gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r36374 - in gnunet/src: multicast psyc util


From: gnunet
Subject: [GNUnet-SVN] r36374 - in gnunet/src: multicast psyc util
Date: Sat, 26 Sep 2015 19:10:10 +0200

Author: tg
Date: 2015-09-26 19:10:10 +0200 (Sat, 26 Sep 2015)
New Revision: 36374

Modified:
   gnunet/src/multicast/gnunet-service-multicast.c
   gnunet/src/multicast/multicast_api.c
   gnunet/src/psyc/gnunet-service-psyc.c
   gnunet/src/psyc/psyc_api.c
   gnunet/src/psyc/test_psyc.c
   gnunet/src/util/client_manager.c
Log:
psyc fixes

Modified: gnunet/src/multicast/gnunet-service-multicast.c
===================================================================
--- gnunet/src/multicast/gnunet-service-multicast.c     2015-09-26 17:10:03 UTC 
(rev 36373)
+++ gnunet/src/multicast/gnunet-service-multicast.c     2015-09-26 17:10:10 UTC 
(rev 36374)
@@ -509,7 +509,7 @@
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "%p User context is NULL in client_disconnect()\n", grp);
-    GNUNET_assert (0);
+    GNUNET_break (0);
     return;
   }
 
@@ -969,7 +969,7 @@
                                                 mem->join_dcsn,
                                                 GNUNET_NO);
   }
-  else if (grp->clients_head == grp->clients_tail)
+  else
   { /* First client of the group, send join request. */
     struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) 
&msg[1];
     uint32_t relay_count = ntohl (msg->relay_count);
@@ -1042,16 +1042,7 @@
     memcpy (mem->join_dcsn, dcsn, dcsn_size);
   }
   else
-  { /* Refused entry, disconnect clients. */
-#if FIXME
-    struct ClientList *cl = mem->grp.clients_head;
-    while (NULL != cl)
-    {
-      struct GNUNET_SERVER_Client *client = cl->client;
-      cl = cl->next;
-      GNUNET_SERVER_client_disconnect (client);
-    }
-#endif
+  { /* Refused entry, but replay would be still possible for past members. */
   }
 }
 

Modified: gnunet/src/multicast/multicast_api.c
===================================================================
--- gnunet/src/multicast/multicast_api.c        2015-09-26 17:10:03 UTC (rev 
36373)
+++ gnunet/src/multicast/multicast_api.c        2015-09-26 17:10:10 UTC (rev 
36374)
@@ -1033,6 +1033,7 @@
                               GNUNET_ContinuationCallback part_cb,
                               void *part_cls)
 {
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Member parting.\n", mem);
   struct GNUNET_MULTICAST_Group *grp = &mem->grp;
 
   grp->is_disconnecting = GNUNET_YES;
@@ -1039,6 +1040,12 @@
   grp->disconnect_cb = part_cb;
   grp->disconnect_cls = part_cls;
 
+  mem->join_dcsn_cb = NULL;
+  grp->join_req_cb = NULL;
+  grp->message_cb = NULL;
+  grp->replay_msg_cb = NULL;
+  grp->replay_frag_cb = NULL;
+
   GNUNET_CLIENT_MANAGER_disconnect (mem->grp.client, GNUNET_YES,
                                     member_cleanup, mem);
 }
@@ -1157,7 +1164,8 @@
       || GNUNET_MULTICAST_FRAGMENT_MAX_SIZE < buf_size)
   {
     LOG (GNUNET_ERROR_TYPE_ERROR,
-         "MemberTransmitNotify() returned error or invalid message size.\n");
+         "MemberTransmitNotify() returned error or invalid message size. "
+         "ret=%d, buf_size=%u\n", ret, buf_size);
     /* FIXME: handle error */
     GNUNET_free (req);
     return;

Modified: gnunet/src/psyc/gnunet-service-psyc.c
===================================================================
--- gnunet/src/psyc/gnunet-service-psyc.c       2015-09-26 17:10:03 UTC (rev 
36373)
+++ gnunet/src/psyc/gnunet-service-psyc.c       2015-09-26 17:10:10 UTC (rev 
36374)
@@ -98,6 +98,16 @@
   uint16_t size;
 
   /**
+   * Type of first message part.
+   */
+  uint16_t first_ptype;
+
+  /**
+   * Type of last message part.
+   */
+  uint16_t last_ptype;
+
+  /**
    * @see enum MessageState
    */
   uint8_t state;
