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

Re: [PATCH 19/23] fsmonitor--daemon: use a cookie file to sync with file system

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
May 3, 2021, 21:59 UTC
Message-ID
<6bea878c-a9b6-ea88-0364-dc6ff60155f5@jeffhostetler.com>
In-Reply-To
<5669d313-4084-dceb-1204-acd005e58657@gmail.com>
On 4/27/21 10:23 AM, Derrick Stolee wrote:
Show 13 quoted lines
> On 4/1/2021 11:41 AM, Jeff Hostetler via GitGitGadget wrote:
>> From: Jeff Hostetler <jeffhost@microsoft.com>
>>
>> Teach fsmonitor--daemon client threads to create a cookie file
>> inside the .git directory and then wait until FS events for the
>> cookie are observed by the FS listener thread.
>>
>> This helps address the racy nature of file system events by
>> blocking the client response until the kernel has drained any
>> event backlog.
> 
> This description matches my expectation of the cookie file,
> which furthers my confusion about GIT_TEST_FSMONITOR_CLIENT_DELAY.

I'm going to try to create the cookie earlier in the thread and see if that lets me eliminate the delay. I don't remember if I added the delay first and then the cookie when I was testing or not. IIRC I was switching between the 2 techniques at one point.

Show 18 quoted lines
> 
>> +enum fsmonitor_cookie_item_result {
>> +	FCIR_ERROR = -1, /* could not create cookie file ? */
>> +	FCIR_INIT = 0,
>> +	FCIR_SEEN,
>> +	FCIR_ABORT,
>> +};
>> +
>> +struct fsmonitor_cookie_item {
>> +	struct hashmap_entry entry;
>> +	const char *name;
>> +	enum fsmonitor_cookie_item_result result;
>> +};
>> +
>> +static int cookies_cmp(const void *data, const struct hashmap_entry *he1,
>> +		     const struct hashmap_entry *he2, const void *keydata)
> 
> I'm interested to see why a hashset is necessary.

I suppose I could search a linked list of active cookies, but this seemed easier. Basically, we have an active cookie (and a socket listener thread blocked) for each active client connection. When the FS event thread receives an FS notification for a cookie file, it needs to do a quick lookup on the cookie file and release the associate socket thread.

Given that we're only likely to have a few clients connected at any given time, a list might be faster.

