adjust read chunk size according to log entry size
This commit is contained in:
parent
4a7f8d3075
commit
71d01a44a1
1 changed files with 12 additions and 8 deletions
|
@ -313,7 +313,7 @@ find_offset_in_file(int first_page)
|
||||||
coffee_offset_t range_start, range_end, part_size;
|
coffee_offset_t range_start, range_end, part_size;
|
||||||
|
|
||||||
READ_HEADER(&hdr, first_page);
|
READ_HEADER(&hdr, first_page);
|
||||||
search_limit = 1;
|
search_limit = 0;
|
||||||
for(i = 0; i < sizeof(hdr.eof_hint) * CHAR_BIT; i++) {
|
for(i = 0; i < sizeof(hdr.eof_hint) * CHAR_BIT; i++) {
|
||||||
if(hdr.eof_hint >> i) {
|
if(hdr.eof_hint >> i) {
|
||||||
search_limit = i + 1;
|
search_limit = i + 1;
|
||||||
|
@ -323,7 +323,7 @@ find_offset_in_file(int first_page)
|
||||||
if(part_size == 0) {
|
if(part_size == 0) {
|
||||||
part_size = 1;
|
part_size = 1;
|
||||||
}
|
}
|
||||||
range_start = part_size * (search_limit - 1);
|
range_start = part_size * search_limit;
|
||||||
range_end = range_start + part_size;
|
range_end = range_start + part_size;
|
||||||
|
|
||||||
if(range_end > hdr.max_pages) {
|
if(range_end > hdr.max_pages) {
|
||||||
|
@ -338,7 +338,7 @@ find_offset_in_file(int first_page)
|
||||||
* are zeroes, then these are skipped from the calculation.
|
* are zeroes, then these are skipped from the calculation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for(page = first_page + range_end - 1; page >= first_page + range_start; page--) {
|
for(page = first_page + range_end; page >= first_page; page--) {
|
||||||
watchdog_periodic();
|
watchdog_periodic();
|
||||||
COFFEE_READ(buf, sizeof(buf), page * COFFEE_PAGE_SIZE);
|
COFFEE_READ(buf, sizeof(buf), page * COFFEE_PAGE_SIZE);
|
||||||
for(i = COFFEE_PAGE_SIZE - 1; i >= 0; i--) {
|
for(i = COFFEE_PAGE_SIZE - 1; i >= 0; i--) {
|
||||||
|
@ -867,7 +867,7 @@ cfs_close(int fd)
|
||||||
|
|
||||||
if(FD_VALID(fd)) {
|
if(FD_VALID(fd)) {
|
||||||
READ_HEADER(&hdr, coffee_fd_set[fd].file_page);
|
READ_HEADER(&hdr, coffee_fd_set[fd].file_page);
|
||||||
current_page = (coffee_fd_set[fd].end + COFFEE_PAGE_SIZE - 1) / COFFEE_PAGE_SIZE;
|
current_page = coffee_fd_set[fd].end / COFFEE_PAGE_SIZE;
|
||||||
part_size = hdr.max_pages / (sizeof(hdr.eof_hint) * CHAR_BIT);
|
part_size = hdr.max_pages / (sizeof(hdr.eof_hint) * CHAR_BIT);
|
||||||
if(part_size == 0) {
|
if(part_size == 0) {
|
||||||
part_size = 1;
|
part_size = 1;
|
||||||
|
@ -926,7 +926,7 @@ cfs_read(int fd, void *buf, unsigned size)
|
||||||
{
|
{
|
||||||
struct file_header hdr;
|
struct file_header hdr;
|
||||||
struct file_desc *fdp;
|
struct file_desc *fdp;
|
||||||
unsigned remains;
|
unsigned remains, read_chunk;
|
||||||
int r;
|
int r;
|
||||||
coffee_offset_t base, offset;
|
coffee_offset_t base, offset;
|
||||||
struct log_param lp;
|
struct log_param lp;
|
||||||
|
@ -940,8 +940,12 @@ cfs_read(int fd, void *buf, unsigned size)
|
||||||
size = fdp->end - fdp->offset;
|
size = fdp->end - fdp->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
read_chunk = COFFEE_PAGE_SIZE;
|
||||||
if(FD_MODIFIED(fd)) {
|
if(FD_MODIFIED(fd)) {
|
||||||
READ_HEADER(&hdr, fdp->file_page);
|
READ_HEADER(&hdr, fdp->file_page);
|
||||||
|
if(hdr.log_entry_size > 0) {
|
||||||
|
read_chunk = hdr.log_entry_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remains = size;
|
remains = size;
|
||||||
|
@ -963,7 +967,7 @@ cfs_read(int fd, void *buf, unsigned size)
|
||||||
}
|
}
|
||||||
/* Read from the original file if we cannot find the data in the log. */
|
/* Read from the original file if we cannot find the data in the log. */
|
||||||
if(r < 0) {
|
if(r < 0) {
|
||||||
r = remains > hdr.log_entry_size ? hdr.log_entry_size : remains;
|
r = remains > read_chunk ? read_chunk : remains;
|
||||||
COFFEE_READ((char *) buf + offset, r,
|
COFFEE_READ((char *) buf + offset, r,
|
||||||
ABS_OFFSET(fdp->file_page, base + offset));
|
ABS_OFFSET(fdp->file_page, base + offset));
|
||||||
}
|
}
|
||||||
|
@ -998,7 +1002,7 @@ cfs_write(int fd, const void *buf, unsigned size)
|
||||||
remains = size;
|
remains = size;
|
||||||
while(remains) {
|
while(remains) {
|
||||||
lp.offset = fdp->offset;
|
lp.offset = fdp->offset;
|
||||||
lp.buf = &buf[size - remains];
|
lp.buf = (char *)buf + size - remains;
|
||||||
lp.size = remains;
|
lp.size = remains;
|
||||||
|
|
||||||
i = write_log_page(fdp, &lp);
|
i = write_log_page(fdp, &lp);
|
||||||
|
|
Loading…
Reference in a new issue