summaryrefslogtreecommitdiff
path: root/src/testbed
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2013-05-09 09:45:53 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2013-05-09 09:45:53 +0000
commitefad1d6733cd7e75a4e6c846ad7c031a0167b8be (patch)
tree93c8d652b78ae04b5b4a5c8e1e8abe398d4dd8c7 /src/testbed
parentd96c9d244148f2ee984c206b71987ba6df0ec820 (diff)
downloadgnunet-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.c3
-rw-r--r--src/testbed/gnunet-service-testbed_links.c57
-rw-r--r--src/testbed/test_gnunet_helper_testbed.c2
-rw-r--r--src/testbed/testbed_api_hosts.c43
-rw-r--r--src/testbed/testbed_api_hosts.h20
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,
425void 425void
426GST_slave_list_clear () 426GST_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 */
1271void 1268void
1272GNUNET_TESTBED_controller_stop (struct GNUNET_TESTBED_ControllerProc *cproc) 1269GNUNET_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 */
1283void
1284GNUNET_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 */
1307void
1308GNUNET_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 */
1289struct GNUNET_TESTBED_HostHabitableCheckHandle 1318struct 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 */
242void
243GNUNET_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 */
251void
252GNUNET_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 */