@@ -483,7 +493,7 @@
   if (NULL != mst->origin)
     GNUNET_MULTICAST_origin_stop (mst->origin, NULL, NULL); // FIXME
   GNUNET_CONTAINER_multihashmap_destroy (mst->join_reqs);
-  GNUNET_CONTAINER_multihashmap_remove (masters, &chn->pub_key_hash, chn);
+  GNUNET_CONTAINER_multihashmap_remove (masters, &chn->pub_key_hash, mst);
 }
 
 
@@ -523,7 +533,7 @@
     GNUNET_MULTICAST_member_part (slv->member, NULL, NULL); // FIXME
     slv->member = NULL;
   }
-  GNUNET_CONTAINER_multihashmap_remove (slaves, &chn->pub_key_hash, chn);
+  GNUNET_CONTAINER_multihashmap_remove (slaves, &chn->pub_key_hash, slv);
 }
 
 
@@ -582,8 +592,6 @@
               chn, (GNUNET_YES == chn->is_master) ? "master" : "slave",
               GNUNET_h2s (&chn->pub_key_hash));
 
-  chn->is_disconnected = GNUNET_YES;
-
   struct Client *cli = chn->clients_head;
   while (NULL != cli)
   {
@@ -609,6 +617,11 @@
 
   if (NULL == chn->clients_head)
   { /* Last client disconnected. */
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "%p Last client (%s) disconnected from channel %s\n",
+                chn, (GNUNET_YES == chn->is_master) ? "master" : "slave",
+                GNUNET_h2s (&chn->pub_key_hash));
+    chn->is_disconnected = GNUNET_YES;
     if (NULL != chn->tmit_head)
     { /* Send pending messages to multicast before cleanup. */
       transmit_message (chn);
@@ -789,6 +802,11 @@
   struct Channel *chn = &slv->chn;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "%p Got join decision: %d\n", slv, is_admitted);
+  if (GNUNET_YES == chn->is_ready)
+  {
+    /* Already admitted */
+    return;
+  }
 
   uint16_t join_resp_size = (NULL != join_resp) ? ntohs (join_resp->size) : 0;
   struct GNUNET_PSYC_JoinDecisionMessage *
@@ -805,10 +823,6 @@
   {
     chn->is_ready = GNUNET_YES;
   }
-  else
-  {
-    slv->member = NULL;
-  }
 }
 
 
@@ -2011,7 +2025,8 @@
   {
     transmit_message (chn);
   }
-  else if (GNUNET_YES == chn->is_disconnected)
+  else if (GNUNET_YES == chn->is_disconnected
+           && tmit_msg->last_ptype < GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END)
   {
     /* FIXME: handle partial message (when still in_transmit) */
     return GNUNET_SYSERR;
@@ -2106,12 +2121,11 @@
  * Queue a message from a channel master for sending to the multicast group.
  */
 static void
-master_queue_message (struct Master *mst, struct TransmitMessage *tmit_msg,
-                     uint16_t first_ptype, uint16_t last_ptype)
+master_queue_message (struct Master *mst, struct TransmitMessage *tmit_msg)
 {
   GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%p master_queue_message()\n", mst);
 
-  if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD == first_ptype)
+  if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD == tmit_msg->first_ptype)
   {
     tmit_msg->id = ++mst->max_message_id;
     struct GNUNET_PSYC_MessageMethod *pmeth
@@ -2149,10 +2163,9 @@
  * Queue a message from a channel slave for sending to the multicast group.
  */
 static void
-slave_queue_message (struct Slave *slv, struct TransmitMessage *tmit_msg,
-                     uint16_t first_ptype, uint16_t last_ptype)
+slave_queue_message (struct Slave *slv, struct TransmitMessage *tmit_msg)
 {
-  if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD == first_ptype)
+  if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD == tmit_msg->first_ptype)
   {
     struct GNUNET_PSYC_MessageMethod *pmeth
       = (struct GNUNET_PSYC_MessageMethod *) &tmit_msg[1];
@@ -2185,6 +2198,8 @@
   tmit_msg->client = client;
   tmit_msg->size = data_size;
   tmit_msg->state = chn->tmit_state;
+  tmit_msg->first_ptype = first_ptype;
+  tmit_msg->last_ptype = last_ptype;
 
   /* FIXME: separate queue per message ID */
 
@@ -2191,10 +2206,8 @@
   GNUNET_CONTAINER_DLL_insert_tail (chn->tmit_head, chn->tmit_tail, tmit_msg);
 
   chn->is_master
-    ? master_queue_message ((struct Master *) chn, tmit_msg,
-                            first_ptype, last_ptype)
-    : slave_queue_message ((struct Slave *) chn, tmit_msg,
-                           first_ptype, last_ptype);
+    ? master_queue_message ((struct Master *) chn, tmit_msg)
+    : slave_queue_message ((struct Slave *) chn, tmit_msg);
   return tmit_msg;
 }
 
