diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-03-15 12:18:20 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-03-15 12:18:20 +0000 |
commit | 423c769c6f8a1953cd3e5f98e2c7b0c01fe91d66 (patch) | |
tree | 556a13559877c323886a49f7d311408a9aecdc69 /src | |
parent | 2965a9e8029f945c663bcb5158b79e147cdbee42 (diff) | |
download | gnunet-423c769c6f8a1953cd3e5f98e2c7b0c01fe91d66.tar.gz gnunet-423c769c6f8a1953cd3e5f98e2c7b0c01fe91d66.zip |
-readd and fix zone iteration
Diffstat (limited to 'src')
-rw-r--r-- | src/gns/gns.h | 1 | ||||
-rw-r--r-- | src/gns/gnunet-service-gns.c | 74 |
2 files changed, 53 insertions, 22 deletions
diff --git a/src/gns/gns.h b/src/gns/gns.h index 31730f8ac..b2f4cc98d 100644 --- a/src/gns/gns.h +++ b/src/gns/gns.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #define GNS_H | 29 | #define GNS_H |
30 | 30 | ||
31 | #define GNUNET_GNS_TLD "gnunet" | 31 | #define GNUNET_GNS_TLD "gnunet" |
32 | #define GNUNET_GNS_DHT_MAX_UPDATE_INTERVAL 3600 | ||
32 | 33 | ||
33 | GNUNET_NETWORK_STRUCT_BEGIN | 34 | GNUNET_NETWORK_STRUCT_BEGIN |
34 | 35 | ||
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c index 2f64a637d..bea63e2f7 100644 --- a/src/gns/gnunet-service-gns.c +++ b/src/gns/gnunet-service-gns.c | |||
@@ -233,15 +233,36 @@ put_gns_record(void *cls, | |||
233 | struct GNUNET_CRYPTO_HashAsciiEncoded xor_hash_string; | 233 | struct GNUNET_CRYPTO_HashAsciiEncoded xor_hash_string; |
234 | uint32_t rd_payload_length; | 234 | uint32_t rd_payload_length; |
235 | char* nrb_data = NULL; | 235 | char* nrb_data = NULL; |
236 | size_t namelen; | ||
236 | 237 | ||
237 | /* we're done */ | 238 | /* we're done */ |
238 | if (NULL == name) | 239 | if (NULL == name) |
239 | { | 240 | { |
240 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Zone iteration finished\n"); | 241 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, |
242 | "Zone iteration finished. Rescheduling put in %ds\n", | ||
243 | GNUNET_GNS_DHT_MAX_UPDATE_INTERVAL); | ||
241 | GNUNET_NAMESTORE_zone_iteration_stop (namestore_iter); | 244 | GNUNET_NAMESTORE_zone_iteration_stop (namestore_iter); |
242 | zone_update_taskid = GNUNET_SCHEDULER_add_now (&update_zone_dht_start, | 245 | zone_update_taskid = GNUNET_SCHEDULER_add_delayed ( |
246 | GNUNET_TIME_relative_multiply( | ||
247 | GNUNET_TIME_UNIT_SECONDS, | ||
248 | GNUNET_GNS_DHT_MAX_UPDATE_INTERVAL | ||
249 | ), | ||
250 | &update_zone_dht_start, | ||
251 | NULL); | ||
252 | return; | ||
253 | } | ||
254 | |||
255 | namelen = strlen(name) + 1; | ||
256 | |||
257 | if (signature == NULL) | ||
258 | { | ||
259 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, | ||
260 | "No signature for %s record data provided! Skipping...\n", | ||
261 | name); | ||
262 | zone_update_taskid = GNUNET_SCHEDULER_add_now (&update_zone_dht_next, | ||
243 | NULL); | 263 | NULL); |
244 | return; | 264 | return; |
265 | |||
245 | } | 266 | } |
246 | 267 | ||
247 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | 268 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, |
@@ -249,34 +270,33 @@ put_gns_record(void *cls, | |||
249 | 270 | ||
250 | rd_payload_length = GNUNET_NAMESTORE_records_get_size (rd_count, rd); | 271 | rd_payload_length = GNUNET_NAMESTORE_records_get_size (rd_count, rd); |
251 | 272 | ||
252 | nrb = GNUNET_malloc(rd_payload_length + strlen(name) + 1 | 273 | nrb = GNUNET_malloc(rd_payload_length + namelen |
253 | + sizeof(struct GNSNameRecordBlock)); | 274 | + sizeof(struct GNSNameRecordBlock)); |
254 | 275 | ||
255 | if (signature != NULL) | 276 | nrb->signature = *signature; |
256 | nrb->signature = *signature; | ||
257 | 277 | ||
258 | nrb->public_key = *key; | 278 | nrb->public_key = *key; |
259 | 279 | ||
260 | nrb->rd_count = htonl(rd_count); | 280 | nrb->rd_count = htonl(rd_count); |
261 | 281 | ||
262 | memset(&nrb[1], 0, strlen(name) + 1); | 282 | memcpy(&nrb[1], name, namelen); |
263 | memcpy(&nrb[1], name, strlen(name)); | ||
264 | 283 | ||
265 | nrb_data = (char*)&nrb[1]; | 284 | nrb_data = (char*)&nrb[1]; |
266 | nrb_data += strlen(name) + 1; | 285 | nrb_data += namelen; |
267 | 286 | ||
268 | rd_payload_length += sizeof(struct GNSNameRecordBlock) + | 287 | rd_payload_length += sizeof(struct GNSNameRecordBlock) + namelen; |
269 | strlen(name) + 1; | ||
270 | 288 | ||
271 | if (-1 == GNUNET_NAMESTORE_records_serialize (rd_count, | 289 | if (-1 == GNUNET_NAMESTORE_records_serialize (rd_count, |
272 | rd, | 290 | rd, |
273 | rd_payload_length, | 291 | rd_payload_length, |
274 | nrb_data)) | 292 | nrb_data)) |
275 | { | 293 | { |
276 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Record serialization failed!\n"); | 294 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, |
295 | "Record serialization failed! Skipping...\n"); | ||
277 | GNUNET_free(nrb); | 296 | GNUNET_free(nrb); |
297 | zone_update_taskid = GNUNET_SCHEDULER_add_now (&update_zone_dht_next, | ||
298 | NULL); | ||
278 | return; | 299 | return; |
279 | //FIXME what to do | ||
280 | } | 300 | } |
281 | 301 | ||
282 | 302 | ||
@@ -286,6 +306,7 @@ put_gns_record(void *cls, | |||
286 | GNUNET_CRYPTO_hash(name, strlen(name), &name_hash); | 306 | GNUNET_CRYPTO_hash(name, strlen(name), &name_hash); |
287 | GNUNET_CRYPTO_hash_xor(&zone_hash, &name_hash, &xor_hash); | 307 | GNUNET_CRYPTO_hash_xor(&zone_hash, &name_hash, &xor_hash); |
288 | GNUNET_CRYPTO_hash_to_enc (&xor_hash, &xor_hash_string); | 308 | GNUNET_CRYPTO_hash_to_enc (&xor_hash, &xor_hash_string); |
309 | |||
289 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | 310 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, |
290 | "putting records for %s under key: %s with size %d\n", | 311 | "putting records for %s under key: %s with size %d\n", |
291 | name, (char*)&xor_hash_string, rd_payload_length); | 312 | name, (char*)&xor_hash_string, rd_payload_length); |
@@ -323,26 +344,35 @@ put_gns_record(void *cls, | |||
323 | static void | 344 | static void |
324 | update_zone_dht_start(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 345 | update_zone_dht_start(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
325 | { | 346 | { |
326 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Starting DHT zone update!\n"); | 347 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Scheduling DHT zone update!\n"); |
327 | if (0 == num_public_records) | 348 | if (0 == num_public_records) |
328 | { | 349 | { |
329 | dht_update_interval = GNUNET_TIME_relative_multiply( | 350 | dht_update_interval = GNUNET_TIME_relative_multiply( |
330 | GNUNET_TIME_UNIT_SECONDS, | 351 | GNUNET_TIME_UNIT_SECONDS, |
331 | 1); | 352 | GNUNET_GNS_DHT_MAX_UPDATE_INTERVAL); |
353 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | ||
354 | "No records in db. Adjusted DHT update interval to %ds\n", | ||
355 | GNUNET_GNS_DHT_MAX_UPDATE_INTERVAL); | ||
332 | } | 356 | } |
333 | else | 357 | else |
334 | { | 358 | { |
359 | |||
335 | dht_update_interval = GNUNET_TIME_relative_multiply( | 360 | dht_update_interval = GNUNET_TIME_relative_multiply( |
336 | GNUNET_TIME_UNIT_SECONDS, | 361 | GNUNET_TIME_UNIT_SECONDS, |
337 | (3600/num_public_records)); | 362 | (3600/num_public_records)); |
363 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | ||
364 | "Adjusted DHT update interval to %ds!\n", | ||
365 | (3600/num_public_records)); | ||
338 | } | 366 | } |
339 | num_public_records = 0; //start counting again | 367 | |
368 | /* start counting again */ | ||
369 | num_public_records = 0; | ||
340 | namestore_iter = GNUNET_NAMESTORE_zone_iteration_start (namestore_handle, | 370 | namestore_iter = GNUNET_NAMESTORE_zone_iteration_start (namestore_handle, |
341 | &zone_hash, | 371 | &zone_hash, |
342 | GNUNET_NAMESTORE_RF_AUTHORITY, | 372 | GNUNET_NAMESTORE_RF_AUTHORITY, |
343 | GNUNET_NAMESTORE_RF_PRIVATE, | 373 | GNUNET_NAMESTORE_RF_PRIVATE, |
344 | &put_gns_record, | 374 | &put_gns_record, |
345 | NULL); | 375 | NULL); |
346 | } | 376 | } |
347 | 377 | ||
348 | 378 | ||
@@ -731,7 +761,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, | |||
731 | */ | 761 | */ |
732 | dht_update_interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, | 762 | dht_update_interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, |
733 | 1); | 763 | 1); |
734 | //zone_update_taskid = GNUNET_SCHEDULER_add_now (&update_zone_dht_start, NULL); | 764 | zone_update_taskid = GNUNET_SCHEDULER_add_now (&update_zone_dht_start, NULL); |
735 | 765 | ||
736 | GNUNET_SERVER_add_handlers (server, handlers); | 766 | GNUNET_SERVER_add_handlers (server, handlers); |
737 | 767 | ||