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

Re: [PATCH 07/12] fsmonitor: refactor untracked-cache invalidation

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 14, 2024, 16:46 UTC
Message-ID
<xmqqo7cjxad3.fsf@gitster.g>
In-Reply-To
<1df4019931c29824b174defb75e09823d604219e.1707857541.git.gitgitgadget@gmail.com>
"Jeff Hostetler via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 6 quoted lines
> From: Jeff Hostetler <jeffhostetler@github.com>
>
> Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
> ---
>  fsmonitor.c | 38 ++++++++++++++++++++++++++------------
>  1 file changed, 26 insertions(+), 12 deletions(-)

Sorry, but the proposed commit log is way lacking for this particular step. Readers have already understood, after reading steps like [04/12] and [05/12], that you use the verb "refactor" in its usual sense, i.e. reorganize the code around without changing behaviour in order to enhance readability and to make it easier for code reuse in future steps, and these two steps did exactly that: helper functions are split out of larger functions, presumably either to allow adding new callers to the helpers, or to make the result of adding more code to the caller easier to follow [*].

However, the changes in this step look vastly different, and it is not even clear if this change intends to keep the behaviour before and after it the same, or if it does, how they are the same.

I can sort-of see that the original code made a call to untracked_cache_invalidate_path() at the very end of the fsmonitor_refresh_callback(), but the updated code no longer does so. Why? Is it because it is the root cause of an unstated bug that we don't do so until the end in the current code? Is it because the order does not matter (how and why?) and the resulting code becomes better (how? simpler to follow? more performant? avoids duplicated work? something else)?

It does not help to call a new helper function with a cryptic "my_" name, either.

Please try again?  Thanks.
[Footnote] 
 * These two are vastly different goals, and there may be other
   reasons why you are doing such refactoring.  It would have been
   nicer if such a preliminary refactoring steps had explained what
   the intended course of evolution for the code involved in the
   refactoring is.
