diff mbox series

[v1,2/4] builtin/receive-pack.c: change xwrite to write_in_full to allow large sizes.

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

Commit Message

Randall S. Becker Feb. 26, 2024, 10:05 p.m. UTC
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(-)

Comments

Randall S. Becker Feb. 26, 2024, 11:02 p.m. UTC | #1
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.
Junio C Hamano Feb. 26, 2024, 11:50 p.m. UTC | #2
"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)))
Randall S. Becker Feb. 27, 2024, 12:15 a.m. UTC | #3
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 mbox series

Patch

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)))