diff --git a/db/write_batch.cc b/db/write_batch.cc index 33f4a42..7f8f3e8 100644 --- a/db/write_batch.cc +++ b/db/write_batch.cc @@ -39,6 +39,10 @@ void WriteBatch::Clear() { rep_.resize(kHeader); } +size_t WriteBatch::ApproximateSize() { + return rep_.size(); +} + Status WriteBatch::Iterate(Handler* handler) const { Slice input(rep_); if (input.size() < kHeader) { diff --git a/db/write_batch_test.cc b/db/write_batch_test.cc index 9064e3d..8d38023 100644 --- a/db/write_batch_test.cc +++ b/db/write_batch_test.cc @@ -113,6 +113,23 @@ TEST(WriteBatchTest, Append) { PrintContents(&b1)); } +TEST(WriteBatchTest, ApproximateSize) { + WriteBatch batch; + size_t empty_size = batch.ApproximateSize(); + + batch.Put(Slice("foo"), Slice("bar")); + size_t one_key_size = batch.ApproximateSize(); + ASSERT_LT(empty_size, one_key_size); + + batch.Put(Slice("baz"), Slice("boo")); + size_t two_keys_size = batch.ApproximateSize(); + ASSERT_LT(one_key_size, two_keys_size); + + batch.Delete(Slice("box")); + size_t post_delete_size = batch.ApproximateSize(); + ASSERT_LT(two_keys_size, post_delete_size); +} + } // namespace leveldb int main(int argc, char** argv) { diff --git a/include/leveldb/write_batch.h b/include/leveldb/write_batch.h index ee9aab6..65a76d8 100644 --- a/include/leveldb/write_batch.h +++ b/include/leveldb/write_batch.h @@ -42,6 +42,12 @@ class WriteBatch { // Clear all updates buffered in this batch. void Clear(); + // The size of the database changes caused by this batch. + // + // This number is tied to implementation details, and may change across + // releases. It is intended for LevelDB usage metrics. + size_t ApproximateSize(); + // Support for iterating over the contents of a batch. class Handler { public: