Commit 3f6bd6b0 authored by Marc Vef's avatar Marc Vef
Browse files

Building metadata keys is now handled in one place

parent a8be39fd
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -31,11 +31,15 @@ set(SOURCE_FILES src/main.cpp src/main.hpp src/fuse_ops.hpp src/configure.hpp
        src/classes/metadata.h src/classes/metadata.cpp src/classes/fs_data.h src/classes/fs_data.cpp
        src/classes/dentry.h src/classes/dentry.cpp

        src/adafs_ops/mdata_ops.hpp src/adafs_ops/dentry_ops.hpp src/adafs_ops/access.hpp src/adafs_ops/db_ops.hpp
        src/adafs_ops/mdata_ops.hpp src/adafs_ops/dentry_ops.hpp src/adafs_ops/access.hpp

        src/db/db_ops.hpp src/db/util.hpp

        src/util.cpp
        src/fuse_ops/file.cpp src/fuse_ops/directory.cpp src/fuse_ops/sync.cpp src/fuse_ops/access.cpp
        src/adafs_ops/mdata_ops.cpp src/adafs_ops/dentry_ops.cpp src/adafs_ops/access.cpp src/adafs_ops/db_ops.cpp
        src/adafs_ops/mdata_ops.cpp src/adafs_ops/dentry_ops.cpp src/adafs_ops/access.cpp

        src/db/db_ops.cpp src/db/util.cpp

        )
add_executable(adafs ${SOURCE_FILES} src/main.cpp)
+4 −5
Original line number Diff line number Diff line
@@ -3,7 +3,8 @@
//

#include "dentry_ops.hpp"
#include "db_ops.hpp"
#include "../db/db_ops.hpp"
#include "../db/util.hpp"

using namespace std;

