summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Rumbaugh <dbr4@psu.edu>2023-11-13 10:41:13 -0500
committerDouglas Rumbaugh <dbr4@psu.edu>2023-11-13 10:41:13 -0500
commit83486744600e8be338c75c2e3d2339452a392a9d (patch)
tree1599636939a2e2146c4a66c584cdd035d6b803ba
parent39d22316be1708073e4fe1f708814cc801ecdc69 (diff)
downloaddynamic-extension-83486744600e8be338c75c2e3d2339452a392a9d.tar.gz
Fixed merge logic bug in tiering
In InternalLevel::clone(), the m_shard_cnt variable was not being set appropriately in the clone, resulting in the record counts reported for a multi-shard level to be reported incorrectly. In DynamicExtension::merge(), the merges were being performed in the wrong order, resulting in multi-level merges deleting records. The leveling tests all passed even with this bug for some reason, but it caused tiering tests to fail. It isn't clear _why_ leveling appeared to work, but the bug is now fixed, so that's largely irrelevant I suppose.
-rw-r--r--include/framework/DynamicExtension.h3
-rw-r--r--include/framework/structure/InternalLevel.h1
2 files changed, 3 insertions, 1 deletions
diff --git a/include/framework/DynamicExtension.h b/include/framework/DynamicExtension.h
index a6047ea..9554c8c 100644
--- a/include/framework/DynamicExtension.h
+++ b/include/framework/DynamicExtension.h
@@ -436,11 +436,12 @@ private:
MergeArgs<R, S, Q, L> *args = (MergeArgs<R, S, Q, L> *) arguments;
Structure *vers = args->epoch->get_structure();
+
// FIXME: with an improved shard interface, multiple full buffers
// could be merged at once here.
Buffer *buff = (Buffer *) args->epoch->get_buffers()[0];
- for (ssize_t i=args->merges.size() - 1; i>=0; i--) {
+ for (ssize_t i=0; i<args->merges.size(); i++) {
vers->merge_levels(args->merges[i].second, args->merges[i].first);
}
diff --git a/include/framework/structure/InternalLevel.h b/include/framework/structure/InternalLevel.h
index 00e0c58..d146b73 100644
--- a/include/framework/structure/InternalLevel.h
+++ b/include/framework/structure/InternalLevel.h
@@ -219,6 +219,7 @@ public:
for (size_t i=0; i<m_shard_cnt; i++) {
new_level->m_shards[i] = m_shards[i];
}
+ new_level->m_shard_cnt = m_shard_cnt;
return new_level;
}