CEPH_OSD_OP_FLAG_FADVISE_SEQUENTIAL = 0x8, /* the op is sequential */
CEPH_OSD_OP_FLAG_FADVISE_WILLNEED = 0x10,/* data will be accessed in the near future */
CEPH_OSD_OP_FLAG_FADVISE_DONTNEED = 0x20,/* data will not be accessed in the near future */
+ CEPH_OSD_OP_FLAG_FADVISE_NOREUSE = 0x40, /* data will be accessed only once by this client */
};
#define EOLDSNAPC 85 /* ORDERSNAP flag set; writer has old snapc*/
LIBRADOS_OP_FLAG_FADVISE_WILLNEED = 0x10,
// indicate read/write data will not accessed int the near future
LIBRADOS_OP_FLAG_FADVISE_DONTNEED = 0x20,
+ // indicate read/write data will not accessed just once by this client
+ LIBRADOS_OP_FLAG_FADVISE_NOREUSE = 0x40,
};
#if __GNUC__ >= 4
OP_FADVISE_SEQUENTIAL = LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL,
OP_FADVISE_WILLNEED = LIBRADOS_OP_FLAG_FADVISE_WILLNEED,
OP_FADVISE_DONTNEED = LIBRADOS_OP_FLAG_FADVISE_DONTNEED,
+ OP_FADVISE_NOREUSE = LIBRADOS_OP_FLAG_FADVISE_NOREUSE,
};
class CEPH_RADOS_API ObjectOperationCompletion {
rados_flags |= CEPH_OSD_OP_FLAG_FADVISE_WILLNEED;
if (flags & LIBRADOS_OP_FLAG_FADVISE_DONTNEED)
rados_flags |= CEPH_OSD_OP_FLAG_FADVISE_DONTNEED;
+ if (flags & LIBRADOS_OP_FLAG_FADVISE_NOREUSE)
+ rados_flags |= CEPH_OSD_OP_FLAG_FADVISE_NOREUSE;
o->set_last_op_flags(rados_flags);
}
case CEPH_OSD_OP_FLAG_FADVISE_DONTNEED:
name = "fadvise_dontneed";
break;
+ case CEPH_OSD_OP_FLAG_FADVISE_NOREUSE:
+ name = "fadvise_noreuse";
+ break;
default:
name = "???";
};
bl.append(buf);
op.write_full(bl);
- op.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
+ op.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOREUSE);
ioctx.aio_operate("test_obj", my_completion1.get(), &op);
{
TestAlarm alarm;
bl.clear();
ObjectReadOperation op1;
op1.read(0, sizeof(buf), &bl, NULL);
- op1.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED|LIBRADOS_OP_FLAG_FADVISE_RANDOM);
+ op1.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOREUSE|LIBRADOS_OP_FLAG_FADVISE_RANDOM);
ioctx.aio_operate("test_obj", my_completion2.get(), &op1, 0);
{
TestAlarm alarm;
op = rados_create_write_op();
ASSERT_TRUE(op);
rados_write_op_write_full(op, "ceph", 4);
- rados_write_op_set_flags(op, LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
+ rados_write_op_set_flags(op, LIBRADOS_OP_FLAG_FADVISE_NOREUSE);
ASSERT_EQ(0, rados_write_op_operate(op, ioctx, "test", NULL, 0));
ASSERT_EQ(4, rados_read(ioctx, "test", hi, 4, 0));
rados_release_write_op(op);
ObjectReadOperation read;
read.read(0, bl.length(), NULL, NULL);
- read.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED|LIBRADOS_OP_FLAG_FADVISE_RANDOM);
+ read.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOREUSE|LIBRADOS_OP_FLAG_FADVISE_RANDOM);
ASSERT_EQ(0, ioctx.operate("foo", &read, &bl));
ASSERT_EQ(0, memcmp(bl.c_str(), "ceph", 4));
}
bl.append("ceph");
ObjectWriteOperation write;
write.write_full(bl);
- write.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
+ write.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOREUSE);
ASSERT_EQ(0, ioctx.operate("foo", &write));
ObjectReadOperation read;
for (i = 0; i < 5; ++i)
ASSERT_PASSED(write_test_data, image, test_data, TEST_IO_SIZE * i,
- TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
+ TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_NOREUSE);
for (i = 5; i < 10; ++i)
ASSERT_PASSED(aio_write_test_data, image, test_data, TEST_IO_SIZE * i,
ASSERT_EQ(-EINVAL, rbd_read(image, info.size, 1, test_data));
// reading through end returns amount up to end
ASSERT_EQ(10, rbd_read2(image, info.size - 10, 100, test_data,
- LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
+ LIBRADOS_OP_FLAG_FADVISE_NOREUSE));
// writing through end returns amount up to end
ASSERT_EQ(10, rbd_write2(image, info.size - 10, 100, test_data,
LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
for (i = 0; i < 5; ++i)
ASSERT_PASSED(write_test_data, image, test_data, strlen(test_data) * i,
- LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
+ LIBRADOS_OP_FLAG_FADVISE_NOREUSE);
for (i = 5; i < 10; ++i)
ASSERT_PASSED(aio_write_test_data, image, test_data, strlen(test_data) * i,