aboutsummaryrefslogtreecommitdiff
path: root/src/core/gnunet-service-core_sessions.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-10-08 17:09:42 +0000
committerChristian Grothoff <christian@grothoff.org>2015-10-08 17:09:42 +0000
commitb910380795760d26a7cc38510c1f313bb1a72ea7 (patch)
treeadcb256486cf4b97284ccb21850197037a802ba7 /src/core/gnunet-service-core_sessions.c
parent0f420b095bd839165613d0bd681f5a8b1614e24e (diff)
downloadgnunet-b910380795760d26a7cc38510c1f313bb1a72ea7.tar.gz
gnunet-b910380795760d26a7cc38510c1f313bb1a72ea7.zip
redefining core message timeout semantics and core-core-API messaging to address (hypothetical?) stalls which may explain #3863. This kind-of breaks the API in that the timeout now has a different semantic -- it's an advisory as to when the app would like the message transmitted, the transmission will no longer actually time out. However, that was the documented semantics before, just not the actual behavior. Most applications didn't rely on it, and tests still pass, so I didn't break too much...
Diffstat (limited to 'src/core/gnunet-service-core_sessions.c')
-rw-r--r--src/core/gnunet-service-core_sessions.c64
1 files changed, 24 insertions, 40 deletions
diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c
index bbabf8866..b99fee272 100644
--- a/src/core/gnunet-service-core_sessions.c
+++ b/src/core/gnunet-service-core_sessions.c
@@ -229,7 +229,8 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid)
229 { 229 {
230 GNUNET_CONTAINER_DLL_remove (session->active_client_request_head, 230 GNUNET_CONTAINER_DLL_remove (session->active_client_request_head,
231 session->active_client_request_tail, car); 231 session->active_client_request_tail, car);
232 GSC_CLIENTS_reject_request (car); 232 GSC_CLIENTS_reject_request (car,
233 GNUNET_NO);
233 } 234 }
234 while (NULL != (sme = session->sme_head)) 235 while (NULL != (sme = session->sme_head))
235 { 236 {
@@ -486,13 +487,15 @@ GSC_SESSIONS_queue_request (struct GSC_ClientActiveRequest *car)
486 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 487 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
487 "Dropped client request for transmission (am disconnected)\n"); 488 "Dropped client request for transmission (am disconnected)\n");
488 GNUNET_break (0); /* should have been rejected earlier */ 489 GNUNET_break (0); /* should have been rejected earlier */
489 GSC_CLIENTS_reject_request (car); 490 GSC_CLIENTS_reject_request (car,
491 GNUNET_NO);
490 return; 492 return;
491 } 493 }
492 if (car->msize > GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE) 494 if (car->msize > GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
493 { 495 {
494 GNUNET_break (0); 496 GNUNET_break (0);
495 GSC_CLIENTS_reject_request (car); 497 GSC_CLIENTS_reject_request (car,
498 GNUNET_YES);
496 return; 499 return;
497 } 500 }
498 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 501 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -516,7 +519,8 @@ GSC_SESSIONS_dequeue_request (struct GSC_ClientActiveRequest *car)
516 struct Session *session; 519 struct Session *session;
517 520
518 if (0 == 521 if (0 ==
519 memcmp (&car->target, &GSC_my_identity, 522 memcmp (&car->target,
523 &GSC_my_identity,
520 sizeof (struct GNUNET_PeerIdentity))) 524 sizeof (struct GNUNET_PeerIdentity)))
521 return; 525 return;
522 session = find_session (&car->target); 526 session = find_session (&car->target);
@@ -524,41 +528,10 @@ GSC_SESSIONS_dequeue_request (struct GSC_ClientActiveRequest *car)
524 GNUNET_CONTAINER_DLL_remove (session->active_client_request_head, 528 GNUNET_CONTAINER_DLL_remove (session->active_client_request_head,
525 session->active_client_request_tail, 529 session->active_client_request_tail,
526 car); 530 car);
527} 531 /* dequeueing of 'high' priority messages may unblock
528 532 transmission for lower-priority messages, so we also
529 533 need to try in this case. */
530/** 534 try_transmission (session);
531 * Discard all expired active transmission requests from clients.
532 *
533 * @param session session to clean up
534 */
535static void
536discard_expired_requests (struct Session *session)
537{
538 struct GSC_ClientActiveRequest *pos;
539 struct GSC_ClientActiveRequest *nxt;
540 struct GNUNET_TIME_Absolute now;
541
542 now = GNUNET_TIME_absolute_get ();
543 pos = NULL;
544 nxt = session->active_client_request_head;
545 while (NULL != nxt)
546 {
547 pos = nxt;
548 nxt = pos->next;
549 if ( (pos->deadline.abs_value_us < now.abs_value_us) &&
550 (GNUNET_YES != pos->was_solicited) )
551 {
552 GNUNET_STATISTICS_update (GSC_stats,
553 gettext_noop
554 ("# messages discarded (expired prior to transmission)"),
555 1, GNUNET_NO);
556 GNUNET_CONTAINER_DLL_remove (session->active_client_request_head,
557 session->active_client_request_tail,
558 pos);
559 GSC_CLIENTS_reject_request (pos);
560 }
561 }
562} 535}
563 536
564 537
@@ -578,7 +551,6 @@ solicit_messages (struct Session *session,
578 size_t so_size; 551 size_t so_size;
579 enum GNUNET_CORE_Priority pmax; 552 enum GNUNET_CORE_Priority pmax;
580 553
581 discard_expired_requests (session);
582 so_size = msize; 554 so_size = msize;
583 pmax = GNUNET_CORE_PRIO_BACKGROUND; 555 pmax = GNUNET_CORE_PRIO_BACKGROUND;
584 for (car = session->active_client_request_head; NULL != car; car = car->next) 556 for (car = session->active_client_request_head; NULL != car; car = car->next)
@@ -599,6 +571,9 @@ solicit_messages (struct Session *session,
599 if (GNUNET_YES == car->was_solicited) 571 if (GNUNET_YES == car->was_solicited)
600 continue; 572 continue;
601 car->was_solicited = GNUNET_YES; 573 car->was_solicited = GNUNET_YES;
574 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
575 "Soliciting message with priority %u\n",
576 car->priority);
602 GSC_CLIENTS_solicit_request (car); 577 GSC_CLIENTS_solicit_request (car);
603 } 578 }
604} 579}
@@ -642,7 +617,11 @@ try_transmission (struct Session *session)
642 int excess; 617 int excess;
643 618
644 if (GNUNET_YES != session->ready_to_transmit) 619 if (GNUNET_YES != session->ready_to_transmit)
620 {
621 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
622 "Already ready to transmit, not evaluating queue\n");
645 return; 623 return;
624 }
646 msize = 0; 625 msize = 0;
647 min_deadline = GNUNET_TIME_UNIT_FOREVER_ABS; 626 min_deadline = GNUNET_TIME_UNIT_FOREVER_ABS;
648 /* if the peer has excess bandwidth, background traffic is allowed, 627 /* if the peer has excess bandwidth, background traffic is allowed,
@@ -745,6 +724,11 @@ try_transmission (struct Session *session)
745 &pop_cork_task, 724 &pop_cork_task,
746 session); 725 session);
747 } 726 }
727 else
728 {
729 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
730 "Queue empty, waiting for solicitations\n");
731 }
748 return; 732 return;
749 } 733 }
750 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 734 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,