Show 72 quoted lines
>
> diff --git a/fsmonitor.c b/fsmonitor.c
> index 754fe20cfd0..14585b6c516 100644
> --- a/fsmonitor.c
> +++ b/fsmonitor.c
> @@ -183,11 +183,35 @@ static int query_fsmonitor_hook(struct repository *r,
>  	return result;
>  }
>  
> +/*
> + * Invalidate the untracked cache for the given pathname.  Copy the
> + * buffer to a proper null-terminated string (since the untracked
> + * cache code does not use (buf, len) style argument).  Also strip any
> + * trailing slash.
> + */
> +static void my_invalidate_untracked_cache(
> +	struct index_state *istate, const char *name, int len)
> +{
> +	struct strbuf work_path = STRBUF_INIT;
> +
> +	if (!len)
> +		return;
> +
> +	if (name[len-1] == '/')
> +		len--;
> +
> +	strbuf_add(&work_path, name, len);
> +	untracked_cache_invalidate_path(istate, work_path.buf, 0);
> +	strbuf_release(&work_path);
> +}
> +
>  static void fsmonitor_refresh_callback_unqualified(
>  	struct index_state *istate, const char *name, int len, int pos)
>  {
>  	int i;
>  
> +	my_invalidate_untracked_cache(istate, name, len);
> +
>  	if (pos >= 0) {
>  		/*
>  		 * We have an exact match for this path and can just
> @@ -253,6 +277,8 @@ static int fsmonitor_refresh_callback_slash(
>  	int i;
>  	int nr_in_cone = 0;
>  
> +	my_invalidate_untracked_cache(istate, name, len);
> +
>  	if (pos < 0)
>  		pos = -pos - 1;
>  
> @@ -278,21 +304,9 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
>  
>  	if (name[len - 1] == '/') {
>  		fsmonitor_refresh_callback_slash(istate, name, len, pos);
> -
> -		/*
> -		 * We need to remove the traling "/" from the path
> -		 * for the untracked cache.
> -		 */
> -		name[len - 1] = '\0';
>  	} else {
>  		fsmonitor_refresh_callback_unqualified(istate, name, len, pos);
>  	}
> -
> -	/*
> -	 * Mark the untracked cache dirty even if it wasn't found in the index
> -	 * as it could be a new untracked file.
> -	 */
> -	untracked_cache_invalidate_path(istate, name, 0);
>  }
>  
>  /*
Previous: Jeff Hostetler via GitGitGadgetNext: Patrick Steinhardt
Message 25 of 91 in “FSMonitor edge cases on case-insensitive file systems”
  1. 00/12 FSMonitor edge cases on case-insensitive file systemsJeff Hostetler via GitGitGadget, Feb 13, 2024
  2. 01/12 sparse-index: pass string length to index_file_exists()Jeff Hostetler via GitGitGadget, Feb 13, 2024
  3. Junio C HamanoFeb 13, 2024
  4. Jeff HostetlerFeb 20, 2024
  5. 02/12 name-hash: add index_dir_exists2()Jeff Hostetler via GitGitGadget, Feb 13, 2024
  6. Junio C HamanoFeb 13, 2024
  7. Jeff HostetlerFeb 20, 2024
  8. Junio C HamanoFeb 20, 2024
  9. Patrick SteinhardtFeb 15, 2024
  10. 03/12 t7527: add case-insensitve test for FSMonitorJeff Hostetler via GitGitGadget, Feb 13, 2024
  11. 04/12 fsmonitor: refactor refresh callback on directory eventsJeff Hostetler via GitGitGadget, Feb 13, 2024
  12. Patrick SteinhardtFeb 15, 2024
  13. Jeff HostetlerFeb 20, 2024
  14. Patrick SteinhardtFeb 21, 2024
  15. 05/12 fsmonitor: refactor refresh callback for non-directory eventsJeff Hostetler via GitGitGadget, Feb 13, 2024
  16. Junio C HamanoFeb 14, 2024
  17. Patrick SteinhardtFeb 15, 2024
  18. 06/12 fsmonitor: clarify handling of directory events in callbackJeff Hostetler via GitGitGadget, Feb 13, 2024
  19. Junio C HamanoFeb 14, 2024
  20. Jeff HostetlerFeb 20, 2024
  21. Junio C HamanoFeb 20, 2024
  22. Patrick SteinhardtFeb 15, 2024
  23. Jeff HostetlerFeb 20, 2024
  24. 07/12 fsmonitor: refactor untracked-cache invalidationJeff Hostetler via GitGitGadget, Feb 13, 2024
  25. Junio C HamanoFeb 14, 2024
  26. Patrick SteinhardtFeb 15, 2024
  27. 08/12 fsmonitor: support case-insensitive directory eventsJeff Hostetler via GitGitGadget, Feb 13, 2024
  28. Patrick SteinhardtFeb 15, 2024
  29. 09/12 fsmonitor: refactor non-directory callbackJeff Hostetler via GitGitGadget, Feb 13, 2024
  30. Patrick SteinhardtFeb 15, 2024
  31. 10/12 fsmonitor: support case-insensitive non-directory eventsJeff Hostetler via GitGitGadget, Feb 13, 2024
  32. 11/12 fsmonitor: refactor bit invalidation in refresh callbackJeff Hostetler via GitGitGadget, Feb 13, 2024
  33. Patrick SteinhardtFeb 15, 2024
  34. 12/12 t7527: update case-insenstive fsmonitor testJeff Hostetler via GitGitGadget, Feb 13, 2024
  35. 00/16 FSMonitor edge cases on case-insensitive file systemsJeff Hostetler via GitGitGadget, Feb 23, 2024
  36. 01/16 name-hash: add index_dir_find()Jeff Hostetler via GitGitGadget, Feb 23, 2024
  37. Junio C HamanoFeb 23, 2024
  38. 03/16 t7527: temporarily disable case-insensitive testsJeff Hostetler via GitGitGadget, Feb 23, 2024
  39. Junio C HamanoFeb 23, 2024
  40. Jeff HostetlerFeb 26, 2024
  41. 02/16 t7527: add case-insensitve test for FSMonitorJeff Hostetler via GitGitGadget, Feb 23, 2024
  42. 05/16 fsmonitor: clarify handling of directory events in callback helperJeff Hostetler via GitGitGadget, Feb 23, 2024
  43. 04/16 fsmonitor: refactor refresh callback on directory eventsJeff Hostetler via GitGitGadget, Feb 23, 2024
  44. Junio C HamanoFeb 23, 2024
  45. 06/16 fsmonitor: refactor refresh callback for non-directory eventsJeff Hostetler via GitGitGadget, Feb 23, 2024
  46. Junio C HamanoFeb 23, 2024
  47. Torsten BögershausenFeb 25, 2024
  48. Junio C HamanoFeb 25, 2024
  49. 07/16 dir: create untracked_cache_invalidate_trimmed_path()Jeff Hostetler via GitGitGadget, Feb 23, 2024
  50. Torsten BögershausenFeb 25, 2024
  51. 08/16 fsmonitor: refactor untracked-cache invalidationJeff Hostetler via GitGitGadget, Feb 23, 2024
  52. 09/16 fsmonitor: move untracked invalidation into helper functionsJeff Hostetler via GitGitGadget, Feb 23, 2024
  53. Junio C HamanoFeb 23, 2024
  54. Jeff HostetlerFeb 26, 2024
  55. 10/16 fsmonitor: return invalidated cache-entry count on directory eventJeff Hostetler via GitGitGadget, Feb 23, 2024
  56. 11/16 fsmonitor: remove custom loop from non-directory path handlerJeff Hostetler via GitGitGadget, Feb 23, 2024
  57. Junio C HamanoFeb 23, 2024
  58. 13/16 fsmonitor: trace the new invalidated cache-entry countJeff Hostetler via GitGitGadget, Feb 23, 2024
  59. Junio C HamanoFeb 23, 2024
  60. 12/16 fsmonitor: return invalided cache-entry count on non-directory eventJeff Hostetler via GitGitGadget, Feb 23, 2024
  61. Junio C HamanoFeb 23, 2024
  62. 14/16 fsmonitor: support case-insensitive eventsJeff Hostetler via GitGitGadget, Feb 23, 2024
  63. Junio C HamanoFeb 23, 2024
  64. Jeff HostetlerFeb 26, 2024
  65. Junio C HamanoFeb 26, 2024
  66. Torsten BögershausenFeb 25, 2024
  67. Jeff HostetlerFeb 26, 2024
  68. 15/16 fsmonitor: refactor bit invalidation in refresh callbackJeff Hostetler via GitGitGadget, Feb 23, 2024
  69. Junio C HamanoFeb 23, 2024
  70. 16/16 t7527: update case-insenstive fsmonitor testJeff Hostetler via GitGitGadget, Feb 23, 2024
  71. 00/14 FSMonitor edge cases on case-insensitive file systemsJeff Hostetler via GitGitGadget, Feb 26, 2024
  72. 01/14 name-hash: add index_dir_find()Jeff Hostetler via GitGitGadget, Feb 26, 2024
  73. 02/14 t7527: add case-insensitve test for FSMonitorJeff Hostetler via GitGitGadget, Feb 26, 2024
  74. 03/14 fsmonitor: refactor refresh callback on directory eventsJeff Hostetler via GitGitGadget, Feb 26, 2024
  75. 04/14 fsmonitor: clarify handling of directory events in callback helperJeff Hostetler via GitGitGadget, Feb 26, 2024
  76. 05/14 fsmonitor: refactor refresh callback for non-directory eventsJeff Hostetler via GitGitGadget, Feb 26, 2024
  77. 06/14 dir: create untracked_cache_invalidate_trimmed_path()Jeff Hostetler via GitGitGadget, Feb 26, 2024
  78. 07/14 fsmonitor: refactor untracked-cache invalidationJeff Hostetler via GitGitGadget, Feb 26, 2024
  79. 08/14 fsmonitor: move untracked-cache invalidation into helper functionsJeff Hostetler via GitGitGadget, Feb 26, 2024
  80. 09/14 fsmonitor: return invalidated cache-entry count on directory eventJeff Hostetler via GitGitGadget, Feb 26, 2024
  81. 10/14 fsmonitor: remove custom loop from non-directory path handlerJeff Hostetler via GitGitGadget, Feb 26, 2024
  82. 11/14 fsmonitor: return invalided cache-entry count on non-directory eventJeff Hostetler via GitGitGadget, Feb 26, 2024
  83. Patrick SteinhardtMar 6, 2024
  84. 12/14 fsmonitor: trace the new invalidated cache-entry countJeff Hostetler via GitGitGadget, Feb 26, 2024
  85. 13/14 fsmonitor: refactor bit invalidation in refresh callbackJeff Hostetler via GitGitGadget, Feb 26, 2024
  86. 14/14 fsmonitor: support case-insensitive eventsJeff Hostetler via GitGitGadget, Feb 26, 2024
  87. Patrick SteinhardtMar 6, 2024
  88. Junio C HamanoFeb 27, 2024
  89. Patrick SteinhardtMar 6, 2024
  90. Junio C HamanoMar 6, 2024
  91. Jeff HostetlerMar 6, 2024

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.