diff options
author | Amitay Isaacs <amitay@gmail.com> | 2018-01-22 12:54:49 +1100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2018-02-12 11:28:49 +0100 |
commit | 83b2971f002f80f7bbbd098bfe7da70e1b019607 (patch) | |
tree | d9c62a550de83157d69a3ce75a3d5e97c4483747 /ctdb | |
parent | 11acdbe842435d2f7ac4f62cd1b11358dee0ade1 (diff) | |
download | samba-83b2971f002f80f7bbbd098bfe7da70e1b019607.tar.gz |
ctdb-tests: Avoid race condition in sock_daemon test 5
This test fails when it takes more than 10s to run. This can occur
when the system is loaded and socket-wrapper is used.
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
(cherry picked from commit 33c0f5599d93a34619c8f37945f79a6e399a1b5e)
Diffstat (limited to 'ctdb')
-rw-r--r-- | ctdb/tests/src/sock_daemon_test.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/ctdb/tests/src/sock_daemon_test.c b/ctdb/tests/src/sock_daemon_test.c index 5641d37bcd1..ebc0b8594c3 100644 --- a/ctdb/tests/src/sock_daemon_test.c +++ b/ctdb/tests/src/sock_daemon_test.c @@ -668,7 +668,8 @@ static void test4(TALLOC_CTX *mem_ctx, const char *pidfile, * Start daemon, multiple client connects, requests, disconnects */ -#define TEST5_MAX_CLIENTS 10 +#define TEST5_VALID_CLIENTS 10 +#define TEST5_MAX_CLIENTS 100 struct test5_pkt { uint32_t len; @@ -710,7 +711,8 @@ static void test5_client_callback(uint8_t *buf, size_t buflen, state->done = true; } -static int test5_client(const char *sockpath, int id) +static int test5_client(const char *sockpath, int id, pid_t pid_server, + pid_t *client_pid) { pid_t pid; int fd[2]; @@ -760,7 +762,9 @@ static int test5_client(const char *sockpath, int id) close(fd[0]); state.fd = -1; - sleep(10); + while (kill(pid_server, 0) == 0 || errno != ESRCH) { + sleep(1); + } exit(0); } @@ -775,6 +779,7 @@ static int test5_client(const char *sockpath, int id) close(fd[0]); + *client_pid = pid; return ret; } @@ -788,12 +793,12 @@ static bool test5_connect(struct sock_client_context *client, struct test5_server_state *state = (struct test5_server_state *)private_data; - if (state->num_clients == TEST5_MAX_CLIENTS) { + if (state->num_clients == TEST5_VALID_CLIENTS) { return false; } state->num_clients += 1; - assert(state->num_clients <= TEST5_MAX_CLIENTS); + assert(state->num_clients <= TEST5_VALID_CLIENTS); return true; } @@ -925,6 +930,7 @@ static void test5(TALLOC_CTX *mem_ctx, const char *pidfile, pid_t pid_server, pid; int fd[2], ret, i; ssize_t n; + pid_t client_pid[TEST5_MAX_CLIENTS]; pid = getpid(); @@ -968,16 +974,18 @@ static void test5(TALLOC_CTX *mem_ctx, const char *pidfile, close(fd[0]); - for (i=0; i<100; i++) { - ret = test5_client(sockpath, i); - if (i < TEST5_MAX_CLIENTS) { + for (i=0; i<TEST5_MAX_CLIENTS; i++) { + ret = test5_client(sockpath, i, pid_server, &client_pid[i]); + if (i < TEST5_VALID_CLIENTS) { assert(ret == i+1); } else { assert(ret == 0); } } - for (i=0; i<100; i++) { + for (i=TEST5_MAX_CLIENTS-1; i>=0; i--) { + kill(client_pid[i], SIGKILL); + pid = wait(&ret); assert(pid != -1); } |