1
0
Fork 0

switch to tiered consolidation by default (#8981)

* switch to tiered consolidation by default

* fix copy/paste error

* fix tests

* fix tests
This commit is contained in:
Andrey Abramov 2019-05-13 18:25:46 +03:00 committed by GitHub
parent aa885c978c
commit 404bcc8b0c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 124 additions and 41 deletions

View File

@ -1619,7 +1619,7 @@ arangodb::Result IResearchAnalyzerFeature::remove( // remove analyzer
if (split.first.null()) { if (split.first.null()) {
return arangodb::Result( // result return arangodb::Result( // result
TRI_ERROR_FORBIDDEN, // code TRI_ERROR_FORBIDDEN, // code
"static analyzers cannot be removed" // message "built-in analyzers cannot be removed" // message
); );
} }
@ -2056,4 +2056,4 @@ bool IResearchAnalyzerFeature::visit( // visit analyzers
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE // --SECTION-- END-OF-FILE
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -36,10 +36,11 @@
namespace { namespace {
const std::string POLICY_BYTES_ACCUM = // {threshold} > (segment_bytes + // sum_of_merge_candidate_segment_bytes) / all_segment_bytes
"bytes_accum"; // {threshold} > (segment_bytes + const std::string POLICY_BYTES_ACCUM = "bytes_accum";
// sum_of_merge_candidate_segment_bytes) / all_segment_bytes
const std::string POLICY_TIER = "tier"; // scoring policy based on byte size and live docs // scoring policy based on byte size and live docs
const std::string POLICY_TIER = "tier";
template <typename T> template <typename T>
arangodb::iresearch::IResearchViewMeta::ConsolidationPolicy createConsolidationPolicy( arangodb::iresearch::IResearchViewMeta::ConsolidationPolicy createConsolidationPolicy(
@ -158,14 +159,30 @@ arangodb::iresearch::IResearchViewMeta::ConsolidationPolicy createConsolidationP
} }
} }
{
// optional double
static const std::string fieldName("minScore");
if (slice.hasKey(fieldName)) {
auto field = slice.get(fieldName);
if (!field.isNumber<double_t>()) {
errorField = fieldName;
return arangodb::iresearch::IResearchViewMeta::ConsolidationPolicy();
}
options.min_score = field.getNumber<double_t>();
}
}
properties.openObject(); properties.openObject();
properties.add("type", arangodb::velocypack::Value(POLICY_TIER)); properties.add("type", VPackValue(POLICY_TIER));
properties.add("lookahead", arangodb::velocypack::Value(size_t(1))); // FIXME remove in 3.5 properties.add("segmentsBytesFloor", VPackValue(options.floor_segment_bytes));
properties.add("segmentsBytesFloor", properties.add("segmentsBytesMax", VPackValue(options.max_segments_bytes));
arangodb::velocypack::Value(options.floor_segment_bytes)); properties.add("segmentsMax", VPackValue(options.max_segments));
properties.add("segmentsBytesMax", arangodb::velocypack::Value(options.max_segments_bytes)); properties.add("segmentsMin", VPackValue(options.min_segments));
properties.add("segmentsMax", arangodb::velocypack::Value(options.max_segments)); properties.add("minScore", VPackValue(options.min_score));
properties.add("segmentsMin", arangodb::velocypack::Value(options.min_segments));
properties.close(); properties.close();
return arangodb::iresearch::IResearchViewMeta::ConsolidationPolicy{ return arangodb::iresearch::IResearchViewMeta::ConsolidationPolicy{
@ -202,9 +219,9 @@ IResearchViewMeta::IResearchViewMeta()
std::string errorField; std::string errorField;
_consolidationPolicy = _consolidationPolicy =
createConsolidationPolicy<irs::index_utils::consolidate_bytes_accum>( createConsolidationPolicy<irs::index_utils::consolidate_tier>(
arangodb::velocypack::Parser::fromJson( arangodb::velocypack::Parser::fromJson(
"{ \"type\": \"bytes_accum\", \"threshold\": 0.1 }") "{ \"type\": \"tier\" }")
->slice(), ->slice(),
errorField); errorField);
assert(_consolidationPolicy.policy()); // ensure above syntax is correct assert(_consolidationPolicy.policy()); // ensure above syntax is correct

View File

@ -68,17 +68,20 @@ SECTION("test_defaults") {
arangodb::iresearch::IResearchViewMeta meta; arangodb::iresearch::IResearchViewMeta meta;
arangodb::iresearch::IResearchViewMetaState metaState; arangodb::iresearch::IResearchViewMetaState metaState;
CHECK((true == metaState._collections.empty())); CHECK(true == metaState._collections.empty());
CHECK(true == (10 == meta._cleanupIntervalStep)); CHECK(true == (10 == meta._cleanupIntervalStep));
CHECK((true == (1000 == meta._commitIntervalMsec))); CHECK(true == (1000 == meta._commitIntervalMsec));
CHECK(true == (60 * 1000 == meta._consolidationIntervalMsec)); CHECK(true == (60 * 1000 == meta._consolidationIntervalMsec));
CHECK((std::string("bytes_accum") == meta._consolidationPolicy.properties().get("type").copyString())); CHECK(std::string("tier") == meta._consolidationPolicy.properties().get("type").copyString());
CHECK((false == !meta._consolidationPolicy.policy())); CHECK(false == !meta._consolidationPolicy.policy());
CHECK((0.1f == meta._consolidationPolicy.properties().get("threshold").getNumber<float>())); CHECK(1 == meta._consolidationPolicy.properties().get("segmentsMin").getNumber<size_t>());
CHECK(10 == meta._consolidationPolicy.properties().get("segmentsMax").getNumber<size_t>());
CHECK(size_t(2)*(1<<20) == meta._consolidationPolicy.properties().get("segmentsBytesFloor").getNumber<size_t>());
CHECK(size_t(5)*(1<<30) == meta._consolidationPolicy.properties().get("segmentsBytesMax").getNumber<size_t>());
CHECK(std::string("C") == irs::locale_utils::name(meta._locale)); CHECK(std::string("C") == irs::locale_utils::name(meta._locale));
CHECK((0 == meta._writebufferActive)); CHECK(0 == meta._writebufferActive);
CHECK((64 == meta._writebufferIdle)); CHECK(64 == meta._writebufferIdle);
CHECK((32*(size_t(1)<<20) == meta._writebufferSizeMax)); CHECK(32*(size_t(1)<<20) == meta._writebufferSizeMax);
CHECK(meta._primarySort.empty()); CHECK(meta._primarySort.empty());
} }
@ -148,9 +151,12 @@ SECTION("test_readDefaults") {
CHECK(10 == meta._cleanupIntervalStep); CHECK(10 == meta._cleanupIntervalStep);
CHECK((1000 == meta._commitIntervalMsec)); CHECK((1000 == meta._commitIntervalMsec));
CHECK(60 * 1000 == meta._consolidationIntervalMsec); CHECK(60 * 1000 == meta._consolidationIntervalMsec);
CHECK((std::string("bytes_accum") == meta._consolidationPolicy.properties().get("type").copyString())); CHECK((std::string("tier") == meta._consolidationPolicy.properties().get("type").copyString()));
CHECK((false == !meta._consolidationPolicy.policy())); CHECK((false == !meta._consolidationPolicy.policy()));
CHECK((0.1f == meta._consolidationPolicy.properties().get("threshold").getNumber<float>())); CHECK(1 == meta._consolidationPolicy.properties().get("segmentsMin").getNumber<size_t>());
CHECK(10 == meta._consolidationPolicy.properties().get("segmentsMax").getNumber<size_t>());
CHECK(size_t(2)*(1<<20) == meta._consolidationPolicy.properties().get("segmentsBytesFloor").getNumber<size_t>());
CHECK(size_t(5)*(1<<30) == meta._consolidationPolicy.properties().get("segmentsBytesMax").getNumber<size_t>());
CHECK(std::string("C") == irs::locale_utils::name(meta._locale)); CHECK(std::string("C") == irs::locale_utils::name(meta._locale));
CHECK((0 == meta._writebufferActive)); CHECK((0 == meta._writebufferActive));
CHECK((64 == meta._writebufferIdle)); CHECK((64 == meta._writebufferIdle));
@ -215,6 +221,8 @@ SECTION("test_readCustomizedValues") {
CHECK((std::string("consolidationPolicy") == errorField)); CHECK((std::string("consolidationPolicy") == errorField));
} }
// consolidation policy "bytes_accum"
{ {
std::string errorField; std::string errorField;
auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"bytes_accum\", \"threshold\": -0.5 } }"); auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"bytes_accum\", \"threshold\": -0.5 } }");
@ -231,6 +239,40 @@ SECTION("test_readCustomizedValues") {
CHECK((std::string("consolidationPolicy=>threshold") == errorField)); CHECK((std::string("consolidationPolicy=>threshold") == errorField));
} }
// consolidation policy "tier"
{
std::string errorField;
auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"tier\", \"segmentsMin\": -1 } }");
CHECK((true == metaState.init(json->slice(), errorField)));
CHECK(false == meta.init(json->slice(), errorField));
CHECK((std::string("consolidationPolicy=>segmentsMin") == errorField));
}
{
std::string errorField;
auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"tier\", \"segmentsMax\": -1 } }");
CHECK((true == metaState.init(json->slice(), errorField)));
CHECK(false == meta.init(json->slice(), errorField));
CHECK((std::string("consolidationPolicy=>segmentsMax") == errorField));
}
{
std::string errorField;
auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"tier\", \"segmentsBytesFloor\": -1 } }");
CHECK((true == metaState.init(json->slice(), errorField)));
CHECK(false == meta.init(json->slice(), errorField));
CHECK((std::string("consolidationPolicy=>segmentsBytesFloor") == errorField));
}
{
std::string errorField;
auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"tier\", \"segmentsBytesMax\": -1 } }");
CHECK((true == metaState.init(json->slice(), errorField)));
CHECK(false == meta.init(json->slice(), errorField));
CHECK((std::string("consolidationPolicy=>segmentsBytesMax") == errorField));
}
{ {
std::string errorField; std::string errorField;
auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"invalid\" } }"); auto json = arangodb::velocypack::Parser::fromJson("{ \"consolidationPolicy\": { \"type\": \"invalid\" } }");
@ -433,11 +475,19 @@ SECTION("test_writeDefaults") {
tmpSlice = slice.get("consolidationIntervalMsec"); tmpSlice = slice.get("consolidationIntervalMsec");
CHECK((true == tmpSlice.isNumber<size_t>() && 60000 == tmpSlice.getNumber<size_t>())); CHECK((true == tmpSlice.isNumber<size_t>() && 60000 == tmpSlice.getNumber<size_t>()));
tmpSlice = slice.get("consolidationPolicy"); tmpSlice = slice.get("consolidationPolicy");
CHECK((true == tmpSlice.isObject() && 2 == tmpSlice.length())); CHECK((true == tmpSlice.isObject() && 6 == tmpSlice.length()));
tmpSlice2 = tmpSlice.get("threshold");
CHECK((tmpSlice2.isNumber<float>() && .1f == tmpSlice2.getNumber<float>()));
tmpSlice2 = tmpSlice.get("type"); tmpSlice2 = tmpSlice.get("type");
CHECK((tmpSlice2.isString() && std::string("bytes_accum") == tmpSlice2.copyString())); CHECK((tmpSlice2.isString() && std::string("tier") == tmpSlice2.copyString()));
tmpSlice2 = tmpSlice.get("segmentsMin");
CHECK((tmpSlice2.isNumber() && 1 == tmpSlice2.getNumber<size_t>()));
tmpSlice2 = tmpSlice.get("segmentsMax");
CHECK((tmpSlice2.isNumber() && 10 == tmpSlice2.getNumber<size_t>()));
tmpSlice2 = tmpSlice.get("segmentsBytesFloor");
CHECK((tmpSlice2.isNumber() && (size_t(2)*(1<<20)) == tmpSlice2.getNumber<size_t>()));
tmpSlice2 = tmpSlice.get("segmentsBytesMax");
CHECK((tmpSlice2.isNumber() && (size_t(5)*(1<<30)) == tmpSlice2.getNumber<size_t>()));
tmpSlice2 = tmpSlice.get("minScore");
CHECK((tmpSlice2.isNumber() && (0. == tmpSlice2.getNumber<double>())));
tmpSlice = slice.get("version"); tmpSlice = slice.get("version");
CHECK((true == tmpSlice.isNumber<uint32_t>() && 1 == tmpSlice.getNumber<uint32_t>())); CHECK((true == tmpSlice.isNumber<uint32_t>() && 1 == tmpSlice.getNumber<uint32_t>()));
tmpSlice = slice.get("writebufferActive"); tmpSlice = slice.get("writebufferActive");

View File

@ -215,9 +215,13 @@ function IResearchFeatureDDLTestSuite () {
assertEqual(1000, properties.commitIntervalMsec); assertEqual(1000, properties.commitIntervalMsec);
assertEqual(60000, properties.consolidationIntervalMsec); assertEqual(60000, properties.consolidationIntervalMsec);
assertTrue(Object === properties.consolidationPolicy.constructor); assertTrue(Object === properties.consolidationPolicy.constructor);
assertEqual(2, Object.keys(properties.consolidationPolicy).length); assertEqual(6, Object.keys(properties.consolidationPolicy).length);
assertEqual("bytes_accum", properties.consolidationPolicy.type); assertEqual("tier", properties.consolidationPolicy.type);
assertEqual((0.1).toFixed(6), properties.consolidationPolicy.threshold.toFixed(6)); assertEqual(1, properties.consolidationPolicy.segmentsMin);
assertEqual(10, properties.consolidationPolicy.segmentsMax);
assertEqual(5*(1 << 30), properties.consolidationPolicy.segmentsBytesMax);
assertEqual(2*(1 << 20), properties.consolidationPolicy.segmentsBytesFloor);
assertEqual((0.0).toFixed(6), properties.consolidationPolicy.minScore.toFixed(6));
meta = { meta = {
commitIntervalMsec: 12345, commitIntervalMsec: 12345,
@ -685,9 +689,13 @@ function IResearchFeatureDDLTestSuite () {
assertEqual(1000, properties.commitIntervalMsec); assertEqual(1000, properties.commitIntervalMsec);
assertEqual(60000, properties.consolidationIntervalMsec); assertEqual(60000, properties.consolidationIntervalMsec);
assertTrue(Object === properties.consolidationPolicy.constructor); assertTrue(Object === properties.consolidationPolicy.constructor);
assertEqual(2, Object.keys(properties.consolidationPolicy).length); assertEqual(6, Object.keys(properties.consolidationPolicy).length);
assertEqual("bytes_accum", properties.consolidationPolicy.type); assertEqual("tier", properties.consolidationPolicy.type);
assertEqual((0.1).toFixed(6), properties.consolidationPolicy.threshold.toFixed(6)); assertEqual(1, properties.consolidationPolicy.segmentsMin);
assertEqual(10, properties.consolidationPolicy.segmentsMax);
assertEqual(5*(1 << 30), properties.consolidationPolicy.segmentsBytesMax);
assertEqual(2*(1 << 20), properties.consolidationPolicy.segmentsBytesFloor);
assertEqual((0.0).toFixed(6), properties.consolidationPolicy.minScore.toFixed(6));
assertTrue(Object === properties.links.constructor); assertTrue(Object === properties.links.constructor);
assertEqual(0, Object.keys(properties.links).length); assertEqual(0, Object.keys(properties.links).length);
}, },

View File

@ -215,9 +215,13 @@ function IResearchFeatureDDLTestSuite () {
assertEqual(1000, properties.commitIntervalMsec); assertEqual(1000, properties.commitIntervalMsec);
assertEqual(60000, properties.consolidationIntervalMsec); assertEqual(60000, properties.consolidationIntervalMsec);
assertTrue(Object === properties.consolidationPolicy.constructor); assertTrue(Object === properties.consolidationPolicy.constructor);
assertEqual(2, Object.keys(properties.consolidationPolicy).length); assertEqual(6, Object.keys(properties.consolidationPolicy).length);
assertEqual("bytes_accum", properties.consolidationPolicy.type); assertEqual("tier", properties.consolidationPolicy.type);
assertEqual((0.1).toFixed(6), properties.consolidationPolicy.threshold.toFixed(6)); assertEqual(1, properties.consolidationPolicy.segmentsMin);
assertEqual(10, properties.consolidationPolicy.segmentsMax);
assertEqual(5*(1 << 30), properties.consolidationPolicy.segmentsBytesMax);
assertEqual(2*(1 << 20), properties.consolidationPolicy.segmentsBytesFloor);
assertEqual((0.0).toFixed(6), properties.consolidationPolicy.minScore.toFixed(6));
meta = { meta = {
commitIntervalMsec: 12345, commitIntervalMsec: 12345,
@ -685,9 +689,13 @@ function IResearchFeatureDDLTestSuite () {
assertEqual(1000, properties.commitIntervalMsec); assertEqual(1000, properties.commitIntervalMsec);
assertEqual(60000, properties.consolidationIntervalMsec); assertEqual(60000, properties.consolidationIntervalMsec);
assertTrue(Object === properties.consolidationPolicy.constructor); assertTrue(Object === properties.consolidationPolicy.constructor);
assertEqual(2, Object.keys(properties.consolidationPolicy).length); assertEqual(6, Object.keys(properties.consolidationPolicy).length);
assertEqual("bytes_accum", properties.consolidationPolicy.type); assertEqual("tier", properties.consolidationPolicy.type);
assertEqual((0.1).toFixed(6), properties.consolidationPolicy.threshold.toFixed(6)); assertEqual(1, properties.consolidationPolicy.segmentsMin);
assertEqual(10, properties.consolidationPolicy.segmentsMax);
assertEqual(5*(1 << 30), properties.consolidationPolicy.segmentsBytesMax);
assertEqual(2*(1 << 20), properties.consolidationPolicy.segmentsBytesFloor);
assertEqual((0.0).toFixed(6), properties.consolidationPolicy.minScore.toFixed(6));
assertTrue(Object === properties.links.constructor); assertTrue(Object === properties.links.constructor);
assertEqual(0, Object.keys(properties.links).length); assertEqual(0, Object.keys(properties.links).length);
}, },