Project

General

Profile

Bug #23187 » test_rados.c

Updated reproducer - Jeff Layton, 03/01/2018 03:05 PM

 
#include <stdio.h>
#include <stdint.h>
#include <endian.h>
#include <rados/librados.h>
#include <errno.h>
#include <getopt.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>

#define MAX_ITEMS 10

static int
cluster_connect(rados_t *clnt, rados_ioctx_t *io_ctx, const char *pool)
{
int ret;

ret = rados_create2(clnt, "ceph", "client.0", 0);
if (ret < 0) {
fprintf(stderr, "rados_create: %d\n", ret);
return ret;
}

ret = rados_conf_read_file(*clnt, NULL);
if (ret < 0) {
fprintf(stderr, "rados_conf_read_file: %d\n", ret);
return ret;
}

ret = rados_connect(*clnt);
if (ret < 0) {
fprintf(stderr, "rados_connect: %d\n", ret);
return ret;
}

ret = rados_ioctx_create(*clnt, pool, io_ctx);
if (ret < 0) {
fprintf(stderr, "rados_ioctx_create: %d\n", ret);
return ret;
}
return 0;
}

int main(int argc, char **argv)
{
int ret;
char *key_out = NULL;
char *val_out = NULL;
size_t val_len_out = 0;
bool pmore = false;
char *start = "";
rados_omap_iter_t iter_vals;
rados_read_op_t read_op;
rados_ioctx_t io_ctx = NULL;
rados_t clnt = NULL;

if (argc < 2)
return 1;

ret = cluster_connect(&clnt, &io_ctx, "nfs-ganesha");
if (ret) {
fprintf(stderr, "Can't connect to cluster: %d\n", ret);
return 1;
}

again:
read_op = rados_create_read_op();
rados_read_op_omap_get_vals2(read_op, start, "", MAX_ITEMS, &iter_vals,
(unsigned char *)&pmore, NULL);
ret = rados_read_op_operate(read_op, &io_ctx, argv[1], 0);
if (ret < 0) {
fprintf(stderr,
"Failed to lst kv ret=%d", ret);
goto out;
}

while (true) {
rados_omap_get_next(iter_vals, &key_out, &val_out,
&val_len_out);
if (val_len_out == 0 && key_out == NULL && val_out == NULL)
break;
start = key_out;
printf("%s : %zu : %s", key_out,
val_len_out, val_out);
}
rados_omap_get_end(iter_vals);

/* more items, next round */
if (pmore) {
rados_release_read_op(read_op);
goto again;
}
out:
rados_release_read_op(read_op);
return ret;
}

(2-2/2)