Loading include/daemon/backend/metadata/db.hpp +2 −2 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ public: /** * @brief Increases only the size part of the metadata entry via a RocksDB * Operand. * Operand as part of a write operation. * @param key KV store key * @param io_size new size for entry * @param append Loading @@ -130,7 +130,7 @@ public: /** * @brief Decreases only the size part of the metadata entry via a RocksDB * Operand/ * Operand. This is used for truncate, e.g.. * @param key KV store key * @param size new size for entry * @throws DBException on failure, NotFoundException if entry doesn't exist Loading include/daemon/backend/metadata/merge.hpp +41 −4 Original line number Diff line number Diff line Loading @@ -37,12 +37,18 @@ namespace rdb = rocksdb; namespace gkfs::metadata { /** * @brief Merge operator classifiers */ enum class OperandID : char { increase_size = 'i', decrease_size = 'd', create = 'c' }; /** * @brief Base class for merge operands */ class MergeOperand { public: constexpr static char operand_id_suffix = ':'; Loading @@ -66,7 +72,9 @@ protected: virtual OperandID id() const = 0; }; /** * @brief Increase size operand */ class IncreaseSizeOperand : public MergeOperand { private: constexpr const static char serialize_sep = ','; Loading Loading @@ -104,7 +112,9 @@ public: return append_; } }; /** * @brief Decrease size operand */ class DecreaseSizeOperand : public MergeOperand { private: size_t size_; Loading @@ -125,7 +135,9 @@ public: return size_; } }; /** * @brief Create operand */ class CreateOperand : public MergeOperand { public: std::string metadata; Loading @@ -138,24 +150,49 @@ public: std::string serialize_params() const override; }; /** * @brief Merge operator class passed to RocksDB, used during merge operations */ class MetadataMergeOperator : public rocksdb::MergeOperator { public: ~MetadataMergeOperator() override = default; /** * @brief Merges all operands in chronological order for the same key * @param op1 Input operand * @param op2 Output operand * @return Result of the merge operation */ bool FullMergeV2(const MergeOperationInput& merge_in, MergeOperationOutput* merge_out) const override; /** * @brief TODO functionality unclear. Currently unused. * @param key * @param operand_list * @param new_value * @param logger * @return */ bool PartialMergeMulti(const rdb::Slice& key, const std::deque<rdb::Slice>& operand_list, std::string* new_value, rdb::Logger* logger) const override; /** * @brief Returns the name of this Merge operator * @return */ const char* Name() const override; /** * @brief Merge Operator configuration which allows merges with just a * single operand. * @return */ bool AllowSingleOperand() const override; }; Loading include/daemon/backend/metadata/metadata_module.hpp +24 −2 Original line number Diff line number Diff line Loading @@ -34,18 +34,29 @@ namespace gkfs::metadata { /** * @brief MetadataModule is a singleton class that holds global data structures * for all metadata operations. */ class MetadataModule { private: MetadataModule() = default; std::shared_ptr<spdlog::logger> log_; std::shared_ptr<spdlog::logger> log_; ///< Metadata logger ///< Map to remember and assign offsets to write append operations std::map<uint16_t, size_t> append_offset_reserve_{}; std::mutex append_offset_reserve_mutex_{}; std::mutex append_offset_reserve_mutex_{}; ///< Mutex to protect ///< append_offset_reserve_ public: ///< Logger name static constexpr const char* LOGGER_NAME = "MetadataModule"; /** * @brief Get the MetadataModule singleton instance * @return MetadataModule instance */ static MetadataModule* getInstance() { static MetadataModule instance; Loading @@ -66,9 +77,20 @@ public: const std::map<uint16_t, size_t>& append_offset_reserve() const; /** * @brief Inserts entry into append_offset_reserve_ * @param merge_id Merge ID * @param offset Offset to reserve */ void append_offset_reserve_put(uint16_t merge_id, size_t offset); /** * @brief Gets and erases entry from append_offset_reserve_ * @param merge_id Merge ID * @return Offset reserved for merge_id * @throws std::out_of_range if merge_id is not in append_offset_reserve_ */ size_t append_offset_reserve_get_and_erase(uint16_t merge_id); }; Loading include/daemon/ops/metadentry.hpp +55 −0 Original line number Diff line number Diff line Loading @@ -34,30 +34,85 @@ namespace gkfs::metadata { /** * @brief Returns the metadata of an object at a specific path. The metadata can * be of dummy values if configured * @param path * @param attr * @return */ Metadata get(const std::string& path); /** * @brief Get metadentry string only for path * @param path * @return */ std::string get_str(const std::string& path); /** * @brief Gets the size of a metadentry * @param path * @param ret_size (return val) * @return err */ size_t get_size(const std::string& path); /** * @brief Returns a vector of directory entries for given directory * @param dir * @return */ std::vector<std::pair<std::string, bool>> get_dirents(const std::string& dir); /** * @brief Returns a vector of directory entries for given directory (extended * version) * @param dir * @return */ std::vector<std::tuple<std::string, bool, size_t, time_t>> get_dirents_extended(const std::string& dir); /** * @brief Creates metadata (if required) and dentry at the same time * @param path * @param mode * @throws DBException */ void create(const std::string& path, Metadata& md); /** * @brief Update metadentry by given Metadata object and path * @param path * @param md */ void update(const std::string& path, Metadata& md); /** * @brief Updates a metadentry's size atomically and returns the starting offset * for the I/O operation. * @param path * @param io_size * @param offset * @param append * @return starting offset for I/O operation */ off_t update_size(const std::string& path, size_t io_size, off_t offset, bool append); /** * @brief Remove metadentry if exists * @param path * @return * @throws gkfs::metadata::DBException */ void remove(const std::string& path); Loading src/daemon/backend/metadata/db.cpp +0 −16 Original line number Diff line number Diff line Loading @@ -97,12 +97,6 @@ MetadataDB::~MetadataDB() { backend_.reset(); } /** * Gets a KV store value for a key * @param key * @return value * @throws DBException on failure, NotFoundException if entry doesn't exist */ std::string MetadataDB::get(const std::string& key) const { return backend_->get(key); Loading Loading @@ -142,22 +136,12 @@ MetadataDB::update(const std::string& old_key, const std::string& new_key, backend_->update(old_key, new_key, val); } /** * @internal * E.g., called before a write() call * @endinternal */ off_t MetadataDB::increase_size(const std::string& key, size_t io_size, off_t offset, bool append) { return backend_->increase_size(key, io_size, offset, append); } /** * @internal * E.g., called before a truncate() call * @endinternal */ void MetadataDB::decrease_size(const std::string& key, size_t size) { backend_->decrease_size(key, size); Loading Loading
include/daemon/backend/metadata/db.hpp +2 −2 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ public: /** * @brief Increases only the size part of the metadata entry via a RocksDB * Operand. * Operand as part of a write operation. * @param key KV store key * @param io_size new size for entry * @param append Loading @@ -130,7 +130,7 @@ public: /** * @brief Decreases only the size part of the metadata entry via a RocksDB * Operand/ * Operand. This is used for truncate, e.g.. * @param key KV store key * @param size new size for entry * @throws DBException on failure, NotFoundException if entry doesn't exist Loading
include/daemon/backend/metadata/merge.hpp +41 −4 Original line number Diff line number Diff line Loading @@ -37,12 +37,18 @@ namespace rdb = rocksdb; namespace gkfs::metadata { /** * @brief Merge operator classifiers */ enum class OperandID : char { increase_size = 'i', decrease_size = 'd', create = 'c' }; /** * @brief Base class for merge operands */ class MergeOperand { public: constexpr static char operand_id_suffix = ':'; Loading @@ -66,7 +72,9 @@ protected: virtual OperandID id() const = 0; }; /** * @brief Increase size operand */ class IncreaseSizeOperand : public MergeOperand { private: constexpr const static char serialize_sep = ','; Loading Loading @@ -104,7 +112,9 @@ public: return append_; } }; /** * @brief Decrease size operand */ class DecreaseSizeOperand : public MergeOperand { private: size_t size_; Loading @@ -125,7 +135,9 @@ public: return size_; } }; /** * @brief Create operand */ class CreateOperand : public MergeOperand { public: std::string metadata; Loading @@ -138,24 +150,49 @@ public: std::string serialize_params() const override; }; /** * @brief Merge operator class passed to RocksDB, used during merge operations */ class MetadataMergeOperator : public rocksdb::MergeOperator { public: ~MetadataMergeOperator() override = default; /** * @brief Merges all operands in chronological order for the same key * @param op1 Input operand * @param op2 Output operand * @return Result of the merge operation */ bool FullMergeV2(const MergeOperationInput& merge_in, MergeOperationOutput* merge_out) const override; /** * @brief TODO functionality unclear. Currently unused. * @param key * @param operand_list * @param new_value * @param logger * @return */ bool PartialMergeMulti(const rdb::Slice& key, const std::deque<rdb::Slice>& operand_list, std::string* new_value, rdb::Logger* logger) const override; /** * @brief Returns the name of this Merge operator * @return */ const char* Name() const override; /** * @brief Merge Operator configuration which allows merges with just a * single operand. * @return */ bool AllowSingleOperand() const override; }; Loading
include/daemon/backend/metadata/metadata_module.hpp +24 −2 Original line number Diff line number Diff line Loading @@ -34,18 +34,29 @@ namespace gkfs::metadata { /** * @brief MetadataModule is a singleton class that holds global data structures * for all metadata operations. */ class MetadataModule { private: MetadataModule() = default; std::shared_ptr<spdlog::logger> log_; std::shared_ptr<spdlog::logger> log_; ///< Metadata logger ///< Map to remember and assign offsets to write append operations std::map<uint16_t, size_t> append_offset_reserve_{}; std::mutex append_offset_reserve_mutex_{}; std::mutex append_offset_reserve_mutex_{}; ///< Mutex to protect ///< append_offset_reserve_ public: ///< Logger name static constexpr const char* LOGGER_NAME = "MetadataModule"; /** * @brief Get the MetadataModule singleton instance * @return MetadataModule instance */ static MetadataModule* getInstance() { static MetadataModule instance; Loading @@ -66,9 +77,20 @@ public: const std::map<uint16_t, size_t>& append_offset_reserve() const; /** * @brief Inserts entry into append_offset_reserve_ * @param merge_id Merge ID * @param offset Offset to reserve */ void append_offset_reserve_put(uint16_t merge_id, size_t offset); /** * @brief Gets and erases entry from append_offset_reserve_ * @param merge_id Merge ID * @return Offset reserved for merge_id * @throws std::out_of_range if merge_id is not in append_offset_reserve_ */ size_t append_offset_reserve_get_and_erase(uint16_t merge_id); }; Loading
include/daemon/ops/metadentry.hpp +55 −0 Original line number Diff line number Diff line Loading @@ -34,30 +34,85 @@ namespace gkfs::metadata { /** * @brief Returns the metadata of an object at a specific path. The metadata can * be of dummy values if configured * @param path * @param attr * @return */ Metadata get(const std::string& path); /** * @brief Get metadentry string only for path * @param path * @return */ std::string get_str(const std::string& path); /** * @brief Gets the size of a metadentry * @param path * @param ret_size (return val) * @return err */ size_t get_size(const std::string& path); /** * @brief Returns a vector of directory entries for given directory * @param dir * @return */ std::vector<std::pair<std::string, bool>> get_dirents(const std::string& dir); /** * @brief Returns a vector of directory entries for given directory (extended * version) * @param dir * @return */ std::vector<std::tuple<std::string, bool, size_t, time_t>> get_dirents_extended(const std::string& dir); /** * @brief Creates metadata (if required) and dentry at the same time * @param path * @param mode * @throws DBException */ void create(const std::string& path, Metadata& md); /** * @brief Update metadentry by given Metadata object and path * @param path * @param md */ void update(const std::string& path, Metadata& md); /** * @brief Updates a metadentry's size atomically and returns the starting offset * for the I/O operation. * @param path * @param io_size * @param offset * @param append * @return starting offset for I/O operation */ off_t update_size(const std::string& path, size_t io_size, off_t offset, bool append); /** * @brief Remove metadentry if exists * @param path * @return * @throws gkfs::metadata::DBException */ void remove(const std::string& path); Loading
src/daemon/backend/metadata/db.cpp +0 −16 Original line number Diff line number Diff line Loading @@ -97,12 +97,6 @@ MetadataDB::~MetadataDB() { backend_.reset(); } /** * Gets a KV store value for a key * @param key * @return value * @throws DBException on failure, NotFoundException if entry doesn't exist */ std::string MetadataDB::get(const std::string& key) const { return backend_->get(key); Loading Loading @@ -142,22 +136,12 @@ MetadataDB::update(const std::string& old_key, const std::string& new_key, backend_->update(old_key, new_key, val); } /** * @internal * E.g., called before a write() call * @endinternal */ off_t MetadataDB::increase_size(const std::string& key, size_t io_size, off_t offset, bool append) { return backend_->increase_size(key, io_size, offset, append); } /** * @internal * E.g., called before a truncate() call * @endinternal */ void MetadataDB::decrease_size(const std::string& key, size_t size) { backend_->decrease_size(key, size); Loading