23 #include <rados/librados.h> 86 #define RADOS_ERR(__err_str, __ret) do { \ 103 RADOS_ERR(
"unable to create RADOS cluster handle", ret);
108 RADOS_ERR(
"unable to read RADOS config file", ret);
113 RADOS_ERR(
"unable to connect to the RADOS cluster", ret);
118 RADOS_ERR(
"unable to create an I/O context for the RADOS cluster", ret);
140 WARN(
"direct I/O mode is not implemented in RADOS\n");
142 oid = strdup(testFileName);
144 ERR(
"unable to allocate RADOS oid");
148 rados_write_op_t create_op;
149 int rados_create_flag;
152 rados_create_flag = LIBRADOS_CREATE_EXCLUSIVE;
154 rados_create_flag = LIBRADOS_CREATE_IDEMPOTENT;
157 create_op = rados_create_write_op();
158 rados_write_op_create(create_op, rados_create_flag,
NULL);
159 ret = rados_write_op_operate(create_op, param->
rados_ioctx, oid,
161 rados_release_write_op(create_op);
163 RADOS_ERR(
"unable to create RADOS object", ret);
190 char *oid = (
char *)fd;
194 rados_write_op_t write_op;
196 write_op = rados_create_write_op();
197 rados_write_op_write(write_op, (
const char *)buffer,
199 ret = rados_write_op_operate(write_op, param->
rados_ioctx,
201 rados_release_write_op(write_op);
203 RADOS_ERR(
"unable to write RADOS object", ret);
209 rados_read_op_t read_op;
211 read_op = rados_create_read_op();
212 rados_read_op_read(read_op, param->
offset, length, (
char *)buffer,
213 &bytes_read, &read_ret);
214 ret = rados_read_op_operate(read_op, param->
rados_ioctx, oid, 0);
215 rados_release_read_op(read_op);
216 if (ret || read_ret || ((
IOR_offset_t)bytes_read != length))
217 RADOS_ERR(
"unable to read RADOS object", ret);
230 char *oid = (
char *)fd;
242 char *oid = testFileName;
243 rados_write_op_t remove_op;
249 remove_op = rados_create_write_op();
250 rados_write_op_remove(remove_op);
251 ret = rados_write_op_operate(remove_op, param->
rados_ioctx,
253 rados_release_write_op(remove_op);
255 RADOS_ERR(
"unable to remove RADOS object", ret);
266 char *oid = testFileName;
267 rados_read_op_t stat_op;
276 stat_op = rados_create_read_op();
277 rados_read_op_stat(stat_op, &oid_size,
NULL, &stat_ret);
278 ret = rados_read_op_operate(stat_op, test->
rados_ioctx, oid, 0);
279 rados_release_read_op(stat_op);
281 RADOS_ERR(
"unable to stat RADOS object", stat_ret);
282 aggSizeFromStat = oid_size;
286 MPI_CHECK(MPI_Allreduce(&aggSizeFromStat, &tmpSum, 1,
287 MPI_LONG_LONG_INT, MPI_SUM, testComm),
288 "cannot total data moved");
289 aggSizeFromStat = tmpSum;
293 MPI_CHECK(MPI_Allreduce(&aggSizeFromStat, &tmpMin, 1,
294 MPI_LONG_LONG_INT, MPI_MIN, testComm),
295 "cannot total data moved");
296 MPI_CHECK(MPI_Allreduce(&aggSizeFromStat, &tmpMax, 1,
297 MPI_LONG_LONG_INT, MPI_MAX, testComm),
298 "cannot total data moved");
299 if (tmpMin != tmpMax)
302 WARN(
"inconsistent file size by different tasks");
305 aggSizeFromStat = tmpMin;
311 return aggSizeFromStat;
317 WARN(
"statfs not supported in RADOS backend!");
323 WARN(
"mkdir not supported in RADOS backend!");
329 WARN(
"rmdir not supported in RADOS backend!");
335 rados_read_op_t read_op;
344 read_op = rados_create_read_op();
345 rados_read_op_stat(read_op, &oid_size,
NULL, &prval);
346 ret = rados_read_op_operate(read_op, param->
rados_ioctx, oid, 0);
347 rados_release_read_op(read_op);
359 WARN(
"stat not supported in RADOS backend!");
static IOR_offset_t RADOS_GetFileSize(IOR_param_t *, MPI_Comm, char *)
static int RADOS_RmDir(const char *, IOR_param_t *)
#define RADOS_ERR(__err_str, __ret)
static void RADOS_Close(void *, IOR_param_t *)
static void * RADOS_Create(char *, IOR_param_t *)
static void RADOS_Fsync(void *, IOR_param_t *)
static void * RADOS_Create_Or_Open(char *testFileName, IOR_param_t *param, int create_flag)
static void * RADOS_Open(char *, IOR_param_t *)
static void RADOS_Delete(char *, IOR_param_t *)
char * aiori_get_version()
#define MPI_CHECK(MPI_STATUS, MSG)
static int RADOS_Access(const char *, int, IOR_param_t *)
static struct rados_options o
static int RADOS_Stat(const char *, struct stat *, IOR_param_t *)
static void RADOS_Cluster_Init(IOR_param_t *param)
static int RADOS_StatFS(const char *, ior_aiori_statfs_t *, IOR_param_t *)
static IOR_offset_t RADOS_Xfer(int, void *, IOR_size_t *, IOR_offset_t, IOR_param_t *)
static option_help * RADOS_options()
static int RADOS_MkDir(const char *, mode_t, IOR_param_t *)
rados_ioctx_t rados_ioctx
long long int IOR_offset_t
static void RADOS_Cluster_Finalize(IOR_param_t *param)
static option_help options[]