From: Junio C Hamano <gitster@pobox.com>
To: "Eric DeCosta via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Eric DeCosta <edecosta@mathworks.com>
Subject: Re: [PATCH v3] fsmonitor: option to allow fsmonitor to run against network-mounted repos
Date: Thu, 11 Aug 2022 12:33:28 -0700 [thread overview]
Message-ID: <xmqqh72iefsn.fsf@gitster.g> (raw)
In-Reply-To: <pull.1317.v3.git.1660242752495.gitgitgadget@gmail.com> (Eric DeCosta via GitGitGadget's message of "Thu, 11 Aug 2022 18:32:32 +0000")
"Eric DeCosta via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Eric DeCosta <edecosta@mathworks.com>
>
> Though perhaps not common, there are uses cases where users have large,
> network-mounted repos. Having the ability to run fsmonitor against
> network paths would benefit those users.
>
> Most modern Samba-based filers have the necessary support to enable
> fsmonitor on network-mounted repos. As a first step towards enabling
> fsmonitor to work against network-mounted repos, introduce a
> configuration option, 'fsmonitor.allowRemote'. Setting this option to
> true will override the default behavior (erroring-out) when a
> network-mounted repo is detected by fsmonitor.
>
> Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
> ---
> ...
> compat/fsmonitor/fsm-settings-win32.c | 66 +++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
>
> diff --git a/compat/fsmonitor/fsm-settings-win32.c b/compat/fsmonitor/fsm-settings-win32.c
> index 907655720bb..32c0695c6c1 100644
> --- a/compat/fsmonitor/fsm-settings-win32.c
> +++ b/compat/fsmonitor/fsm-settings-win32.c
> @@ -24,6 +24,60 @@ static enum fsmonitor_reason check_vfs4git(struct repository *r)
> return FSMONITOR_REASON_OK;
> }
>
> +/*
> + * Check if monitoring remote working directories is allowed.
> + *
> + * By default, monitoring remote working directories is
> + * disabled unless on a network filesystem that is known to
> + * behave well. Users may override this behavior in enviroments where
> + * they have proper support.
> + */
After applying this patch, "unless on a network filesystem ..." part
is not exactly in effect yet; we could say that we start with no
known-to-behave-well network filesystems, but we can then update the
above comment when we start to know of at least one good one.
> +/*
> + * Check remote working directory protocol.
> + *
> + * Error if client machine cannot get remote protocol information.
> + */
Good, but void means that the caller of this function does not know
when we detected an error. Perhaps return -1 on error, return 0 on
"not error", so that we can return 1 when we learn to recognize
"known to behave well" network filesystem to tell the caller?
That is,
> +static void check_remote_protocol(wchar_t *wpath)
"void" -> "int"
> +{
> + HANDLE h;
> + FILE_REMOTE_PROTOCOL_INFO proto_info;
> +
> + h = CreateFileW(wpath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
> + FILE_FLAG_BACKUP_SEMANTICS, NULL);
> +
> + if (h == INVALID_HANDLE_VALUE) {
> + error(_("[GLE %ld] unable to open for read '%ls'"),
> + GetLastError(), wpath);
> + return;
"return" -> "return -1"
> + }
> +
> + if (!GetFileInformationByHandleEx(h, FileRemoteProtocolInfo,
> + &proto_info, sizeof(proto_info))) {
> + error(_("[GLE %ld] unable to get protocol information for '%ls'"),
> + GetLastError(), wpath);
> + CloseHandle(h);
> + return;
"return" -> "return -1"
> + }
> +
> + CloseHandle(h);
> +
> + trace_printf_key(&trace_fsmonitor,
> + "check_remote_protocol('%ls') remote protocol %#8.8lx",
> + wpath, proto_info.Protocol);
> +
> + return;
"return" -> "return 0" (or "-1")
> +}
> +
> /*
> * Remote working directories are problematic for FSMonitor.
> *
> @@ -115,6 +169,18 @@ static enum fsmonitor_reason check_remote(struct repository *r)
> trace_printf_key(&trace_fsmonitor,
> "check_remote('%s') true",
> r->worktree);
> +
> + check_remote_protocol(wfullpath);
And here
ret = check_remote_protocol(wfullpath);
if (ret < 0)
/* definitely an error */
return FSMONITOR_REASON_ERROR;
and then we can fall thru the non-error case below. We'd of course
need to declare "int ret" at the beginning of the function.
> + switch (check_config_allowremote(r)) {
> + case 0: /* config overrides and disables */
> + return FSMONITOR_REASON_REMOTE;
> + case 1: /* config overrides and enables */
> + return FSMONITOR_REASON_OK;
> + default:
> + break; /* config has no opinion */
> + }
> +
> return FSMONITOR_REASON_REMOTE;
> }
In the future, when this "first step" graduates to the upcoming
release, we may want to have a follow-up enhancement patch that
changes the code like so:
* we recognize ones like SMB in check_remote_protocol() as "known
to be good", and return 1 from there
* after the "switch" above determies that the configuration file
does not have any opinion, instead of unconditionally returning
REASON_REMOTE to refuse the request, pay attention to "ret", e.g.
something like
- return FSMONITOR_REASON_REMOTE;
+ if (!ret)
+ return FSMONITOR_REASON_REMOTE;
+ else /* known to be good ones */
+ return FSMONITOR_REASON_OK;
When we do so, we'd resurrect the "unless on a network filesystem
that is known to behave well" comment. What this last part does is
exactly that.
Thanks.
next prev parent reply other threads:[~2022-08-11 19:33 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-09 17:44 [PATCH] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-08-10 16:49 ` Junio C Hamano
2022-08-10 18:49 ` Eric D
2022-08-10 19:50 ` Junio C Hamano
2022-08-10 20:36 ` Eric D
2022-08-10 21:30 ` Eric D
2022-08-10 21:41 ` Junio C Hamano
2022-08-11 15:57 ` [PATCH v2 0/2] Option to allow fsmonitor to run against repos on network file systems Eric DeCosta via GitGitGadget
2022-08-11 15:57 ` [PATCH v2 1/2] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-08-11 15:57 ` [PATCH v2 2/2] fsmonitor.allowRemote now overrides default behavior Eric DeCosta via GitGitGadget
2022-08-11 16:53 ` Junio C Hamano
2022-08-11 17:49 ` Eric D
2022-08-11 17:53 ` Junio C Hamano
2022-08-11 17:58 ` Eric D
2022-08-11 18:32 ` [PATCH v3] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-08-11 19:33 ` Junio C Hamano [this message]
2022-08-11 23:57 ` [PATCH v4] " Eric DeCosta via GitGitGadget
2022-08-12 18:23 ` Junio C Hamano
2022-08-15 16:01 ` Jeff Hostetler
2022-08-15 17:33 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqh72iefsn.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=edecosta@mathworks.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).