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

[PATCH v2 08/17] read-cache: invalidate untracked cache data when reading WAMA

From
David Turner <dturner@twopensource.com>
Date
Mar 19, 2016, 01:04 UTC
Message-ID
<1458349490-1704-9-git-send-email-dturner@twopensource.com>
In-Reply-To
<1458349490-1704-1-git-send-email-dturner@twopensource.com>

When reading the watchman extension, invalidate the listed untracked-cache entries.

We don't clear these entries yet; we can only do that once we know that they came from a live watchman (rather than from disk).

Signed-off-by: David Turner <dturner@twopensource.com>
---
 dir.c        | 11 +++++---
 dir.h        |  3 ++
 read-cache.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 94 insertions(+), 9 deletions(-)
diff --git a/dir.c b/dir.c
index 69e0be6..9b659e6 100644
--- a/dir.c
+++ b/dir.c
@@ -597,9 +597,9 @@ static void trim_trailing_spaces(char *buf)
  *
  * If "name" has the trailing slash, it'll be excluded in the search.
  */
-static struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc,
-						    struct untracked_cache_dir *dir,
-						    const char *name, int len)
+struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc,
+					     struct untracked_cache_dir *dir,
+					     const char *name, int len)
 {
 	int first, last;
 	struct untracked_cache_dir *d;
@@ -2625,8 +2625,10 @@ static void free_untracked(struct untracked_cache_dir *ucd)
 
 void free_untracked_cache(struct untracked_cache *uc)
 {
-	if (uc)
+	if (uc) {
 		free_untracked(uc->root);
+		string_list_clear(&uc->invalid_untracked, 0);
+	}
 	free(uc);
 }
 
@@ -2775,6 +2777,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
 		return NULL;
 
 	uc = xcalloc(1, sizeof(*uc));
+	string_list_init(&uc->invalid_untracked, 1);
 	strbuf_init(&uc->ident, ident_len);
 	strbuf_add(&uc->ident, ident, ident_len);
 	load_sha1_stat(&uc->ss_info_exclude, &ouc->info_exclude_stat,
diff --git a/dir.h b/dir.h
index 3d540de..8fd3f9e 100644
--- a/dir.h
+++ b/dir.h
@@ -315,4 +315,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
 void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);
 void add_untracked_cache(struct index_state *istate);
 void remove_untracked_cache(struct index_state *istate);
+struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc,
+					     struct untracked_cache_dir *dir,
+					     const char *name, int len);
 #endif
diff --git a/read-cache.c b/read-cache.c
index 6d5e871..b4bd15c 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1373,11 +1373,76 @@ static int verify_hdr(const struct cache_header *hdr, unsigned long size)
 	return 0;
 }
 
