git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 4/4] fsmonitor: Delay updating state until after split index is merged

From
AVAlex Vandiver <alexmv@dropbox.com>
Date
Oct 20, 2017, 01:11 UTC
Message-ID
<05670bb6e3c6378119b1649144c80dd6d72bfe29.1508461850.git.alexmv@dropbox.com>
In-Reply-To
<20171020011136.14170-1-alexmv@dropbox.com>

If the fsmonitor extension is used in conjunction with the split index extension, the set of entries in the index when it is first loaded is only a subset of the real index. This leads to only the non-"base" index being marked as CE_FSMONITOR_VALID.

Delay the expansion of the ewah bitmap until after tweak_split_index has been called to merge in the base index as well.

Signed-off-by: Alex Vandiver <alexmv@dropbox.com>
---
 cache.h      |  1 +
 fsmonitor.c  | 38 ++++++++++++++++++++++++--------------
 read-cache.c |  4 ++++
 3 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/cache.h b/cache.h
index 25adcf681..0a4f43ec2 100644
--- a/cache.h
+++ b/cache.h
@@ -348,6 +348,7 @@ struct index_state {
 	unsigned char sha1[20];
 	struct untracked_cache *untracked;
 	uint64_t fsmonitor_last_update;
+	struct ewah_bitmap *fsmonitor_dirty;
 };
 
 extern struct index_state the_index;
diff --git a/fsmonitor.c b/fsmonitor.c
index 7c1540c05..4c2668f57 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -49,20 +49,7 @@ int read_fsmonitor_extension(struct index_state *istate, const void *data,
 		ewah_free(fsmonitor_dirty);
 		return error("failed to parse ewah bitmap reading fsmonitor index extension");
 	}
-
-	if (git_config_get_fsmonitor()) {
-		/* Mark all entries valid */
-		for (i = 0; i < istate->cache_nr; i++)
-			istate->cache[i]->ce_flags |= CE_FSMONITOR_VALID;
-
-		/* Mark all previously saved entries as dirty */
-		ewah_each_bit(fsmonitor_dirty, fsmonitor_ewah_callback, istate);
-
-		/* Now mark the untracked cache for fsmonitor usage */
-		if (istate->untracked)
-			istate->untracked->use_fsmonitor = 1;
-	}
-	ewah_free(fsmonitor_dirty);
+	istate->fsmonitor_dirty = fsmonitor_dirty;
 
 	trace_printf_key(&trace_fsmonitor, "read fsmonitor extension successful");
 	return 0;
@@ -238,6 +225,29 @@ void remove_fsmonitor(struct index_state *istate)
 
 void tweak_fsmonitor(struct index_state *istate)
 {
+	int i;
+
+	if (istate->fsmonitor_dirty) {
+		/* Mark all entries valid */
+		trace_printf_key(&trace_fsmonitor, "fsmonitor is enabled; cache is %d", istate->cache_nr);
+		for (i = 0; i < istate->cache_nr; i++) {
+			istate->cache[i]->ce_flags |= CE_FSMONITOR_VALID;
+		}
+		trace_printf_key(&trace_fsmonitor, "marked all as valid");
+
+		/* Mark all previously saved entries as dirty */
+		trace_printf_key(&trace_fsmonitor, "setting each bit on %p", istate->fsmonitor_dirty);
+		ewah_each_bit(istate->fsmonitor_dirty, fsmonitor_ewah_callback, istate);
+
+		/* Now mark the untracked cache for fsmonitor usage */
+		trace_printf_key(&trace_fsmonitor, "setting untracked state");
+		if (istate->untracked)
+			istate->untracked->use_fsmonitor = 1;
+		ewah_free(istate->fsmonitor_dirty);
+	} else {
+		trace_printf_key(&trace_fsmonitor, "fsmonitor not enabled");
+	}
+
 	switch (git_config_get_fsmonitor()) {
 	case -1: /* keep: do nothing */
 		break;
diff --git a/read-cache.c b/read-cache.c
index c18e5e623..3b5cd00a2 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -330,6 +330,10 @@ int ie_match_stat(struct index_state *istate,
 		return 0;
 	if (!ignore_fsmonitor && (ce->ce_flags & CE_FSMONITOR_VALID))
 		return 0;
+	if (ce->ce_flags & CE_FSMONITOR_VALID)
+		trace_printf_key(&trace_fsmonitor, "fsmon marked valid for %s", ce->name);
+	if (ignore_fsmonitor)
+		trace_printf_key(&trace_fsmonitor, "Ignoring fsmonitor for %s", ce->name);
 
 	/*
 	 * Intent-to-add entries have not been added, so the index entry
-- 
2.15.0.rc1.417.g05670bb6e
Previous: Ben PeartNext: Johannes Schindelin
Message 9 of 21 in “fsmonitor fixes”
  1. 0/4 fsmonitor fixesAlex Vandiver, Oct 20, 2017
  2. 2/4 fsmonitor: Don't bother pretty-printing JSON from watchmanAlex Vandiver, Oct 20, 2017
  3. Johannes SchindelinOct 20, 2017
  4. Ben PeartOct 20, 2017
  5. Alex VandiverOct 26, 2017
  6. Johannes SchindelinOct 27, 2017
  7. 3/4 fsmonitor: Document GIT_TRACE_FSMONITORAlex Vandiver, Oct 20, 2017
  8. Ben PeartOct 20, 2017
  9. 4/4 fsmonitor: Delay updating state until after split index is mergedAlex Vandiver, Oct 20, 2017
  10. Johannes SchindelinOct 20, 2017
  11. Ben PeartOct 20, 2017
  12. Junio C HamanoOct 21, 2017
  13. Jeff KingOct 21, 2017
  14. Johannes SchindelinOct 23, 2017
  15. Ben PeartOct 23, 2017
  16. Alex VandiverOct 26, 2017
  17. 1/4 fsmonitor: Watch, and ask about, the top of the repo, not the CWDAlex Vandiver, Oct 20, 2017
  18. Johannes SchindelinOct 20, 2017
  19. Alex VandiverOct 26, 2017
  20. Johannes SchindelinOct 27, 2017
  21. Johannes SchindelinOct 20, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.