From: Sage Weil Date: Fri, 23 Jan 2015 17:06:32 +0000 (-0800) Subject: librados: add FADVISE_NOREUSE X-Git-Tag: v0.93~181^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F3477%2Fhead;p=ceph.git 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 --- diff --git a/src/include/rados.h b/src/include/rados.h index c760898644f..80542ab493a 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 9a35307f2b3..7cb004a4b5d 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 7be99680207..744a8a6227c 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 dfbedaa0eb9..28f60aaefae 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 324dd45b7ad..2c313cdc699 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 34f740ddb5e..164f0f9880e 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 ff08bda6689..d4ef4785063 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 4a709b797ef..7bb9b9190ee 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 71648726bd5..bca89a2498d 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,