+static struct untracked_cache_dir *find_untracked_cache_dir(
+	struct untracked_cache *uc, struct untracked_cache_dir *ucd,
+	const char *name)
+{
+	int component_len;
+	const char *end;
+	struct untracked_cache_dir *dir;
+
+	if (!*name)
+		return ucd;
+
+	end = strchr(name, '/');
+	if (end)
+		component_len = end - name;
+	else
+		component_len = strlen(name);
+
+	dir = lookup_untracked(uc, ucd, name, component_len);
+	if (dir)
+		return find_untracked_cache_dir(uc, dir, name + component_len + 1);
+
+	return NULL;
+}
+
 static void mark_no_watchman(size_t pos, void *data)
 {
 	struct index_state *istate = data;
+	struct cache_entry *ce = istate->cache[pos];
+	struct strbuf sb = STRBUF_INIT;
+	char *c;
+	struct untracked_cache_dir *dir;
+
 	assert(pos < istate->cache_nr);
-	istate->cache[pos]->ce_flags |= CE_WATCHMAN_DIRTY;
+	ce->ce_flags |= CE_WATCHMAN_DIRTY;
+
+	if (!istate->untracked || !istate->untracked->root)
+		return;
+
+	strbuf_add(&sb, ce->name, ce_namelen(ce));
+
+	for (c = sb.buf + sb.len - 1; c > sb.buf; c--) {
+		if (*c == '/') {
+			strbuf_setlen(&sb, c - sb.buf);
+			break;
+		}
+	}
+
+	if (c == sb.buf) {
+		strbuf_setlen(&sb, 0);
+	}
+
+	dir = find_untracked_cache_dir(istate->untracked,
+				       istate->untracked->root, sb.buf);
+	if (dir)
+		dir->valid = 0;
+
+	strbuf_release(&sb);
+}
+
+static int mark_untracked_invalid(struct string_list_item *item, void *uc)
+{
+	struct untracked_cache *untracked = uc;
+	struct untracked_cache_dir *dir;
+
+	dir = find_untracked_cache_dir(untracked, untracked->root,
+				       item->string);
+	if (dir)
+		dir->valid = 0;
+
+	return 0;
 }
 
 static int read_watchman_ext(struct index_state *istate, const void *data,
@@ -1407,10 +1472,24 @@ static int read_watchman_ext(struct index_state *istate, const void *data,
 	ewah_each_bit(bitmap, mark_no_watchman, istate);
 	ewah_free(bitmap);
 
-	/*
-	 * TODO: update the untracked cache from the untracked data in this
-	 * extension.
-	 */
+	if (istate->untracked && istate->untracked->root) {
+		int i;
+		const char *untracked;
+
+		untracked = data + len + 8 + bitmap_size;
+		for (i = 0; i < untracked_nr; ++i) {
+			int len = strlen(untracked);
+			string_list_append(&istate->untracked->invalid_untracked,
+					   untracked);
+			untracked += len + 1;
+		}
+
+		for_each_string_list(&istate->untracked->invalid_untracked,
+			 mark_untracked_invalid, istate->untracked);
+
+		if (untracked_nr)
+			istate->cache_changed |= WATCHMAN_CHANGED;
+	}
 	return 0;
 }
 
-- 
2.4.2.767.g62658d5-twtrsrc
Previous: David TurnerNext: Duy Nguyen
Message 12 of 25 in “index-helper, watchman”
  1. 00/15 index-helper, watchmanDavid Turner, Mar 19, 2016
  2. 01/17 read-cache.c: fix constness of verify_hdr()David Turner, Mar 19, 2016
  3. 02/17 read-cache: allow to keep mmap'd memory after readingDavid Turner, Mar 19, 2016
  4. 03/17 index-helper: new daemon for caching index and related stuffDavid Turner, Mar 19, 2016
  5. Duy NguyenMar 29, 2016
  6. David TurnerMar 29, 2016
  7. 04/17 index-helper: add --strictDavid Turner, Mar 19, 2016
  8. 05/17 daemonize(): set a flag before exiting the main processDavid Turner, Mar 19, 2016
  9. 06/17 index-helper: add --detachDavid Turner, Mar 19, 2016
  10. Duy NguyenMar 29, 2016
  11. 07/17 read-cache: add watchman 'WAMA' extensionDavid Turner, Mar 19, 2016
  12. 08/17 read-cache: invalidate untracked cache data when reading WAMADavid Turner, Mar 19, 2016
  13. Duy NguyenMar 29, 2016
  14. David TurnerMar 29, 2016
  15. 09/17 Add watchman support to reduce index refresh costDavid Turner, Mar 19, 2016
  16. Jeff HostetlerMar 24, 2016
  17. David TurnerMar 24, 2016
  18. 10/17 index-helper: use watchman to avoid refreshing index with lstat()David Turner, Mar 19, 2016
  19. 11/17 update-index: enable/disable watchman supportDavid Turner, Mar 19, 2016
  20. 12/17 unpack-trees: preserve index extensionsDavid Turner, Mar 19, 2016
  21. 13/17 index-helper: kill modeDavid Turner, Mar 19, 2016
  22. 14/17 index-helper: don't run if already runningDavid Turner, Mar 19, 2016
  23. 15/17 index-helper: autorun modeDavid Turner, Mar 19, 2016
  24. 16/17 index-helper: optionally automatically runDavid Turner, Mar 19, 2016
  25. 17/17 read-cache: config for waiting for index-helperDavid Turner, Mar 19, 2016

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.