*/
static struct GNUNET_CONTAINER_MultiHashMap *plans;
+/**
+ * Sum of all transmission counters (equals total delay for all plan entries).
+ */
+static unsigned long long total_delay;
+
+/**
+ * Number of plan entries.
+ */
+static unsigned long long plan_count;
+
/**
* Figure out when and how to transmit to the given peer.
struct GSF_RequestPlan *rp)
{
struct GSF_PendingRequestData *prd;
+ struct GNUNET_TIME_Relative delay;
+ GNUNET_STATISTICS_set (GSF_stats,
+ gettext_noop ("# average retransmission delay (ms)"),
+ total_delay * 1000LL / plan_count,
+ GNUNET_NO);
prd = GSF_pending_request_get_data_ (rp->pr);
// FIXME: calculate 'rp->earliest_transmission'!
- // FIXME: claculate 'rp->priority'!
+ // FIXME: claculate 'rp->priority'!
+ delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
+ rp->transmission_counter);
rp->earliest_transmission
- = GNUNET_TIME_relative_to_absolute
- (GNUNET_TIME_relative_multiply
- (GNUNET_TIME_UNIT_SECONDS,
- rp->transmission_counter));
+ = GNUNET_TIME_relative_to_absolute (delay);
#if DEBUG_FS
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Earliest (re)transmission for `%s' in %us\n",
rp->transmission_counter);
#endif
-
+ GNUNET_assert (rp->hn == NULL);
if (GNUNET_TIME_absolute_get_remaining (rp->earliest_transmission).rel_value == 0)
rp->hn = GNUNET_CONTAINER_heap_insert (pp->priority_heap,
rp,
rp->hn = NULL;
rp->last_transmission = GNUNET_TIME_absolute_get ();
rp->transmission_counter++;
+ total_delay++;
#if DEBUG_FS
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Executing plan %p executed %u times, planning retransmission\n",
rp->transmission_counter);
#endif
plan (pp, rp);
+ GNUNET_STATISTICS_update (GSF_stats,
+ gettext_noop ("# queries messages sent to other peers"),
+ 1,
+ GNUNET_NO);
return msize;
}
}
/* process from priority heap */
rp = GNUNET_CONTAINER_heap_peek (pp->priority_heap);
-#if DEBUG_FS
+#if DEBUG_FS > 1
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Executing query plan %p\n",
rp);
struct GSF_PendingRequestData *prd;
struct GSF_RequestPlan *rp;
+ GNUNET_assert (NULL != cp);
GSF_connected_peer_get_identity_ (cp, &id);
pp = GNUNET_CONTAINER_multihashmap_get (plans,
&id.hashPubKey);
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
}
prd = GSF_pending_request_get_data_ (pr);
+ plan_count++;
+ GNUNET_STATISTICS_update (GSF_stats,
+ gettext_noop ("# query plan entries"),
+ 1,
+ GNUNET_NO);
rp = GNUNET_malloc (sizeof (struct GSF_RequestPlan));
#if DEBUG_FS
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
if (NULL != pp->pth)
GSF_peer_transmit_cancel_ (pp->pth);
if (GNUNET_SCHEDULER_NO_TASK != pp->task)
- GNUNET_SCHEDULER_cancel (pp->task);
+ {
+ GNUNET_SCHEDULER_cancel (pp->task);
+ pp->task = GNUNET_SCHEDULER_NO_TASK;
+ }
while (NULL != (rp = GNUNET_CONTAINER_heap_remove_root (pp->priority_heap)))
{
prd = GSF_pending_request_get_data_ (rp->pr);
GNUNET_CONTAINER_DLL_remove (prd->rp_head,
prd->rp_tail,
rp);
+ plan_count--;
GNUNET_free (rp);
}
GNUNET_CONTAINER_heap_destroy (pp->priority_heap);
GNUNET_CONTAINER_DLL_remove (prd->rp_head,
prd->rp_tail,
rp);
+ plan_count--;
GNUNET_free (rp);
}
+ GNUNET_STATISTICS_set (GSF_stats,
+ gettext_noop ("# query plan entries"),
+ plan_count,
+ GNUNET_NO);
+
GNUNET_CONTAINER_heap_destroy (pp->delay_heap);
GNUNET_free (pp);
}
GNUNET_CONTAINER_DLL_remove (prd->rp_head,
prd->rp_tail,
rp);
+ plan_count--;
GNUNET_free (rp);
}
+ GNUNET_STATISTICS_set (GSF_stats,
+ gettext_noop ("# query plan entries"),
+ plan_count,
+ GNUNET_NO);
}