END_TEST START_TEST(test_sbf_double_close) { bloom_sbf_params params = SBF_DEFAULT_PARAMS; params.initial_capacity = 1e3; params.fp_probability = 1e-4; bloom_sbf sbf; int res = sbf_from_filters(¶ms, NULL, NULL, 0, NULL, &sbf); fail_unless(res == 0); res = sbf_close(&sbf); fail_unless(res == 0); res = sbf_close(&sbf); fail_unless(res == -1); }
END_TEST START_TEST(test_sbf_close_does_flush) { bloom_sbf_params params = SBF_DEFAULT_PARAMS; params.initial_capacity = 1e3; params.fp_probability = 1e-4; nextfile next; next.format = "/tmp/mmap_close.%d.data"; next.num = 0; bloom_sbf sbf; int res = sbf_from_filters(¶ms, sbf_make_callback, &next, 0, NULL, &sbf); fail_unless(res == 0); char buf[100]; for (int i=0;i<2000;i++) { snprintf((char*)&buf, 100, "foobar%d", i); sbf_add(&sbf, (char*)&buf); } fail_unless(sbf_close(&sbf) == 0); bloom_bitmap maps[2]; bitmap_from_filename("/tmp/mmap_close.0.data", get_size("/tmp/mmap_close.0.data"), 1, 1, SHARED, (bloom_bitmap*)&maps); bitmap_from_filename("/tmp/mmap_close.1.data", get_size("/tmp/mmap_close.1.data"), 1, 1, SHARED, ((bloom_bitmap*)&maps)+1); bloom_bloomfilter filters[2]; bf_from_bitmap((bloom_bitmap*)&maps, 1, 0, (bloom_bloomfilter*)&filters); bf_from_bitmap(((bloom_bitmap*)&maps)+1, 1, 0, ((bloom_bloomfilter*)&filters)+1); bloom_bloomfilter **filter_map = calloc(2, sizeof(bloom_bloomfilter*)); filter_map[0] = (bloom_bloomfilter*)&filters; filter_map[1] = ((bloom_bloomfilter*)&filters)+1; res = sbf_from_filters(¶ms, sbf_make_callback, &next, 2, filter_map, &sbf); fail_unless(res == 0); fail_unless(sbf_size(&sbf) == 2000); fail_unless(sbf_total_capacity(&sbf) == 5*1e3); for (int i=0;i<2000;i++) { snprintf((char*)&buf, 100, "foobar%d", i); res = sbf_contains(&sbf, (char*)&buf); fail_unless(res == 1); } unlink("/tmp/mmap_close.0.data"); unlink("/tmp/mmap_close.1.data"); }
/** * Gracefully closes a bloom filter. * @arg filter The filter to close * @return 0 on success. */ int bloomf_close(bloom_filter *filter) { // Acquire lock pthread_mutex_lock(&filter->sbf_lock); // Only act if we are non-proxied if (filter->sbf) { bloomf_flush(filter); bloom_sbf *sbf = (bloom_sbf*)filter->sbf; filter->sbf = NULL; sbf_close(sbf); free(sbf); filter->counters.page_outs += 1; } // Release lock pthread_mutex_unlock(&filter->sbf_lock); return 0; }