Show 15 quoted lines
> 
>> +static enum fsmonitor_cookie_item_result fsmonitor_wait_for_cookie(
>> +	struct fsmonitor_daemon_state *state)
>> +{
>> +	int fd;
>> +	struct fsmonitor_cookie_item cookie;
>> +	struct strbuf cookie_pathname = STRBUF_INIT;
>> +	struct strbuf cookie_filename = STRBUF_INIT;
>> +	const char *slash;
>> +	int my_cookie_seq;
>> +
>> +	pthread_mutex_lock(&state->main_lock);
> 
> Hm. We are entering a locked region. I hope this is only for the
> cookie write and not the entire waiting period.

I'm taking the lock to increment the cookie_seq and to add the hash-entry to the hashmap mainly. The cond_wait() after the open() is an atomic unlock-and-wait-and-relock. So we wait there for the FS thread to tell us it has seen our cookie file. Then we remove our hash-entry from the hashmap and unlock.

Yes, I am doing several things here, but it didn't seem worth it to lock-unlock-lock-unlock-lock-cond_wait...

Show 27 quoted lines
> 
>> +	my_cookie_seq = state->cookie_seq++;
>> +
>> +	strbuf_addbuf(&cookie_pathname, &state->path_cookie_prefix);
>> +	strbuf_addf(&cookie_pathname, "%i-%i", getpid(), my_cookie_seq);
>> +
>> +	slash = find_last_dir_sep(cookie_pathname.buf);
>> +	if (slash)
>> +		strbuf_addstr(&cookie_filename, slash + 1);
>> +	else
>> +		strbuf_addbuf(&cookie_filename, &cookie_pathname);
> 
> This business about the slash-or-not-slash is good defensive
> programming. I imagine the only possible way for there to not
> be a slash is if the Git process is running with the .git
> directory as its working directory?
> 
>> +	cookie.name = strbuf_detach(&cookie_filename, NULL);
>> +	cookie.result = FCIR_INIT;
>> +	// TODO should we have case-insenstive hash (and in cookie_cmp()) ??
> 
> This TODO comment should be cleaned up. Doesn't match C-style, either.
> 
> As for the question, I believe that we can limit ourselves to names that
> don't need case-insensitive hashes and trust that the filesystem will not
> change the case. Using lowercase letters should help with this.
> 

I'm going to redo the pathname construction (to solve a conflict with VSCode) and will clean up this.

Show 16 quoted lines
>> +	hashmap_entry_init(&cookie.entry, strhash(cookie.name));
>> +
>> +	/*
>> +	 * Warning: we are putting the address of a stack variable into a
>> +	 * global hashmap.  This feels dodgy.  We must ensure that we remove
>> +	 * it before this thread and stack frame returns.
>> +	 */
>> +	hashmap_add(&state->cookies, &cookie.entry);
> 
> I saw this warning and thought about avoiding it by using the heap, but
> even with a heap pointer we need to be careful to remove the result
> before returning and stopping the thread.
> 
> However, there is likely a higher potential of a bug leading to a
> security issue through an error causing stack corruption and unsafe
> code execution. Perhaps it is worth converting to using heap data here.
I never liked the stack buffer.  I'm going to move it to the heap.
Show 15 quoted lines
> 
>> +	trace_printf_key(&trace_fsmonitor, "cookie-wait: '%s' '%s'",
>> +			 cookie.name, cookie_pathname.buf);
>> +
>> +	/*
>> +	 * Create the cookie file on disk and then wait for a notification
>> +	 * that the listener thread has seen it.
>> +	 */
>> +	fd = open(cookie_pathname.buf, O_WRONLY | O_CREAT | O_EXCL, 0600);
>> +	if (fd >= 0) {
>> +		close(fd);
>> +		unlink_or_warn(cookie_pathname.buf);
> 
> Interesting that we are ignoring the warning here. Is it possible that
> these cookie files will continue to grow if this unlink fails?

It is possible that the unlink() could fail, but I'm not sure what we can do about it. The FS event from the open() (and/or the close()) will be sufficient to wake up this thread.

Show 10 quoted lines
> 
>> +
>> +		while (cookie.result == FCIR_INIT)
>> +			pthread_cond_wait(&state->cookies_cond,
>> +					  &state->main_lock);
> 
> Ok, we are waiting here for another thread to signal that the cookie
> file has been found in the events. What happens if the event gets lost?
> I'll look for a later signal that cookie.result can change based on a
> timeout, too.

I'd like to use `pthread_cond_timedwait()` here, but I'm not sure it is supported everywhere.

I do have code in the FS layers to dump/alert all cookies at certain times, such as loss of sync.

Show 13 quoted lines
> 
>> +
>> +		hashmap_remove(&state->cookies, &cookie.entry, NULL);
>> +	} else {
>> +		error_errno(_("could not create fsmonitor cookie '%s'"),
>> +			    cookie.name);
>> +
>> +		cookie.result = FCIR_ERROR;
>> +		hashmap_remove(&state->cookies, &cookie.entry, NULL);
>> +	}
> 
> Both blocks here remove the cookie entry, so move it to the end of the
> method with the other cleanups.
I can move it outside of the IF, but it has to be before we unlock.
Show 8 quoted lines
> 
>> +
>> +	pthread_mutex_unlock(&state->main_lock);
> 
> Hm. We are locking the main state throughout this process. I suppose that
> the listener thread could be watching multiple repos and updating them
> while we wait here for one repo to update. This is a larger lock window
> than I was hoping for, but I don't currently see how to reduce it safely.

We only watch a single repo/working directory. We're locking because we could have multiple clients all hitting us at the same time.

Show 7 quoted lines
> 
>> +
>> +	free((char*)cookie.name);
>> +	strbuf_release(&cookie_pathname);
>> +	return cookie.result;
> 
> Remove the cookie from the hashset along with these lines.
No, it has to be within the lock above.
Show 15 quoted lines
> 
>> +}
>> +
>> +/*
>> + * Mark these cookies as _SEEN and wake up the corresponding client threads.
>> + */
>> +static void fsmonitor_cookie_mark_seen(struct fsmonitor_daemon_state *state,
>> +				       const struct string_list *cookie_names)
>> +{
>> +	/* assert state->main_lock */
> 
> I'm now confused what this is trying to document. The 'state' should be
> locked by another thread while we are waiting for a cookie response, so
> this method is updating the cookie as seen from a different thread that
> doesn't have the lock.

I'm trying to document that this function must be called while the thread is holding the main lock (without paying for a lock check or trying to do a recursive lock or whatever).

Since it is a little static function and I control the 2 or 3 callers, I can just visually check this without fuss.

Show 23 quoted lines
> 
> ...
>> +/*
>> + * Set _ABORT on all pending cookies and wake up all client threads.
>> + */
>> +static void fsmonitor_cookie_abort_all(struct fsmonitor_daemon_state *state)
> ...
> 
>> + * [2] Some of those lost events may have been for cookie files.  We
>> + *     should assume the worst and abort them rather letting them starve.
>> + *
>>    * If there are no readers of the the current token data series, we
>>    * can free it now.  Otherwise, let the last reader free it.  Either
>>    * way, the old token data series is no longer associated with our
>> @@ -454,6 +600,8 @@ void fsmonitor_force_resync(struct fsmonitor_daemon_state *state)
>>   			 state->current_token_data->token_id.buf,
>>   			 new_one->token_id.buf);
>>   
>> +	fsmonitor_cookie_abort_all(state);
>> +
> 
> I see we abort here if we force a resync. I lost the detail of whether
> this is triggered by a timeout, too.

