Browse Source

Merge branch 'jk/epipe-in-async' into maint

Handling of errors while writing into our internal asynchronous
process has been made more robust, which reduces flakiness in our
tests.

* jk/epipe-in-async:
  t5504: handle expected output from SIGPIPE death
  test_must_fail: report number of unexpected signal
  fetch-pack: ignore SIGPIPE in sideband demuxer
  write_or_die: handle EPIPE in async threads
maint
Junio C Hamano 9 years ago
parent
commit
fbef03d6ab
  1. 6
      fetch-pack.c
  2. 10
      run-command.c
  3. 1
      run-command.h
  4. 5
      t/t5504-fetch-receive-strict.sh
  5. 2
      t/test-lib-functions.sh
  6. 4
      write_or_die.c

6
fetch-pack.c

@ -15,6 +15,7 @@
#include "version.h" #include "version.h"
#include "prio-queue.h" #include "prio-queue.h"
#include "sha1-array.h" #include "sha1-array.h"
#include "sigchain.h"


static int transfer_unpack_limit = -1; static int transfer_unpack_limit = -1;
static int fetch_unpack_limit = -1; static int fetch_unpack_limit = -1;
@ -671,9 +672,12 @@ static int everything_local(struct fetch_pack_args *args,
static int sideband_demux(int in, int out, void *data) static int sideband_demux(int in, int out, void *data)
{ {
int *xd = data; int *xd = data;
int ret;


int ret = recv_sideband("fetch-pack", xd[0], out); sigchain_push(SIGPIPE, SIG_IGN);
ret = recv_sideband("fetch-pack", xd[0], out);
close(out); close(out);
sigchain_pop(SIGPIPE);
return ret; return ret;
} }



10
run-command.c

@ -633,6 +633,11 @@ int in_async(void)
return !pthread_equal(main_thread, pthread_self()); return !pthread_equal(main_thread, pthread_self());
} }


void NORETURN async_exit(int code)
{
pthread_exit((void *)(intptr_t)code);
}

#else #else


static struct { static struct {
@ -678,6 +683,11 @@ int in_async(void)
return process_is_async; return process_is_async;
} }


void NORETURN async_exit(int code)
{
exit(code);
}

#endif #endif


int start_async(struct async *async) int start_async(struct async *async)

1
run-command.h

@ -121,5 +121,6 @@ struct async {
int start_async(struct async *async); int start_async(struct async *async);
int finish_async(struct async *async); int finish_async(struct async *async);
int in_async(void); int in_async(void);
void NORETURN async_exit(int code);


#endif #endif

5
t/t5504-fetch-receive-strict.sh

@ -101,7 +101,10 @@ test_expect_success 'push with receive.fsckobjects' '
git config transfer.fsckobjects false git config transfer.fsckobjects false
) && ) &&
test_must_fail ok=sigpipe git push --porcelain dst master:refs/heads/test >act && test_must_fail ok=sigpipe git push --porcelain dst master:refs/heads/test >act &&
test_cmp exp act {
test_cmp exp act ||
! test -s act
}
' '


test_expect_success 'push with transfer.fsckobjects' ' test_expect_success 'push with transfer.fsckobjects' '

2
t/test-lib-functions.sh

@ -617,7 +617,7 @@ test_must_fail () {
return 0 return 0
elif test $exit_code -gt 129 && test $exit_code -le 192 elif test $exit_code -gt 129 && test $exit_code -le 192
then then
echo >&2 "test_must_fail: died by signal: $*" echo >&2 "test_must_fail: died by signal $(($exit_code - 128)): $*"
return 1 return 1
elif test $exit_code -eq 127 elif test $exit_code -eq 127
then then

4
write_or_die.c

@ -1,8 +1,12 @@
#include "cache.h" #include "cache.h"
#include "run-command.h"


static void check_pipe(int err) static void check_pipe(int err)
{ {
if (err == EPIPE) { if (err == EPIPE) {
if (in_async())
async_exit(141);

signal(SIGPIPE, SIG_DFL); signal(SIGPIPE, SIG_DFL);
raise(SIGPIPE); raise(SIGPIPE);
/* Should never happen, but just in case... */ /* Should never happen, but just in case... */

Loading…
Cancel
Save