diff --git a/src/probabilistic/CardinalityCounter.cc b/src/probabilistic/CardinalityCounter.cc index a256673b79..304bf5151d 100644 --- a/src/probabilistic/CardinalityCounter.cc +++ b/src/probabilistic/CardinalityCounter.cc @@ -201,10 +201,10 @@ broker::expected CardinalityCounter::Serialize() const broker::vector v = {m, V, alpha_m}; v.reserve(3 + m); - for ( size_t i = 0; i < m; ++i ) + for ( size_t i = 0; i < m; ++i ) v.emplace_back(static_cast(buckets[i])); - return {v}; + return {v}; } std::unique_ptr CardinalityCounter::Unserialize(const broker::data& data) @@ -219,19 +219,22 @@ std::unique_ptr CardinalityCounter::Unserialize(const broker if ( ! (m && V && alpha_m) ) return nullptr; - if ( v->size() != 3 + *m ) return nullptr; auto cc = std::unique_ptr(new CardinalityCounter(*m, *V, *alpha_m)); + if ( *m != cc->m ) + return nullptr; + if ( cc->buckets.size() != * m ) + return nullptr; - for ( size_t i = 0; i < *m; ++i ) + for ( size_t i = 0; i < *m; ++i ) { auto x = caf::get_if(&(*v)[3 + i]); if ( ! x ) return nullptr; - cc->buckets.push_back(*x); + cc->buckets[i] = *x; } return cc; diff --git a/src/probabilistic/cardinality-counter.bif b/src/probabilistic/cardinality-counter.bif index 2fa7953c9e..1e12765b57 100644 --- a/src/probabilistic/cardinality-counter.bif +++ b/src/probabilistic/cardinality-counter.bif @@ -90,7 +90,7 @@ function hll_cardinality_merge_into%(handle1: opaque of cardinality, handle2: op bool res = h1->Merge(h2); if ( ! res ) { - reporter->Error("Carinality counters with different parameters cannot be merged"); + reporter->Error("Cardinality counters with different parameters cannot be merged"); return val_mgr->GetBool(0); } diff --git a/testing/btest/Baseline/broker.opaque/out b/testing/btest/Baseline/broker.opaque/out index f35f4e3284..4582e8dc2b 100644 --- a/testing/btest/Baseline/broker.opaque/out +++ b/testing/btest/Baseline/broker.opaque/out @@ -4,6 +4,7 @@ ============ HLL 3.000069 3.000069 +3.000069 ============ Bloom 0 1 diff --git a/testing/btest/Baseline/language.copy-all-opaques/out b/testing/btest/Baseline/language.copy-all-opaques/out index ad38ca1a8d..68b12cecac 100644 --- a/testing/btest/Baseline/language.copy-all-opaques/out +++ b/testing/btest/Baseline/language.copy-all-opaques/out @@ -4,6 +4,7 @@ ============ HLL 3.000069 3.000069 +3.000069 ============ Bloom 0 1 diff --git a/testing/btest/broker/opaque.zeek b/testing/btest/broker/opaque.zeek index f65fc191dd..bddd68e0be 100644 --- a/testing/btest/broker/opaque.zeek +++ b/testing/btest/broker/opaque.zeek @@ -26,6 +26,10 @@ event zeek_init() hll_cardinality_add(c1, 2004); print hll_cardinality_estimate(c2); + local c3 = hll_cardinality_init(0.01, 0.95); + hll_cardinality_merge_into(c3, c2); + print hll_cardinality_estimate(c3); + print "============ Bloom"; local bf_cnt = bloomfilter_basic_init(0.1, 1000); bloomfilter_add(bf_cnt, 42); diff --git a/testing/btest/language/copy-all-opaques.zeek b/testing/btest/language/copy-all-opaques.zeek index 25ca89fd80..06b4a07471 100644 --- a/testing/btest/language/copy-all-opaques.zeek +++ b/testing/btest/language/copy-all-opaques.zeek @@ -27,6 +27,10 @@ event zeek_init() hll_cardinality_add(c1, 2004); print hll_cardinality_estimate(c2); + local c3 = hll_cardinality_init(0.01, 0.95); + hll_cardinality_merge_into(c3, c2); + print hll_cardinality_estimate(c3); + print "============ Bloom"; local bf_cnt = bloomfilter_basic_init(0.1, 1000); bloomfilter_add(bf_cnt, 42);