[master] 32f503efe Refactor & Polish

Poul-Henning Kamp phk at FreeBSD.org
Tue Aug 13 11:10:10 UTC 2019


commit 32f503efea667eb7fc856a4a14e521c382c547cf
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Aug 7 13:34:22 2019 +0000

    Refactor & Polish

diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index 7e9f950ec..79411d783 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -113,6 +113,10 @@ struct vsm_set {
 	// _.index reading state
 	unsigned		retval;
 	struct vsm_seg		*vg;
+
+	unsigned		flag_running;
+	unsigned		flag_changed;
+	unsigned		flag_restarted;
 };
 
 struct vsm {
@@ -122,9 +126,9 @@ struct vsm {
 	struct vsb		*diag;
 	uintptr_t		serial;
 
-	int			dfd;
-	struct stat		dst;
-	char			*dname;
+	int			wdfd;
+	struct stat		wdst;
+	char			*wdname;
 
 	struct vsm_set		*mgt;
 	struct vsm_set		*child;
@@ -186,7 +190,7 @@ vsm_mapseg(struct vsm *vd, struct vsm_seg *vg)
 
 	vsb = VSB_new_auto();
 	AN(vsb);
-	VSB_printf(vsb, "%s/%s/%s", vd->dname, vg->set->dname, vg->av[1]);
+	VSB_printf(vsb, "%s/%s/%s", vd->wdname, vg->set->dname, vg->av[1]);
 	AZ(VSB_finish(vsb));
 
 	fd = open(VSB_data(vsb), O_RDONLY);	// XXX: openat
@@ -315,10 +319,18 @@ VSM_New(void)
 	AN(vd);
 
 	vd->mgt = vsm_newset(VSM_MGT_DIRNAME);
+	vd->mgt->flag_running = VSM_MGT_RUNNING;
+	vd->mgt->flag_changed = VSM_MGT_CHANGED;
+	vd->mgt->flag_restarted = VSM_MGT_RESTARTED;
+
 	vd->child = vsm_newset(VSM_CHILD_DIRNAME);
+	vd->child->flag_running = VSM_WRK_RUNNING;
+	vd->child->flag_changed = VSM_WRK_CHANGED;
+	vd->child->flag_restarted = VSM_WRK_RESTARTED;
+
 	vd->mgt->vsm = vd;
 	vd->child->vsm = vd;
-	vd->dfd = -1;
+	vd->wdfd = -1;
 	vd->patience = 5;
 	if (getenv("VSM_NOPID") != NULL)
 		vd->couldkill = -1;
@@ -353,7 +365,7 @@ VSM_Arg(struct vsm *vd, char flag, const char *arg)
 			return (vsm_diag(vd, "Invalid instance name: %s",
 			    strerror(errno)));
 		AN(p);
-		REPLACE(vd->dname, p);
+		REPLACE(vd->wdname, p);
 		free(p);
 		break;
 	default:
@@ -372,11 +384,11 @@ VSM_Destroy(struct vsm **vdp)
 	TAKE_OBJ_NOTNULL(vd, vdp, VSM_MAGIC);
 
 	VSM_ResetError(vd);
-	REPLACE(vd->dname, NULL);
+	REPLACE(vd->wdname, NULL);
 	if (vd->diag != NULL)
 		VSB_destroy(&vd->diag);
-	if (vd->dfd >= 0)
-		closefd(&vd->dfd);
+	if (vd->wdfd >= 0)
+		closefd(&vd->wdfd);
 	vsm_delset(&vd->mgt);
 	vsm_delset(&vd->child);
 	FREE_OBJ(vd);
@@ -564,7 +576,7 @@ vsm_vlu_func(void *priv, const char *line)
 		i = vsm_vlu_hash(vd, vs, line);
 		VTAILQ_FOREACH(vs->vg, &vs->segs, list)
 			vs->vg->flags &= ~VSM_FLAG_MARKSCAN;
-		if (!(vs->retval & VSM_MGT_RESTARTED))
+		if (!(vs->retval & vs->flag_restarted))
 			vs->vg = VTAILQ_FIRST(&vs->segs);
 		break;
 	case '+':
@@ -590,29 +602,27 @@ vsm_refresh_set(struct vsm *vd, struct vsm_set *vs)
 	CHECK_OBJ_NOTNULL(vs, VSM_SET_MAGIC);
 	vs->retval = 0;
 	if (vs->dfd >= 0) {
-		if (fstatat(vd->dfd, vs->dname, &st, AT_SYMLINK_NOFOLLOW)) {
-			closefd(&vs->dfd);
-			vs->id1 = vs->id2 = 0;
-			vsm_wash_set(vs, 1);
-			return (VSM_MGT_RESTARTED|VSM_MGT_CHANGED);
-		}
-		if (st.st_ino != vs->dst.st_ino ||
+		if (fstatat(vd->wdfd, vs->dname, &st, AT_SYMLINK_NOFOLLOW) ||
+		    st.st_ino != vs->dst.st_ino ||
 		    st.st_dev != vs->dst.st_dev ||
-		    st.st_mode != vs->dst.st_mode) {
+		    st.st_mode != vs->dst.st_mode ||
+		    st.st_nlink == 0) {
 			closefd(&vs->dfd);
 			vs->id1 = vs->id2 = 0;
+			vsm_wash_set(vs, 1);
+			vs->retval |= vs->flag_restarted;
 		}
 	}
 
 	if (vs->dfd < 0) {
 		if (vs->fd >= 0)
 			closefd(&vs->fd);
-		vs->dfd = openat(vd->dfd, vs->dname, O_RDONLY);
-		vs->retval |= VSM_MGT_RESTARTED;
+		vs->dfd = openat(vd->wdfd, vs->dname, O_RDONLY);
 		if (vs->dfd < 0) {
 			vs->id1 = vs->id2 = 0;
 			vsm_wash_set(vs, 1);
-			return (vs->retval|VSM_MGT_CHANGED);
+			vs->retval |= vs->flag_restarted;
+			return (vs->retval);
 		}
 		AZ(fstat(vs->dfd, &vs->dst));
 	}
@@ -630,14 +640,14 @@ vsm_refresh_set(struct vsm *vd, struct vsm_set *vs)
 
 	if (vs->fd >= 0) {
 		if (vd->couldkill < 1 || !kill(vs->id1, 0))
-			vs->retval |= VSM_MGT_RUNNING;
+			vs->retval |= vs->flag_running;
 		return (vs->retval);
 	}
 
-	vs->retval |= VSM_MGT_CHANGED;
+	vs->retval |= vs->flag_changed;
 	vs->fd = openat(vs->dfd, "_.index", O_RDONLY);
 	if (vs->fd < 0)
-		return (vs->retval|VSM_MGT_RESTARTED);
+		return (vs->retval|vs->flag_restarted);
 
 	AZ(fstat(vs->fd, &vs->fst));
 
@@ -659,38 +669,41 @@ vsm_refresh_set(struct vsm *vd, struct vsm_set *vs)
 unsigned
 VSM_Status(struct vsm *vd)
 {
-	unsigned retval = 0, u;
+	unsigned retval = 0;
 	struct stat st;
 
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
 
 	/* See if the -n workdir changed */
-	if (vd->dfd >= 0) {
-		AZ(fstat(vd->dfd, &st));
-		if (st.st_ino != vd->dst.st_ino ||
-		    st.st_dev != vd->dst.st_dev ||
-		    st.st_mode != vd->dst.st_mode ||
+	if (vd->wdfd >= 0) {
+		AZ(fstat(vd->wdfd, &st));
+		if (st.st_ino != vd->wdst.st_ino ||
+		    st.st_dev != vd->wdst.st_dev ||
+		    st.st_mode != vd->wdst.st_mode ||
 		    st.st_nlink == 0) {
-			closefd(&vd->dfd);
-			retval |= VSM_MGT_CHANGED;
-			retval |= VSM_WRK_CHANGED;
+			closefd(&vd->wdfd);
+			vsm_wash_set(vd->mgt, 1);
+			vsm_wash_set(vd->child, 1);
 		}
 	}
 
 	/* Open workdir */
-	if (vd->dfd < 0) {
-		vd->dfd = open(vd->dname, O_RDONLY);
-		if (vd->dfd < 0)
+	if (vd->wdfd < 0) {
+		retval |= VSM_MGT_RESTARTED | VSM_MGT_CHANGED;
+		retval |= VSM_WRK_RESTARTED | VSM_MGT_CHANGED;
+		vd->wdfd = open(vd->wdname, O_RDONLY);
+		if (vd->wdfd < 0)
 			(void)vsm_diag(vd,
 			    "VSM_Status: Cannot open workdir");
 		else
-			AZ(fstat(vd->dfd, &vd->dst));
+			AZ(fstat(vd->wdfd, &vd->wdst));
 	}
 
-	u = vsm_refresh_set(vd, vd->mgt);
-	retval |= u;
-	if (u & VSM_MGT_RUNNING)
-		retval |= vsm_refresh_set(vd, vd->child) << 8;
+	if (vd->wdfd >= 0) {
+		retval |= vsm_refresh_set(vd, vd->mgt);
+		if (retval & VSM_MGT_RUNNING)
+			retval |= vsm_refresh_set(vd, vd->child);
+	}
 	return (retval);
 }
 
@@ -710,12 +723,12 @@ VSM_Attach(struct vsm *vd, int progress)
 	else
 		t0 = VTIM_mono() + vd->patience;
 
-	if (vd->dname == NULL) {
+	if (vd->wdname == NULL) {
 		/* Use default (hostname) */
 		i = VSM_Arg(vd, 'n', "");
 		if (i < 0)
 			return (i);
-		AN(vd->dname);
+		AN(vd->wdname);
 	}
 
 	AZ(vd->attached);


More information about the varnish-commit mailing list