[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;
> }
>
>
>