[Moving to ceph-devel] Try putting debug ms = 1 and debug objecter = 20 in your ceph.conf under [clients] and see if the request is getting sent, and whether the reply is coming back. sage On Fri, 6 Jun 2014, Leo Chen wrote: > hi sage,I use rados_stat() in fuse module , It's block all all all the time. > 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; > } > > >