ref: 1ba67b57e8e863229f5eb19fceba5f7f7c224cf5
parent: 85cd892f0121f21c30f8b65645729c0097ef1429
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Nov 3 17:14:37 EDT 2023
blk: move log compression to syncing let's minimize the amount of time we spend on a swapped out sync list, and put a barrier in the right place.
--- a/fs.c
+++ b/fs.c
@@ -2205,6 +2205,7 @@
vlong off;
Amsg *a;
Msg m;
+ int i;
while(1){
a = chrecv(fs->admchan);
@@ -2211,6 +2212,16 @@
switch(a->op){
case AOsync:
qlock(&fs->mutlk);
+ for(i = 0; i < fs->narena; i++){
+ epochstart(id);
+ qlock(&fs->arenas[i]);
+ if(fs->arenas[i].nlog > fs->arenas[i].reserve/(10*Blksz))
+ if(compresslog(&fs->arenas[i]) == -1)
+ fprint(2, "compress log: %r");
+ qunlock(&fs->arenas[i]);
+ epochend(id);
+ epochclean();
+ }
if(a->halt)
ainc(&fs->rdonly);
epochstart(id);
@@ -2259,13 +2270,12 @@
}
void
-runtasks(int id, void *)
+runtasks(int, void *)
{
- int i, c;
Amsg *a;
while(1){
- sleep(5000);
+ sleep(500);
a = mallocz(sizeof(Amsg), 1);
if(a == nil){
fprint(2, "alloc sync msg: %r\n");
@@ -2276,28 +2286,5 @@
a->halt = 0;
a->fd = -1;
chsend(fs->admchan, a);
-
- /*
- * compresslog is designed to be concurrent with allocation,
- * so it's safe to call from outside the mutator proc; we
- * don't want to spend a ton of time compressing, though,
- * so we only do the compression when our log gets big.
- *
- * 10% of our reserved emergency space seems like a good
- * heuristic for big, but it was picked arbitrarily.
- */
- qlock(&fs->synclk);
- for(i = 0; i < fs->narena; i++){
- epochstart(id);
- qlock(&fs->arenas[i]);
- c = fs->arenas[i].nlog > fs->arenas[i].reserve/(10*Blksz);
- if(c){
- if(compresslog(&fs->arenas[i]) == -1)
- fprint(2, "compress log: %r");
- }
- qunlock(&fs->arenas[i]);
- epochend(id);
- }
- qunlock(&fs->synclk);
}
}
--- a/load.c
+++ b/load.c
@@ -112,7 +112,6 @@
fprint(2, "\tarenasz:\t%lld MiB\n", fs->arenasz/MiB);
fprint(2, "\tnextqid:\t%lld\n", fs->nextqid);
fprint(2, "\tnextgen:\t%lld\n", fs->nextgen);
- fprint(2, "\tsyncgen:\t%lld\n", fs->qgen);
fprint(2, "\tblocksize:\t%lld\n", Blksz);
fprint(2, "\tcachesz:\t%lld MiB\n", fs->cmax*Blksz/MiB);
if((t = opensnap("adm", nil)) == nil)