I don't currently have a cookie timeout for each thread. I'd like to use pthread_cond_timedwait(), but I didn't see it in the compat headers, so I'm not sure if it is portable. I'll make a note to look into this again.

Show 17 quoted lines
> 
>> @@ -654,6 +803,39 @@ static int do_handle_client(struct fsmonitor_daemon_state *state,
>>   		goto send_trivial_response;
>>   	}
>>   
>> +	pthread_mutex_unlock(&state->main_lock);
>> +
>> +	/*
>> +	 * Write a cookie file inside the directory being watched in an
>> +	 * effort to flush out existing filesystem events that we actually
>> +	 * care about.  Suspend this client thread until we see the filesystem
>> +	 * events for this cookie file.
>> +	 */
>> +	cookie_result = fsmonitor_wait_for_cookie(state);
> 
> Odd that we unlock before calling this method, then just take the lock
> again inside of it.
Yeah, I didn't like doing that.  I'll revisit.
Show 39 quoted lines
> 
>> +	if (cookie_result != FCIR_SEEN) {
>> +		error(_("fsmonitor: cookie_result '%d' != SEEN"),
>> +		      cookie_result);
>> +		result = 0;
>> +		goto send_trivial_response;
>> +	}
>> +
>> +	pthread_mutex_lock(&state->main_lock);
>> +
>> +	if (strcmp(requested_token_id.buf,
>> +		   state->current_token_data->token_id.buf)) {
>> +		/*
>> +		 * Ack! The listener thread lost sync with the filesystem
>> +		 * and created a new token while we were waiting for the
>> +		 * cookie file to be created!  Just give up.
>> +		 */
>> +		pthread_mutex_unlock(&state->main_lock);
>> +
>> +		trace_printf_key(&trace_fsmonitor,
>> +				 "lost filesystem sync");
>> +		result = 0;
>> +		goto send_trivial_response;
>> +	}
>> +
>>   	/*
>>   	 * We're going to hold onto a pointer to the current
>>   	 * token-data while we walk the list of batches of files.
>> @@ -982,6 +1164,9 @@ void fsmonitor_publish(struct fsmonitor_daemon_state *state,
>>   		}
>>   	}
>>   
>> +	if (cookie_names->nr)
>> +		fsmonitor_cookie_mark_seen(state, cookie_names);
>> +
> 
> I was confused as to what updates 'cookie_names', but it appears that
> these are updated in the platform-specific code. That seems to happen
> in later patches.

Yes, this is a list of the cookies that the platform layer saw events for. It was passed in along with the set of batched paths. So the platform code can "publish/prepend" a new set of changed paths and wake any threads whose cookie was seen.

> 
> Thanks,
> -Stolee
> 

Thanks, Jeff

Previous: Derrick StoleeNext: Jeff Hostetler via GitGitGadget
Message 13 of 237 in “[RFC] Builtin FSMonitor Feature”
  1. 00/23 [RFC] Builtin FSMonitor FeatureJeff Hostetler via GitGitGadget, Apr 1, 2021
  2. 17/23 fsmonitor--daemon: periodically truncate list of modified filesJeff Hostetler via GitGitGadget, Apr 1, 2021
  3. Derrick StoleeApr 27, 2021
  4. 14/23 fsmonitor-fs-listen-macos: add macos header files for FSEventJeff Hostetler via GitGitGadget, Apr 1, 2021
  5. Derrick StoleeApr 27, 2021
  6. 06/23 fsmonitor--daemon: implement client command optionsJeff Hostetler via GitGitGadget, Apr 1, 2021
  7. Derrick StoleeApr 26, 2021
  8. Jeff HostetlerApr 30, 2021
  9. 20/23 fsmonitor: force update index when fsmonitor token advancesJeff Hostetler via GitGitGadget, Apr 1, 2021
  10. Derrick StoleeApr 27, 2021
  11. 19/23 fsmonitor--daemon: use a cookie file to sync with file systemJeff Hostetler via GitGitGadget, Apr 1, 2021
  12. Derrick StoleeApr 27, 2021
  13. Jeff HostetlerMay 3, 2021
  14. 02/23 fsmonitor-ipc: create client routines for git-fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  15. Derrick StoleeApr 26, 2021
  16. Eric SunshineApr 26, 2021
  17. Derrick StoleeApr 26, 2021
  18. Jeff HostetlerApr 28, 2021
  19. 04/23 fsmonitor: introduce `core.useBuiltinFSMonitor` to call the daemon via IPCJohannes Schindelin via GitGitGadget, Apr 1, 2021
  20. Derrick StoleeApr 26, 2021
  21. Ævar Arnfjörð BjarmasonApr 27, 2021
  22. Derrick StoleeApr 27, 2021
  23. Ævar Arnfjörð BjarmasonApr 28, 2021
  24. repo-settings.c: simplify the setupÆvar Arnfjörð Bjarmason, Apr 28, 2021
  25. Nesting topics within other threads (was: [PATCH] repo-settings.c: simplify the setup)Derrick Stolee, Apr 28, 2021
  26. Ævar Arnfjörð BjarmasonApr 28, 2021
  27. Johannes SchindelinMay 5, 2021
  28. Junio C HamanoApr 29, 2021
  29. Ævar Arnfjörð BjarmasonApr 29, 2021
  30. Jeff KingApr 29, 2021
  31. Junio C HamanoApr 30, 2021
  32. Jeff HostetlerApr 30, 2021
  33. 15/23 fsmonitor-fs-listen-macos: implement FSEvent listener on MacOSJeff Hostetler via GitGitGadget, Apr 1, 2021
  34. Derrick StoleeApr 27, 2021
  35. Jeff HostetlerApr 30, 2021
  36. 12/23 fsmonitor--daemon: create token-based changed path cacheJeff Hostetler via GitGitGadget, Apr 1, 2021
  37. Derrick StoleeApr 26, 2021
  38. Jeff HostetlerApr 30, 2021
  39. 09/23 fsmonitor--daemon: implement daemon command optionsJeff Hostetler via GitGitGadget, Apr 1, 2021
  40. Derrick StoleeApr 26, 2021
  41. Derrick StoleeApr 26, 2021
  42. Jeff HostetlerApr 30, 2021
  43. Jeff HostetlerApr 30, 2021
  44. 11/23 fsmonitor--daemon: define token-idsJeff Hostetler via GitGitGadget, Apr 1, 2021
  45. Derrick StoleeApr 26, 2021
  46. Eric SunshineApr 26, 2021
  47. Derrick StoleeApr 26, 2021
  48. Jeff HostetlerApr 30, 2021
  49. 23/23 t7527: test status with untracked-cache and fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  50. Derrick StoleeApr 27, 2021
  51. 21/23 t7527: create test for fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  52. Derrick StoleeApr 27, 2021
  53. 16/23 fsmonitor--daemon: implement handle_client callbackJeff Hostetler via GitGitGadget, Apr 1, 2021
  54. Derrick StoleeApr 26, 2021
  55. Jeff HostetlerMay 3, 2021
  56. Derrick StoleeMay 13, 2021
  57. 05/23 fsmonitor--daemon: add a built-in fsmonitor daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  58. Derrick StoleeApr 26, 2021
  59. Derrick StoleeApr 26, 2021
  60. Jeff HostetlerApr 30, 2021
  61. 08/23 fsmonitor-fs-listen-macos: stub in backend for MacOSJeff Hostetler via GitGitGadget, Apr 1, 2021
  62. 18/23 fsmonitor--daemon:: introduce client delay for testingJeff Hostetler via GitGitGadget, Apr 1, 2021
  63. Derrick StoleeApr 27, 2021
  64. 13/23 fsmonitor-fs-listen-win32: implement FSMonitor backend on WindowsJeff Hostetler via GitGitGadget, Apr 1, 2021
  65. Derrick StoleeApr 27, 2021
  66. Eric SunshineApr 27, 2021
  67. Jeff HostetlerApr 30, 2021
  68. 22/23 p7519: add fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  69. Derrick StoleeApr 27, 2021
  70. 10/23 fsmonitor--daemon: add pathname classificationJeff Hostetler via GitGitGadget, Apr 1, 2021
  71. Derrick StoleeApr 26, 2021
  72. Eric SunshineApr 26, 2021
  73. Derrick StoleeApr 26, 2021
  74. 03/23 config: FSMonitor is repository-specificJohannes Schindelin via GitGitGadget, Apr 1, 2021
  75. 07/23 fsmonitor-fs-listen-win32: stub in backend for WindowsJeff Hostetler via GitGitGadget, Apr 1, 2021
  76. Derrick StoleeApr 26, 2021
  77. 01/23 fsmonitor--daemon: man page and documentationJeff Hostetler via GitGitGadget, Apr 1, 2021
  78. Derrick StoleeApr 26, 2021
  79. Jeff HostetlerApr 28, 2021
  80. Junio C HamanoApr 16, 2021
  81. Johannes SchindelinApr 20, 2021
  82. Jeff HostetlerApr 20, 2021
  83. Derrick StoleeApr 21, 2021
  84. FS Monitor Windows Performance (was [PATCH 00/23] [RFC] Builtin FSMonitor Feature)Derrick Stolee, Apr 27, 2021
  85. FS Monitor macOS Performance (was [PATCH 00/23] [RFC] Builtin FSMonitor Feature)Derrick Stolee, Apr 27, 2021
  86. 00/28 Builtin FSMonitor FeatureJeff Hostetler via GitGitGadget, May 22, 2021
  87. 01/28 simple-ipc: preparations for supporting binary messages.Jeff Hostetler via GitGitGadget, May 22, 2021
  88. 05/28 help: include fsmonitor--daemon feature flag in version infoJeff Hostetler via GitGitGadget, May 22, 2021
  89. 03/28 fsmonitor--daemon: update fsmonitor documentationJeff Hostetler via GitGitGadget, May 22, 2021
  90. 02/28 fsmonitor--daemon: man pageJeff Hostetler via GitGitGadget, May 22, 2021
  91. 04/28 fsmonitor-ipc: create client routines for git-fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  92. Johannes SchindelinJun 2, 2021
  93. Johannes SchindelinJun 14, 2021
  94. 06/28 config: FSMonitor is repository-specificJohannes Schindelin via GitGitGadget, May 22, 2021
  95. 08/28 fsmonitor--daemon: add a built-in fsmonitor daemonJeff Hostetler via GitGitGadget, May 22, 2021
  96. 07/28 fsmonitor: introduce `core.useBuiltinFSMonitor` to call the daemon via IPCJohannes Schindelin via GitGitGadget, May 22, 2021
  97. Johannes SchindelinJun 14, 2021
  98. 09/28 fsmonitor--daemon: implement client command optionsJeff Hostetler via GitGitGadget, May 22, 2021
  99. 10/28 t/helper/fsmonitor-client: create IPC client to talk to FSMonitor DaemonJeff Hostetler via GitGitGadget, May 22, 2021
  100. Junio C HamanoJun 11, 2021
  101. 12/28 fsmonitor-fs-listen-macos: stub in backend for MacOSJeff Hostetler via GitGitGadget, May 22, 2021
  102. 11/28 fsmonitor-fs-listen-win32: stub in backend for WindowsJeff Hostetler via GitGitGadget, May 22, 2021
  103. 13/28 fsmonitor--daemon: implement daemon command optionsJeff Hostetler via GitGitGadget, May 22, 2021
  104. 14/28 fsmonitor--daemon: add pathname classificationJeff Hostetler via GitGitGadget, May 22, 2021
  105. 17/28 fsmonitor-fs-listen-win32: implement FSMonitor backend on WindowsJeff Hostetler via GitGitGadget, May 22, 2021
  106. 16/28 fsmonitor--daemon: create token-based changed path cacheJeff Hostetler via GitGitGadget, May 22, 2021
  107. 15/28 fsmonitor--daemon: define token-idsJeff Hostetler via GitGitGadget, May 22, 2021
  108. 24/28 fsmonitor: force update index after large responsesJeff Hostetler via GitGitGadget, May 22, 2021
  109. 20/28 fsmonitor--daemon: implement handle_client callbackJeff Hostetler via GitGitGadget, May 22, 2021
  110. 21/28 fsmonitor--daemon: periodically truncate list of modified filesJeff Hostetler via GitGitGadget, May 22, 2021
  111. 19/28 fsmonitor-fs-listen-macos: implement FSEvent listener on MacOSJeff Hostetler via GitGitGadget, May 22, 2021
  112. 18/28 fsmonitor-fs-listen-macos: add macos header files for FSEventJeff Hostetler via GitGitGadget, May 22, 2021
  113. 23/28 fsmonitor: enhance existing commentsJeff Hostetler via GitGitGadget, May 22, 2021
  114. 22/28 fsmonitor--daemon: use a cookie file to sync with file systemJeff Hostetler via GitGitGadget, May 22, 2021
  115. Johannes SchindelinJun 14, 2021
  116. 25/28 t7527: create test for fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  117. 26/28 p7519: add fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  118. 27/28 t7527: test status with untracked-cache and fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  119. 28/28 t/perf: avoid copying builtin fsmonitor files into test repoJeff Hostetler via GitGitGadget, May 22, 2021
  120. Junio C HamanoMay 27, 2021
  121. Johannes SchindelinJun 2, 2021
  122. Jeff HostetlerJun 22, 2021
  123. 00/34 Builtin FSMonitor FeatureJeff Hostetler via GitGitGadget, Jul 1, 2021
  124. 02/34 fsmonitor--daemon: man pageJeff Hostetler via GitGitGadget, Jul 1, 2021
  125. Ævar Arnfjörð BjarmasonJul 1, 2021
  126. Johannes SchindelinJul 5, 2021
  127. Jeff HostetlerJul 12, 2021
  128. Ævar Arnfjörð BjarmasonJul 13, 2021
  129. Johannes SchindelinJul 16, 2021
  130. Felipe ContrerasJul 16, 2021
  131. 01/34 simple-ipc: preparations for supporting binary messages.Jeff Hostetler via GitGitGadget, Jul 1, 2021
  132. 04/34 fsmonitor-ipc: create client routines for git-fsmonitor--daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  133. 05/34 help: include fsmonitor--daemon feature flag in version infoJeff Hostetler via GitGitGadget, Jul 1, 2021
  134. 03/34 fsmonitor--daemon: update fsmonitor documentationJeff Hostetler via GitGitGadget, Jul 1, 2021
  135. Ævar Arnfjörð BjarmasonJul 1, 2021
  136. 07/34 fsmonitor: use IPC to query the builtin FSMonitor daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  137. 08/34 fsmonitor--daemon: add a built-in fsmonitor daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  138. Ævar Arnfjörð BjarmasonJul 1, 2021
  139. Jeff HostetlerJul 19, 2021
  140. 06/34 fsmonitor: config settings are repository-specificJeff Hostetler via GitGitGadget, Jul 1, 2021
  141. Ævar Arnfjörð BjarmasonJul 1, 2021
  142. Jeff HostetlerJul 19, 2021
  143. 09/34 fsmonitor--daemon: implement 'stop' and 'status' commandsJeff Hostetler via GitGitGadget, Jul 1, 2021
  144. 11/34 fsmonitor-fs-listen-win32: stub in backend for WindowsJeff Hostetler via GitGitGadget, Jul 1, 2021
  145. Ævar Arnfjörð BjarmasonJul 1, 2021
  146. Johannes SchindelinJul 16, 2021
  147. Ævar Arnfjörð BjarmasonJul 16, 2021
  148. Junio C HamanoJul 17, 2021
  149. Junio C HamanoJul 17, 2021
  150. Ævar Arnfjörð BjarmasonJul 17, 2021
  151. Junio C HamanoJul 19, 2021
  152. Felipe ContrerasJul 16, 2021
  153. Jeff HostetlerJul 19, 2021
  154. Ævar Arnfjörð BjarmasonJul 20, 2021
  155. 13/34 fsmonitor--daemon: implement 'run' commandJeff Hostetler via GitGitGadget, Jul 1, 2021
  156. 10/34 t/helper/fsmonitor-client: create IPC client to talk to FSMonitor DaemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  157. Ævar Arnfjörð BjarmasonJul 1, 2021
  158. 12/34 fsmonitor-fs-listen-macos: stub in backend for MacOSJeff Hostetler via GitGitGadget, Jul 1, 2021
  159. Ævar Arnfjörð BjarmasonJul 1, 2021
  160. Johannes SchindelinJul 16, 2021
  161. Ævar Arnfjörð BjarmasonJul 16, 2021
  162. Johannes SchindelinJul 26, 2021
  163. Junio C HamanoJul 26, 2021
  164. Jeff HostetlerJul 27, 2021
  165. Ævar Arnfjörð BjarmasonJul 27, 2021
  166. Junio C HamanoJul 27, 2021
  167. Felipe ContrerasJul 27, 2021
  168. 14/34 fsmonitor--daemon: implement 'start' commandJeff Hostetler via GitGitGadget, Jul 1, 2021
  169. Ævar Arnfjörð BjarmasonJul 1, 2021
  170. Johannes SchindelinJul 5, 2021
  171. Jeff HostetlerJul 13, 2021
  172. Ævar Arnfjörð BjarmasonJul 13, 2021
  173. Jeff HostetlerJul 13, 2021
  174. Ævar Arnfjörð BjarmasonJul 20, 2021
  175. 15/34 fsmonitor: do not try to operate on bare reposJeff Hostetler via GitGitGadget, Jul 1, 2021
  176. Ævar Arnfjörð BjarmasonJul 1, 2021
  177. 16/34 fsmonitor--daemon: add pathname classificationJeff Hostetler via GitGitGadget, Jul 1, 2021
  178. 18/34 fsmonitor--daemon: create token-based changed path cacheJeff Hostetler via GitGitGadget, Jul 1, 2021
  179. 17/34 fsmonitor--daemon: define token-idsJeff Hostetler via GitGitGadget, Jul 1, 2021
  180. Ævar Arnfjörð BjarmasonJul 1, 2021
  181. Jeff HostetlerJul 13, 2021
  182. Ævar Arnfjörð BjarmasonJul 13, 2021
  183. 20/34 fsmonitor-fs-listen-macos: add macos header files for FSEventJeff Hostetler via GitGitGadget, Jul 1, 2021
  184. 19/34 fsmonitor-fs-listen-win32: implement FSMonitor backend on WindowsJeff Hostetler via GitGitGadget, Jul 1, 2021
  185. Ævar Arnfjörð BjarmasonJul 1, 2021
  186. Jeff HostetlerJul 13, 2021
  187. Ævar Arnfjörð BjarmasonJul 13, 2021
  188. Johannes SchindelinJul 16, 2021
  189. Ævar Arnfjörð BjarmasonJul 16, 2021
  190. Eric WongJul 17, 2021
  191. Jeff HostetlerJul 19, 2021
  192. Felipe ContrerasJul 16, 2021
  193. Johannes SchindelinJul 6, 2021
  194. Jeff HostetlerJul 13, 2021
  195. 23/34 t/helper/test-touch: add helper to touch a series of filesJeff Hostetler via GitGitGadget, Jul 1, 2021
  196. Junio C HamanoJul 1, 2021
  197. Jeff HostetlerJul 13, 2021
  198. 24/34 t/perf/p7519: speed up test using "test-tool touch"Jeff Hostetler via GitGitGadget, Jul 1, 2021
  199. Ævar Arnfjörð BjarmasonJul 1, 2021
  200. Jeff HostetlerJul 13, 2021
  201. Elijah NewrenJul 13, 2021
  202. Junio C HamanoJul 13, 2021
  203. Elijah NewrenJul 13, 2021
  204. Jeff HostetlerJul 13, 2021
  205. Junio C HamanoJul 13, 2021
  206. Jeff HostetlerJul 13, 2021
  207. Ævar Arnfjörð BjarmasonJul 13, 2021
  208. Jeff HostetlerJul 13, 2021
  209. Ævar Arnfjörð BjarmasonJul 20, 2021
  210. Jeff HostetlerJul 13, 2021
  211. 22/34 fsmonitor--daemon: implement handle_client callbackJeff Hostetler via GitGitGadget, Jul 1, 2021
  212. 21/34 fsmonitor-fs-listen-macos: implement FSEvent listener on MacOSJeff Hostetler via GitGitGadget, Jul 1, 2021
  213. 25/34 t/perf: avoid copying builtin fsmonitor files into test repoJeff Hostetler via GitGitGadget, Jul 1, 2021
  214. Ævar Arnfjörð BjarmasonJul 1, 2021
  215. 29/34 fsmonitor--daemon: use a cookie file to sync with file systemJeff Hostetler via GitGitGadget, Jul 1, 2021
  216. Ævar Arnfjörð BjarmasonJul 1, 2021
  217. Jeff HostetlerJul 21, 2021
  218. 27/34 t7527: create test for fsmonitor--daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  219. Ævar Arnfjörð BjarmasonJul 1, 2021
  220. 26/34 t/perf/p7519: add fsmonitor--daemon test casesJeff Hostetler via GitGitGadget, Jul 1, 2021
  221. 28/34 fsmonitor--daemon: periodically truncate list of modified filesJeff Hostetler via GitGitGadget, Jul 1, 2021
  222. 30/34 fsmonitor: enhance existing commentsJeff Hostetler via GitGitGadget, Jul 1, 2021
  223. 32/34 t7527: test status with untracked-cache and fsmonitor--daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  224. 31/34 fsmonitor: force update index after large responsesJeff Hostetler via GitGitGadget, Jul 1, 2021
  225. 33/34 fsmonitor: handle shortname for .gitJeff Hostetler via GitGitGadget, Jul 1, 2021
  226. 34/34 t7527: test FS event reporing on MacOS WRT case and UnicodeJeff Hostetler via GitGitGadget, Jul 1, 2021
  227. Ævar Arnfjörð BjarmasonJul 1, 2021
  228. Ævar Arnfjörð BjarmasonJul 1, 2021
  229. Jeff HostetlerJul 1, 2021
  230. Ævar Arnfjörð BjarmasonJul 1, 2021
  231. Jeff HostetlerJul 2, 2021
  232. Ævar Arnfjörð BjarmasonJul 5, 2021
  233. Johannes SchindelinJul 5, 2021
  234. Ævar Arnfjörð BjarmasonJul 5, 2021
  235. Johannes SchindelinJul 6, 2021
  236. Felipe ContrerasJul 7, 2021
  237. Felipe ContrerasJul 7, 2021

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.