rados_list_parallel_SOURCES = \
test/system/rados_list_parallel.cc \
- test/system/st_rados_create_pool.cc
+ test/system/st_rados_create_pool.cc \
+ test/system/st_rados_list_objects.cc
rados_list_parallel_LDADD = libsystest.la librados.la
bin_DEBUGPROGRAMS += rados_list_parallel
common/sync_filesystem.h \
test/system/cross_process_sem.h \
test/system/st_rados_create_pool.h \
+ test/system/st_rados_list_objects.h \
test/system/systest_runnable.h \
test/system/systest_settings.h
#include "cross_process_sem.h"
#include "include/rados/librados.h"
#include "st_rados_create_pool.h"
+#include "st_rados_list_objects.h"
#include "systest_runnable.h"
#include "systest_settings.h"
static CrossProcessSem *pool_setup_sem = NULL;
static CrossProcessSem *modify_sem = NULL;
-class RadosListObjectsR : public SysTestRunnable
-{
-public:
- RadosListObjectsR(int argc, const char **argv)
- : SysTestRunnable(argc, argv)
- {
- }
-
- ~RadosListObjectsR()
- {
- }
-
- int run()
- {
- rados_t cl;
- RETURN_IF_NONZERO(rados_create(&cl, NULL));
- rados_conf_parse_argv(cl, m_argc, m_argv);
- RETURN_IF_NONZERO(rados_conf_read_file(cl, NULL));
- RETURN_IF_NONZERO(rados_connect(cl));
- pool_setup_sem->wait();
- pool_setup_sem->post();
-
- rados_ioctx_t io_ctx;
- RETURN_IF_NOT_VAL(-EEXIST, rados_pool_create(cl, "foo"));
- RETURN_IF_NONZERO(rados_ioctx_create(cl, "foo", &io_ctx));
-
- int ret, saw = 0;
- const char *obj_name;
- rados_list_ctx_t h;
- printf("%s: listing objects.\n", get_id_str());
- RETURN_IF_NONZERO(rados_objects_list_open(io_ctx, &h));
- while (true) {
- ret = rados_objects_list_next(h, &obj_name);
- if (ret == -ENOENT) {
- break;
- }
- else if (ret != 0) {
- printf("%s: rados_objects_list_next error: %d\n", get_id_str(), ret);
- return ret;
- }
- char *obj_name_copy = strdup(obj_name);
- free(obj_name_copy);
- if ((saw % 25) == 0) {
- printf("%s: listed object %d...\n", get_id_str(), saw);
- }
- ++saw;
- if (saw == g_num_objects / 2)
- modify_sem->wait();
- }
- rados_objects_list_close(h);
-
- printf("%s: saw %d objects\n", get_id_str(), saw);
-
- rados_ioctx_destroy(io_ctx);
- rados_shutdown(cl);
-
- return 0;
- }
-};
-
class RadosDeleteObjectsR : public SysTestRunnable
{
public:
// Test 1... list objects
{
StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
- RadosListObjectsR r2(argc, argv);
+ StRadosListObjects r2(argc, argv, g_num_objects, pool_setup_sem, modify_sem);
vector < SysTestRunnable* > vec;
vec.push_back(&r1);
vec.push_back(&r2);
RETURN_IF_NONZERO(modify_sem->reinit(0));
{
StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
- RadosListObjectsR r2(argc, argv);
+ StRadosListObjects r2(argc, argv, g_num_objects, pool_setup_sem, modify_sem);
RadosDeleteObjectsR r3(argc, argv);
vector < SysTestRunnable* > vec;
vec.push_back(&r1);
RETURN_IF_NONZERO(modify_sem->reinit(0));
{
StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
- RadosListObjectsR r2(argc, argv);
+ StRadosListObjects r2(argc, argv, g_num_objects, pool_setup_sem, modify_sem);
RadosAddObjectsR r3(argc, argv, "obj2");
vector < SysTestRunnable* > vec;
vec.push_back(&r1);
RETURN_IF_NONZERO(modify_sem->reinit(0));
{
StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
- RadosListObjectsR r2(argc, argv);
+ StRadosListObjects r2(argc, argv, g_num_objects, pool_setup_sem, modify_sem);
RadosAddObjectsR r3(argc, argv, "obj2");
RadosAddObjectsR r4(argc, argv, "obj3");
RadosDeleteObjectsR r5(argc, argv);
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+* Ceph - scalable distributed file system
+*
+* Copyright (C) 2011 New Dream Network
+*
+* This is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License version 2.1, as published by the Free Software
+* Foundation. See file COPYING.
+*
+*/
+
+#include "cross_process_sem.h"
+#include "include/rados/librados.h"
+#include "st_rados_list_objects.h"
+#include "systest_runnable.h"
+#include "systest_settings.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sstream>
+#include <string>
+
+using std::ostringstream;
+
+StRadosListObjects::
+StRadosListObjects(int argc, const char **argv, int midway_cnt,
+ CrossProcessSem *pool_setup_sem, CrossProcessSem *midway_sem)
+ : SysTestRunnable(argc, argv),
+ m_midway_cnt(midway_cnt),
+ m_pool_setup_sem(pool_setup_sem),
+ m_midway_sem(midway_sem)
+{
+}
+
+StRadosListObjects::
+~StRadosListObjects()
+{
+}
+
+int StRadosListObjects::
+run()
+{
+ rados_t cl;
+ RETURN_IF_NONZERO(rados_create(&cl, NULL));
+ rados_conf_parse_argv(cl, m_argc, m_argv);
+ RETURN_IF_NONZERO(rados_conf_read_file(cl, NULL));
+ RETURN_IF_NONZERO(rados_connect(cl));
+ m_pool_setup_sem->wait();
+ m_pool_setup_sem->post();
+
+ rados_ioctx_t io_ctx;
+ RETURN_IF_NOT_VAL(-EEXIST, rados_pool_create(cl, "foo"));
+ RETURN_IF_NONZERO(rados_ioctx_create(cl, "foo", &io_ctx));
+
+ int ret, saw = 0;
+ const char *obj_name;
+ rados_list_ctx_t h;
+ printf("%s: listing objects.\n", get_id_str());
+ RETURN_IF_NONZERO(rados_objects_list_open(io_ctx, &h));
+ while (true) {
+ ret = rados_objects_list_next(h, &obj_name);
+ if (ret == -ENOENT) {
+ break;
+ }
+ else if (ret != 0) {
+ printf("%s: rados_objects_list_next error: %d\n", get_id_str(), ret);
+ return ret;
+ }
+ char *obj_name_copy = strdup(obj_name);
+ free(obj_name_copy);
+ if ((saw % 25) == 0) {
+ printf("%s: listed object %d...\n", get_id_str(), saw);
+ }
+ ++saw;
+ if (saw == m_midway_cnt) {
+ if (m_midway_sem)
+ m_midway_sem->wait();
+ }
+ }
+ rados_objects_list_close(h);
+
+ printf("%s: saw %d objects\n", get_id_str(), saw);
+
+ rados_ioctx_destroy(io_ctx);
+ rados_shutdown(cl);
+
+ return 0;
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+* Ceph - scalable distributed file system
+*
+* Copyright (C) 2011 New Dream Network
+*
+* This is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License version 2.1, as published by the Free Software
+* Foundation. See file COPYING.
+*
+*/
+
+#ifndef TEST_SYSTEM_ST_RADOS_LIST_OBJECTS_H
+#define TEST_SYSTEM_ST_RADOS_LIST_OBJECTS_H
+
+#include "systest_runnable.h"
+
+class CrossProcessSem;
+
+/*
+ * st_rados_list_objects
+ *
+ * 1. calls pool_setup_sem->wait()
+ * 2. calls pool_setup_sem->post()
+ * 3. list some objects
+ * 4. modify_sem->wait()
+ * 5. list some objects
+ */
+class StRadosListObjects : public SysTestRunnable
+{
+public:
+ static std::string get_random_buf(int sz);
+ StRadosListObjects(int argc, const char **argv, int midway_cnt,
+ CrossProcessSem *pool_setup_sem, CrossProcessSem *midway_sem);
+ ~StRadosListObjects();
+ virtual int run();
+private:
+ int m_midway_cnt;
+ CrossProcessSem *m_pool_setup_sem;
+ CrossProcessSem *m_midway_sem;
+};
+
+#endif