Skip to content

Commit dec6766

Browse files
committed
Fix socket bind collisions in manager_tests
1 parent 47851ee commit dec6766

File tree

1 file changed

+76
-25
lines changed

1 file changed

+76
-25
lines changed

src/plasma/test/manager_tests.c

Lines changed: 76 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "common.h"
1010
#include "event_loop.h"
1111
#include "io.h"
12+
#include "utstring.h"
1213

1314
#include "plasma.h"
1415
#include "plasma_client.h"
@@ -17,9 +18,6 @@
1718
SUITE(plasma_manager_tests);
1819

1920
const char *manager_addr = "127.0.0.1";
20-
int manager_port = 12345;
21-
const char *store_socket_name = "/tmp/store12345";
22-
const char *manager_socket_name = "/tmp/manager12345";
2321
object_id oid;
2422

2523
void wait_for_pollin(int fd) {
@@ -30,6 +28,38 @@ void wait_for_pollin(int fd) {
3028
CHECK(retval > 0);
3129
}
3230

31+
UT_string *bind_ipc_sock_retry(int *fd) {
32+
UT_string *socket_name = NULL;
33+
for (int num_retries = 0; num_retries < 5; ++num_retries) {
34+
LOG_INFO("trying to find plasma socket (attempt %d)", num_retries);
35+
utstring_renew(socket_name);
36+
utstring_printf(socket_name, "/tmp/plasma_socket_%d", rand());
37+
*fd = bind_ipc_sock(utstring_body(socket_name));
38+
if (*fd < 0) {
39+
/* Sleep for 100ms. */
40+
usleep(100000);
41+
continue;
42+
}
43+
break;
44+
}
45+
return socket_name;
46+
}
47+
48+
int bind_inet_sock_retry(int *fd) {
49+
int port = -1;
50+
for (int num_retries = 0; num_retries < 5; ++num_retries) {
51+
port = 10000 + rand() % 40000;
52+
*fd = bind_inet_sock(port);
53+
if (*fd < 0) {
54+
/* Sleep for 100ms. */
55+
usleep(100000);
56+
continue;
57+
}
58+
break;
59+
}
60+
return port;
61+
}
62+
3363
int test_done_handler(event_loop *loop, timer_id id, void *context) {
3464
event_loop_stop(loop);
3565
return AE_NOMORE;
@@ -54,20 +84,22 @@ typedef struct {
5484
client_connection *client_conn;
5585
} plasma_mock;
5686

57-
plasma_mock *init_plasma_mock(int port, plasma_mock *remote_mock) {
87+
plasma_mock *init_plasma_mock(plasma_mock *remote_mock) {
5888
plasma_mock *mock = malloc(sizeof(plasma_mock));
5989
/* Start listening on all the ports and initiate the local plasma manager. */
60-
mock->port = port;
61-
mock->manager_remote_fd = bind_inet_sock(port);
62-
mock->manager_local_fd = bind_ipc_sock(manager_socket_name);
63-
mock->local_store = bind_ipc_sock(store_socket_name);
64-
mock->state =
65-
init_plasma_manager_state(store_socket_name, manager_addr, port, NULL, 0);
90+
mock->port = bind_inet_sock_retry(&mock->manager_remote_fd);
91+
UT_string *store_socket_name = bind_ipc_sock_retry(&mock->local_store);
92+
UT_string *manager_socket_name = bind_ipc_sock_retry(&mock->manager_local_fd);
93+
94+
CHECK(mock->manager_local_fd >= 0 && mock->local_store >= 0);
95+
96+
mock->state = init_plasma_manager_state(utstring_body(store_socket_name),
97+
manager_addr, mock->port, NULL, 0);
6698
mock->loop = get_event_loop(mock->state);
6799
/* Accept a connection from the local manager on the remote manager. */
68100
if (remote_mock != NULL) {
69101
mock->write_conn =
70-
get_manager_connection(remote_mock->state, manager_addr, port);
102+
get_manager_connection(remote_mock->state, manager_addr, mock->port);
71103
wait_for_pollin(mock->manager_remote_fd);
72104
mock->read_conn = new_client_connection(mock->loop, mock->manager_remote_fd,
73105
mock->state, 0);
@@ -77,10 +109,13 @@ plasma_mock *init_plasma_mock(int port, plasma_mock *remote_mock) {
77109
}
78110
/* Connect a new client to the local plasma manager and mock a request to an
79111
* object. */
80-
mock->plasma_conn = plasma_connect(store_socket_name, manager_socket_name);
112+
mock->plasma_conn = plasma_connect(utstring_body(store_socket_name),
113+
utstring_body(manager_socket_name));
81114
wait_for_pollin(mock->manager_local_fd);
82115
mock->client_conn =
83116
new_client_connection(mock->loop, mock->manager_local_fd, mock->state, 0);
117+
utstring_free(store_socket_name);
118+
utstring_free(manager_socket_name);
84119
return mock;
85120
}
86121

@@ -109,10 +144,13 @@ void destroy_plasma_mock(plasma_mock *mock) {
109144
* correct object ID.
110145
*/
111146
TEST request_transfer_test(void) {
112-
plasma_mock *local_mock = init_plasma_mock(manager_port, NULL);
113-
plasma_mock *remote_mock = init_plasma_mock(12346, local_mock);
147+
plasma_mock *local_mock = init_plasma_mock(NULL);
148+
plasma_mock *remote_mock = init_plasma_mock(local_mock);
114149
const char **manager_vector = malloc(sizeof(char *));
115-
manager_vector[0] = "127.0.0.1:12346";
150+
UT_string *addr = NULL;
151+
utstring_new(addr);
152+
utstring_printf(addr, "127.0.0.1:%d", remote_mock->port);
153+
manager_vector[0] = utstring_body(addr);
116154
request_transfer(oid, 1, manager_vector, local_mock->client_conn);
117155
event_loop_add_timer(local_mock->loop, MANAGER_TIMEOUT, test_done_handler,
118156
local_mock->state);
@@ -126,6 +164,7 @@ TEST request_transfer_test(void) {
126164
ASSERT(req->num_object_ids == 1);
127165
ASSERT(memcmp(&oid, &req->object_ids[0], sizeof(object_id)) == 0);
128166
/* Clean up. */
167+
utstring_free(addr);
129168
free(req);
130169
destroy_plasma_mock(remote_mock);
131170
destroy_plasma_mock(local_mock);
@@ -145,12 +184,18 @@ TEST request_transfer_test(void) {
145184
* with the correct object ID.
146185
*/
147186
TEST request_transfer_retry_test(void) {
148-
plasma_mock *local_mock = init_plasma_mock(manager_port, NULL);
149-
plasma_mock *remote_mock1 = init_plasma_mock(12346, local_mock);
150-
plasma_mock *remote_mock2 = init_plasma_mock(12347, local_mock);
187+
plasma_mock *local_mock = init_plasma_mock(NULL);
188+
plasma_mock *remote_mock1 = init_plasma_mock(local_mock);
189+
plasma_mock *remote_mock2 = init_plasma_mock(local_mock);
151190
const char **manager_vector = malloc(sizeof(char *) * 2);
152-
manager_vector[0] = "127.0.0.1:12346";
153-
manager_vector[1] = "127.0.0.1:12347";
191+
UT_string *addr0 = NULL;
192+
utstring_new(addr0);
193+
utstring_printf(addr0, "127.0.0.1:%d", remote_mock1->port);
194+
manager_vector[0] = utstring_body(addr0);
195+
UT_string *addr1 = NULL;
196+
utstring_new(addr1);
197+
utstring_printf(addr1, "127.0.0.1:%d", remote_mock2->port);
198+
manager_vector[1] = utstring_body(addr1);
154199
request_transfer(oid, 2, manager_vector, local_mock->client_conn);
155200
event_loop_add_timer(local_mock->loop, MANAGER_TIMEOUT * 2, test_done_handler,
156201
local_mock->state);
@@ -165,6 +210,8 @@ TEST request_transfer_retry_test(void) {
165210
ASSERT(req->num_object_ids == 1);
166211
ASSERT(memcmp(&oid, &req->object_ids[0], sizeof(object_id)) == 0);
167212
/* Clean up. */
213+
utstring_free(addr0);
214+
utstring_free(addr1);
168215
free(req);
169216
destroy_plasma_mock(remote_mock2);
170217
destroy_plasma_mock(remote_mock1);
@@ -184,10 +231,13 @@ TEST request_transfer_retry_test(void) {
184231
* wasn't fetched.
185232
*/
186233
TEST request_transfer_timeout_test(void) {
187-
plasma_mock *local_mock = init_plasma_mock(manager_port, NULL);
188-
plasma_mock *remote_mock = init_plasma_mock(12346, local_mock);
234+
plasma_mock *local_mock = init_plasma_mock(NULL);
235+
plasma_mock *remote_mock = init_plasma_mock(local_mock);
189236
const char **manager_vector = malloc(sizeof(char *));
190-
manager_vector[0] = "127.0.0.1:12346";
237+
UT_string *addr = NULL;
238+
utstring_new(addr);
239+
utstring_printf(addr, "127.0.0.1:%d", remote_mock->port);
240+
manager_vector[0] = utstring_body(addr);
191241
request_transfer(oid, 1, manager_vector, local_mock->client_conn);
192242
event_loop_add_timer(local_mock->loop, MANAGER_TIMEOUT * (NUM_RETRIES + 2),
193243
test_done_handler, local_mock->state);
@@ -201,6 +251,7 @@ TEST request_transfer_timeout_test(void) {
201251
ASSERT_EQ(memcmp(&oid, &reply.object_ids, sizeof(object_id)), 0);
202252
ASSERT_EQ(reply.has_object, 0);
203253
/* Clean up. */
254+
utstring_free(addr);
204255
destroy_plasma_mock(remote_mock);
205256
destroy_plasma_mock(local_mock);
206257
PASS();
@@ -214,8 +265,8 @@ TEST request_transfer_timeout_test(void) {
214265
* - Expect to see the same data.
215266
*/
216267
TEST read_write_object_chunk_test(void) {
217-
plasma_mock *local_mock = init_plasma_mock(manager_port, NULL);
218-
plasma_mock *remote_mock = init_plasma_mock(12346, local_mock);
268+
plasma_mock *local_mock = init_plasma_mock(NULL);
269+
plasma_mock *remote_mock = init_plasma_mock(local_mock);
219270
/* Create a mock object buffer to transfer. */
220271
const char *data = "Hello world!";
221272
const int data_size = strlen(data) + 1;

0 commit comments

Comments
 (0)