mirror of
https://github.com/zeek/zeek.git
synced 2025-10-13 12:08:20 +00:00
ok, this bug was hard to find.
hyperloglog.h was missing guards and randomly deleting memory at addresses equal to variable contents. I am not entirely sure why that did not crash before...
This commit is contained in:
parent
a37ffab0ea
commit
240d667e30
4 changed files with 17 additions and 12 deletions
|
@ -18,7 +18,7 @@ int CardinalityCounter::optimalB(double error)
|
||||||
answer++;
|
answer++;
|
||||||
k = pow(2, (answer - initial_estimate)/2);
|
k = pow(2, (answer - initial_estimate)/2);
|
||||||
}
|
}
|
||||||
while (erf(k/sqrt(2)) < conf);
|
while (erf(k/sqrt(2)) < HLL_CONF);
|
||||||
|
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
@ -67,9 +67,6 @@ CardinalityCounter :: CardinalityCounter(double error_margin)
|
||||||
CardinalityCounter::~CardinalityCounter()
|
CardinalityCounter::~CardinalityCounter()
|
||||||
{
|
{
|
||||||
delete [] buckets;
|
delete [] buckets;
|
||||||
delete &m;
|
|
||||||
delete &V;
|
|
||||||
delete &alpha_m;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t CardinalityCounter::rank(uint64_t hash_modified)
|
uint8_t CardinalityCounter::rank(uint64_t hash_modified)
|
||||||
|
|
|
@ -1,16 +1,19 @@
|
||||||
// See the file "COPYING" in the main distribution directory for copyright.
|
// See the file "COPYING" in the main distribution directory for copyright.
|
||||||
|
|
||||||
|
#ifndef hyperloglog_h
|
||||||
|
#define hyperloglog_h
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <opaqueval.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "conf" is how confident the estimate given by the counter is.
|
* "conf" is how confident the estimate given by the counter is.
|
||||||
*
|
*
|
||||||
* In other words, if the cardinality is estimated to be 100 with 2% error margin and conf is
|
* In other words, if the cardinality is estimated to be 100 with 2% error margin and HLL_CONFis
|
||||||
* 0.95, then we are 95% sure that the actual cardinality is between 98 and 102.
|
* 0.95, then we are 95% sure that the actual cardinality is between 98 and 102.
|
||||||
*/
|
*/
|
||||||
#define conf .95
|
#define HLL_CONF .95
|
||||||
|
|
||||||
class CardinalityVal;
|
|
||||||
|
|
||||||
class CardinalityCounter {
|
class CardinalityCounter {
|
||||||
friend class CardinalityVal;
|
friend class CardinalityVal;
|
||||||
|
@ -114,3 +117,5 @@ class CardinalityCounter {
|
||||||
*/
|
*/
|
||||||
uint64_t getM();
|
uint64_t getM();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -11,14 +11,16 @@ CardinalityVal::CardinalityVal() : OpaqueVal(new OpaqueType("cardinality"))
|
||||||
|
|
||||||
CardinalityVal::~CardinalityVal()
|
CardinalityVal::~CardinalityVal()
|
||||||
{
|
{
|
||||||
if ( valid && c )
|
if ( valid && c != 0 )
|
||||||
delete c;
|
delete c;
|
||||||
|
c = 0;
|
||||||
|
valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
IMPLEMENT_SERIAL(CardinalityVal, SER_CARDINALITY_VAL);
|
IMPLEMENT_SERIAL(CardinalityVal, SER_CARDINALITY_VAL);
|
||||||
|
|
||||||
bool CardinalityVal::DoSerialize(SerialInfo* info) const
|
bool CardinalityVal::DoSerialize(SerialInfo* info) const
|
||||||
{
|
{
|
||||||
|
printf("Serializing\n");
|
||||||
DO_SERIALIZE(SER_CARDINALITY_VAL, OpaqueVal);
|
DO_SERIALIZE(SER_CARDINALITY_VAL, OpaqueVal);
|
||||||
|
|
||||||
if ( ! IsValid() )
|
if ( ! IsValid() )
|
||||||
|
@ -39,6 +41,7 @@ bool CardinalityVal::DoSerialize(SerialInfo* info) const
|
||||||
|
|
||||||
bool CardinalityVal::DoUnserialize(UnserialInfo* info)
|
bool CardinalityVal::DoUnserialize(UnserialInfo* info)
|
||||||
{
|
{
|
||||||
|
printf("Unserializing\n");
|
||||||
DO_UNSERIALIZE(OpaqueVal);
|
DO_UNSERIALIZE(OpaqueVal);
|
||||||
|
|
||||||
if ( ! IsValid() )
|
if ( ! IsValid() )
|
||||||
|
@ -56,7 +59,7 @@ bool CardinalityVal::DoUnserialize(UnserialInfo* info)
|
||||||
}
|
}
|
||||||
|
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CardinalityVal::Init(CardinalityCounter* arg_c)
|
bool CardinalityVal::Init(CardinalityCounter* arg_c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,11 +11,11 @@ class CardinalityCounter;
|
||||||
|
|
||||||
class CardinalityVal: public OpaqueVal {
|
class CardinalityVal: public OpaqueVal {
|
||||||
public:
|
public:
|
||||||
|
CardinalityVal();
|
||||||
|
~CardinalityVal();
|
||||||
bool Init(CardinalityCounter*);
|
bool Init(CardinalityCounter*);
|
||||||
bool IsValid() const { return valid; };
|
bool IsValid() const { return valid; };
|
||||||
CardinalityCounter* Get() { return c; };
|
CardinalityCounter* Get() { return c; };
|
||||||
CardinalityVal();
|
|
||||||
~CardinalityVal();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool valid;
|
bool valid;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue