aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Schanzenbach <mschanzenbach@posteo.de>2012-03-15 12:18:20 +0000
committerMartin Schanzenbach <mschanzenbach@posteo.de>2012-03-15 12:18:20 +0000
commit423c769c6f8a1953cd3e5f98e2c7b0c01fe91d66 (patch)
tree556a13559877c323886a49f7d311408a9aecdc69 /src
parent2965a9e8029f945c663bcb5158b79e147cdbee42 (diff)
downloadgnunet-423c769c6f8a1953cd3e5f98e2c7b0c01fe91d66.tar.gz
gnunet-423c769c6f8a1953cd3e5f98e2c7b0c01fe91d66.zip
-readd and fix zone iteration
Diffstat (limited to 'src')
-rw-r--r--src/gns/gns.h1
-rw-r--r--src/gns/gnunet-service-gns.c74
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
33GNUNET_NETWORK_STRUCT_BEGIN 34GNUNET_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,
323static void 344static void
324update_zone_dht_start(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 345update_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