shithub: gefs

Download patch

ref: 806f0870bdb11f9af7554678eb1413f65ef75c5a
parent: bd1d74ba77fc8777d51038f65190ab3506bc1388
author: Ori Bernstein <ori@eigenstate.org>
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,