Improve writeout rescheduling if list of objects is completed quickly

This commit is contained in:
Vincent Sanders 2014-11-30 00:27:05 +00:00
parent d08acbc5ae
commit 61ab2777da

View File

@ -2382,6 +2382,7 @@ static void llcache_persist(void *p)
struct llcache_object **lst; /* candidate object list */ struct llcache_object **lst; /* candidate object list */
int lst_count; /* number of candidates in list */ int lst_count; /* number of candidates in list */
int idx; /* current candidate object index in list */ int idx; /* current candidate object index in list */
int next = -1; /* when the next run should be scheduled for */
unsigned long write_limit; /* max number of bytes to write in this run*/ unsigned long write_limit; /* max number of bytes to write in this run*/
@ -2416,6 +2417,7 @@ static void llcache_persist(void *p)
* (bandwidth) for this run being exceeded. * (bandwidth) for this run being exceeded.
*/ */
if (total_elapsed > llcache->time_quantum) { if (total_elapsed > llcache->time_quantum) {
LOG(("Overran timeslot"));
/* writeout has exhausted the available time. /* writeout has exhausted the available time.
* Either the writeout is slow or the last * Either the writeout is slow or the last
* object was very large. * object was very large.
@ -2426,7 +2428,6 @@ static void llcache_persist(void *p)
guit->llcache->finalise(); guit->llcache->finalise();
break; break;
} else { } else {
unsigned long next;
if (total_bandwidth > llcache->maximum_bandwidth) { if (total_bandwidth > llcache->maximum_bandwidth) {
/* fast writeout of large file /* fast writeout of large file
* so calculate delay as if * so calculate delay as if
@ -2437,14 +2438,11 @@ static void llcache_persist(void *p)
} else { } else {
next = llcache->time_quantum; next = llcache->time_quantum;
} }
LOG(("Overran our timeslot Rescheduling writeout in %dms", next));
guit->browser->schedule(next,
llcache_persist, NULL);
break; break;
} }
} else if (total_written > write_limit) { } else if (total_written > write_limit) {
/* The bandwidth limit has been reached. */ /* The bandwidth limit has been reached. */
unsigned long next;
if (total_bandwidth > llcache->maximum_bandwidth) { if (total_bandwidth > llcache->maximum_bandwidth) {
/* fast writeout of large file so /* fast writeout of large file so
* calculate delay as if write * calculate delay as if write
@ -2454,18 +2452,22 @@ static void llcache_persist(void *p)
} else { } else {
next = llcache->time_quantum - total_elapsed; next = llcache->time_quantum - total_elapsed;
} }
LOG(("Rescheduling writeout in %dms", next));
guit->browser->schedule(next, llcache_persist,
NULL);
break; break;
} }
} }
} }
free(lst);
if (idx == lst_count) {
LOG(("Completed writeout list"));
next = llcache->time_quantum - total_elapsed;
}
LOG(("writeout size:%d time:%d bandwidth:%dbytes/s", LOG(("writeout size:%d time:%d bandwidth:%dbytes/s",
total_written, total_elapsed, total_bandwidth)); total_written, total_elapsed, total_bandwidth));
free(lst); LOG(("Rescheduling writeout in %dms", next));
guit->browser->schedule(next, llcache_persist, NULL);
} }