aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2016-10-27 15:01:52 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2016-10-27 15:01:52 +0000
commita85d0779cb1dad2c5d2aecff2d5be96f1e11b665 (patch)
treeb0569b02721fda8b8cd67776fdc800611fc88000 /src
parent251c9287514c0e3a2cf6a3f6f978a27a49e65085 (diff)
downloadgnunet-a85d0779cb1dad2c5d2aecff2d5be96f1e11b665.tar.gz
gnunet-a85d0779cb1dad2c5d2aecff2d5be96f1e11b665.zip
propagate barrier status messages to sub controllers
Diffstat (limited to 'src')
-rw-r--r--src/testbed/gnunet-service-testbed_barriers.c28
-rw-r--r--src/testbed/testbed_api.c8
2 files changed, 25 insertions, 11 deletions
diff --git a/src/testbed/gnunet-service-testbed_barriers.c b/src/testbed/gnunet-service-testbed_barriers.c
index 638263103..a201d22bb 100644
--- a/src/testbed/gnunet-service-testbed_barriers.c
+++ b/src/testbed/gnunet-service-testbed_barriers.c
@@ -109,6 +109,11 @@ struct WBarrier
109 struct Barrier *barrier; 109 struct Barrier *barrier;
110 110
111 /** 111 /**
112 * Handle to the slave controller where this wrapper creates a barrier
113 */
114 struct GNUNET_TESTBED_Controller *controller;
115
116 /**
112 * The barrier handle from API 117 * The barrier handle from API
113 */ 118 */
114 struct GNUNET_TESTBED_Barrier *hbarrier; 119 struct GNUNET_TESTBED_Barrier *hbarrier;
@@ -546,14 +551,7 @@ wbarrier_status_cb (void *cls,
546 struct WBarrier *wrapper = cls; 551 struct WBarrier *wrapper = cls;
547 struct Barrier *barrier = wrapper->barrier; 552 struct Barrier *barrier = wrapper->barrier;
548 553
549 //FIXME: why are we removing the wrapper? They should only be removed if they
550 //barrier is crossed or errored out
551 GNUNET_assert (b_ == wrapper->hbarrier); 554 GNUNET_assert (b_ == wrapper->hbarrier);
552 wrapper->hbarrier = NULL;
553 GNUNET_CONTAINER_DLL_remove (barrier->whead,
554 barrier->wtail,
555 wrapper);
556 GNUNET_free (wrapper);
557 switch (status) 555 switch (status)
558 { 556 {
559 case GNUNET_TESTBED_BARRIERSTATUS_ERROR: 557 case GNUNET_TESTBED_BARRIERSTATUS_ERROR:
@@ -712,11 +710,12 @@ handle_barrier_init (void *cls,
712 } 710 }
713 wrapper = GNUNET_new (struct WBarrier); 711 wrapper = GNUNET_new (struct WBarrier);
714 wrapper->barrier = barrier; 712 wrapper->barrier = barrier;
713 wrapper->controller = slave->controller;
715 GNUNET_CONTAINER_DLL_insert_tail (barrier->whead, 714 GNUNET_CONTAINER_DLL_insert_tail (barrier->whead,
716 barrier->wtail, 715 barrier->wtail,
717 wrapper); 716 wrapper);
718 //FIXME: Increment barrier->num_wbarriers 717 barrier->num_wbarriers++;
719 wrapper->hbarrier = GNUNET_TESTBED_barrier_init_ (slave->controller, 718 wrapper->hbarrier = GNUNET_TESTBED_barrier_init_ (wrapper->controller,
720 barrier->name, 719 barrier->name,
721 barrier->quorum, 720 barrier->quorum,
722 &wbarrier_status_cb, 721 &wbarrier_status_cb,
@@ -868,6 +867,7 @@ handle_barrier_status (void *cls,
868 struct GNUNET_SERVICE_Client *client = cls; 867 struct GNUNET_SERVICE_Client *client = cls;
869 struct Barrier *barrier; 868 struct Barrier *barrier;
870 struct ClientCtx *client_ctx; 869 struct ClientCtx *client_ctx;
870 struct WBarrier *wrapper;
871 const char *name; 871 const char *name;
872 struct GNUNET_HashCode key; 872 struct GNUNET_HashCode key;
873 uint16_t name_len; 873 uint16_t name_len;
@@ -907,7 +907,15 @@ handle_barrier_status (void *cls,
907 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client_ctx->client), 907 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client_ctx->client),
908 env); 908 env);
909 } 909 }
910 //FIXME: Send status to wrappers if they exist 910 /**
911 * The wrapper barriers do not echo the barrier status, so we have to do it
912 * here
913 */
914 for (wrapper = barrier->whead; NULL != wrapper; wrapper = wrapper->next)
915 {
916 GNUNET_TESTBED_queue_message_ (wrapper->controller,
917 GNUNET_copy_message (&msg->header));
918 }
911} 919}
912 920
913/* end of gnunet-service-testbed_barriers.c */ 921/* end of gnunet-service-testbed_barriers.c */
diff --git a/src/testbed/testbed_api.c b/src/testbed/testbed_api.c
index a019d9b64..ae40948b3 100644
--- a/src/testbed/testbed_api.c
+++ b/src/testbed/testbed_api.c
@@ -1310,7 +1310,13 @@ handle_barrier_status (void *cls,
1310 1310
1311 cleanup: 1311 cleanup:
1312 GNUNET_free_non_null (emsg); 1312 GNUNET_free_non_null (emsg);
1313 if (NULL != barrier) 1313 /**
1314 * Do not remove the barrier if we did not echo the status back; this is
1315 * required at the chained testbed controller setup to ensure the only the
1316 * test-driver echos the status and the controller hierarchy properly
1317 * propagates the status.
1318 */
1319 if ((NULL != barrier) && (GNUNET_YES == barrier->echo))
1314 GNUNET_TESTBED_barrier_remove_ (barrier); 1320 GNUNET_TESTBED_barrier_remove_ (barrier);
1315} 1321}
1316 1322