Verified Commit e290d905 authored by Marc Vef's avatar Marc Vef
Browse files

Cleanup and adding documentation

parent bfece2ab
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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
@@ -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
+41 −4
Original line number Diff line number Diff line
@@ -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 = ':';
@@ -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 = ',';
@@ -104,7 +112,9 @@ public:
        return append_;
    }
};

/**
 * @brief Decrease size operand
 */
class DecreaseSizeOperand : public MergeOperand {
private:
    size_t size_;
@@ -125,7 +135,9 @@ public:
        return size_;
    }
};

/**
 * @brief Create operand
 */
class CreateOperand : public MergeOperand {
public:
    std::string metadata;
@@ -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;
};
+24 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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);
};
+55 −0
Original line number Diff line number Diff line
@@ -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);

+0 −16
Original line number Diff line number Diff line
@@ -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);
@@ -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