From b7bf8a8983f100f7fa30f1f8ee72875d0bd83fb9 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 24 Apr 2017 14:19:29 +0200 Subject: [PATCH] implement basic operations for settings --- .../RocksDBEngine/RocksDBCounterManager.cpp | 41 ++++++++++++++++++- arangod/RocksDBEngine/RocksDBCounterManager.h | 3 ++ arangod/RocksDBEngine/RocksDBKey.cpp | 17 ++++++++ arangod/RocksDBEngine/RocksDBKey.h | 8 +++- arangod/RocksDBEngine/RocksDBKeyBounds.cpp | 3 +- arangod/RocksDBEngine/RocksDBTypes.cpp | 6 +++ arangod/RocksDBEngine/RocksDBTypes.h | 3 +- 7 files changed, 75 insertions(+), 6 deletions(-) diff --git a/arangod/RocksDBEngine/RocksDBCounterManager.cpp b/arangod/RocksDBEngine/RocksDBCounterManager.cpp index 41fc90c8fb..fb7c186bea 100644 --- a/arangod/RocksDBEngine/RocksDBCounterManager.cpp +++ b/arangod/RocksDBEngine/RocksDBCounterManager.cpp @@ -26,17 +26,17 @@ #include "Basics/ReadLocker.h" #include "Basics/WriteLocker.h" #include "Logger/Logger.h" +#include "RocksDBEngine/RocksDBCommon.h" #include "RocksDBEngine/RocksDBKey.h" #include "RocksDBEngine/RocksDBKeyBounds.h" #include "RocksDBEngine/RocksDBValue.h" -#include "RocksDBEngine/RocksDBCommon.h" - #include #include #include #include +#include #include using namespace arangodb; @@ -68,6 +68,8 @@ void RocksDBCounterManager::CMValue::serialize(VPackBuilder& b) const { /// will load counts from the db and scan the WAL RocksDBCounterManager::RocksDBCounterManager(rocksdb::DB* db) : _db(db) { + readSettings(); + readCounterValues(); if (_counters.size() > 0) { if (parseRocksWAL()) { @@ -148,6 +150,8 @@ Result RocksDBCounterManager::sync() { return Result(); } + writeSettings(); + std::unordered_map copy; { // block all updates WRITE_LOCKER(guard, _rwLock); @@ -197,6 +201,39 @@ Result RocksDBCounterManager::sync() { return rocksutils::convertStatus(s); } +void RocksDBCounterManager::readSettings() { +#if 0 + RocksDBKey key = RocksDBKey::SettingsValue(); + + std::string result; + rocksdb::Status status = _db->Get(rocksdb::ReadOptions(), key.string(), &result); + if (status.ok()) { + // key may not be there... + VPackSlice slice = VPackSlice(result.data()); + TRI_ASSERT(slice.isObject()); + } +#endif +} + +void RocksDBCounterManager::writeSettings() { +#if 0 + RocksDBKey key = RocksDBKey::SettingsValue(); + + VPackBuilder builder; + builder.openObject(); + builder.close(); + + VPackSlice slice = builder.slice(); + rocksdb::Slice value(slice.startAs(), slice.byteSize()); + + rocksdb::Status status = _db->Put(rocksdb::WriteOptions(), key.string(), value); + + if (status.ok()) { + // TODO + } +#endif +} + /// Parse counter values from rocksdb void RocksDBCounterManager::readCounterValues() { WRITE_LOCKER(guard, _rwLock); diff --git a/arangod/RocksDBEngine/RocksDBCounterManager.h b/arangod/RocksDBEngine/RocksDBCounterManager.h index 6db2719af9..4455393623 100644 --- a/arangod/RocksDBEngine/RocksDBCounterManager.h +++ b/arangod/RocksDBEngine/RocksDBCounterManager.h @@ -100,6 +100,9 @@ class RocksDBCounterManager { }; + void readSettings(); + void writeSettings(); + void readCounterValues(); bool parseRocksWAL(); diff --git a/arangod/RocksDBEngine/RocksDBKey.cpp b/arangod/RocksDBEngine/RocksDBKey.cpp index be351f07c8..74aebab5a6 100644 --- a/arangod/RocksDBEngine/RocksDBKey.cpp +++ b/arangod/RocksDBEngine/RocksDBKey.cpp @@ -85,6 +85,10 @@ RocksDBKey RocksDBKey::CounterValue(uint64_t objectId) { return RocksDBKey(RocksDBEntryType::CounterValue, objectId); } +RocksDBKey RocksDBKey::SettingsValue() { + return RocksDBKey(RocksDBEntryType::SettingsValue); +} + RocksDBEntryType RocksDBKey::type(RocksDBKey const& key) { return type(key._buffer.data(), key._buffer.size()); } @@ -156,6 +160,19 @@ VPackSlice RocksDBKey::indexedVPack(rocksdb::Slice const& slice) { std::string const& RocksDBKey::string() const { return _buffer; } +RocksDBKey::RocksDBKey(RocksDBEntryType type) + : _type(type), _buffer() { + switch (_type) { + case RocksDBEntryType::SettingsValue: { + _buffer.push_back(static_cast(_type)); + break; + } + + default: + THROW_ARANGO_EXCEPTION(TRI_ERROR_BAD_PARAMETER); + } +} + RocksDBKey::RocksDBKey(RocksDBEntryType type, uint64_t first) : _type(type), _buffer() { switch (_type) { diff --git a/arangod/RocksDBEngine/RocksDBKey.h b/arangod/RocksDBEngine/RocksDBKey.h index 1a6edb89c7..c6f8074e36 100644 --- a/arangod/RocksDBEngine/RocksDBKey.h +++ b/arangod/RocksDBEngine/RocksDBKey.h @@ -109,6 +109,11 @@ class RocksDBKey { ////////////////////////////////////////////////////////////////////////////// static RocksDBKey View(TRI_voc_tick_t databaseId, TRI_voc_cid_t viewId); + ////////////////////////////////////////////////////////////////////////////// + /// @brief Create a fully-specified key for a settings value + ////////////////////////////////////////////////////////////////////////////// + static RocksDBKey SettingsValue(); + ////////////////////////////////////////////////////////////////////////////// /// @brief Create a fully-specified key for a counter value ////////////////////////////////////////////////////////////////////////////// @@ -129,7 +134,7 @@ class RocksDBKey { /// May be called on any valid key (in our keyspace) ////////////////////////////////////////////////////////////////////////////// static uint64_t counterObjectId(rocksdb::Slice const&); - + ////////////////////////////////////////////////////////////////////////////// /// @brief Extracts the databaseId from a key /// @@ -198,6 +203,7 @@ class RocksDBKey { std::string const& string() const; private: + explicit RocksDBKey(RocksDBEntryType type); RocksDBKey(RocksDBEntryType type, uint64_t first); RocksDBKey(RocksDBEntryType type, uint64_t first, uint64_t second); RocksDBKey(RocksDBEntryType type, uint64_t first, VPackSlice const& slice); diff --git a/arangod/RocksDBEngine/RocksDBKeyBounds.cpp b/arangod/RocksDBEngine/RocksDBKeyBounds.cpp index acedca2c3c..1205b74062 100644 --- a/arangod/RocksDBEngine/RocksDBKeyBounds.cpp +++ b/arangod/RocksDBEngine/RocksDBKeyBounds.cpp @@ -106,14 +106,13 @@ RocksDBKeyBounds::RocksDBKeyBounds(RocksDBEntryType type) _startBuffer.reserve(length); _startBuffer.push_back(static_cast(_type)); - _endBuffer.clear(); _endBuffer.append(_startBuffer); nextPrefix(_endBuffer); break; } case RocksDBEntryType::CounterValue: { - size_t length = sizeof(char); + size_t length = sizeof(char) + sizeof(uint64_t); _startBuffer.reserve(length); _startBuffer.push_back(static_cast(_type)); uint64ToPersistent(_startBuffer, 0); diff --git a/arangod/RocksDBEngine/RocksDBTypes.cpp b/arangod/RocksDBEngine/RocksDBTypes.cpp index 7b5527141e..2e4784e6c1 100644 --- a/arangod/RocksDBEngine/RocksDBTypes.cpp +++ b/arangod/RocksDBEngine/RocksDBTypes.cpp @@ -74,6 +74,10 @@ static rocksdb::Slice UniqueIndexValue( static RocksDBEntryType view = RocksDBEntryType::View; static rocksdb::Slice View( reinterpret_cast::type*>(&view), 1); + +static RocksDBEntryType settingsValue = RocksDBEntryType::SettingsValue; +static rocksdb::Slice SettingsValue( + reinterpret_cast::type*>(&settingsValue), 1); } rocksdb::Slice const& arangodb::rocksDBSlice(RocksDBEntryType const& type) { @@ -96,6 +100,8 @@ rocksdb::Slice const& arangodb::rocksDBSlice(RocksDBEntryType const& type) { return UniqueIndexValue; case RocksDBEntryType::View: return View; + case RocksDBEntryType::SettingsValue: + return SettingsValue; } return Document; // avoids warning - errorslice instead ?! diff --git a/arangod/RocksDBEngine/RocksDBTypes.h b/arangod/RocksDBEngine/RocksDBTypes.h index 914d8603b8..1bac0ac471 100644 --- a/arangod/RocksDBEngine/RocksDBTypes.h +++ b/arangod/RocksDBEngine/RocksDBTypes.h @@ -40,7 +40,8 @@ enum class RocksDBEntryType : char { EdgeIndexValue = '5', IndexValue = '6', UniqueIndexValue = '7', - View = '8' + View = '8', + SettingsValue = '9' }; rocksdb::Slice const& rocksDBSlice(RocksDBEntryType const& type);