diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2013-05-09 09:45:53 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2013-05-09 09:45:53 +0000 |
commit | efad1d6733cd7e75a4e6c846ad7c031a0167b8be (patch) | |
tree | 93c8d652b78ae04b5b4a5c8e1e8abe398d4dd8c7 /src/testbed | |
parent | d96c9d244148f2ee984c206b71987ba6df0ec820 (diff) | |
download | gnunet-efad1d6733cd7e75a4e6c846ad7c031a0167b8be.tar.gz gnunet-efad1d6733cd7e75a4e6c846ad7c031a0167b8be.zip |
- complement HELPER API with functions to kill and wait on the helper process
- To shutdown quickly, have testbed first kill all sub-controller's helper
processes first and wait later instead of kill & wait per each processes.
Diffstat (limited to 'src/testbed')
-rw-r--r-- | src/testbed/gnunet-service-testbed.c | 3 | ||||
-rw-r--r-- | src/testbed/gnunet-service-testbed_links.c | 57 | ||||
-rw-r--r-- | src/testbed/test_gnunet_helper_testbed.c | 2 | ||||
-rw-r--r-- | src/testbed/testbed_api_hosts.c | 43 | ||||
-rw-r--r-- | src/testbed/testbed_api_hosts.h | 20 |
5 files changed, 95 insertions, 30 deletions
diff --git a/src/testbed/gnunet-service-testbed.c b/src/testbed/gnunet-service-testbed.c index bb791988e..1b74ad1df 100644 --- a/src/testbed/gnunet-service-testbed.c +++ b/src/testbed/gnunet-service-testbed.c | |||
@@ -785,7 +785,7 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
785 | uint32_t id; | 785 | uint32_t id; |
786 | 786 | ||
787 | shutdown_task_id = GNUNET_SCHEDULER_NO_TASK; | 787 | shutdown_task_id = GNUNET_SCHEDULER_NO_TASK; |
788 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Shutting down testbed service\n"); | 788 | LOG_DEBUG ("Shutting down testbed service\n"); |
789 | /* cleanup any remaining forwarded operations */ | 789 | /* cleanup any remaining forwarded operations */ |
790 | GST_clear_fopcq (); | 790 | GST_clear_fopcq (); |
791 | GST_free_lcfq (); | 791 | GST_free_lcfq (); |
@@ -904,6 +904,7 @@ testbed_run (void *cls, struct GNUNET_SERVER_Handle *server, | |||
904 | char *logfile; | 904 | char *logfile; |
905 | unsigned long long num; | 905 | unsigned long long num; |
906 | 906 | ||
907 | LOG_DEBUG ("Starting testbed\n"); | ||
907 | if (GNUNET_OK == | 908 | if (GNUNET_OK == |
908 | GNUNET_CONFIGURATION_get_value_filename (cfg, "TESTBED", "LOG_FILE", | 909 | GNUNET_CONFIGURATION_get_value_filename (cfg, "TESTBED", "LOG_FILE", |
909 | &logfile)) | 910 | &logfile)) |
diff --git a/src/testbed/gnunet-service-testbed_links.c b/src/testbed/gnunet-service-testbed_links.c index bcf8d91c8..7b0006d1f 100644 --- a/src/testbed/gnunet-service-testbed_links.c +++ b/src/testbed/gnunet-service-testbed_links.c | |||
@@ -425,32 +425,47 @@ reghost_free_iterator (void *cls, const struct GNUNET_HashCode *key, | |||
425 | void | 425 | void |
426 | GST_slave_list_clear () | 426 | GST_slave_list_clear () |
427 | { | 427 | { |
428 | unsigned int id; | ||
429 | struct HostRegistration *hr_entry; | 428 | struct HostRegistration *hr_entry; |
429 | struct GNUNET_TESTBED_ControllerProc *cproc; | ||
430 | unsigned int id; | ||
430 | 431 | ||
431 | for (id = 0; id < GST_slave_list_size; id++) | 432 | for (id = 0; id < GST_slave_list_size; id++) |
432 | if (NULL != GST_slave_list[id]) | 433 | { |
434 | if (NULL == GST_slave_list[id]) | ||
435 | continue; | ||
436 | while (NULL != (hr_entry = GST_slave_list[id]->hr_dll_head)) | ||
433 | { | 437 | { |
434 | while (NULL != (hr_entry = GST_slave_list[id]->hr_dll_head)) | 438 | GNUNET_CONTAINER_DLL_remove (GST_slave_list[id]->hr_dll_head, |
435 | { | 439 | GST_slave_list[id]->hr_dll_tail, hr_entry); |
436 | GNUNET_CONTAINER_DLL_remove (GST_slave_list[id]->hr_dll_head, | 440 | GNUNET_free (hr_entry); |
437 | GST_slave_list[id]->hr_dll_tail, hr_entry); | 441 | } |
438 | GNUNET_free (hr_entry); | 442 | if (NULL != GST_slave_list[id]->rhandle) |
439 | } | 443 | GNUNET_TESTBED_cancel_registration (GST_slave_list[id]->rhandle); |
440 | if (NULL != GST_slave_list[id]->rhandle) | 444 | (void) |
441 | GNUNET_TESTBED_cancel_registration (GST_slave_list[id]->rhandle); | 445 | GNUNET_CONTAINER_multihashmap_iterate (GST_slave_list |
442 | (void) | 446 | [id]->reghost_map, |
443 | GNUNET_CONTAINER_multihashmap_iterate (GST_slave_list | 447 | reghost_free_iterator, |
444 | [id]->reghost_map, | 448 | GST_slave_list[id]); |
445 | reghost_free_iterator, | 449 | GNUNET_CONTAINER_multihashmap_destroy (GST_slave_list[id]->reghost_map); |
446 | GST_slave_list[id]); | 450 | if (NULL != GST_slave_list[id]->controller) |
447 | GNUNET_CONTAINER_multihashmap_destroy (GST_slave_list[id]->reghost_map); | 451 | GNUNET_TESTBED_controller_disconnect (GST_slave_list[id]->controller); |
448 | if (NULL != GST_slave_list[id]->controller) | 452 | if (NULL != (cproc = GST_slave_list[id]->controller_proc)) |
449 | GNUNET_TESTBED_controller_disconnect (GST_slave_list[id]->controller); | 453 | { |
450 | if (NULL != GST_slave_list[id]->controller_proc) | 454 | LOG_DEBUG ("Stopping a slave\n"); |
451 | GNUNET_TESTBED_controller_stop (GST_slave_list[id]->controller_proc); | 455 | GNUNET_TESTBED_controller_kill_ (cproc); |
452 | GNUNET_free (GST_slave_list[id]); | ||
453 | } | 456 | } |
457 | } | ||
458 | for (id = 0; id < GST_slave_list_size; id++) | ||
459 | { | ||
460 | if (NULL == GST_slave_list[id]) | ||
461 | continue; | ||
462 | if (NULL != (cproc = GST_slave_list[id]->controller_proc)) | ||
463 | { | ||
464 | GNUNET_TESTBED_controller_destroy_ (cproc); | ||
465 | LOG_DEBUG ("Slave stopped\n"); | ||
466 | } | ||
467 | GNUNET_free (GST_slave_list[id]); | ||
468 | } | ||
454 | GNUNET_free_non_null (GST_slave_list); | 469 | GNUNET_free_non_null (GST_slave_list); |
455 | GST_slave_list = NULL; | 470 | GST_slave_list = NULL; |
456 | } | 471 | } |
diff --git a/src/testbed/test_gnunet_helper_testbed.c b/src/testbed/test_gnunet_helper_testbed.c index 0c7c5f27e..cf4559c26 100644 --- a/src/testbed/test_gnunet_helper_testbed.c +++ b/src/testbed/test_gnunet_helper_testbed.c | |||
@@ -88,7 +88,7 @@ do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
88 | if (GNUNET_SCHEDULER_NO_TASK != abort_task) | 88 | if (GNUNET_SCHEDULER_NO_TASK != abort_task) |
89 | GNUNET_SCHEDULER_cancel (abort_task); | 89 | GNUNET_SCHEDULER_cancel (abort_task); |
90 | if (NULL != helper) | 90 | if (NULL != helper) |
91 | GNUNET_HELPER_stop (helper); | 91 | GNUNET_HELPER_stop (helper, GNUNET_NO); |
92 | GNUNET_free_non_null (msg); | 92 | GNUNET_free_non_null (msg); |
93 | if (NULL != cfg) | 93 | if (NULL != cfg) |
94 | GNUNET_CONFIGURATION_destroy (cfg); | 94 | GNUNET_CONFIGURATION_destroy (cfg); |
diff --git a/src/testbed/testbed_api_hosts.c b/src/testbed/testbed_api_hosts.c index f61129b85..c386d18a0 100644 --- a/src/testbed/testbed_api_hosts.c +++ b/src/testbed/testbed_api_hosts.c | |||
@@ -1261,20 +1261,33 @@ GNUNET_TESTBED_controller_start (const char *trusted_ip, | |||
1261 | 1261 | ||
1262 | 1262 | ||
1263 | /** | 1263 | /** |
1264 | * Stop the controller process (also will terminate all peers and controllers | 1264 | * Sends termination signal to the controller's helper process |
1265 | * dependent on this controller). This function blocks until the testbed has | ||
1266 | * been fully terminated (!). The controller status cb from | ||
1267 | * GNUNET_TESTBED_controller_start() will not be called. | ||
1268 | * | 1265 | * |
1269 | * @param cproc the controller process handle | 1266 | * @param cproc the handle to the controller's helper process |
1270 | */ | 1267 | */ |
1271 | void | 1268 | void |
1272 | GNUNET_TESTBED_controller_stop (struct GNUNET_TESTBED_ControllerProc *cproc) | 1269 | GNUNET_TESTBED_controller_kill_ (struct GNUNET_TESTBED_ControllerProc *cproc) |
1273 | { | 1270 | { |
1274 | if (NULL != cproc->shandle) | 1271 | if (NULL != cproc->shandle) |
1275 | GNUNET_HELPER_send_cancel (cproc->shandle); | 1272 | GNUNET_HELPER_send_cancel (cproc->shandle); |
1276 | if (NULL != cproc->helper) | 1273 | if (NULL != cproc->helper) |
1277 | GNUNET_HELPER_soft_stop (cproc->helper); | 1274 | GNUNET_HELPER_kill (cproc->helper, GNUNET_YES); |
1275 | } | ||
1276 | |||
1277 | |||
1278 | /** | ||
1279 | * Cleans-up the controller's helper process handle | ||
1280 | * | ||
1281 | * @param cproc the handle to the controller's helper process | ||
1282 | */ | ||
1283 | void | ||
1284 | GNUNET_TESTBED_controller_destroy_ (struct GNUNET_TESTBED_ControllerProc *cproc) | ||
1285 | { | ||
1286 | if (NULL != cproc->helper) | ||
1287 | { | ||
1288 | GNUNET_break (GNUNET_OK == GNUNET_HELPER_wait (cproc->helper)); | ||
1289 | GNUNET_HELPER_destroy (cproc->helper); | ||
1290 | } | ||
1278 | if (NULL != cproc->helper_argv) | 1291 | if (NULL != cproc->helper_argv) |
1279 | free_argv (cproc->helper_argv); | 1292 | free_argv (cproc->helper_argv); |
1280 | cproc->host->controller_started = GNUNET_NO; | 1293 | cproc->host->controller_started = GNUNET_NO; |
@@ -1284,6 +1297,22 @@ GNUNET_TESTBED_controller_stop (struct GNUNET_TESTBED_ControllerProc *cproc) | |||
1284 | 1297 | ||
1285 | 1298 | ||
1286 | /** | 1299 | /** |
1300 | * Stop the controller process (also will terminate all peers and controllers | ||
1301 | * dependent on this controller). This function blocks until the testbed has | ||
1302 | * been fully terminated (!). The controller status cb from | ||
1303 | * GNUNET_TESTBED_controller_start() will not be called. | ||
1304 | * | ||
1305 | * @param cproc the controller process handle | ||
1306 | */ | ||
1307 | void | ||
1308 | GNUNET_TESTBED_controller_stop (struct GNUNET_TESTBED_ControllerProc *cproc) | ||
1309 | { | ||
1310 | GNUNET_TESTBED_controller_kill_ (cproc); | ||
1311 | GNUNET_TESTBED_controller_destroy_ (cproc); | ||
1312 | } | ||
1313 | |||
1314 | |||
1315 | /** | ||
1287 | * The handle for whether a host is habitable or not | 1316 | * The handle for whether a host is habitable or not |
1288 | */ | 1317 | */ |
1289 | struct GNUNET_TESTBED_HostHabitableCheckHandle | 1318 | struct GNUNET_TESTBED_HostHabitableCheckHandle |
diff --git a/src/testbed/testbed_api_hosts.h b/src/testbed/testbed_api_hosts.h index 56cca624b..3cef4412a 100644 --- a/src/testbed/testbed_api_hosts.h +++ b/src/testbed/testbed_api_hosts.h | |||
@@ -233,5 +233,25 @@ GNUNET_TESTBED_host_handle_addhostconfirm_ (struct GNUNET_TESTBED_Controller *c, | |||
233 | GNUNET_TESTBED_HostConfirmedMessage | 233 | GNUNET_TESTBED_HostConfirmedMessage |
234 | *msg); | 234 | *msg); |
235 | 235 | ||
236 | |||
237 | /** | ||
238 | * Sends termination signal to the controller's helper process | ||
239 | * | ||
240 | * @param cproc the handle to the controller's helper process | ||
241 | */ | ||
242 | void | ||
243 | GNUNET_TESTBED_controller_kill_ (struct GNUNET_TESTBED_ControllerProc *cproc); | ||
244 | |||
245 | |||
246 | /** | ||
247 | * Cleans-up the controller's helper process handle | ||
248 | * | ||
249 | * @param cproc the handle to the controller's helper process | ||
250 | */ | ||
251 | void | ||
252 | GNUNET_TESTBED_controller_destroy_ (struct GNUNET_TESTBED_ControllerProc | ||
253 | *cproc); | ||
254 | |||
255 | |||
236 | #endif | 256 | #endif |
237 | /* end of testbed_api_hosts.h */ | 257 | /* end of testbed_api_hosts.h */ |