From 4dda030a44366c0360fd2e6d4b22704598034c55 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 23 Jan 2015 09:06:32 -0800 Subject: [PATCH] librados: add FADVISE_NOREUSE We left this off because it seemed the same as DONTNEED, but there is a subtle distinction: DONTNEED means nobody will need it (and we probably discard our cache), while NOREUSE means this client won't need it again (and we should try to avoid polluting the cache from this IO only). At least, that's the way we'r defining it. posix_fadvise says: POSIX_FADV_NOREUSE The specified data will be accessed only once. POSIX_FADV_DONTNEED The specified data will not be accessed in the near future. which is similar. I think our definitions make a bit more sense for the multi-client environment. Signed-off-by: Sage Weil --- src/include/rados.h | 1 + src/include/rados/librados.h | 2 ++ src/include/rados/librados.hpp | 1 + src/librados/librados.cc | 2 ++ src/osd/osd_types.cc | 3 +++ src/test/librados/aio.cc | 4 ++-- src/test/librados/c_write_operations.cc | 2 +- src/test/librados/io.cc | 4 ++-- src/test/librbd/test_librbd.cc | 6 +++--- 9 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/include/rados.h b/src/include/rados.h index c760898644f6..80542ab493ad 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -418,6 +418,7 @@ enum { 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*/ diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index 9a35307f2b33..7cb004a4b5d5 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -78,6 +78,8 @@ enum { 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 diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 7be99680207a..744a8a6227c5 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -222,6 +222,7 @@ namespace librados 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 { diff --git a/src/librados/librados.cc b/src/librados/librados.cc index dfbedaa0eb9f..28f60aaefae6 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -98,6 +98,8 @@ static void set_op_flags(::ObjectOperation *o, int flags) 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); } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 324dd45b7ad2..2c313cdc699c 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -92,6 +92,9 @@ const char * ceph_osd_op_flag_name(unsigned flag) case CEPH_OSD_OP_FLAG_FADVISE_DONTNEED: name = "fadvise_dontneed"; break; + case CEPH_OSD_OP_FLAG_FADVISE_NOREUSE: + name = "fadvise_noreuse"; + break; default: name = "???"; }; diff --git a/src/test/librados/aio.cc b/src/test/librados/aio.cc index 34f740ddb5e9..164f0f9880e3 100644 --- a/src/test/librados/aio.cc +++ b/src/test/librados/aio.cc @@ -2624,7 +2624,7 @@ TEST(LibRadosAioEC, RoundTripWriteFullPP2) 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; @@ -2636,7 +2636,7 @@ TEST(LibRadosAioEC, RoundTripWriteFullPP2) 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; diff --git a/src/test/librados/c_write_operations.cc b/src/test/librados/c_write_operations.cc index ff08bda66896..d4ef4785063a 100644 --- a/src/test/librados/c_write_operations.cc +++ b/src/test/librados/c_write_operations.cc @@ -100,7 +100,7 @@ TEST(LibRadosCWriteOps, Write) { 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); diff --git a/src/test/librados/io.cc b/src/test/librados/io.cc index 4a709b797ef7..7bb9b9190ee3 100644 --- a/src/test/librados/io.cc +++ b/src/test/librados/io.cc @@ -256,7 +256,7 @@ TEST_F(LibRadosIoPP, RoundTripPP2) 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)); } @@ -327,7 +327,7 @@ TEST_F(LibRadosIoPP, WriteFullRoundTripPP2) 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; diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index 71648726bd5a..bca89a2498d7 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -843,7 +843,7 @@ TEST_F(TestLibRBD, TestIOWithIOHint) 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, @@ -879,7 +879,7 @@ TEST_F(TestLibRBD, TestIOWithIOHint) 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)); @@ -1099,7 +1099,7 @@ TEST_F(TestLibRBD, TestIOPPWithIOHint) 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, -- 2.47.3