From: Sage Weil Date: Wed, 23 Nov 2016 03:19:24 +0000 (-0600) Subject: ceph_test_osd_stale_read: add StaleRead test X-Git-Tag: v15.1.0~2136^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7a06dda72d6d0a1c365728fb9a35d8191acdc75c;p=ceph.git ceph_test_osd_stale_read: add StaleRead test This reproduces the "read hole". Signed-off-by: Sage Weil --- diff --git a/src/test/osd/CMakeLists.txt b/src/test/osd/CMakeLists.txt index 64639d5ec8e..2a6d784a3e9 100644 --- a/src/test/osd/CMakeLists.txt +++ b/src/test/osd/CMakeLists.txt @@ -17,6 +17,22 @@ install(TARGETS ceph_test_rados DESTINATION ${CMAKE_INSTALL_BINDIR}) +# test_stale_read +add_executable(ceph_test_osd_stale_read + ceph_test_osd_stale_read.cc + ) +target_link_libraries(ceph_test_osd_stale_read + librados + global + ${CMAKE_DL_LIBS} + ${EXTRALIBS} + ${CMAKE_DL_LIBS} + ${UNITTEST_LIBS} + ) +install(TARGETS + ceph_test_osd_stale_read + DESTINATION ${CMAKE_INSTALL_BINDIR}) + # scripts add_ceph_test(safe-to-destroy.sh ${CMAKE_CURRENT_SOURCE_DIR}/safe-to-destroy.sh) diff --git a/src/test/osd/ceph_test_osd_stale_read.cc b/src/test/osd/ceph_test_osd_stale_read.cc new file mode 100644 index 00000000000..dc4b63a32f6 --- /dev/null +++ b/src/test/osd/ceph_test_osd_stale_read.cc @@ -0,0 +1,178 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +#include "gtest/gtest.h" + +#include "mds/mdstypes.h" +#include "include/buffer.h" +#include "include/rbd_types.h" +#include "include/rados/librados.h" +#include "include/rados/librados.hpp" +#include "include/stringify.h" +#include "include/types.h" +#include "global/global_context.h" +#include "global/global_init.h" +#include "common/ceph_argparse.h" +#include "common/common_init.h" +#include "common/Cond.h" +#include "json_spirit/json_spirit.h" + +#include +#include +#include +#include + +using namespace librados; +using std::map; +using std::ostringstream; +using std::string; + +int get_primary_osd(Rados& rados, const string& pool_name, + const string& oid, int *pprimary) +{ + bufferlist inbl; + string cmd = string("{\"prefix\": \"osd map\",\"pool\":\"") + + pool_name + + string("\",\"object\": \"") + + oid + + string("\",\"format\": \"json\"}"); + bufferlist outbl; + int r = rados.mon_command(cmd, inbl, &outbl, NULL); + assert(r >= 0); + string outstr(outbl.c_str(), outbl.length()); + json_spirit::Value v; + if (!json_spirit::read(outstr, v)) { + cerr <<" unable to parse json " << outstr << std::endl; + return -1; + } + + json_spirit::Object& o = v.get_obj(); + for (json_spirit::Object::size_type i=0; i args; + argv_to_vec(argc, (const char **)argv, args); + auto cct = global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, + CODE_ENVIRONMENT_UTILITY, 0); + common_init_finish(g_ceph_context); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}