ref: 806f0870bdb11f9af7554678eb1413f65ef75c5a
parent: bd1d74ba77fc8777d51038f65190ab3506bc1388
author: Ori Bernstein <[email protected]>
date: Fri Dec 1 00:27:03 EST 2023
fs: make autosnaps happen on a per-mnt basis
--- a/dat.h
+++ b/dat.h
@@ -566,9 +566,6 @@
RWLock flushq[Nflushtab];
int flushop[Nflushtab];
-
- char minutely[60][128];
- char hourly[24][128];
Stats stats;
};
@@ -625,9 +622,13 @@
Mount *next;
long ref;
vlong gen;
- char *name;
+ char name[64];
int mutable;
Tree *root; /* EBR protected */
+
+ /* snapshot history */
+ char minutely[60][128];
+ char hourly[24][128];
};
struct Conn {
@@ -686,7 +687,7 @@
struct Scan {
vlong offset; /* last read offset */
-
+Tree *t;
char first;
char donescan;
char overflow;
--- a/fs.c
+++ b/fs.c
@@ -398,6 +398,51 @@
return de;
}
+static void
+loadautos(Mount *mnt)
+{
+ char pfx[128];
+ int m, h, ns;
+ uint flg;
+ Scan s;
+
+ m = 0;
+ h = 0;
+ pfx[0] = Klabel;
+ ns = snprint(pfx+1, sizeof(pfx)-1, "%s@minute.", mnt->name);
+ btnewscan(&s, pfx, ns+1);
+ btenter(&fs->snap, &s);
+ while(1){
+ if(!btnext(&s, &s.kv))
+ break;
+ flg = UNPACK32(s.kv.v+1+8);
+ if(flg & Lauto){
+ memcpy(mnt->minutely[m], s.kv.k+1, s.kv.nk-1);
+ mnt->minutely[m][s.kv.nk-1] = 0;
+ m = (m+1)%60;
+ continue;
+ }
+ }
+ btexit(&s);
+
+ pfx[0] = Klabel;
+ ns = snprint(pfx+1, sizeof(pfx)-1, "%s@hour.", mnt->name);
+ btnewscan(&s, pfx, ns+1);
+ btenter(&fs->snap, &s);
+ while(1){
+ if(!btnext(&s, &s.kv))
+ break;
+ flg = UNPACK32(s.kv.v+1+8);
+ if(flg & Lauto){
+ memcpy(mnt->hourly[h], s.kv.k+1, s.kv.nk-1);
+ mnt->hourly[h][s.kv.nk-1] = 0;
+ h = (h+1)%24;
+ continue;
+ }
+ }
+ btexit(&s);
+}
+
Mount *
getmount(char *name)
{
@@ -416,18 +461,16 @@
}
if((mnt = mallocz(sizeof(*mnt), 1)) == nil)
goto Out;
- mnt->ref = 1;
- if((mnt->name = strdup(name)) == nil){
+ if(waserror()){
+ unlock(&fs->mountlk);
free(mnt);
- mnt = nil;
- goto Out;
+ return nil;
}
- if((t = opensnap(name, &mnt->mutable)) == nil){
- free(mnt->name);
- free(mnt);
- mnt = nil;
- goto Out;
- }
+ mnt->ref = 1;
+ snprint(mnt->name, sizeof(mnt->name), "%s", name);
+ if((t = opensnap(name, &mnt->mutable)) == nil)
+ error(Enosnap);
+ loadautos(mnt);
mnt->root = t;
mnt->next = fs->mounts;
fs->mounts = mnt;
@@ -434,6 +477,7 @@
Out:
unlock(&fs->mountlk);
+ poperror();
return mnt;
}
@@ -452,7 +496,6 @@
}
assert(me != nil);
*p = me->next;
- free(mnt->name);
free(mnt);
}
unlock(&fs->mountlk);
@@ -2269,50 +2312,6 @@
}
}
-static void
-loadautos(void)
-{
- char pfx[Snapsz];
- int m, h, ns, nl;
- uint flg;
- Scan s;
-
- m = 0;
- h = 0;
- pfx[0] = Klabel;
- pfx[1] = '@';
- btnewscan(&s, pfx, 2);
- btenter(&fs->snap, &s);
- while(1){
- if(!btnext(&s, &s.kv))
- break;
- flg = UNPACK32(s.kv.v+1+8);
- if(!(flg & Lauto))
- continue;
- nl = s.kv.nk-1;
- ns = strlen("@minute.");
- assert(nl+1 < sizeof(fs->minutely[0]));
- if(nl > ns && strncmp(s.kv.k+1, "@minute.", ns) == 0){
- memcpy(fs->minutely[m], s.kv.k+1, s.kv.nk-1);
- fs->minutely[m][s.kv.nk-1] = 0;
- m = (m+1)%60;
- continue;
- }
- ns = strlen("@hour.");
- if(nl > ns && strncmp(s.kv.k+1, "@hour.", ns) == 0){
- memcpy(fs->hourly[h], s.kv.k+1, s.kv.nk-1);
- fs->hourly[h][s.kv.nk-1] = 0;
- h = (h+1)%24;
- continue;
- }
- ns = strlen("@day.");
- if(nl > ns && strncmp(s.kv.k+1, "@day.", ns) == 0)
- continue;
- fprint(2, "unknown autosnap %.*s\n", s.kv.nk-1, s.kv.k+1);
- }
- btexit(&s);
-}
-
void
snapmsg(char *old, char *new, int flg)
{
@@ -2335,12 +2334,12 @@
{
char buf[128];
Tm now, then;
+ Mount *mnt;
int m, h;
Amsg *a;
m = 0;
h = 0;
- loadautos();
tmnow(&then, nil);
tmnow(&now, nil);
while(1){
@@ -2354,23 +2353,28 @@
chsend(fs->admchan, a);
tmnow(&now, nil);
- if(now.yday != then.yday){
- snprint(buf, sizeof(buf), "@day.%τ", tmfmt(&now, "YYYY.MM.DD[_]hh:mm:ss"));
- snapmsg("main", buf, Lauto);
- }
- if(now.hour != then.hour){
- if(fs->hourly[h][0] != 0)
- snapmsg(fs->hourly[h], nil, 0);
- snprint(fs->hourly[h], sizeof(fs->hourly[h]), "@hour.%τ", tmfmt(&now, "YYYY.MM.DD[_]hh:mm:ss"));
- snapmsg("main", fs->hourly[h], Lauto);
- h = (h+1)%24;
- }
- if(now.min != then.min){
- if(fs->minutely[m][0] != 0)
- snapmsg(fs->minutely[m], nil, 0);
- snprint(fs->minutely[m], sizeof(fs->minutely[m]), "@minute.%τ", tmfmt(&now, "YYYY.MM.DD[_]hh:mm:ss"));
- snapmsg("main", fs->minutely[m], Lauto);
- m = (m+1)%60;
+ for(mnt = fs->mounts; mnt != nil; mnt = mnt->next){
+ if(now.yday != then.yday){
+ snprint(buf, sizeof(buf),
+ "%s@day.%τ", mnt->name, tmfmt(&now, "YYYY.MM.DD[_]hh:mm:ss"));
+ snapmsg("main", buf, Lauto);
+ }
+ if(now.hour != then.hour){
+ if(mnt->hourly[h][0] != 0)
+ snapmsg(mnt->hourly[h], nil, 0);
+ snprint(mnt->hourly[h], sizeof(mnt->hourly[h]),
+ "%s@hour.%τ", mnt->name, tmfmt(&now, "YYYY.MM.DD[_]hh:mm:ss"));
+ snapmsg("main", mnt->hourly[h], Lauto);
+ h = (h+1)%24;
+ }
+ if(now.min != then.min){
+ if(mnt->minutely[m][0] != 0)
+ snapmsg(mnt->minutely[m], nil, 0);
+ snprint(mnt->minutely[m], sizeof(mnt->minutely[m]),
+ "%s@minute.%τ", mnt->name, tmfmt(&now, "YYYY.MM.DD[_]hh:mm:ss"));
+ snapmsg("main", mnt->minutely[m], Lauto);
+ m = (m+1)%60;
+ }
}
then = now;
poperror();
--- a/load.c
+++ b/load.c
@@ -68,10 +68,9 @@
if((dump = mallocz(sizeof(*dump), 1)) == nil)
sysfatal("malloc: %r");
- if((dump->name = strdup("dump")) == nil)
- sysfatal("malloc: %r");
if(waserror())
sysfatal("load fs: %s", errmsg());
+ snprint(dump->name, sizeof(dump->name), "dump");
dump->ref = 1;
dump->gen = -1;
dump->root = &fs->snap;
--- a/main.c
+++ b/main.c
@@ -278,6 +278,7 @@
if((s = getenv("NPROC")) != nil)
nproc = atoi(s);
+ free(s);
/*
* too few procs, we can't parallelize io,