Message ID | 20240226220539.3494-3-randall.becker@nexbridge.ca (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Change xwrite() to write_in_full() in builtins. | expand |
On Monday, February 26, 2024 5:06 PM, I wrote: >From: "Randall S. Becker" <rsbecker@nexbridge.com> > >This change is required because some platforms do not support file writes of arbitrary sizes (e.g, NonStop). xwrite ends up truncating >the output to the maximum single I/O size possible for the destination device. > >Signed-off-by: Randall S. Becker <rsbecker@nexbridge.com> >--- > builtin/receive-pack.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > >diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index db65607485..5064f3d300 100644 >--- a/builtin/receive-pack.c >+++ b/builtin/receive-pack.c >@@ -455,8 +455,9 @@ static void report_message(const char *prefix, const char *err, va_list params) > > if (use_sideband) > send_sideband(1, 2, msg, sz, use_sideband); >- else >- xwrite(2, msg, sz); >+ else { >+ write_in_full(2, msg, sz); >+ } > } > > __attribute__((format (printf, 1, 2))) >-- >2.42.1 This needs to be fixed, so the {} after the else is removed. Will be in v2.
"Randall S. Becker" <the.n.e.key@gmail.com> writes: > From: "Randall S. Becker" <rsbecker@nexbridge.com> > > This change is required because some platforms do not support file writes of > arbitrary sizes (e.g, NonStop). xwrite ends up truncating the output to the > maximum single I/O size possible for the destination device. As msg[] here is 4k on-stack buffer, if the I/O size is small enough, the above may happen, and I think write-in-full is warranted here. If your I/O must be done in 1k chunks, it would be very slow to run things like writing a pack stream to clone any non-toy projects, though X-<. > Signed-off-by: Randall S. Becker <rsbecker@nexbridge.com> > --- > builtin/receive-pack.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c > index db65607485..5064f3d300 100644 > --- a/builtin/receive-pack.c > +++ b/builtin/receive-pack.c > @@ -455,8 +455,9 @@ static void report_message(const char *prefix, const char *err, va_list params) > > if (use_sideband) > send_sideband(1, 2, msg, sz, use_sideband); > - else > - xwrite(2, msg, sz); > + else { > + write_in_full(2, msg, sz); > + } > } > > __attribute__((format (printf, 1, 2)))
On Monday, February 26, 2024 6:51 PM, Junio C Hamano wrote: >"Randall S. Becker" <the.n.e.key@gmail.com> writes: > >> From: "Randall S. Becker" <rsbecker@nexbridge.com> >> >> This change is required because some platforms do not support file >> writes of arbitrary sizes (e.g, NonStop). xwrite ends up truncating >> the output to the maximum single I/O size possible for the destination device. > >As msg[] here is 4k on-stack buffer, if the I/O size is small enough, the above may happen, and I think write-in-full is warranted here. If >your I/O must be done in 1k chunks, it would be very slow to run things like writing a pack stream to clone any non-toy projects, >though X-<. On the x86 platform, we get a size large enough not to trigger the failure in t7704. However, on ia64, the limit is 56Kb, which apparently does. I'm hoping no one else has a 1Kb limit - although some TCP stacks might experience it. Either way, truncating a package is bad. Fortunately the I/O subsystem on NonStop is very fast (basically DMA) between process memory space. > >> Signed-off-by: Randall S. Becker <rsbecker@nexbridge.com> >> --- >> builtin/receive-pack.c | 5 +++-- >> 1 file changed, 3 insertions(+), 2 deletions(-) >> >> diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index >> db65607485..5064f3d300 100644 >> --- a/builtin/receive-pack.c >> +++ b/builtin/receive-pack.c >> @@ -455,8 +455,9 @@ static void report_message(const char *prefix, >> const char *err, va_list params) >> >> if (use_sideband) >> send_sideband(1, 2, msg, sz, use_sideband); >> - else >> - xwrite(2, msg, sz); >> + else { >> + write_in_full(2, msg, sz); >> + } >> } >> >> __attribute__((format (printf, 1, 2)))
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index db65607485..5064f3d300 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -455,8 +455,9 @@ static void report_message(const char *prefix, const char *err, va_list params) if (use_sideband) send_sideband(1, 2, msg, sz, use_sideband); - else - xwrite(2, msg, sz); + else { + write_in_full(2, msg, sz); + } } __attribute__((format (printf, 1, 2)))