Commit 82afdc34 authored by Marc Vef's avatar Marc Vef
Browse files

Fix: get_attr() inode resolution (could be rpc)

parent 0c565e48
Loading
Loading
Loading
Loading
+19 −5
Original line number Diff line number Diff line
@@ -131,11 +131,25 @@ int get_metadata(Metadata& md, const fuse_ino_t inode) {
 */
int get_attr(struct stat& attr, const fuse_ino_t inode) {

    // XXX look in cache first
    auto md = make_shared<Metadata>();
    auto err = get_metadata(*md, inode);

    metadata_to_stat(*md, attr);
    // XXX look in attribute cache first
    Metadata md{};
    int err;
    if (ADAFS_DATA->host_size() > 1) { // multiple node operation
        auto recipient = RPC_DATA->get_rpc_node(fmt::FormatInt(inode).str());
        if (ADAFS_DATA->is_local_op(recipient) || inode == ADAFS_ROOT_INODE) { // local, root inode is locally available
            err = get_metadata(md, inode);
            if (err == 0)
                metadata_to_stat(md, attr);
        } else {
            err = rpc_send_get_attr(recipient, inode, attr);
        }
    } else { // single node operation
        err = get_metadata(md, inode);
        if (err == 0)
            metadata_to_stat(md, attr);
    }
    if (err != 0)
        ADAFS_DATA->spdlogger()->error("Failed to get attributes.");

    return err;
}
+9 −6
Original line number Diff line number Diff line
@@ -47,13 +47,16 @@ void adafs_ll_lookup(fuse_req_t req, fuse_ino_t parent, const char* name) {
        return;
    }

    auto fep = make_shared<struct fuse_entry_param>();
    get_attr(fep->attr, inode);
    fep->ino = fep->attr.st_ino;
    fep->entry_timeout = 1.0;
    fep->attr_timeout = 1.0;
    struct fuse_entry_param fep{};
    err = get_attr(fep.attr, inode);
    fep.ino = fep.attr.st_ino;
    fep.entry_timeout = 1.0;
    fep.attr_timeout = 1.0;

    fuse_reply_entry(req, fep.get());
    if (err == 0)
        fuse_reply_entry(req, &fep);
    else
        fuse_reply_err(req, err);


    /* for ENOENTs
+1 −15
Original line number Diff line number Diff line
@@ -36,22 +36,8 @@ void adafs_ll_getattr(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi)
    ADAFS_DATA->spdlogger()->debug("adafs_ll_getattr() enter: inode {}", ino);

    struct stat attr{};
    int err;

    if (ADAFS_DATA->host_size() > 1) { // multiple node operation
        auto recipient = RPC_DATA->get_rpc_node(fmt::FormatInt(ino).str());
        if (ADAFS_DATA->is_local_op(recipient) || ino == ADAFS_ROOT_INODE) { // local, root inode is locally available
            err = get_attr(attr, ino);
        } else { // remote
            err = rpc_send_get_attr(recipient, ino, attr);
        }
    } else { // single node operation
        err = get_attr(attr, ino);

    }

    auto err = get_attr(attr, ino);

//    auto attr = make_shared<struct stat>();
    if (err == 0) {
        // XXX take a look into timeout value later
        fuse_reply_attr(req, &attr, 1.0);