- GNUNET_STATISTICS_update (GSF_stats,
- gettext_noop ("# processing result set cut short due to load"),
- 1,
- GNUNET_NO);
- if (NULL != (cont = pr->llc_cont))
- {
- pr->llc_cont = NULL;
- cont (pr->llc_cont_cls,
- pr,
- pr->local_result);
- }
- return;
- }
- pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh,
- pr->local_result_offset++,
- &pr->public_data.query,
- pr->public_data.type == GNUNET_BLOCK_TYPE_FS_DBLOCK
- ? GNUNET_BLOCK_TYPE_ANY
- : pr->public_data.type,
- (0 != (GSF_PRO_PRIORITY_UNLIMITED & pr->public_data.options))
- ? UINT_MAX
- : 1 /* queue priority */,
- (0 != (GSF_PRO_PRIORITY_UNLIMITED & pr->public_data.options))
- ? UINT_MAX
- : 1 /* max queue size */,
- GNUNET_TIME_UNIT_FOREVER_REL,
- &process_local_reply,
- pr);
- GNUNET_assert (NULL != pr->qe);
+ GNUNET_STATISTICS_update (GSF_stats,
+ gettext_noop
+ ("# Datastore lookups concluded (load too high)"),
+ 1, GNUNET_NO);
+ goto check_error_and_continue;
+ }
+ pr->qe_start = GNUNET_TIME_absolute_get ();
+ pr->warn_task =
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &warn_delay_task,
+ pr);
+ pr->qe =
+ GNUNET_DATASTORE_get_key (GSF_dsh, pr->local_result_offset++,
+ &pr->public_data.query,
+ pr->public_data.type ==
+ GNUNET_BLOCK_TYPE_FS_DBLOCK ?
+ GNUNET_BLOCK_TYPE_ANY : pr->public_data.type,
+ (0 !=
+ (GSF_PRO_PRIORITY_UNLIMITED & pr->
+ public_data.options)) ? UINT_MAX : 1
+ /* queue priority */ ,
+ (0 !=
+ (GSF_PRO_PRIORITY_UNLIMITED & pr->
+ public_data.options)) ? UINT_MAX :
+ datastore_queue_size
+ /* max queue size */ ,
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ &process_local_reply, pr);
+ /* check if we successfully queued another datastore request;
+ * if so, return, otherwise call our continuation (if we have
+ * any) */
+check_error_and_continue:
+ if (NULL != pr->qe)
+ return;
+ if (GNUNET_SCHEDULER_NO_TASK != pr->warn_task)
+ {
+ GNUNET_SCHEDULER_cancel (pr->warn_task);
+ pr->warn_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+ if (NULL == (cont = pr->llc_cont))
+ return; /* no continuation */
+ pr->llc_cont = NULL;
+ cont (pr->llc_cont_cls, pr, pr->local_result);
+}
+
+
+/**
+ * Is the given target a legitimate peer for forwarding the given request?
+ *
+ * @param pr request
+ * @param target
+ * @return GNUNET_YES if this request could be forwarded to the given peer
+ */
+int
+GSF_pending_request_test_target_ (struct GSF_PendingRequest *pr,
+ const struct GNUNET_PeerIdentity *target)
+{
+ struct GNUNET_PeerIdentity pi;
+
+ if (0 == pr->origin_pid)
+ return GNUNET_YES;
+ GNUNET_PEER_resolve (pr->origin_pid, &pi);
+ return (0 ==
+ memcmp (&pi, target,
+ sizeof (struct GNUNET_PeerIdentity))) ? GNUNET_NO :
+ GNUNET_YES;