diff options
-rw-r--r-- | src/datacache/datacache.c | 2 | ||||
-rw-r--r-- | src/datastore/gnunet-service-datastore.c | 5 | ||||
-rw-r--r-- | src/topology/gnunet-daemon-topology.c | 2 | ||||
-rw-r--r-- | src/util/container_bloomfilter.c | 80 |
4 files changed, 41 insertions, 48 deletions
diff --git a/src/datacache/datacache.c b/src/datacache/datacache.c index 10b2721ee..b937c63bb 100644 --- a/src/datacache/datacache.c +++ b/src/datacache/datacache.c | |||
@@ -163,7 +163,7 @@ GNUNET_DATACACHE_create (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
163 | } | 163 | } |
164 | else | 164 | else |
165 | { | 165 | { |
166 | ret->filter = GNUNET_CONTAINER_bloomfilter_load (NULL, bf_size, 5); /* approx. 3% false positives at max use */ | 166 | ret->filter = GNUNET_CONTAINER_bloomfilter_init (NULL, bf_size, 5); /* approx. 3% false positives at max use */ |
167 | } | 167 | } |
168 | ret->stats = GNUNET_STATISTICS_create ("datacache", | 168 | ret->stats = GNUNET_STATISTICS_create ("datacache", |
169 | cfg); | 169 | cfg); |
diff --git a/src/datastore/gnunet-service-datastore.c b/src/datastore/gnunet-service-datastore.c index 9ae400292..fab403a86 100644 --- a/src/datastore/gnunet-service-datastore.c +++ b/src/datastore/gnunet-service-datastore.c | |||
@@ -1664,7 +1664,10 @@ run (void *cls, | |||
1664 | GNUNET_free_non_null (fn); | 1664 | GNUNET_free_non_null (fn); |
1665 | fn = NULL; | 1665 | fn = NULL; |
1666 | } | 1666 | } |
1667 | filter = GNUNET_CONTAINER_bloomfilter_load (fn, bf_size, 5); /* approx. 3% false positives at max use */ | 1667 | if (fn != NULL) |
1668 | filter = GNUNET_CONTAINER_bloomfilter_load (fn, bf_size, 5); /* approx. 3% false positives at max use */ | ||
1669 | else | ||
1670 | filter = GNUNET_CONTAINER_bloomfilter_init (NULL, bf_size, 5); /* approx. 3% false positives at max use */ | ||
1668 | GNUNET_free_non_null (fn); | 1671 | GNUNET_free_non_null (fn); |
1669 | if (filter == NULL) | 1672 | if (filter == NULL) |
1670 | { | 1673 | { |
diff --git a/src/topology/gnunet-daemon-topology.c b/src/topology/gnunet-daemon-topology.c index ebe19a58d..f7118a058 100644 --- a/src/topology/gnunet-daemon-topology.c +++ b/src/topology/gnunet-daemon-topology.c | |||
@@ -511,7 +511,7 @@ setup_filter (struct Peer *peer) | |||
511 | "useless" once a HELLO has been passed on to ~100 | 511 | "useless" once a HELLO has been passed on to ~100 |
512 | other peers, which is likely more than enough in | 512 | other peers, which is likely more than enough in |
513 | any case; hence 64, 5 as bloomfilter parameters. */ | 513 | any case; hence 64, 5 as bloomfilter parameters. */ |
514 | peer->filter = GNUNET_CONTAINER_bloomfilter_load (NULL, 64, 5); | 514 | peer->filter = GNUNET_CONTAINER_bloomfilter_init (NULL, 64, 5); |
515 | peer->filter_expiration = GNUNET_TIME_relative_to_absolute (HELLO_ADVERTISEMENT_MIN_REPEAT_FREQUENCY); | 515 | peer->filter_expiration = GNUNET_TIME_relative_to_absolute (HELLO_ADVERTISEMENT_MIN_REPEAT_FREQUENCY); |
516 | /* never send a peer its own HELLO */ | 516 | /* never send a peer its own HELLO */ |
517 | GNUNET_CONTAINER_bloomfilter_add (peer->filter, &peer->pid.hashPubKey); | 517 | GNUNET_CONTAINER_bloomfilter_add (peer->filter, &peer->pid.hashPubKey); |
diff --git a/src/util/container_bloomfilter.c b/src/util/container_bloomfilter.c index 53eaf31d1..b4c3ad08d 100644 --- a/src/util/container_bloomfilter.c +++ b/src/util/container_bloomfilter.c | |||
@@ -437,6 +437,7 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, | |||
437 | int i; | 437 | int i; |
438 | size_t ui; | 438 | size_t ui; |
439 | 439 | ||
440 | GNUNET_assert (NULL != filename); | ||
440 | if ((k == 0) || (size == 0)) | 441 | if ((k == 0) || (size == 0)) |
441 | return NULL; | 442 | return NULL; |
442 | if (size < BUFFSIZE) | 443 | if (size < BUFFSIZE) |
@@ -448,31 +449,23 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, | |||
448 | 449 | ||
449 | bf = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_BloomFilter)); | 450 | bf = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_BloomFilter)); |
450 | /* Try to open a bloomfilter file */ | 451 | /* Try to open a bloomfilter file */ |
451 | if (filename != NULL) | 452 | bf->fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READWRITE |
453 | | GNUNET_DISK_OPEN_CREATE, | ||
454 | GNUNET_DISK_PERM_USER_READ | | ||
455 | GNUNET_DISK_PERM_USER_WRITE); | ||
456 | if (NULL == bf->fh) | ||
452 | { | 457 | { |
453 | bf->fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READWRITE | 458 | GNUNET_free (bf); |
454 | | GNUNET_DISK_OPEN_CREATE, | 459 | return NULL; |
455 | GNUNET_DISK_PERM_USER_READ | | ||
456 | GNUNET_DISK_PERM_USER_WRITE); | ||
457 | if (NULL == bf->fh) | ||
458 | { | ||
459 | GNUNET_free (bf); | ||
460 | return NULL; | ||
461 | } | ||
462 | bf->filename = GNUNET_strdup (filename); | ||
463 | } | ||
464 | else | ||
465 | { | ||
466 | bf->filename = NULL; | ||
467 | bf->fh = NULL; | ||
468 | } | 460 | } |
461 | bf->filename = GNUNET_strdup (filename); | ||
469 | /* Alloc block */ | 462 | /* Alloc block */ |
470 | bf->bitArray = GNUNET_malloc_large (size); | 463 | bf->bitArray = GNUNET_malloc_large (size); |
471 | if (bf->bitArray == NULL) | 464 | if (bf->bitArray == NULL) |
472 | { | 465 | { |
473 | if (bf->fh != NULL) | 466 | if (bf->fh != NULL) |
474 | GNUNET_DISK_file_close (bf->fh); | 467 | GNUNET_DISK_file_close (bf->fh); |
475 | GNUNET_free_non_null (bf->filename); | 468 | GNUNET_free (bf->filename); |
476 | GNUNET_free (bf); | 469 | GNUNET_free (bf); |
477 | return NULL; | 470 | return NULL; |
478 | } | 471 | } |
@@ -480,36 +473,33 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, | |||
480 | bf->addressesPerElement = k; | 473 | bf->addressesPerElement = k; |
481 | memset (bf->bitArray, 0, bf->bitArraySize); | 474 | memset (bf->bitArray, 0, bf->bitArraySize); |
482 | 475 | ||
483 | if (bf->filename != NULL) | 476 | /* Read from the file what bits we can */ |
477 | rbuff = GNUNET_malloc (BUFFSIZE); | ||
478 | pos = 0; | ||
479 | while (pos < size * 8) | ||
484 | { | 480 | { |
485 | /* Read from the file what bits we can */ | 481 | int res; |
486 | rbuff = GNUNET_malloc (BUFFSIZE); | 482 | |
487 | pos = 0; | 483 | res = GNUNET_DISK_file_read (bf->fh, rbuff, BUFFSIZE); |
488 | while (pos < size * 8) | 484 | if (res == -1) |
489 | { | 485 | { |
490 | int res; | 486 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, |
491 | 487 | "read", bf->filename); | |
492 | res = GNUNET_DISK_file_read (bf->fh, rbuff, BUFFSIZE); | 488 | } |
493 | if (res == -1) | 489 | if (res == 0) |
494 | { | 490 | break; /* is ok! we just did not use that many bits yet */ |
495 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, | 491 | for (i = 0; i < res; i++) |
496 | "read", bf->filename); | 492 | { |
497 | } | 493 | if ((rbuff[i] & 0x0F) != 0) |
498 | if (res == 0) | 494 | setBit (bf->bitArray, pos + i * 2); |
499 | break; /* is ok! we just did not use that many bits yet */ | 495 | if ((rbuff[i] & 0xF0) != 0) |
500 | for (i = 0; i < res; i++) | 496 | setBit (bf->bitArray, pos + i * 2 + 1); |
501 | { | 497 | } |
502 | if ((rbuff[i] & 0x0F) != 0) | 498 | if (res < BUFFSIZE) |
503 | setBit (bf->bitArray, pos + i * 2); | 499 | break; |
504 | if ((rbuff[i] & 0xF0) != 0) | 500 | pos += BUFFSIZE * 2; /* 2 bits per byte in the buffer */ |
505 | setBit (bf->bitArray, pos + i * 2 + 1); | ||
506 | } | ||
507 | if (res < BUFFSIZE) | ||
508 | break; | ||
509 | pos += BUFFSIZE * 2; /* 2 bits per byte in the buffer */ | ||
510 | } | ||
511 | GNUNET_free (rbuff); | ||
512 | } | 501 | } |
502 | GNUNET_free (rbuff); | ||
513 | return bf; | 503 | return bf; |
514 | } | 504 | } |
515 | 505 | ||