Thank you very much for your reply.

$ rados -p metad stat 812d45e9f48f7372d908270616b2b06bfad44958
metad/812d45e9f48f7372d908270616b2b06bfad44958 mtime 1401948103, size 43

use rados command no problem,
in simple code to test rados_stat() also no problem,

just invoke rados_stat() code:

int main(int argc, char **argv) {
    int err;
    rados_t cluster;
    rados_ioctx_t io;
    char *poolname = "metad";
    uint64_t ss = 0;
    time_t tt = 0;

    err = rados_create(&cluster, NULL);
    if (err < 0) {
        fprintf(stderr, "%s: cannot create a cluster handle: %s\n",
argv[0], strerror(-err));
        exit(1);
    }
    err = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf");
    if (err < 0) {
        fprintf(stderr, "%s: cannot read config file: %s\n", argv[0],
strerror(-err));
        exit(1);
    }
    err = rados_connect(cluster);
    if (err < 0) {
        fprintf(stderr, "%s: cannot connect to cluster: %s\n", argv[0],
strerror(-err));
        exit(1);
    }

    err = rados_ioctx_create(cluster, poolname, &io);
    if (err < 0) {
        fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0],
poolname, strerror(-err));
        rados_shutdown(cluster);
        exit(1);
    }

    err = rados_stat(io, "812d45e9f48f7372d908270616b2b06bfad44958", &ss,
&tt);
    if (err < 0) {
        fprintf(stderr, "%s: cannot rados_stat %s: %s\n", argv[0],
poolname, strerror(-err));
        rados_ioctx_destroy(io);
        rados_shutdown(cluster);
        exit(1);
    }
    printf("%s : size = %llu; mtime = %lu\n",
"812d45e9f48f7372d908270616b2b06bfad44958", (unsigned long long)ss,
(unsigned long)tt);

    rados_ioctx_destroy(io);
    rados_shutdown(cluster);
    return 0;
}

$ ./test
812d45e9f48f7372d908270616b2b06bfad44958 : size = 43; mtime = 1401948103


only invoke rados_stst() in fuse, It block .....
rados_read() also block. in fuse.

cluster healthy is HEALTH_WARN
$ ceph -s
    cluster 0444d037-44f1-44da-a8c9-ded9b1accec6
     health HEALTH_WARN mds ceph3.local is laggy; clock skew detected on
mon.ceph2, mon.ceph3
     monmap e1: 3 mons at {ceph1=
10.58.89.200:6789/0,ceph2=10.58.89.210:6789/0,ceph3=10.58.89.211:6789/0},
election epoch 10, quorum 0,1,2 ceph1,ceph2,ceph3
     mdsmap e20: 1/1/1 up {0=ceph3.local=up:active(laggy or crashed)}
     osdmap e29: 3 osds: 3 up, 3 in
      pgmap v2919: 200 pgs, 4 pools, 3840 MB data, 84 objects
            26990 MB used, 1079 GB / 1106 GB avail
                 200 active+clean




2014-06-06 16:26 GMT+08:00 Wido den Hollander <[email protected]>:

