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

Re: [PATCH 1/3] scalar: enable built-in FSMonitor on `register`

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 16, 2022, 20:49 UTC
Message-ID
<xmqq4jybud6h.fsf@gitster.g>
In-Reply-To
<62682ccf6964d6eebb67491db4a9476dbab56671.1660673269.git.gitgitgadget@gmail.com>

"Matthew John Cheetham via GitGitGadget" <gitgitgadget@gmail.com> writes:

Show 27 quoted lines
> +static int start_fsmonitor_daemon(void)
> +{
> +	int res = 0;
> +	if (fsmonitor_ipc__is_supported() &&
> +	    fsmonitor_ipc__get_state() != IPC_STATE__LISTENING) {
> +		struct strbuf err = STRBUF_INIT;
> +		struct child_process cp = CHILD_PROCESS_INIT;
> +
> +		/* Try to start the FSMonitor daemon */
> +		cp.git_cmd = 1;
> +		strvec_pushl(&cp.args, "fsmonitor--daemon", "start", NULL);
> +		if (!pipe_command(&cp, NULL, 0, NULL, 0, &err, 0)) {
> +			/* Successfully started FSMonitor */
> +			strbuf_release(&err);
> +			return 0;
> +		}
> +
> +		/* If FSMonitor really hasn't started, emit error */
> +		if (fsmonitor_ipc__get_state() != IPC_STATE__LISTENING)
> +			res = error(_("could not start the FSMonitor daemon: %s"),
> +				    err.buf);
> +
> +		strbuf_release(&err);
> +	}
> +
> +	return res;
> +}

This somewhat curious code structure made me look, and made me notice that the behaviour is even more curious. Even though pipe_command() fails, fsmonitor_ipc__get_state() can somehow become LISTENING, in which case we are OK? If that is the case, a more natural way to write it would be:

	int res = 0; /* assume success */
	if (fsmonitor_ipc__is_supported() &&
            fsmonitor_ipc__get_state() != IPC_STATE__LISTENING) {
		...
                /* 
                 * if we fail to start it ourselves, and there is no
                 * daemon listening to us, it is an error.
                 */
		if (pipe_command(...) &&
		    fsmonitor_ipc__get_state() != IPC_STATE__LISTENING)
			res = error(...);
		strbuf_release(&err);
	}
	return res;
and that would utilize "res" consistently throughout the function.

Note that (I omitted unnecessary blank lines and added necessary ones in the above outline of the rewrite.

Stopping, stepping back a bit and rethinking, the above is not still exactly right. If pipe_command() could lie and say "we failed to start" when we immediately after the failure can find a running daemon, what guarantees us that pipe_command() does not lie in the other direction? So, in that sense, perhaps doing

	/* we do not care if pipe_command() succeeds or not */
	(void) pipe_command(...);
        /*
         * we check ourselves if we do have a usable daemon 
         * and that is the authoritative answer.  we were asked
         * to ensure that usable daemon exists, and we answer
         * if we do or don't.
         */
	if (fsmonitor_ipc__get_state() != IPC_STATE__LISTENING)
		res = error(...);
may be more true to the spirit of the code.

It also is slightly curious if the caller wants to see "success" when fsmonitor is not supported. I would have expected the caller to check and refrain from calling start/stop when it is not supported (and if there is an end-user interface to force the scalar command to "start", complain by saying "not supported here"). But as long as we are consistent, I guess it is OK.

The side that stops shares exactly the same two pieces of "curiosity" and may need to be updated exactly the same way. It assumes that pipe_command() is unreliable and instead of reporting a possible failure, we sweep that under the rug, with a questionable "we do not care about pipe failing, as long as the daemon is listening, we do not care" attitude. And the caller does not care "start" not stopping where it is not supported.

Thanks.
Previous: Matthew John Cheetham via GitGitGadgetNext: Victoria Dye
Message 3 of 39 in “scalar: enable built-in FSMonitor”
  1. 0/3 scalar: enable built-in FSMonitorVictoria Dye via GitGitGadget, Aug 16, 2022
  2. 1/3 scalar: enable built-in FSMonitor on `register`Matthew John Cheetham via GitGitGadget, Aug 16, 2022
  3. Junio C HamanoAug 16, 2022
  4. Victoria DyeAug 16, 2022
  5. Junio C HamanoAug 16, 2022
  6. 2/3 scalar unregister: stop FSMonitor daemonJohannes Schindelin via GitGitGadget, Aug 16, 2022
  7. 3/3 scalar: update technical doc roadmap with FSMonitor supportVictoria Dye via GitGitGadget, Aug 16, 2022
  8. Junio C HamanoAug 16, 2022
  9. Victoria DyeAug 16, 2022
  10. Junio C HamanoAug 16, 2022
  11. 0/5 scalar: enable built-in FSMonitorVictoria Dye via GitGitGadget, Aug 16, 2022
  12. 1/5 scalar-unregister: handle error codes greater than 0Victoria Dye via GitGitGadget, Aug 16, 2022
  13. Junio C HamanoAug 17, 2022
  14. 2/5 scalar-[un]register: clearly indicate source of errorVictoria Dye via GitGitGadget, Aug 16, 2022
  15. 5/5 scalar: update technical doc roadmap with FSMonitor supportVictoria Dye via GitGitGadget, Aug 16, 2022
  16. 3/5 scalar: enable built-in FSMonitor on `register`Matthew John Cheetham via GitGitGadget, Aug 16, 2022
  17. Derrick StoleeAug 17, 2022
  18. Junio C HamanoAug 17, 2022
  19. Victoria DyeAug 17, 2022
  20. Derrick StoleeAug 18, 2022
  21. Junio C HamanoAug 17, 2022
  22. 4/5 scalar unregister: stop FSMonitor daemonJohannes Schindelin via GitGitGadget, Aug 16, 2022
  23. Derrick StoleeAug 17, 2022
  24. Victoria DyeAug 17, 2022
  25. Derrick StoleeAug 17, 2022
  26. Derrick StoleeAug 17, 2022
  27. 0/8 scalar: enable built-in FSMonitorVictoria Dye via GitGitGadget, Aug 18, 2022
  28. 1/8 scalar: constrain enlistment searchVictoria Dye via GitGitGadget, Aug 18, 2022
  29. Derrick StoleeAug 19, 2022
  30. 2/8 scalar-unregister: handle error codes greater than 0Victoria Dye via GitGitGadget, Aug 18, 2022
  31. 3/8 scalar-[un]register: clearly indicate source of errorVictoria Dye via GitGitGadget, Aug 18, 2022
  32. 4/8 scalar-delete: do not 'die()' in 'delete_enlistment()'Victoria Dye via GitGitGadget, Aug 18, 2022
  33. 6/8 scalar: enable built-in FSMonitor on `register`Matthew John Cheetham via GitGitGadget, Aug 18, 2022
  34. Derrick StoleeAug 19, 2022
  35. 8/8 scalar: update technical doc roadmap with FSMonitor supportVictoria Dye via GitGitGadget, Aug 18, 2022
  36. 5/8 scalar: move config setting logic into its own functionVictoria Dye via GitGitGadget, Aug 18, 2022
  37. 7/8 scalar unregister: stop FSMonitor daemonJohannes Schindelin via GitGitGadget, Aug 18, 2022
  38. Derrick StoleeAug 19, 2022
  39. Junio C HamanoAug 19, 2022

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.