@@ -120,11 +121,9 @@ pair<int, fuse_ino_t> do_lookup(fuse_req_t& req, const fuse_ino_t p_inode, const
 * @return
 */
int create_dentry(const fuse_ino_t p_inode, const fuse_ino_t inode, const string& name, mode_t mode) {

    auto key = "d_"s + fmt::FormatInt(p_inode).str() + "_"s + name;
    auto val = fmt::FormatInt(inode).str() + "_"s + fmt::FormatInt(mode).str();
    // XXX check later if we need to check if dentry of father already exists
    return db_put_dentry(key, val);
    // put dentry for key, value
    return db_put_dentry(db_build_dentry_key(p_inode, name), db_build_dentry_value(inode, mode));
}

/**
+40 −30
Original line number Diff line number Diff line
@@ -5,21 +5,24 @@
#include "mdata_ops.hpp"
#include "dentry_ops.hpp"

using namespace std;

// TODO error handling.
int write_all_metadata(const Metadata& md, const fuse_ino_t inode) {
    auto inode_key = fmt::FormatInt(inode).str();

    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::atime)>(md_field_map), md.atime());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::mtime)>(md_field_map), md.mtime());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::ctime)>(md_field_map), md.ctime());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::uid)>(md_field_map), md.uid());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::gid)>(md_field_map), md.gid());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::mode)>(md_field_map), md.mode());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::inode_no)>(md_field_map), md.inode_no());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::link_count)>(md_field_map), md.link_count());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::size)>(md_field_map), md.size());
    db_put_mdata(inode_key + std::get<to_underlying(Md_fields::blocks)>(md_field_map), md.blocks());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::atime)>(md_field_map)), md.atime());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::mtime)>(md_field_map)), md.mtime());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::ctime)>(md_field_map)), md.ctime());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::uid)>(md_field_map)), md.uid());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::gid)>(md_field_map)), md.gid());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::mode)>(md_field_map)), md.mode());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::inode_no)>(md_field_map)),
                 md.inode_no());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::link_count)>(md_field_map)),
                 md.link_count());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::size)>(md_field_map)), md.size());
    db_put_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::blocks)>(md_field_map)), md.blocks());
    return 0;
}

@@ -27,16 +30,23 @@ int write_all_metadata(const Metadata& md, const fuse_ino_t inode) {
int read_all_metadata(Metadata& md, const fuse_ino_t inode) {
    auto inode_key = fmt::FormatInt(inode).str();

    md.atime(db_get_mdata<time_t>(inode_key + std::get<to_underlying(Md_fields::atime)>(md_field_map)));
    md.mtime(db_get_mdata<time_t>(inode_key + std::get<to_underlying(Md_fields::mtime)>(md_field_map)));
    md.ctime(db_get_mdata<time_t>(inode_key + std::get<to_underlying(Md_fields::ctime)>(md_field_map)));
    md.uid(db_get_mdata<uid_t>(inode_key + std::get<to_underlying(Md_fields::uid)>(md_field_map)));
    md.gid(db_get_mdata<gid_t>(inode_key + std::get<to_underlying(Md_fields::gid)>(md_field_map)));
    md.mode(db_get_mdata<mode_t>(inode_key + std::get<to_underlying(Md_fields::mode)>(md_field_map)));
    md.inode_no(db_get_mdata<fuse_ino_t>(inode_key + std::get<to_underlying(Md_fields::inode_no)>(md_field_map)));
    md.link_count(db_get_mdata<nlink_t>(inode_key + std::get<to_underlying(Md_fields::link_count)>(md_field_map)));
    md.size(db_get_mdata<off_t>(inode_key + std::get<to_underlying(Md_fields::size)>(md_field_map)));
    md.blocks(db_get_mdata<blkcnt_t>(inode_key + std::get<to_underlying(Md_fields::blocks)>(md_field_map)));
    md.atime(db_get_mdata<time_t>(
            db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::atime)>(md_field_map))));
    md.mtime(db_get_mdata<time_t>(
            db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::mtime)>(md_field_map))));
    md.ctime(db_get_mdata<time_t>(
            db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::ctime)>(md_field_map))));
    md.uid(db_get_mdata<uid_t>(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::uid)>(md_field_map))));
    md.gid(db_get_mdata<gid_t>(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::gid)>(md_field_map))));
    md.mode(db_get_mdata<mode_t>(
            db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::mode)>(md_field_map))));
    md.inode_no(db_get_mdata<fuse_ino_t>(
            db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::inode_no)>(md_field_map))));
    md.link_count(db_get_mdata<nlink_t>(
            db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::link_count)>(md_field_map))));
    md.size(db_get_mdata<off_t>(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::size)>(md_field_map))));
    md.blocks(db_get_mdata<blkcnt_t>(
            db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::blocks)>(md_field_map))));
    return 0;
}

@@ -49,16 +59,16 @@ int read_all_metadata(Metadata& md, const fuse_ino_t inode) {
int remove_all_metadata(const fuse_ino_t inode) {
    // TODO error handling
    auto inode_key = fmt::FormatInt(inode).str();
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::atime)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::mtime)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::ctime)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::uid)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::gid)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::mode)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::inode_no)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::link_count)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::size)>(md_field_map));
    db_delete_mdata(inode_key + std::get<to_underlying(Md_fields::blocks)>(md_field_map));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::atime)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::mtime)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::ctime)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::uid)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::gid)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::mode)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::inode_no)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::link_count)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::size)>(md_field_map)));
    db_delete_mdata(db_build_mdata_key(inode_key, std::get<to_underlying(Md_fields::blocks)>(md_field_map)));
    return 0;
}

+13 −12
Original line number Diff line number Diff line
@@ -7,21 +7,22 @@

#include "../main.hpp"
#include "../classes/metadata.h"
#include "db_ops.hpp"
#include "../db/db_ops.hpp"
#include "../db/util.hpp"

using namespace std;

template <typename E>
constexpr typename std::underlying_type<E>::type to_underlying(E e) {
    return static_cast<typename std::underlying_type<E>::type>(e);
}

// mapping of enum to string to get the file names for metadata
enum class Md_fields { atime, mtime, ctime, uid, gid, mode, inode_no, link_count, size, blocks };

const std::array<std::string, 10> md_field_map = {
        "_atime"s, "_mtime"s, "_ctime"s, "_uid"s, "_gid"s, "_mode"s, "_inodeno"s, "_lnkcnt"s, "_size"s, "_blkcnt"s
};
//template <typename E>
//constexpr typename std::underlying_type<E>::type to_underlying(E e) {
//    return static_cast<typename std::underlying_type<E>::type>(e);
//}
//
//// mapping of enum to string to get the db_keys for metadata
//enum class Md_fields { atime, mtime, ctime, uid, gid, mode, inode_no, link_count, size, blocks };
//
//const std::array<std::string, 10> md_field_map = {
//        "_atime"s, "_mtime"s, "_ctime"s, "_uid"s, "_gid"s, "_mode"s, "_inodeno"s, "_lnkcnt"s, "_size"s, "_blkcnt"s
//};

int write_all_metadata(const Metadata& md, const fuse_ino_t inode);

+6 −6
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
//

#include "db_ops.hpp"
#include "mdata_ops.hpp"
#include "../adafs_ops/mdata_ops.hpp"


using namespace rocksdb;
@@ -38,7 +38,7 @@ bool db_delete_mdata(const string& key) {

bool db_dentry_exists(const fuse_ino_t p_inode, const string& name, string& val) {
    auto db = ADAFS_DATA->rdb();
    auto key = "d_"s + fmt::FormatInt(p_inode).str() + "_"s + name;
    auto key = db_build_dentry_key(p_inode, name);
    return db->Get(rocksdb::ReadOptions(), key, &val).ok();
}

@@ -46,7 +46,7 @@ bool db_mdata_exists(const fuse_ino_t inode) {
    auto db = ADAFS_DATA->rdb();
    string val_str;
    return db->Get(ReadOptions(),
                   fmt::FormatInt(inode).str() + std::get<to_underlying(Md_fields::atime)>(md_field_map),
                   db_build_mdata_key(inode, std::get<to_underlying(Md_fields::atime)>(md_field_map)),
                   &val_str).ok();
}

@@ -61,7 +61,7 @@ void db_get_dentries(vector<Dentry>& dentries, const fuse_ino_t dir_inode) {
    size_t pos;
    auto delim = "_"s;
    auto db = ADAFS_DATA->rdb();
    auto prefix = "d_"s + fmt::FormatInt(dir_inode).str();
    auto prefix = db_build_dentry_prefix(dir_inode);
    // Do RangeScan on parent inode
    auto dentry_iter = db->NewIterator(rocksdb::ReadOptions());
    for (dentry_iter->Seek(prefix);
@@ -88,7 +88,7 @@ void db_get_dentries(vector<Dentry>& dentries, const fuse_ino_t dir_inode) {
}

pair<bool, fuse_ino_t> db_delete_dentry_get_inode(const fuse_ino_t p_inode, const string& name) {
    auto key = "d_"s + fmt::FormatInt(p_inode).str() + "_"s + name;
    auto key = db_build_dentry_key(p_inode, name);
    auto db = ADAFS_DATA->rdb();
    string val;
    db->Get(ReadOptions(), key, &val);
@@ -105,7 +105,7 @@ pair<bool, fuse_ino_t> db_delete_dentry_get_inode(const fuse_ino_t p_inode, cons
bool db_is_dir_empty(const fuse_ino_t inode) {
    auto dir_empty = true;
    auto db = ADAFS_DATA->rdb();
    auto prefix = "d_"s + fmt::FormatInt(inode).str();
    auto prefix = db_build_dentry_prefix(inode);
    auto dentry_iter = db->NewIterator(rocksdb::ReadOptions());
    for (dentry_iter->Seek(prefix);
         dentry_iter->Valid() && dentry_iter->key().starts_with(prefix); dentry_iter->Next()) {
Loading