@@ -2295,7 +2308,8 @@
               "%p GNUNET_PSYCSTORE_membership_store() returned %" PRId64 " 
(%.s)\n",
               op->chn, result, err_msg_size, err_msg);
 
-  client_send_result (op->client, op->op_id, result, err_msg, err_msg_size);
+  if (NULL != op->client)
+    client_send_result (op->client, op->op_id, result, err_msg, err_msg_size);
   op_remove (op);
 }
 

Modified: gnunet/src/psyc/psyc_api.c
===================================================================
--- gnunet/src/psyc/psyc_api.c  2015-09-26 17:10:03 UTC (rev 36373)
+++ gnunet/src/psyc/psyc_api.c  2015-09-26 17:10:10 UTC (rev 36374)
@@ -464,7 +464,7 @@
   if (sizeof (*req) + sizeof (*join_msg) <= ntohs (req->header.size))
   {
     join_msg = (struct GNUNET_PSYC_Message *) &req[1];
-    LOG (GNUNET_ERROR_TYPE_ERROR,
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
          "Received join_msg of type %u and size %u.\n",
          ntohs (join_msg->header.type), ntohs (join_msg->header.size));
   }

Modified: gnunet/src/psyc/test_psyc.c
===================================================================
--- gnunet/src/psyc/test_psyc.c 2015-09-26 17:10:03 UTC (rev 36373)
+++ gnunet/src/psyc/test_psyc.c 2015-09-26 17:10:10 UTC (rev 36374)
@@ -86,19 +86,22 @@
 
 enum
 {
-  TEST_NONE = 0,
-  TEST_MASTER_START = 1,
-  TEST_SLAVE_JOIN = 2,
-  TEST_SLAVE_TRANSMIT = 3,
-  TEST_MASTER_TRANSMIT = 4,
-  TEST_MASTER_HISTORY_REPLAY_LATEST = 5,
-  TEST_SLAVE_HISTORY_REPLAY_LATEST = 6,
-  TEST_MASTER_HISTORY_REPLAY = 7,
-  TEST_SLAVE_HISTORY_REPLAY = 8,
-  TEST_MASTER_STATE_GET = 9,
-  TEST_SLAVE_STATE_GET = 10,
-  TEST_MASTER_STATE_GET_PREFIX = 11,
-  TEST_SLAVE_STATE_GET_PREFIX = 12,
+  TEST_NONE                         = 0,
+  TEST_MASTER_START                 = 1,
+  TEST_SLAVE_JOIN_REJECT            = 2,
+  TEST_SLAVE_JOIN_ACCEPT            = 3,
+  TEST_SLAVE_ADD                    = 4,
+  TEST_SLAVE_REMOVE                 = 5,
+  TEST_SLAVE_TRANSMIT               = 6,
+  TEST_MASTER_TRANSMIT              = 7,
+  TEST_MASTER_HISTORY_REPLAY_LATEST = 8,
+  TEST_SLAVE_HISTORY_REPLAY_LATEST  = 9,
+  TEST_MASTER_HISTORY_REPLAY       = 10,
+  TEST_SLAVE_HISTORY_REPLAY        = 11,
+  TEST_MASTER_STATE_GET            = 12,
+  TEST_SLAVE_STATE_GET             = 13,
+  TEST_MASTER_STATE_GET_PREFIX     = 14,
+  TEST_SLAVE_STATE_GET_PREFIX      = 15,
 } test;
 
 
