Verified Commit 5692115d authored by Tommaso Tocci's avatar Tommaso Tocci
Browse files

Use char as metadata separator instead of string

parent 8ec48874
Loading
Loading
Loading
Loading
+19 −19
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@

using namespace std;

static const std::string dentry_val_delim = ","s;
static const char MSP = '|'; // metadata separator

// By default create an empty metadata object

@@ -36,7 +36,7 @@ Metadata::Metadata(const std::string& path, const mode_t mode) : atime_(),
 * @param db_val
 */
Metadata::Metadata(const std::string& path, std::string db_val) {
    auto pos = db_val.find(dentry_val_delim);
    auto pos = db_val.find(MSP);
    if (pos == std::string::npos) { // no delimiter found => no metadata enabled. fill with dummy values
        inode_no_ = std::hash<std::string>{}(path);
        mode_ = static_cast<unsigned int>(stoul(db_val));
@@ -54,7 +54,7 @@ Metadata::Metadata(const std::string& path, std::string db_val) {
    mode_ = static_cast<unsigned int>(stoul(db_val.substr(0, pos)));
    db_val.erase(0, pos + 1);
    // size is also there
    pos = db_val.find(dentry_val_delim);
    pos = db_val.find(MSP);
    if (pos != std::string::npos) {  // delimiter found. more metadata is coming
        size_ = stol(db_val.substr(0, pos));
        db_val.erase(0, pos + 1);
@@ -64,37 +64,37 @@ Metadata::Metadata(const std::string& path, std::string db_val) {
    }
    // The order is important. don't change.
    if (ADAFS_DATA->atime_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        atime_ = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->mtime_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        mtime_ = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->ctime_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        ctime_ = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->uid_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        uid_ = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->gid_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        gid_ = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->inode_no_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        inode_no_ = static_cast<ino_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (ADAFS_DATA->link_cnt_state()) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        link_count_ = static_cast<nlink_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
@@ -129,38 +129,38 @@ std::string Metadata::serialize() const {
    std::string s;
    // The order is important. don't change.
    s += fmt::format_int(mode_).c_str(); // add mandatory mode
    s += dentry_val_delim;
    s += MSP;
    s += fmt::format_int(size_).c_str(); // add mandatory size
    if (ADAFS_DATA->atime_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(atime_).c_str();
    }
    if (ADAFS_DATA->mtime_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(mtime_).c_str();
    }
    if (ADAFS_DATA->ctime_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(ctime_).c_str();
    }
    if (ADAFS_DATA->uid_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(uid_).c_str();
    }
    if (ADAFS_DATA->gid_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(gid_).c_str();
    }
    if (ADAFS_DATA->inode_no_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(inode_no_).c_str();
    }
    if (ADAFS_DATA->link_cnt_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(link_count_).c_str();
    }
    if (ADAFS_DATA->blocks_state()) {
        s += dentry_val_delim;
        s += MSP;
        s += fmt::format_int(blocks_).c_str();
    }
    return s;
+10 −10
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@

using namespace std;

static const std::string dentry_val_delim = ","s;
static const char MSP = '|';

// rpc address cache
std::unique_ptr<std::unordered_map<uint64_t, hg_addr_t>> rpc_addresses;
@@ -48,7 +48,7 @@ int db_val_to_stat(const std::string& path, std::string db_val, struct stat& att
    memset(&attr.st_mtim, 0, sizeof(timespec));
    memset(&attr.st_ctim, 0, sizeof(timespec));

    auto pos = db_val.find(dentry_val_delim);
    auto pos = db_val.find(MSP);
    if (pos == std::string::npos) { // no delimiter found => no metadata enabled. fill with dummy values
        attr.st_mode = static_cast<unsigned int>(stoul(db_val));
        attr.st_nlink = 1;
@@ -66,7 +66,7 @@ int db_val_to_stat(const std::string& path, std::string db_val, struct stat& att
    attr.st_mode = static_cast<unsigned int>(stoul(db_val.substr(0, pos)));
    db_val.erase(0, pos + 1);
    // size is also there XXX
    pos = db_val.find(dentry_val_delim);
    pos = db_val.find(MSP);
    if (pos != std::string::npos) {  // delimiter found. more metadata is coming
        attr.st_size = stol(db_val.substr(0, pos));
        db_val.erase(0, pos + 1);
@@ -75,37 +75,37 @@ int db_val_to_stat(const std::string& path, std::string db_val, struct stat& att
    }
    // The order is important. don't change.
    if (CTX->fs_conf()->atime_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_atim.tv_sec = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->mtime_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_mtim.tv_sec = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->ctime_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_ctim.tv_sec = static_cast<time_t>(stol(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->uid_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_uid = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->gid_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_gid = static_cast<uid_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->inode_no_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_ino = static_cast<ino_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }
    if (CTX->fs_conf()->link_cnt_state) {
        pos = db_val.find(dentry_val_delim);
        pos = db_val.find(MSP);
        attr.st_nlink = static_cast<nlink_t>(stoul(db_val.substr(0, pos)));
        db_val.erase(0, pos + 1);
    }