aboutsummaryrefslogtreecommitdiff
path: root/src/fs
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-05-25 15:34:24 +0000
committerChristian Grothoff <christian@grothoff.org>2011-05-25 15:34:24 +0000
commitb7981b63fe6630ca580768e555415d8c61c3e5c3 (patch)
treef7e2d09d65219d454fd518bf999c89d7d5a4ce93 /src/fs
parentfc25b8f4e03c545a12631c50a5aa41d435c00cd5 (diff)
downloadgnunet-b7981b63fe6630ca580768e555415d8c61c3e5c3.tar.gz
gnunet-b7981b63fe6630ca580768e555415d8c61c3e5c3.zip
better assertions, extra warnings
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/gnunet-service-fs_cp.c6
-rw-r--r--src/fs/gnunet-service-fs_pr.c82
2 files changed, 84 insertions, 4 deletions
diff --git a/src/fs/gnunet-service-fs_cp.c b/src/fs/gnunet-service-fs_cp.c
index acad54501..7508ea324 100644
--- a/src/fs/gnunet-service-fs_cp.c
+++ b/src/fs/gnunet-service-fs_cp.c
@@ -419,7 +419,9 @@ peer_transmit_ready_cb (void *cls,
419 struct GSF_PeerTransmitHandle *pth = cls; 419 struct GSF_PeerTransmitHandle *pth = cls;
420 struct GSF_ConnectedPeer *cp; 420 struct GSF_ConnectedPeer *cp;
421 size_t ret; 421 size_t ret;
422 422
423 GNUNET_assert ( (NULL == buf) ||
424 (pth->size <= size) );
423 pth->cth = NULL; 425 pth->cth = NULL;
424 if (pth->timeout_task != GNUNET_SCHEDULER_NO_TASK) 426 if (pth->timeout_task != GNUNET_SCHEDULER_NO_TASK)
425 { 427 {
@@ -764,7 +766,7 @@ handle_p2p_reply (void *cls,
764 struct PutMessage *pm; 766 struct PutMessage *pm;
765 size_t msize; 767 size_t msize;
766 768
767 GNUNET_assert (data_len < GNUNET_SERVER_MAX_MESSAGE_SIZE); 769 GNUNET_assert (data_len + sizeof (struct PutMessage) < GNUNET_SERVER_MAX_MESSAGE_SIZE);
768 GNUNET_assert (peerreq->pr == pr); 770 GNUNET_assert (peerreq->pr == pr);
769 prd = GSF_pending_request_get_data_ (pr); 771 prd = GSF_pending_request_get_data_ (pr);
770 if (NULL == data) 772 if (NULL == data)
diff --git a/src/fs/gnunet-service-fs_pr.c b/src/fs/gnunet-service-fs_pr.c
index 220a331d5..7c1138356 100644
--- a/src/fs/gnunet-service-fs_pr.c
+++ b/src/fs/gnunet-service-fs_pr.c
@@ -100,6 +100,16 @@ struct GSF_PendingRequest
100 GNUNET_PEER_Id sender_pid; 100 GNUNET_PEER_Id sender_pid;
101 101
102 /** 102 /**
103 * Time we started the last datastore lookup.
104 */
105 struct GNUNET_TIME_Absolute qe_start;
106
107 /**
108 * Task that warns us if the local datastore lookup takes too long.
109 */
110 GNUNET_SCHEDULER_TaskIdentifier warn_task;
111
112 /**
103 * Current offset for querying our local datastore for results. 113 * Current offset for querying our local datastore for results.
104 * Starts at a random value, incremented until we get the same 114 * Starts at a random value, incremented until we get the same
105 * UID again (detected using 'first_uid'), which is then used 115 * UID again (detected using 'first_uid'), which is then used
@@ -576,6 +586,8 @@ clean_request (void *cls,
576 GNUNET_DATASTORE_cancel (pr->qe); 586 GNUNET_DATASTORE_cancel (pr->qe);
577 if (NULL != pr->gh) 587 if (NULL != pr->gh)
578 GNUNET_DHT_get_stop (pr->gh); 588 GNUNET_DHT_get_stop (pr->gh);
589 if (GNUNET_SCHEDULER_NO_TASK != pr->warn_task)
590 GNUNET_SCHEDULER_cancel (pr->warn_task);
579 GNUNET_free (pr); 591 GNUNET_free (pr);
580 return GNUNET_YES; 592 return GNUNET_YES;
581} 593}
@@ -589,7 +601,8 @@ clean_request (void *cls,
589void 601void
590GSF_pending_request_cancel_ (struct GSF_PendingRequest *pr) 602GSF_pending_request_cancel_ (struct GSF_PendingRequest *pr)
591{ 603{
592 if (NULL == pr_map) return; /* already cleaned up! */ 604 if (NULL == pr_map)
605 return; /* already cleaned up! */
593 GNUNET_assert (GNUNET_OK == 606 GNUNET_assert (GNUNET_OK ==
594 GNUNET_CONTAINER_multihashmap_remove (pr_map, 607 GNUNET_CONTAINER_multihashmap_remove (pr_map,
595 &pr->public_data.query, 608 &pr->public_data.query,
@@ -1019,6 +1032,49 @@ GSF_dht_lookup_ (struct GSF_PendingRequest *pr)
1019 pr); 1032 pr);
1020} 1033}
1021 1034
1035
1036/**
1037 * Task that issues a warning if the datastore lookup takes too long.
1038 *
1039 * @param cls the 'struct GSF_PendingRequest'
1040 * @param tc task context
1041 */
1042static void
1043warn_delay_task (void *cls,
1044 const struct GNUNET_SCHEDULER_TaskContext *tc)
1045{
1046 struct GSF_PendingRequest *pr = cls;
1047
1048 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1049 _("Datastore lookup already took %llu ms!\n"),
1050 (unsigned long long) GNUNET_TIME_absolute_get_duration (pr->qe_start).rel_value);
1051 pr->warn_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
1052 &warn_delay_task,
1053 pr);
1054}
1055
1056
1057/**
1058 * Task that issues a warning if the datastore lookup takes too long.
1059 *
1060 * @param cls the 'struct GSF_PendingRequest'
1061 * @param tc task context
1062 */
1063static void
1064odc_warn_delay_task (void *cls,
1065 const struct GNUNET_SCHEDULER_TaskContext *tc)
1066{
1067 struct GSF_PendingRequest *pr = cls;
1068
1069 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1070 _("On-demand lookup already took %llu ms!\n"),
1071 (unsigned long long) GNUNET_TIME_absolute_get_duration (pr->qe_start).rel_value);
1072 pr->warn_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
1073 &odc_warn_delay_task,
1074 pr);
1075}
1076
1077
1022/** 1078/**
1023 * We're processing (local) results for a search request 1079 * We're processing (local) results for a search request
1024 * from another peer. Pass applicable results to the 1080 * from another peer. Pass applicable results to the
@@ -1054,6 +1110,8 @@ process_local_reply (void *cls,
1054 unsigned int old_rf; 1110 unsigned int old_rf;
1055 1111
1056 pr->qe = NULL; 1112 pr->qe = NULL;
1113 GNUNET_SCHEDULER_cancel (pr->warn_task);
1114 pr->warn_task = GNUNET_SCHEDULER_NO_TASK;
1057 if (0 == pr->replies_seen_count) 1115 if (0 == pr->replies_seen_count)
1058 { 1116 {
1059 pr->first_uid = uid; 1117 pr->first_uid = uid;
@@ -1095,13 +1153,21 @@ process_local_reply (void *cls,
1095 gettext_noop ("# on-demand blocks matched requests"), 1153 gettext_noop ("# on-demand blocks matched requests"),
1096 1, 1154 1,
1097 GNUNET_NO); 1155 GNUNET_NO);
1156 pr->qe_start = GNUNET_TIME_absolute_get ();
1157 pr->warn_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
1158 &odc_warn_delay_task,
1159 pr);
1098 if (GNUNET_OK != 1160 if (GNUNET_OK !=
1099 GNUNET_FS_handle_on_demand_block (key, size, data, type, priority, 1161 GNUNET_FS_handle_on_demand_block (key, size, data, type, priority,
1100 anonymity, expiration, uid, 1162 anonymity, expiration, uid,
1101 &process_local_reply, 1163 &process_local_reply,
1102 pr)) 1164 pr))
1103 { 1165 {
1104 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh, 1166 GNUNET_SCHEDULER_cancel (pr->warn_task);
1167 pr->warn_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
1168 &warn_delay_task,
1169 pr);
1170 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh,
1105 pr->local_result_offset - 1, 1171 pr->local_result_offset - 1,
1106 &pr->public_data.query, 1172 &pr->public_data.query,
1107 pr->public_data.type == GNUNET_BLOCK_TYPE_FS_DBLOCK 1173 pr->public_data.type == GNUNET_BLOCK_TYPE_FS_DBLOCK
@@ -1139,6 +1205,10 @@ process_local_reply (void *cls,
1139 -1, -1, 1205 -1, -1,
1140 GNUNET_TIME_UNIT_FOREVER_REL, 1206 GNUNET_TIME_UNIT_FOREVER_REL,
1141 NULL, NULL); 1207 NULL, NULL);
1208 pr->qe_start = GNUNET_TIME_absolute_get ();
1209 pr->warn_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
1210 &warn_delay_task,
1211 pr);
1142 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh, 1212 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh,
1143 pr->local_result_offset - 1, 1213 pr->local_result_offset - 1,
1144 &pr->public_data.query, 1214 &pr->public_data.query,
@@ -1198,6 +1268,10 @@ process_local_reply (void *cls,
1198 } 1268 }
1199 return; 1269 return;
1200 } 1270 }
1271 pr->qe_start = GNUNET_TIME_absolute_get ();
1272 pr->warn_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
1273 &warn_delay_task,
1274 pr);
1201 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh, 1275 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh,
1202 pr->local_result_offset++, 1276 pr->local_result_offset++,
1203 &pr->public_data.query, 1277 &pr->public_data.query,
@@ -1233,6 +1307,10 @@ GSF_local_lookup_ (struct GSF_PendingRequest *pr,
1233 GNUNET_assert (NULL == pr->llc_cont); 1307 GNUNET_assert (NULL == pr->llc_cont);
1234 pr->llc_cont = cont; 1308 pr->llc_cont = cont;
1235 pr->llc_cont_cls = cont_cls; 1309 pr->llc_cont_cls = cont_cls;
1310 pr->qe_start = GNUNET_TIME_absolute_get ();
1311 pr->warn_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
1312 &warn_delay_task,
1313 pr);
1236 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh, 1314 pr->qe = GNUNET_DATASTORE_get_key (GSF_dsh,
1237 pr->local_result_offset++, 1315 pr->local_result_offset++,
1238 &pr->public_data.query, 1316 &pr->public_data.query,