Skip to content

Commit bb38cd0

Browse files
sagar0facebook-github-bot
authored andcommitted
Limit number of merge operands in Cassandra merge operator
Summary: Now that RocksDB supports conditional merging during point lookups (introduced in #2923), Cassandra value merge operator can be updated to pass in a limit. The limit needs to be passed in from the Cassandra code. Closes #2947 Differential Revision: D5938454 Pulled By: sagar0 fbshipit-source-id: d64a72d53170d8cf202b53bd648475c3952f7d7f
1 parent cf51d3e commit bb38cd0

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

java/rocksjni/cassandra_value_operator.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@
2323
/*
2424
* Class: org_rocksdb_CassandraValueMergeOperator
2525
* Method: newSharedCassandraValueMergeOperator
26-
* Signature: (I)J
26+
* Signature: (II)J
2727
*/
2828
jlong Java_org_rocksdb_CassandraValueMergeOperator_newSharedCassandraValueMergeOperator(
29-
JNIEnv* env, jclass jclazz, jint gcGracePeriodInSeconds) {
29+
JNIEnv* env, jclass jclazz, jint gcGracePeriodInSeconds,
30+
jint operands_limit) {
3031
auto* op = new std::shared_ptr<rocksdb::MergeOperator>(
3132
new rocksdb::cassandra::CassandraValueMergeOperator(
32-
gcGracePeriodInSeconds));
33+
gcGracePeriodInSeconds, operands_limit));
3334
return reinterpret_cast<jlong>(op);
3435
}
3536

java/src/main/java/org/rocksdb/CassandraValueMergeOperator.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@
1111
*/
1212
public class CassandraValueMergeOperator extends MergeOperator {
1313
public CassandraValueMergeOperator(int gcGracePeriodInSeconds) {
14-
super(newSharedCassandraValueMergeOperator(gcGracePeriodInSeconds));
14+
super(newSharedCassandraValueMergeOperator(gcGracePeriodInSeconds, 0));
1515
}
1616

17-
private native static long newSharedCassandraValueMergeOperator(int gcGracePeriodInSeconds);
17+
public CassandraValueMergeOperator(int gcGracePeriodInSeconds, int operandsLimit) {
18+
super(newSharedCassandraValueMergeOperator(gcGracePeriodInSeconds, operandsLimit));
19+
}
20+
21+
private native static long newSharedCassandraValueMergeOperator(
22+
int gcGracePeriodInSeconds, int limit);
1823

1924
@Override protected final native void disposeInternal(final long handle);
2025
}

utilities/cassandra/merge_operator.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ namespace cassandra {
1515
*/
1616
class CassandraValueMergeOperator : public MergeOperator {
1717
public:
18-
explicit CassandraValueMergeOperator(int32_t gc_grace_period_in_seconds)
19-
: gc_grace_period_in_seconds_(gc_grace_period_in_seconds) {}
18+
explicit CassandraValueMergeOperator(int32_t gc_grace_period_in_seconds,
19+
size_t operands_limit = 0)
20+
: gc_grace_period_in_seconds_(gc_grace_period_in_seconds),
21+
operands_limit_(operands_limit) {}
2022

2123
virtual bool FullMergeV2(const MergeOperationInput& merge_in,
2224
MergeOperationOutput* merge_out) const override;
@@ -30,8 +32,13 @@ class CassandraValueMergeOperator : public MergeOperator {
3032

3133
virtual bool AllowSingleOperand() const override { return true; }
3234

35+
virtual bool ShouldMerge(const std::vector<Slice>& operands) const override {
36+
return operands_limit_ > 0 && operands.size() >= operands_limit_;
37+
}
38+
3339
private:
3440
int32_t gc_grace_period_in_seconds_;
41+
size_t operands_limit_;
3542
};
3643
} // namespace cassandra
3744
} // namespace rocksdb

0 commit comments

Comments
 (0)