2013-07-23 21:42:27 +00:00
|
|
|
// This file contains the interface that must be implemented by any collection
|
|
|
|
// to be used as the backing store for a MemTable. Such a collection must
|
|
|
|
// satisfy the following properties:
|
|
|
|
// (1) It does not store duplicate items.
|
|
|
|
// (2) It uses MemTableRep::KeyComparator to compare items for iteration and
|
|
|
|
// equality.
|
|
|
|
// (3) It can be accessed concurrently by multiple readers but need not support
|
|
|
|
// concurrent writes.
|
|
|
|
// (4) Items are never deleted.
|
|
|
|
// The liberal use of assertions is encouraged to enforce (1).
|
|
|
|
|
|
|
|
#ifndef STORAGE_LEVELDB_DB_TABLE_H_
|
|
|
|
#define STORAGE_LEVELDB_DB_TABLE_H_
|
|
|
|
|
|
|
|
#include <memory>
|
Make arena block size configurable
Summary:
Add an option for arena block size, default value 4096 bytes. Arena will allocate blocks with such size.
I am not sure about passing parameter to skiplist in the new virtualized framework, though I talked to Jim a bit. So add Jim as reviewer.
Test Plan:
new unit test, I am running db_test.
For passing paramter from configured option to Arena, I tried tests like:
TEST(DBTest, Arena_Option) {
std::string dbname = test::TmpDir() + "/db_arena_option_test";
DestroyDB(dbname, Options());
DB* db = nullptr;
Options opts;
opts.create_if_missing = true;
opts.arena_block_size = 1000000; // tested 99, 999999
Status s = DB::Open(opts, dbname, &db);
db->Put(WriteOptions(), "a", "123");
}
and printed some debug info. The results look good. Any suggestion for such a unit-test?
Reviewers: haobo, dhruba, emayanke, jpaton
Reviewed By: dhruba
CC: leveldb, zshao
Differential Revision: https://reviews.facebook.net/D11799
2013-07-31 19:42:23 +00:00
|
|
|
#include "leveldb/arena.h"
|
2013-07-23 21:42:27 +00:00
|
|
|
|
|
|
|
namespace leveldb {
|
|
|
|
|
|
|
|
class MemTableRep {
|
|
|
|
public:
|
|
|
|
// KeyComparator(a, b) returns a negative value if a is less than b, 0 if they
|
|
|
|
// are equal, and a positive value if b is greater than a
|
|
|
|
class KeyComparator {
|
|
|
|
public:
|
|
|
|
virtual int operator()(const char* a, const char* b) const = 0;
|
|
|
|
virtual ~KeyComparator() { }
|
|
|
|
};
|
|
|
|
|
|
|
|
// Insert key into the collection. (The caller will pack key and value into a
|
|
|
|
// single buffer and pass that in as the parameter to Insert)
|
|
|
|
// REQUIRES: nothing that compares equal to key is currently in the
|
|
|
|
// collection.
|
|
|
|
virtual void Insert(const char* key) = 0;
|
|
|
|
|
|
|
|
// Returns true iff an entry that compares equal to key is in the collection.
|
|
|
|
virtual bool Contains(const char* key) const = 0;
|
|
|
|
|
|
|
|
virtual ~MemTableRep() { }
|
|
|
|
|
|
|
|
// Iteration over the contents of a skip collection
|
|
|
|
class Iterator {
|
|
|
|
public:
|
|
|
|
// Initialize an iterator over the specified collection.
|
|
|
|
// The returned iterator is not valid.
|
|
|
|
// explicit Iterator(const MemTableRep* collection);
|
|
|
|
virtual ~Iterator() { };
|
|
|
|
|
|
|
|
// Returns true iff the iterator is positioned at a valid node.
|
|
|
|
virtual bool Valid() const = 0;
|
|
|
|
|
|
|
|
// Returns the key at the current position.
|
|
|
|
// REQUIRES: Valid()
|
|
|
|
virtual const char* key() const = 0;
|
|
|
|
|
|
|
|
// Advances to the next position.
|
|
|
|
// REQUIRES: Valid()
|
|
|
|
virtual void Next() = 0;
|
|
|
|
|
|
|
|
// Advances to the previous position.
|
|
|
|
// REQUIRES: Valid()
|
|
|
|
virtual void Prev() = 0;
|
|
|
|
|
|
|
|
// Advance to the first entry with a key >= target
|
|
|
|
virtual void Seek(const char* target) = 0;
|
|
|
|
|
|
|
|
// Position at the first entry in collection.
|
|
|
|
// Final state of iterator is Valid() iff collection is not empty.
|
|
|
|
virtual void SeekToFirst() = 0;
|
|
|
|
|
|
|
|
// Position at the last entry in collection.
|
|
|
|
// Final state of iterator is Valid() iff collection is not empty.
|
|
|
|
virtual void SeekToLast() = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
virtual std::shared_ptr<Iterator> GetIterator() = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
class MemTableRepFactory {
|
|
|
|
public:
|
|
|
|
virtual ~MemTableRepFactory() { };
|
|
|
|
virtual std::shared_ptr<MemTableRep> CreateMemTableRep(
|
Make arena block size configurable
Summary:
Add an option for arena block size, default value 4096 bytes. Arena will allocate blocks with such size.
I am not sure about passing parameter to skiplist in the new virtualized framework, though I talked to Jim a bit. So add Jim as reviewer.
Test Plan:
new unit test, I am running db_test.
For passing paramter from configured option to Arena, I tried tests like:
TEST(DBTest, Arena_Option) {
std::string dbname = test::TmpDir() + "/db_arena_option_test";
DestroyDB(dbname, Options());
DB* db = nullptr;
Options opts;
opts.create_if_missing = true;
opts.arena_block_size = 1000000; // tested 99, 999999
Status s = DB::Open(opts, dbname, &db);
db->Put(WriteOptions(), "a", "123");
}
and printed some debug info. The results look good. Any suggestion for such a unit-test?
Reviewers: haobo, dhruba, emayanke, jpaton
Reviewed By: dhruba
CC: leveldb, zshao
Differential Revision: https://reviews.facebook.net/D11799
2013-07-31 19:42:23 +00:00
|
|
|
MemTableRep::KeyComparator&, Arena* arena) = 0;
|
2013-07-23 21:42:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // STORAGE_LEVELDB_DB_TABLE_H_
|