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