Make Write API work for TTL databases
Summary: Added logic to make another WriteBatch with Timestamps during the Write function execution in TTL class. Also expanded the ttl_test to test for it. Have done nothing for Merge for now. Test Plan: make ttl_test;./ttl_test Reviewers: haobo, vamsi, dhruba Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D10827
This commit is contained in:
parent
1b69f1e584
commit
3c35eda9bd
@ -226,7 +226,34 @@ Status DBWithTTL::Merge(const WriteOptions& options,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status DBWithTTL::Write(const WriteOptions& opts, WriteBatch* updates) {
|
Status DBWithTTL::Write(const WriteOptions& opts, WriteBatch* updates) {
|
||||||
return db_->Write(opts, updates);
|
class Handler : public WriteBatch::Handler {
|
||||||
|
public:
|
||||||
|
WriteBatch updates_ttl;
|
||||||
|
Status batch_rewrite_status;
|
||||||
|
virtual void Put(const Slice& key, const Slice& value) {
|
||||||
|
std::string value_with_ts;
|
||||||
|
Status st = AppendTS(value, value_with_ts);
|
||||||
|
if (!st.ok()) {
|
||||||
|
batch_rewrite_status = st;
|
||||||
|
} else {
|
||||||
|
updates_ttl.Put(key, value_with_ts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual void Merge(const Slice& key, const Slice& value) {
|
||||||
|
// TTL doesn't support merge operation
|
||||||
|
batch_rewrite_status = Status::NotSupported("TTL doesn't support Merge");
|
||||||
|
}
|
||||||
|
virtual void Delete(const Slice& key) {
|
||||||
|
updates_ttl.Delete(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Handler handler;
|
||||||
|
updates->Iterate(&handler);
|
||||||
|
if (!handler.batch_rewrite_status.ok()) {
|
||||||
|
return handler.batch_rewrite_status;
|
||||||
|
} else {
|
||||||
|
return db_->Write(opts, &(handler.updates_ttl));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Iterator* DBWithTTL::NewIterator(const ReadOptions& opts) {
|
Iterator* DBWithTTL::NewIterator(const ReadOptions& opts) {
|
||||||
|
@ -12,6 +12,10 @@ namespace leveldb {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
typedef std::map<std::string, std::string> KVMap;
|
typedef std::map<std::string, std::string> KVMap;
|
||||||
|
enum BatchOperation {
|
||||||
|
PUT = 0,
|
||||||
|
DELETE = 1
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
class TtlTest {
|
class TtlTest {
|
||||||
@ -69,6 +73,29 @@ class TtlTest {
|
|||||||
ASSERT_EQ((int)kvmap_.size(), num_entries);//check all insertions done
|
ASSERT_EQ((int)kvmap_.size(), num_entries);//check all insertions done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Makes a write-batch with key-vals from kvmap_ and 'Write''s it
|
||||||
|
void MakePutWriteBatch(const BatchOperation* batch_ops, int num_ops) {
|
||||||
|
assert(num_ops <= (int)kvmap_.size());
|
||||||
|
static WriteOptions wopts;
|
||||||
|
static FlushOptions flush_opts;
|
||||||
|
WriteBatch batch;
|
||||||
|
kv_it_ = kvmap_.begin();
|
||||||
|
for (int i = 0; i < num_ops && kv_it_ != kvmap_.end(); i++, kv_it_++) {
|
||||||
|
switch (batch_ops[i]) {
|
||||||
|
case PUT:
|
||||||
|
batch.Put(kv_it_->first, kv_it_->second);
|
||||||
|
break;
|
||||||
|
case DELETE:
|
||||||
|
batch.Delete(kv_it_->first);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
db_ttl_->Write(wopts, &batch);
|
||||||
|
db_ttl_->Flush(flush_opts);
|
||||||
|
}
|
||||||
|
|
||||||
// Puts num_entries starting from start_pos_map from kvmap_ into the database
|
// Puts num_entries starting from start_pos_map from kvmap_ into the database
|
||||||
void PutValues(int start_pos_map, int num_entries) {
|
void PutValues(int start_pos_map, int num_entries) {
|
||||||
assert(db_ttl_);
|
assert(db_ttl_);
|
||||||
@ -288,7 +315,27 @@ TEST(TtlTest, ReadOnlyPresentForever) {
|
|||||||
CloseTtl();
|
CloseTtl();
|
||||||
|
|
||||||
OpenReadOnlyTtl(1);
|
OpenReadOnlyTtl(1);
|
||||||
SleepCompactCheck(2, 0, kSampleSize, true); // T=2:Set1 should still be there
|
SleepCompactCheck(2, 0, kSampleSize); // T=2:Set1 should still be there
|
||||||
|
CloseTtl();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks whether WriteBatch works well with TTL
|
||||||
|
// Puts all kvs in kvmap_ in a batch and writes first, then deletes first half
|
||||||
|
TEST(TtlTest, WriteBatchTest) {
|
||||||
|
MakeKVMap(kSampleSize);
|
||||||
|
BatchOperation batch_ops[kSampleSize];
|
||||||
|
for (int i = 0; i < kSampleSize; i++) {
|
||||||
|
batch_ops[i] = PUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenTtl(2);
|
||||||
|
MakePutWriteBatch(batch_ops, kSampleSize);
|
||||||
|
for (int i = 0; i < kSampleSize / 2; i++) {
|
||||||
|
batch_ops[i] = DELETE;
|
||||||
|
}
|
||||||
|
MakePutWriteBatch(batch_ops, kSampleSize / 2);
|
||||||
|
SleepCompactCheck(0, 0, kSampleSize / 2, false);
|
||||||
|
SleepCompactCheck(0, kSampleSize / 2, kSampleSize - kSampleSize / 2);
|
||||||
CloseTtl();
|
CloseTtl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user