diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-10-08 17:09:42 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-10-08 17:09:42 +0000 |
commit | b910380795760d26a7cc38510c1f313bb1a72ea7 (patch) | |
tree | adcb256486cf4b97284ccb21850197037a802ba7 /src/core/gnunet-service-core_sessions.c | |
parent | 0f420b095bd839165613d0bd681f5a8b1614e24e (diff) | |
download | gnunet-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.c | 64 |
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 | */ | ||
535 | static void | ||
536 | discard_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, |