]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsmonitor: refactor initialization of fsmonitor_last_update token
authorJeff Hostetler <jeffhost@microsoft.com>
Wed, 3 Feb 2021 15:34:50 +0000 (15:34 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Feb 2021 01:14:35 +0000 (17:14 -0800)
Isolate and document initialization of `istate->fsmonitor_last_update`.
This field should contain a fsmonitor-specific opaque token, but we
need to initialize it before we can actually talk to a fsmonitor process,
so we create a generic default value.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fsmonitor.c

index 64deeda597ead87ef0daa94cebb3b6e91b5a744b..e12214b30071e7241fb3c2f37c1457954495161c 100644 (file)
@@ -343,16 +343,45 @@ void refresh_fsmonitor(struct index_state *istate)
        istate->fsmonitor_last_update = strbuf_detach(&last_update_token, NULL);
 }
 
+/*
+ * The caller wants to turn on FSMonitor.  And when the caller writes
+ * the index to disk, a FSMonitor extension should be included.  This
+ * requires that `istate->fsmonitor_last_update` not be NULL.  But we
+ * have not actually talked to a FSMonitor process yet, so we don't
+ * have an initial value for this field.
+ *
+ * For a protocol V1 FSMonitor process, this field is a formatted
+ * "nanoseconds since epoch" field.  However, for a protocol V2
+ * FSMonitor process, this field is an opaque token.
+ *
+ * Historically, `add_fsmonitor()` has initialized this field to the
+ * current time for protocol V1 processes.  There are lots of race
+ * conditions here, but that code has shipped...
+ *
+ * The only true solution is to use a V2 FSMonitor and get a current
+ * or default token value (that it understands), but we cannot do that
+ * until we have actually talked to an instance of the FSMonitor process
+ * (but the protocol requires that we send a token first...).
+ *
+ * For simplicity, just initialize like we have a V1 process and require
+ * that V2 processes adapt.
+ */
+static void initialize_fsmonitor_last_update(struct index_state *istate)
+{
+       struct strbuf last_update = STRBUF_INIT;
+
+       strbuf_addf(&last_update, "%"PRIu64"", getnanotime());
+       istate->fsmonitor_last_update = strbuf_detach(&last_update, NULL);
+}
+
 void add_fsmonitor(struct index_state *istate)
 {
        unsigned int i;
-       struct strbuf last_update = STRBUF_INIT;
 
        if (!istate->fsmonitor_last_update) {
                trace_printf_key(&trace_fsmonitor, "add fsmonitor");
                istate->cache_changed |= FSMONITOR_CHANGED;
-               strbuf_addf(&last_update, "%"PRIu64"", getnanotime());
-               istate->fsmonitor_last_update = strbuf_detach(&last_update, NULL);
+               initialize_fsmonitor_last_update(istate);
 
                /* reset the fsmonitor state */
                for (i = 0; i < istate->cache_nr; i++)