> On 06/06/2014 10:13 AM, Leo Chen wrote:
>
>> hi sage,
>> I use rados_stat() in fuse module , It's block all all all the time.
>>
>
> Is the cluster healthy? Aka HEALTH_OK?
>
> What if you try to stat the object this way:
>
> $ rados -p <pool> stat <obj>
>
> Wido
>
>  Thank you for help me.
>>
>> #define FUSE_USE_VERSION 26
>>
>> #include <fuse.h>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <string.h>
>> #include <assert.h>
>> #include <errno.h>
>> #include <sys/types.h>
>> #include <sys/stat.h>
>> #include <unistd.h>
>> #include <sys/stat.h>
>> #include <fcntl.h>
>> #include <rados/librados.h>
>> #include <openssl/sha.h>
>> #include <json/json.h>
>> #include <time.h>
>> #include <syslog.h>
>>
>> char *poold = "data";
>> char *poolm = "metad";
>> rados_t cluster = NULL;
>> rados_ioctx_t dio = NULL;
>> rados_ioctx_t mio = NULL;
>>
>> static int read_ceph_getattr(const char *path, struct stat *stbuf)
>> {
>>    int err = 0;
>>    uint64_t size = 0;
>>    time_t mtime = 0;
>>    int res = 0;
>>    unsigned char *buf = NULL;
>>    const char *str_size = NULL;
>>    unsigned char fileid[50] = {'\0'};
>>
>>    struct json_object *new_obj = NULL;
>>
>>    memset(stbuf, 0, sizeof(struct stat));
>>
>>    if (strcmp(path, "/") == 0) {
>>      stbuf->st_mode = S_IFDIR | 0755;
>>      stbuf->st_nlink = 2;
>>      stbuf->st_mtime = time(NULL);
>>      stbuf->st_size = 4096;
>>      res = 0;
>>      goto Endhandle;
>>    }
>>    memcpy(fileid, path + 1, strlen(path) - 1);
>>
>>    syslog(LOG_INFO, "metadata fileid : %s\n", fileid);
>>
>>    if (strlen(fileid) < 40) {
>>      res = -ENOENT;
>>      goto Endhandle;
>>    }
>>
>> */err = rados_stat(mio, fileid, &size, &mtime); //This block ........./*
>>
>>    if (err < 0) {
>>      syslog(LOG_INFO, "mio rados_stat: %s\n", strerror(-err));
>>      res = -ENOENT;
>>      goto Endhandle;
>>    }
>>
>>    buf = (unsigned char *)malloc(size + 1);
>>    if (NULL == buf) {
>>      res = -ENOENT;
>>      goto Endhandle;
>>    }
>>    memset(buf, 0, size + 1);
>>    err = rados_read(mio, fileid, buf, size, 0);
>>    if (err < 0) {
>>      syslog(LOG_INFO, "mio rados_read: %s\n", strerror(-err));
>>      res = -ENOENT;
>>      goto Endhandle;
>>    }
>>    syslog(LOG_INFO, "json : %s\n", buf);
>>
>>    new_obj = json_tokener_parse(buf);
>>    str_size = json_object_get_string(json_object_object_get(new_obj,
>> "filesize"));
>>
>>    stbuf->st_nlink = 1;
>>    stbuf->st_mode = S_IFREG | 0666;
>>    stbuf->st_size = hextoll(str_size, strlen(str_size));
>>
>>    size = 0;
>>    mtime = 0;
>>    memset(fileid, 0, 50);
>>    snprintf(fileid, 50, "%s.00000000", path + 1);
>>
>>    syslog(LOG_INFO, "data fileid : %s\n", fileid);
>>
>>    err = rados_stat(dio, fileid, &size, &mtime);
>>    if (err < 0) {
>>      syslog(LOG_INFO, "dio rados_stat: %s\n", strerror(-err));
>>      res = -ENOENT;
>>      goto Endhandle;
>>    }
>>    stbuf->st_mtime = mtime;
>>
>>   Endhandle:
>>    if (NULL != buf) {
>>      free(buf);
>>      buf = NULL;
>>    }
>>    if (NULL != new_obj) {
>>      json_object_put(new_obj);
>>      new_obj = NULL;
>>    }
>>    return res;
>> }
>>
>> static struct fuse_operations read_ceph_oper = {
>>    .getattr= read_ceph_getattr
>>
>> };
>>
>> int main(int argc, char *argv[])
>> {
>>    int err = 0;
>>    int iRet = 0;
>>
>>    err = rados_create(&cluster, NULL);
>>    if (err < 0) {
>>      fprintf(stderr, "%s: cannot create a cluster handle: %s\n",
>> argv[0], strerror(-err));
>>      iRet = -1;
>>      goto Endhandle;
>>    }
>>
>>    err = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf");
>>    if (err < 0) {
>>      fprintf(stderr, "%s: cannot read config file: %s\n", argv[0],
>> strerror(-err));
>>      iRet = -1;
>>      goto Endhandle;
>>    }
>>
>>    err = rados_connect(cluster);
>>    if (err < 0) {
>>      fprintf(stderr, "%s: cannot connect to cluster: %s\n", argv[0],
>> strerror(-err));
>>      iRet = -1;
>>      goto Endhandle;
>>
>>    }
>>
>>    err = rados_ioctx_create(cluster, poold, &dio);
>>    if (err < 0) {
>>      fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0],
>> poold, strerror(-err));
>>      iRet = -1;
>>      goto Endhandle;
>>    }
>>
>>    err = rados_ioctx_create(cluster, poolm, &mio);
>>    if (err < 0) {
>>      fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0],
>> poolm, strerror(-err));
>>      iRet = -1;
>>      goto Endhandle;
>>    }
>>
>>    fuse_main(argc, argv, &read_ceph_oper, NULL);
>>
>>   Endhandle:
>>
>>    if (NULL != dio) {
>>      rados_ioctx_destroy(dio);
>>      dio = NULL;
>>    }
>>    if (NULL != mio) {
>>      rados_ioctx_destroy(mio);
>>      mio = NULL;
>>    }
>>    if (NULL != cluster) {
>>      rados_shutdown(cluster);
>>      cluster = NULL;
>>    }
>>
>>    return iRet;
>> }
>>
>>
>>
>> _______________________________________________
>> ceph-users mailing list
>> [email protected]
>> http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com
>>
>>
>
> --
> Wido den Hollander
> 42on B.V.
> Ceph trainer and consultant
>
> Phone: +31 (0)20 700 9902
> Skype: contact42on
> _______________________________________________
> ceph-users mailing list
> [email protected]
> http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com
>
_______________________________________________
ceph-users mailing list
[email protected]
http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com

Reply via email to