static VALUE rb_rados_cluster_pool_list(VALUE self) { VALUE a; int i; GET_CLUSTER(self); int buf_s = rados_pool_list(*wrapper->cluster, NULL, 0); char *buf = xmalloc(buf_s); char *buf_p; int r = rados_pool_list(*wrapper->cluster, buf, buf_s); if (r != buf_s) { xfree(buf); rb_raise(cRadosError, "mismatch retrieving pool list"); } a = rb_ary_new(); rb_ary_push(a, rb_str_new2(buf)); for (i = 1; i < buf_s; i++) { if ((buf[i - 1] == 0) && (buf[i] != 0) ) { buf_p = buf + i; rb_ary_push(a, rb_str_new2(buf_p)); } } xfree(buf); return a; }
int main(int argc, char **argv) { rados_t cluster; char cluster_name[] = "ceph"; char user_name[] = "client.admin"; APPNAME = &argv[0][2]; uint64_t flags; int err; /* Initialize the cluster handle */ err = rados_create2(&cluster, cluster_name, user_name, flags); // err = rados_create(&cluster, NULL); error_print(err, "Couldn't create the cluster handle!", "Created a cluster handle."); /* Read a Ceph configuration file to configure the cluster handle. */ err = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf"); error_print(err, "Cannot read config file!", "Read the config file."); /* Connect to the cluster */ err = rados_connect(cluster); error_print(err, "Cannot connect to cluster!", "Connected to the cluster."); /* List pools. */ char buf[1024]; err = rados_pool_list(cluster, buf, 1024); split_str(buf, 1024); error_print(err, "Cannot list pools!", buf); /* List pool stats */ char *poolname = strtok(buf, ","); while(poolname != NULL) { rados_ioctx_t io; struct rados_pool_stat_t stats; err = rados_ioctx_create(cluster, poolname, &io); error_print(err, "Cannot create IO context!", "IO context created."); err = rados_ioctx_pool_stat(io, &stats); error_print(err, "Cannot list pool stats!", "Pool stats listed."); printf("[%s][%s]: Number of read: %"PRIu64"\n", APPNAME, poolname, stats.num_rd); printf("[%s][%s]: Number of read in kb: %"PRIu64"\n", APPNAME, poolname, stats.num_rd_kb); printf("[%s][%s]: Number of write: %"PRIu64"\n", APPNAME, poolname, stats.num_wr); printf("[%s][%s]: Number of write in kb: %"PRIu64"\n", APPNAME, poolname, stats.num_wr_kb); rados_ioctx_destroy(io); poolname = strtok(NULL, ","); } /* Shut down the cluster */ rados_shutdown(cluster); printf("[%s]: Cluster shut down.\n", APPNAME); }
static int testrados(void) { char tmp[32]; int i, r; rados_t cl; if (rados_create(&cl, NULL) < 0) { printf("error initializing\n"); return 1; } if (rados_conf_read_file(cl, NULL)) { printf("error reading configuration file\n"); return 1; } // Try to set a configuration option that doesn't exist. // This should fail. if (!rados_conf_set(cl, "config option that doesn't exist", "some random value")) { printf("error: succeeded in setting nonexistent config option\n"); return 1; } if (rados_conf_get(cl, "log to stderr", tmp, sizeof(tmp))) { printf("error: failed to read log_to_stderr from config\n"); return 1; } // Can we change it? if (rados_conf_set(cl, "log to stderr", "2")) { printf("error: error setting log_to_stderr\n"); return 1; } if (rados_conf_get(cl, "log to stderr", tmp, sizeof(tmp))) { printf("error: failed to read log_to_stderr from config\n"); return 1; } if (tmp[0] != '2') { printf("error: new setting for log_to_stderr failed to take effect.\n"); return 1; } if (rados_connect(cl)) { printf("error connecting\n"); return 1; } if (rados_connect(cl) == 0) { printf("second connect attempt didn't return an error\n"); return 1; } /* create an io_ctx */ r = rados_pool_create(cl, "foo"); printf("rados_pool_create = %d\n", r); rados_ioctx_t io_ctx; r = rados_ioctx_create(cl, "foo", &io_ctx); printf("rados_ioctx_create = %d, io_ctx = %p\n", r, io_ctx); /* list all pools */ { int buf_sz = rados_pool_list(cl, NULL, 0); printf("need buffer size of %d\n", buf_sz); char buf[buf_sz]; int r = rados_pool_list(cl, buf, buf_sz); if (r != buf_sz) { printf("buffer size mismatch: got %d the first time, but %d " "the second.\n", buf_sz, r); return 1; } const char *b = buf; printf("begin pools.\n"); while (1) { if (b[0] == '\0') break; printf(" pool: '%s'\n", b); b += strlen(b) + 1; }; printf("end pools.\n"); } /* stat */ struct rados_pool_stat_t st; r = rados_ioctx_pool_stat(io_ctx, &st); printf("rados_ioctx_pool_stat = %d, %lld KB, %lld objects\n", r, (long long)st.num_kb, (long long)st.num_objects); /* snapshots */ r = rados_ioctx_snap_create(io_ctx, "snap1"); printf("rados_ioctx_snap_create snap1 = %d\n", r); rados_snap_t snaps[10]; r = rados_ioctx_snap_list(io_ctx, snaps, 10); for (i=0; i<r; i++) { char name[100]; rados_ioctx_snap_get_name(io_ctx, snaps[i], name, sizeof(name)); printf("rados_ioctx_snap_list got snap %lld %s\n", (long long)snaps[i], name); } rados_snap_t snapid; r = rados_ioctx_snap_lookup(io_ctx, "snap1", &snapid); printf("rados_ioctx_snap_lookup snap1 got %lld, result %d\n", (long long)snapid, r); r = rados_ioctx_snap_remove(io_ctx, "snap1"); printf("rados_ioctx_snap_remove snap1 = %d\n", r); /* sync io */ time_t tm; char buf[128], buf2[128]; time(&tm); snprintf(buf, 128, "%s", ctime(&tm)); const char *oid = "foo_object"; r = rados_write(io_ctx, oid, buf, strlen(buf) + 1, 0); printf("rados_write = %d\n", r); r = rados_read(io_ctx, oid, buf2, sizeof(buf2), 0); printf("rados_read = %d\n", r); if (memcmp(buf, buf2, r)) printf("*** content mismatch ***\n"); /* attrs */ if (do_rados_setxattr(io_ctx, oid, "b", "2")) return 1; if (do_rados_setxattr(io_ctx, oid, "a", "1")) return 1; if (do_rados_setxattr(io_ctx, oid, "c", "3")) return 1; if (do_rados_getxattr(io_ctx, oid, "a", "1")) return 1; if (do_rados_getxattr(io_ctx, oid, "b", "2")) return 1; if (do_rados_getxattr(io_ctx, oid, "c", "3")) return 1; const char *exkeys[] = { "a", "b", "c", NULL }; const char *exvals[] = { "1", "2", "3", NULL }; if (do_rados_getxattrs(io_ctx, oid, exkeys, exvals)) return 1; uint64_t size; time_t mtime; r = rados_stat(io_ctx, oid, &size, &mtime); printf("rados_stat size = %lld mtime = %d = %d\n", (long long)size, (int)mtime, r); r = rados_stat(io_ctx, "does_not_exist", NULL, NULL); printf("rados_stat(does_not_exist) = %d\n", r); /* exec */ rados_exec(io_ctx, oid, "crypto", "md5", buf, strlen(buf) + 1, buf, 128); printf("exec result=%s\n", buf); r = rados_read(io_ctx, oid, buf2, 128, 0); printf("read result=%s\n", buf2); printf("size=%d\n", r); /* aio */ rados_completion_t a, b; rados_aio_create_completion(0, 0, 0, &a); rados_aio_create_completion(0, 0, 0, &b); rados_aio_write(io_ctx, "a", a, buf, 100, 0); rados_aio_write(io_ctx, "../b/bb_bb_bb\\foo\\bar", b, buf, 100, 0); rados_aio_wait_for_safe(a); printf("a safe\n"); rados_aio_wait_for_safe(b); printf("b safe\n"); rados_aio_release(a); rados_aio_release(b); /* test flush */ printf("testing aio flush\n"); rados_completion_t c; rados_aio_create_completion(0, 0, 0, &c); rados_aio_write(io_ctx, "c", c, buf, 100, 0); int safe = rados_aio_is_safe(c); printf("a should not yet be safe and ... %s\n", safe ? "is":"is not"); assert(!safe); rados_aio_flush(io_ctx); safe = rados_aio_is_safe(c); printf("a should be safe and ... %s\n", safe ? "is":"is not"); assert(safe); rados_aio_release(c); rados_read(io_ctx, "../b/bb_bb_bb\\foo\\bar", buf2, 128, 0); /* list objects */ rados_list_ctx_t h; r = rados_objects_list_open(io_ctx, &h); printf("rados_list_objects_open = %d, h = %p\n", r, h); const char *poolname; while (rados_objects_list_next(h, &poolname) == 0) printf("rados_list_objects_next got object '%s'\n", poolname); rados_objects_list_close(h); /* stat */ r = rados_ioctx_pool_stat(io_ctx, &st); printf("rados_stat_pool = %d, %lld KB, %lld objects\n", r, (long long)st.num_kb, (long long)st.num_objects); /* delete a pool */ printf("rados_delete_pool = %d\n", r); rados_ioctx_destroy(io_ctx); r = rados_pool_delete(cl, "foo"); printf("rados_ioctx_pool_delete = %d\n", r); rados_shutdown(cl); return 0; }
ERL_NIF_TERM x_pool_list(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { const char * func_name = "x_pool_list()"; uint64_t id; if (!enif_get_uint64(env, argv[0], &id)) { logger.error(MOD_NAME, func_name, "enif get params failed"); return enif_make_badarg(env); } logger.debug(MOD_NAME, func_name, "cluster : %ld", id); rados_t cluster = map_cluster_get(id); if (cluster == NULL) { logger.error(MOD_NAME, func_name, "cluster non-existing : %ld", id); return enif_make_badarg(env); } // Call with a null buffer to get the buffer length first. int buf_len = rados_pool_list(cluster, NULL, 0); if (buf_len < 0) { return make_error_tuple(env, -buf_len); } if (buf_len > 0) { char * buf = (char *)malloc(buf_len + 10); if (buf == NULL) { logger.error(MOD_NAME, func_name, "unable to malloc: %ld", id); return make_error_tuple(env, ENOMEM); } int buf_len2 = rados_pool_list(cluster, buf, buf_len + 10); if (buf_len2 < 0) { logger.error(MOD_NAME, func_name, "failed to get pool list for %ld: %s", id, strerror(-buf_len2)); return make_error_tuple(env, -buf_len2); } list<int> pool_list; scan_pool_name_list(&pool_list, buf, buf_len); list<int>::const_iterator it; ERL_NIF_TERM term_list = enif_make_list(env, 0); for (it = pool_list.begin(); it != pool_list.end(); it++) { int off = *it; ERL_NIF_TERM head = enif_make_string(env, buf + off, ERL_NIF_LATIN1); term_list = enif_make_list_cell(env, head, term_list); } free(buf); return enif_make_tuple2(env, enif_make_atom(env, "ok"), term_list); } else { return enif_make_tuple2(env, enif_make_atom(env, "ok"), enif_make_list(env, 0)); // empty list } }