*/
unsigned int queue_size;
+ /**
+ * Are we currently trying to receive from the service?
+ */
+ int in_receive;
+
};
h->reconnect_task = GNUNET_SCHEDULER_NO_TASK;
h->client = GNUNET_CLIENT_connect (h->sched, "datastore", h->cfg);
if (h->client == NULL)
- return;
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "DATASTORE reconnect failed (fatally)\n");
+ return;
+ }
+#if DEBUG_DATASTORE
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Reconnected to DATASTORE\n");
+#endif
process_queue (h);
}
do_disconnect (struct GNUNET_DATASTORE_Handle *h)
{
if (h->client == NULL)
- return;
+ {
+#if DEBUG_DATASTORE
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "client NULL in disconnect, will not try to reconnect\n");
+#endif
+ return;
+ }
#if 0
GNUNET_STATISTICS_update (stats,
- gettext_noop ("# reconnected to datastore"),
+ gettext_noop ("# reconnected to DATASTORE"),
1,
GNUNET_NO);
#endif
if (buf == NULL)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _("Failed to transmit request to database.\n"));
+ _("Failed to transmit request to DATASTORE.\n"));
do_disconnect (h);
return 0;
}
process_queue (h);
return 0;
}
+ #if DEBUG_DATASTORE
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Transmitting %u byte request to DATASTORE\n",
+ msize);
+#endif
memcpy (buf, &qe[1], msize);
qe->was_transmitted = GNUNET_YES;
GNUNET_SCHEDULER_cancel (h->sched,
qe->task);
qe->task = GNUNET_SCHEDULER_NO_TASK;
+ h->in_receive = GNUNET_YES;
GNUNET_CLIENT_receive (h->client,
qe->response_proc,
qe,
struct GNUNET_DATASTORE_QueueEntry *qe;
if (NULL == (qe = h->queue_head))
- return; /* no entry in queue */
+ {
+#if DEBUG_DATASTORE > 1
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Queue empty\n");
+#endif
+ return; /* no entry in queue */
+ }
if (qe->was_transmitted == GNUNET_YES)
- return; /* waiting for replies */
+ {
+#if DEBUG_DATASTORE > 1
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Head request already transmitted\n");
+#endif
+ return; /* waiting for replies */
+ }
if (h->th != NULL)
- return; /* request pending */
+ {
+#if DEBUG_DATASTORE > 1
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Pending transmission request\n");
+#endif
+ return; /* request pending */
+ }
if (h->client == NULL)
- return; /* waiting for reconnect */
+ {
+#if DEBUG_DATASTORE > 1
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Not connected\n");
+#endif
+ return; /* waiting for reconnect */
+ }
#if DEBUG_DATASTORE
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Transmitting %u bytes request to datastore\n",
+ "Queueing %u byte request to DATASTORE\n",
qe->message_size);
#endif
h->th = GNUNET_CLIENT_notify_transmit_ready (h->client,
int32_t status;
int was_transmitted;
+ h->in_receive = GNUNET_NO;
was_transmitted = qe->was_transmitted;
if (msg == NULL)
{
const struct DataMessage *dm;
int was_transmitted;
+ h->in_receive = GNUNET_NO;
if (msg == NULL)
{
was_transmitted = qe->was_transmitted;
if (rc.iter == NULL)
{
/* abort iteration */
+#if DEBUG_DATASTORE
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Aborting iteration via disconnect (client has cancelled)\n");
+#endif
+ free_queue_entry (qe);
+ h->retry_time = GNUNET_TIME_UNIT_ZERO;
do_disconnect (h);
return;
}
GNUNET_assert (&process_result_message == qe->response_proc);
if (GNUNET_YES == more)
{
+ h->in_receive = GNUNET_YES;
GNUNET_CLIENT_receive (h->client,
qe->response_proc,
qe,
int reconnect;
h = qe->h;
+#if DEBUG_DATASTORE
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Pending DATASTORE request %p cancelled (%d, %d)\n",
+ qe,
+ qe->was_transmitted,
+ h->queue_head == qe);
+#endif
reconnect = GNUNET_NO;
if (GNUNET_YES == qe->was_transmitted)
{
if (qe->response_proc == &process_result_message)
{
qe->qc.rc.iter = NULL;
- GNUNET_DATASTORE_get_next (h, GNUNET_YES);
+ if (GNUNET_YES != h->in_receive)
+ GNUNET_DATASTORE_get_next (h, GNUNET_YES);
return;
}
reconnect = GNUNET_YES;
}
free_queue_entry (qe);
- h->queue_size--;
if (reconnect)
{
h->retry_time = GNUNET_TIME_UNIT_ZERO;
do_disconnect (h);
}
+ else
+ {
+ process_queue (h);
+ }
}