@@ -204,6 +207,7 @@
 master_message_cb (void *cls, uint64_t message_id, uint32_t flags,
                    const struct GNUNET_PSYC_MessageHeader *msg)
 {
+  GNUNET_assert (NULL != msg);
   GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
               "Test #%d: Master got PSYC message fragment of size %u "
               "belonging to message ID %" PRIu64 " with flags %x\n",
@@ -718,6 +722,16 @@
 
 
 void
+slave_remove ()
+{
+  test = TEST_SLAVE_REMOVE;
+  struct GNUNET_PSYC_Channel *chn = GNUNET_PSYC_master_get_channel (mst);
+  GNUNET_PSYC_channel_slave_remove (chn, &slave_pub_key, 2,
+                                    &slave_remove_cb, chn);
+}
+
+
+void
 slave_add_cb (void *cls, int64_t result,
               const void *err_msg, uint16_t err_msg_size)
 {
@@ -724,14 +738,33 @@
   GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
               "slave_add:\t%" PRId64 " (%.*s)\n",
               result, err_msg_size, err_msg);
+  slave_remove ();
+}
 
-  struct GNUNET_PSYC_Channel *chn = cls;
-  GNUNET_PSYC_channel_slave_remove (chn, &slave_pub_key, 2,
-                                    &slave_remove_cb, chn);
 
+void
+slave_add ()
+{
+  test = TEST_SLAVE_ADD;
+  struct GNUNET_PSYC_Channel *chn = GNUNET_PSYC_master_get_channel (mst);
+  GNUNET_PSYC_channel_slave_add (chn, &slave_pub_key, 2, 2, &slave_add_cb, 
chn);
 }
 
 
+void first_slave_parted (void *cls)
+{
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "First slave parted.\n");
+  slave_join (TEST_SLAVE_JOIN_ACCEPT);
+}
+
+
+void
+schedule_slave_part (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  GNUNET_PSYC_slave_part (slv, GNUNET_NO, first_slave_parted, NULL);
+}
+
+
 static void
 join_decision_cb (void *cls,
                   const struct GNUNET_PSYC_JoinDecisionMessage *dcsn,
@@ -741,15 +774,23 @@
   GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
               "Slave got join decision: %d\n", is_admitted);
 
-  if (GNUNET_YES != is_admitted)
-  { /* First join request is refused, retry. */
+  switch (test)
+  {
+  case TEST_SLAVE_JOIN_REJECT:
+    GNUNET_assert (0 == is_admitted);
     GNUNET_assert (1 == join_req_count);
-    slave_join ();
-    return;
+    GNUNET_SCHEDULER_add_now (schedule_slave_part, NULL);
+    break;
+
+  case TEST_SLAVE_JOIN_ACCEPT:
+    GNUNET_assert (1 == is_admitted);
+    GNUNET_assert (2 == join_req_count);
+    slave_add ();
+    break;
+
+  default:
+    GNUNET_break (0);
   }
-
-  struct GNUNET_PSYC_Channel *chn = GNUNET_PSYC_master_get_channel (mst);
-  GNUNET_PSYC_channel_slave_add (chn, &slave_pub_key, 2, 2, &slave_add_cb, 
chn);
 }
 
 
@@ -778,16 +819,16 @@
   GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
               "Slave connected: %d, max_message_id: %" PRIu64 "\n",
               result, max_message_id);
-  GNUNET_assert (TEST_SLAVE_JOIN == test);
+  GNUNET_assert (TEST_SLAVE_JOIN_REJECT == test || TEST_SLAVE_JOIN_ACCEPT == 
test);
   GNUNET_assert (GNUNET_OK == result || GNUNET_NO == result);
 }
 
 
 static void
-slave_join ()
+slave_join (int t)
 {
   GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Joining slave.\n");
-  test = TEST_SLAVE_JOIN;
+  test = t;
 
   struct GNUNET_PeerIdentity origin = this_peer;
   struct GNUNET_ENV_Environment *env = GNUNET_ENV_environment_create ();
@@ -870,7 +911,7 @@
               result, max_message_id);
   GNUNET_assert (TEST_MASTER_START == test);
   GNUNET_assert (GNUNET_OK == result || GNUNET_NO == result);
-  slave_join ();
+  slave_join (TEST_SLAVE_JOIN_REJECT);
 }
 
 

Modified: gnunet/src/util/client_manager.c
===================================================================
--- gnunet/src/util/client_manager.c    2015-09-26 17:10:03 UTC (rev 36373)
+++ gnunet/src/util/client_manager.c    2015-09-26 17:10:10 UTC (rev 36374)
@@ -196,6 +196,9 @@
     mgr->client_tmit = NULL;
   }
 
+  if (GNUNET_YES == mgr->is_disconnecting)
+    return;
+
   size_t i = 0;
   while (NULL != mgr->handlers[i].callback)
   {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]