[6.0] 514a9de19 Don't close the _.index fd, but continue reading until the file is recreated by varnishd.
Martin Blix Grydeland
martin at varnish-software.com
Fri Oct 18 13:23:07 UTC 2019
commit 514a9de19e990411180e971ebb00216cc62e51e7
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Aug 13 13:09:14 2019 +0000
Don't close the _.index fd, but continue reading until the
file is recreated by varnishd.
Martin spotted that I lost this in the previous commit.
diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index 175f5f441..c7bded025 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -70,6 +70,8 @@
const struct vsm_valid VSM_invalid[1] = {{"invalid"}};
const struct vsm_valid VSM_valid[1] = {{"valid"}};
+static vlu_f vsm_vlu_func;
+
/*--------------------------------------------------------------------*/
struct vsm_set;
@@ -112,6 +114,7 @@ struct vsm_set {
uintmax_t id1, id2;
// _.index reading state
+ struct vlu *vlu;
unsigned retval;
struct vsm_seg *vg;
@@ -277,6 +280,8 @@ vsm_newset(const char *dirname)
VTAILQ_INIT(&vs->clusters);
vs->dname = dirname;
vs->dfd = vs->fd = -1;
+ vs->vlu = VLU_New(vsm_vlu_func, vs, 0);
+ AN(vs->vlu);
return (vs);
}
@@ -297,6 +302,7 @@ vsm_delset(struct vsm_set **p)
while (!VTAILQ_EMPTY(&vs->segs))
vsm_delseg(VTAILQ_FIRST(&vs->segs), 0);
assert(VTAILQ_EMPTY(&vs->clusters));
+ VLU_Destroy(&vs->vlu);
FREE_OBJ(vs);
}
@@ -590,76 +596,79 @@ vsm_vlu_func(void *priv, const char *line)
return (i);
}
+static void
+vsm_readlines(struct vsm_set *vs)
+{
+ int i;
+
+ do {
+ i = VLU_Fd(vs->vlu, vs->fd);
+ } while (!i);
+ assert(i == -2);
+}
+
static unsigned
vsm_refresh_set(struct vsm *vd, struct vsm_set *vs)
{
struct stat st;
- int i;
- struct vlu *vlu;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
CHECK_OBJ_NOTNULL(vs, VSM_SET_MAGIC);
vs->retval = 0;
- if (vs->dfd >= 0) {
- 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_nlink == 0) {
- closefd(&vs->dfd);
- vs->id1 = vs->id2 = 0;
- vsm_wash_set(vs, 1);
- vs->retval |= vs->flag_restarted;
- }
+ if (vs->dfd >= 0 && (
+ 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_nlink == 0)) {
+ closefd(&vs->dfd);
}
if (vs->dfd < 0) {
if (vs->fd >= 0)
closefd(&vs->fd);
vs->dfd = openat(vd->wdfd, vs->dname, O_RDONLY);
- if (vs->dfd < 0) {
- vs->id1 = vs->id2 = 0;
- vsm_wash_set(vs, 1);
- vs->retval |= vs->flag_restarted;
- return (vs->retval);
- }
- AZ(fstat(vs->dfd, &vs->dst));
}
+ if (vs->dfd < 0) {
+ vs->id1 = vs->id2 = 0;
+ vsm_wash_set(vs, 1);
+ return (vs->retval | vs->flag_restarted);
+ }
+
+ AZ(fstat(vs->dfd, &vs->dst));
+
if (vs->fd >= 0 && (
fstatat(vs->dfd, "_.index", &st, AT_SYMLINK_NOFOLLOW) ||
st.st_ino != vs->fst.st_ino ||
st.st_dev != vs->fst.st_dev ||
st.st_mode != vs->fst.st_mode ||
- st.st_size != vs->fst.st_size ||
+ st.st_size < vs->fst.st_size ||
st.st_nlink < 1 ||
memcmp(&st.st_mtime, &vs->fst.st_mtime, sizeof st.st_mtime))) {
closefd(&vs->fd);
}
if (vs->fd >= 0) {
- if (vd->couldkill < 1 || !kill(vs->id1, 0))
- vs->retval |= vs->flag_running;
- return (vs->retval);
+ vs->vg = NULL;
+ vsm_readlines(vs);
+ } else {
+ VTAILQ_FOREACH(vs->vg, &vs->segs, list)
+ vs->vg->flags &= ~VSM_FLAG_MARKSCAN;
+ vs->vg = VTAILQ_FIRST(&vs->segs);
+ vs->fd = openat(vs->dfd, "_.index", O_RDONLY);
+ if (vs->fd < 0)
+ return (vs->retval|vs->flag_restarted);
+ VLU_Reset(vs->vlu);
+ AZ(fstat(vs->fd, &vs->fst));
+ vsm_readlines(vs);
+ vsm_wash_set(vs, 0);
}
- vs->retval |= vs->flag_changed;
- vs->fd = openat(vs->dfd, "_.index", O_RDONLY);
- if (vs->fd < 0)
- return (vs->retval|vs->flag_restarted);
-
- AZ(fstat(vs->fd, &vs->fst));
-
- vlu = VLU_New(vsm_vlu_func, vs, 0);
- AN(vlu);
+ vs->fst.st_size = lseek(vs->fd, 0L, SEEK_CUR);
- vs->vg = NULL;
- do {
- i = VLU_Fd(vlu, vs->fd);
- } while (!i);
- assert(i == -2);
- VLU_Destroy(&vlu);
- vsm_wash_set(vs, 0);
+ if (vd->couldkill < 1 || !kill(vs->id1, 0))
+ vs->retval |= vs->flag_running;
return (vs->retval);
}
More information about the varnish-commit
mailing list