diff -Nru ceph-10.2.6/aclocal.m4 ceph-10.2.7/aclocal.m4 --- ceph-10.2.6/aclocal.m4 2017-03-07 13:31:24.000000000 +0000 +++ ceph-10.2.7/aclocal.m4 2017-04-10 11:45:16.000000000 +0000 @@ -1512,6 +1512,7 @@ m4_include([m4/ax_c_pretty_func.m4]) m4_include([m4/ax_c_var_func.m4]) m4_include([m4/ax_check_compile_flag.m4]) +m4_include([m4/ax_check_openssl.m4]) m4_include([m4/ax_cxx_compile_stdcxx_11.m4]) m4_include([m4/ax_cxx_static_cast.m4]) m4_include([m4/ax_intel.m4]) diff -Nru ceph-10.2.6/AUTHORS ceph-10.2.7/AUTHORS --- ceph-10.2.6/AUTHORS 2017-03-07 13:32:04.000000000 +0000 +++ ceph-10.2.7/AUTHORS 2017-04-10 11:45:56.000000000 +0000 @@ -64,6 +64,7 @@ Babu Shanmugam Baptiste Veuillez Barbora Ančincová +Bartłomiej Święcki Bastian Blank Benjamin Kerensa Benoît Knecht @@ -274,6 +275,7 @@ Jim Schutt Jim Wright Jingkai Yuan +Jing Wenjun João Eduardo Luís João Eduardo Luís João Eduardo Luís @@ -358,6 +360,7 @@ Marc Koderer Marco Garcês Marcus Sorensen +Marcus Watts Marcus Watts Mark Kampe Mark Nelson diff -Nru ceph-10.2.6/ceph.spec ceph-10.2.7/ceph.spec --- ceph-10.2.6/ceph.spec 2017-03-07 13:31:50.000000000 +0000 +++ ceph-10.2.7/ceph.spec 2017-04-10 11:45:43.000000000 +0000 @@ -56,7 +56,7 @@ # common ################################################################################# Name: ceph -Version: 10.2.6 +Version: 10.2.7 Release: 0%{?dist} Epoch: 1 Summary: User space components of the Ceph file system diff -Nru ceph-10.2.6/ChangeLog ceph-10.2.7/ChangeLog --- ceph-10.2.6/ChangeLog 2017-03-07 13:32:04.000000000 +0000 +++ ceph-10.2.7/ChangeLog 2017-04-10 11:45:57.000000000 +0000 @@ -1,6 +1,49 @@ -656b5b6 (HEAD, tag: v10.2.6, origin/jewel) 10.2.6 +50e863e (HEAD, tag: v10.2.7, origin/jewel) 10.2.7 +fb85c68 rgw_file: use fh_hook::is_linked() to check residence +fcc3ada jewel: librbd: possible race in ExclusiveLock handle_peer_notification +eedb9f7 rgw_file: RGWFileHandle dtor must also cond-unlink from FHCache +6c2a40a rgw_file: split last argv on ws, if provided +d2ca03b rgw_file: fix hiwat behavior +166cb7f rgw_file: refcnt bugfixes +31a71be rgw_file: add refcount dout traces at debuglevel 17 +1d6c72f rgw_file: add pretty-print for RGWFileHandle +a969c44 rgw_file: fix marker computation +a70e83c rgw_file: rgw_readdir can't list multi-segment dirs +209987e rgw_file: allow setattr on placeholder directories +b24a8c2 rgw_file: posix style atime,ctime,mtime +b618183 rgw_file: fix marker computation +ed9308c rgw_file: rgw_readdir can't list multi-segment dirs +26a38e2 rgw_file: allow setattr on placeholder directories +7e4e290 rgw_file: fix reversed return value of getattr +3c02ee4 rgw_file: fix non-negative return code for open operation +e9a4903 rgw_file: fix double unref on rgw_fh for rename +9910eac rgw: multipart part copy, fix regression +a3fdf0e rgw: minor optimization +2161376 rgw: rgw_obj_key use adjustment in multipart copy part +135f84d rgw: multipart copy-part handle versionId +9ab65f5 rgw: multipart copy part minor parsing cleanup +3eb9dc9 rgw: multipart copy, check for empty bucket, improve logging +2588e95 rgw: multipart copy part, chunked read +bd118b5 rgw: doc: add multipart uploads copy part feature as supported +b56b719 rgw: multipart uploads copy part support +d44263f rgw: make sending Content-Length in 204 and 304 controllable +f3face6 rgw: clear old zone short ids on period update +0be4e89 rgw: hold a reference on data_sync_cr over run() +18ffdb7 rgw: clear data_sync_cr if RGWDataSyncControlCR fails +d0a0d2f tests: fix merge error in rgw/singleton/all/radosgw-admin.yaml +1985662 rgw: RGWMetaSyncShardControlCR retries with backoff on all error codes +dfaaec0 rgw_file: return of RGWFileHandle::FLAG_EXACT_MATCH +9b3784d rgw_file: invalid use of RGWFileHandle::FLAG_EXACT_MATCH +7761376 rgw_file: rgw_lookup: don't ref for "/" or ".." +97fed01 rgw_file: avoid stranding invalid-name bucket handles in fhcache +d333add rgw: set dumpable flag after setuid post ff0e521 +656b5b6 (tag: v10.2.6) 10.2.6 +f7ce5df rgw: fix swift cannot disable object versioning with empty X-Versions-Location +2f20328 osd: Increase priority for inactive PGs backfill +e8041f6 rgw_file: fix RGWLibFS::setattr for directory objects 88f4895 qa/suites/upgrade/hammer-x: Add some volumes 0c242d1 qa/suites/ceph-deploy: Drop OpenStack volume count +e475bfa rgw_file: ensure valid_s3_object_name for directories, too ccd0265 qa: replace centos 7.2 with centos 7.3 2cbec5b Removed dumplin test 13234.yaml as not needed anymore 771e1d9 qa/suites/rest: Openstack volumes @@ -12,6 +55,11 @@ ba35859 qa/suites/kcephfs: Openstack volume configuration aced718 qa/suites/krbd: Add openstack volume configuration 94d5888 qa/suites/rgw: Add openstack volume configuration +78c8be7 rgw/openssl fix: xenial autoconf logic problem: gcc/ld got too smart... +db928d6 rbd-mirror: retry object copy after -ENOENT error +a643fa8 rbd-mirror: object copy should always reference valid snapshots +37bbc95 rbd-mirror: replace complex object op tuple with struct +8941881 rgw_file: interned RGWFileHandle objects need parent refs cb7bb0c tests: reduce stress-split-erasure-code-x86_64 dependency on stress-split 8ae1886 tests: reduce stress-split-erasure-code dependency on stress-split 4d4b38e qa: drop ubuntu trusty support @@ -45,6 +93,32 @@ c1cf61f rgw: utilities to support raw bucket index operations 0ce2a12 rgw: use bucket_info.bucket_id instead of marker where needed 5fe58c5 cls/rgw: utilities to support raw bucket index operations +952f34f test: Update for new error message when doing scrub with deep-scrub errors +b655b98 osd: Add "trigger_scrub" admin socket command +94c958d test: Add test for keeping deep-scrub information +42eb24f osd: When deep-scrub errors present upgrade regular scrubs +76a457a tasks/scrub_test.py: Make test deterministic by updating digests +bd1f198 repair_test, scrub_test: Fix whitelists for scrub changes +28106f0 scrub_test: Fix for list-inconsistent-obj output changes +abcefc1 doc, test: Add schemas for list-inconsistent-* rados command output +2fa2b64 test: Update testing for new list-inconsistent-obj output +304f697 rados, osd: Improve attrs output of list-inconsistent-obj +ea52f52 osd: Fix logging to help with diagnostics +5e8f8a2 test: Fix use of wait_for_clean() +2230e6a common: Change cleanbin() to use base64 encoding, update ceph-objectstore-tool +83ea077 common: Move cleanbin() function to common/util.cc +ba84ca9 test: Add test support for deep-scrub +6a421d1 common: Fix indentation +c7c3e07 osd: Handle corrupt attributes in get_object_context() +8006ba7 ReplicatedPG::failed_push: release read lock on failure +5ca69d5 test.sh: Make check for flags more robust +1be38e5 test: Remove extra objectstore_tool call which causes a recovery +026f181 test: Handle object removals in a non-racey way +c5ef385 osd: Fix hang on unfound object after mark_unfound_lost is done +6284f74 osd: Handle recovery read errors +27393a8 osd: Fix log messages +cbf66f3 osd: CLEANUP: Remove unused pending_read member +228b91d test/osd-scrub-repair.sh: Use test case specific object names to help with diagnostics 7515a77 tests: drop buildpackages.py 36f96f4 tests: update SUSE yaml facets in qa/distros/all 7cf37f6 rbd-nbd: support partition for rbd-nbd mapped raw block device. @@ -136,6 +210,7 @@ e5ac120 rgw: multipart copy part, chunked read a54a7ad rgw: doc: add multipart uploads copy part feature as supported 987b425 rgw: multipart uploads copy part support +39848e4 radosgw/swift: clean up flush / newline behavior. 21622c1 src/mds: fix MDSMap upgrade decoding be8bc11 mds: use FSMap::insert to add to standby_daemons 649b1d4 rbd: bench-write should return error if io-size >= 4G @@ -156,6 +231,7 @@ 69a0efa tests: subst repo name in krbd/unmap/tasks/unmap.yaml 2931aef tests: subst repo name in qa/tasks/cram.py 205403b cram: support fetching from sha1 branch, tag, commit hash +3fce77a osd: jewel fix OSD network address in OSD heartbeat_check log message ea65450 qa/workunits/rbd: use more recent qemu-iotests that support Xenial f449e3d qa/workunits/rbd: removed qemu-iotest case 077 61e1b0c tasks/rbd_fio: unmap rbd devices on cleanup @@ -193,8 +269,15 @@ 5115c21 ceph_volume_client: check if volume metadata is empty bf33cd5 ceph_volume_client: fix _recover_auth_meta() method 8404426 mds/server: skip unwanted dn in handle_client_readdir +14a6aab rgw: Handle multiple listening addreses w/ optional ssl "correctly" with civetweb. +6982505 rgw: s3: secure_port should override port, also apply ssl default right. +28f2841 rgw: Get civetweb ssl enhancement: wip-listen3 = mg_get_local_addr +8d83dfb rgw: Document that radosgw now supports SSL. +e3f80c9 rgw: civetweb/openssl: automagic: load libssl.so and libcrypto.so by soname. a0ee8b9 jewel: fix compile error for dencode test case when --with-radosgw=no 5e6c729 jewel: fixed compile error when --with-radosgw=no +0455514 rgw: civetweb/openssl: Load libssl.so and libcrypto.so by soname. +3866408 rgw: cmake: remove useless civetweb include path side effect. cdd6cbf librbd: block concurrent in-flight object map updates for the same object 04cee05 qa/tasks/workunit: clear clone dir before retrying checkout 1a98850 qa/tasks/workunit: retry on ceph.git if checkout fails @@ -6230,7 +6313,7 @@ 1df9705 test/librbd/fsx: musl libc doesn't implement random_r. Use c++11 std::mt19937 generator instead. 6f1fb16 doc: osd: s/schedued/scheduled/ 7d93cf4 buffer: make usable outside of ceph source again -93d3dfe Fixing NULL pointer dereference +93d3dfe0 Fixing NULL pointer dereference 72785ee rgw: enforce SLO part's ETag match during GET on SLO of Swift. 1cf149d rgw: append X-Static-Large-Object attribute during PUT on SLO. 630eac1 rgw: add support for normalisation of ranged SLO requests. @@ -34194,7 +34277,7 @@ 7c05c1f osd: simplify share_pg_log 43bd49d osd: fix up PG::Missing methods a bit 5115882 osd: factor out recover_primary_got() helper -efe5abf osd: make C_OSD_CommittedPushedObject::op optional +efe5abfc osd: make C_OSD_CommittedPushedObject::op optional 22684f2 osd: pass version explicitly to pull a3be665 osd: fix share_pg_log() c3fa078 messages/MOSDPG*: clean up output a bit diff -Nru ceph-10.2.6/CMakeLists.txt ceph-10.2.7/CMakeLists.txt --- ceph-10.2.6/CMakeLists.txt 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/CMakeLists.txt 2017-04-10 11:44:25.000000000 +0000 @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 2.8.11) project(Ceph) -set(VERSION 10.2.6) +set(VERSION 10.2.7) if (NOT (CMAKE_MAJOR_VERSION LESS 3)) # Tweak policies (this one disables "missing" dependency warning) @@ -158,10 +158,10 @@ option(WITH_OPENSSL "OPENSSL is here" ON) if(${WITH_OPENSSL}) find_package(OpenSSL REQUIRED) -set(HAVE_OPENSSL ON) +set(USE_OPENSSL ON) #message(STATUS "${OPENSSL_LIBRARIES}") else(${WITH_OPENSSL}) -set(HAVE_OPENSSL OFF) +set(USE_OPENSSL OFF) set(OPENSSL_LIBRARIES) endif(${WITH_OPENSSL}) @@ -288,6 +288,47 @@ #option for RGW option(WITH_RADOSGW "Rados Gateway is enabled" ON) +if (WITH_RADOSGW) + if (NOT DEFINED OPENSSL_FOUND) + message(STATUS "Looking for openssl anyways, because radosgw selected") + find_package(OpenSSL) + endif() + if (OPENSSL_FOUND) + execute_process( + COMMAND + "sh" "-c" + "objdump -p ${OPENSSL_SSL_LIBRARY} | sed -n 's/^ SONAME *//p'" + OUTPUT_VARIABLE LIBSSL_SONAME + ERROR_VARIABLE OBJDUMP_ERRORS + RESULT_VARIABLE OBJDUMP_RESULTS + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (OBJDUMP_RESULTS) + message(FATAL_ERROR "can't run objdump: ${OBJDUMP_RESULTS}") + endif() + if (NOT OBJDUMP_ERRORS STREQUAL "") + message(WARNING "message from objdump: ${OBJDUMP_ERRORS}") + endif() + execute_process( + COMMAND + "sh" "-c" + "objdump -p ${OPENSSL_CRYPTO_LIBRARY} | sed -n 's/^ SONAME *//p'" + OUTPUT_VARIABLE LIBCRYPTO_SONAME + ERROR_VARIABLE OBJDUMP_ERRORS + RESULT_VARIABLE OBJDUMP_RESULTS + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (OBJDUMP_RESULTS) + message(FATAL_ERROR "can't run objdump: ${OBJDUMP_RESULTS}") + endif() + if (NOT OBJDUMP_ERRORS STREQUAL "") + message(WARNING "message from objdump: ${OBJDUMP_ERRORS}") + endif() + message(STATUS "ssl soname: ${LIBSSL_SONAME}") + message(STATUS "crypto soname: ${LIBCRYPTO_SONAME}") + else() + message(WARNING "ssl not found: rgw civetweb may fail to dlopen libssl libcrypto") + endif() +endif (WITH_RADOSGW) + #option for CephFS option(WITH_CEPHFS "CephFS is enabled" ON) diff -Nru ceph-10.2.6/configure ceph-10.2.7/configure --- ceph-10.2.6/configure 2017-03-07 13:31:25.000000000 +0000 +++ ceph-10.2.7/configure 2017-04-10 11:45:17.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for ceph 10.2.6. +# Generated by GNU Autoconf 2.69 for ceph 10.2.7. # # Report bugs to . # @@ -590,8 +590,8 @@ # Identity of this package. PACKAGE_NAME='ceph' PACKAGE_TARNAME='ceph' -PACKAGE_VERSION='10.2.6' -PACKAGE_STRING='ceph 10.2.6' +PACKAGE_VERSION='10.2.7' +PACKAGE_STRING='ceph 10.2.7' PACKAGE_BUGREPORT='ceph-devel@vger.kernel.org' PACKAGE_URL='' @@ -741,6 +741,10 @@ WITH_FUSE_TRUE LIBFUSE_LIBS LIBFUSE_CFLAGS +SONAME_DEFINES +OPENSSL_LDFLAGS +OPENSSL_LIBS +OPENSSL_INCLUDES WITH_RADOSGW_FALSE WITH_RADOSGW_TRUE GCOV_PREFIX_STRIP @@ -989,6 +993,7 @@ with_profiler with_debug enable_coverage +with_openssl with_fuse with_jemalloc with_tcmalloc_minimal @@ -1595,7 +1600,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures ceph 10.2.6 to adapt to many kinds of systems. +\`configure' configures ceph 10.2.7 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1667,7 +1672,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ceph 10.2.6:";; + short | recursive ) echo "Configuration of ceph 10.2.7:";; esac cat <<\_ACEOF @@ -1722,6 +1727,7 @@ --with-nss Use cryptographic functions from nss --with-profiler build extra profiler binaries --with-debug build extra debug binaries and tests + --with-openssl=DIR root of the OpenSSL directory --without-fuse disable FUSE userspace client --with-jemalloc enable jemalloc for memory allocations --with-tcmalloc-minimal enable minimal tcmalloc support for memory @@ -1856,7 +1862,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ceph configure 10.2.6 +ceph configure 10.2.7 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2932,7 +2938,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ceph $as_me 10.2.6, which was +It was created by ceph $as_me 10.2.7, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -17045,7 +17051,7 @@ # Define the identity of the package. PACKAGE='ceph' - VERSION='10.2.6' + VERSION='10.2.7' cat >>confdefs.h <<_ACEOF @@ -20793,6 +20799,208 @@ fi +if test "$RADOSGW" = "1"; then : + + + found=false + +# Check whether --with-openssl was given. +if test "${with_openssl+set}" = set; then : + withval=$with_openssl; + case "$withval" in + "" | y | ye | yes | n | no) + as_fn_error $? "Invalid --with-openssl value" "$LINENO" 5 + ;; + *) ssldirs="$withval" + ;; + esac + +else + + # if pkg-config is installed and openssl has installed a .pc file, + # then use that information and don't search ssldirs + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$PKG_CONFIG" != x""; then + OPENSSL_LDFLAGS=`$PKG_CONFIG openssl --libs-only-L 2>/dev/null` + if test $? = 0; then + OPENSSL_LIBS=`$PKG_CONFIG openssl --libs-only-l 2>/dev/null` + OPENSSL_INCLUDES=`$PKG_CONFIG openssl --cflags-only-I 2>/dev/null` + found=true + fi + fi + + # no such luck; use some default ssldirs + if ! $found; then + ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr" + fi + + +fi + + + + # note that we #include , so the OpenSSL headers have to be in + # an 'openssl' subdirectory + + if ! $found; then + OPENSSL_INCLUDES= + for ssldir in $ssldirs; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl/ssl.h in $ssldir" >&5 +$as_echo_n "checking for openssl/ssl.h in $ssldir... " >&6; } + if test -f "$ssldir/include/openssl/ssl.h"; then + OPENSSL_INCLUDES="-I$ssldir/include" + OPENSSL_LDFLAGS="-L$ssldir/lib" + OPENSSL_LIBS="-lssl -lcrypto" + found=true + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + break + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + done + + # if the file wasn't found, well, go ahead and try the link anyway -- maybe + # it will just work! + fi + + # try the preprocessor and linker with our new flags, + # being careful not to pollute the global LIBS, LDFLAGS, and CPPFLAGS + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiling and linking against OpenSSL works" >&5 +$as_echo_n "checking whether compiling and linking against OpenSSL works... " >&6; } + echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \ + "OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&5 + + save_LIBS="$LIBS" + save_LDFLAGS="$LDFLAGS" + save_CPPFLAGS="$CPPFLAGS" + LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS" + LIBS="$OPENSSL_LIBS $LIBS" + CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +SSL_new(NULL) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "radosgw selected but OpenSSL not found +See \`config.log' for more details" "$LINENO" 5; } + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: radosgw: openssl INCLUDES $OPENSSL_INCLUDES LIBS $OPENSSL_LIBS" >&5 +$as_echo "$as_me: radosgw: openssl INCLUDES $OPENSSL_INCLUDES LIBS $OPENSSL_LIBS" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for radosgw/civetweb: sonames for openssl libraries" >&5 +$as_echo_n "checking for radosgw/civetweb: sonames for openssl libraries... " >&6; } + saved_LIBS="${LIBS}" + LIBS="$OPENSSL_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +SSL *s = 0;printf ("%p %d\n", (void*)EVP_md5(), SSL_get_fd(s)) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: linked" >&5 +$as_echo "linked" >&6; } +eval `$OBJDUMP -p ./conftest$ac_exeext | sed -n 's/^ NEEDED *libssl/LIBSSL_SONAME=libssl/p; +s/^ NEEDED *libcrypto/LIBCRYPTO_SONAME=libcrypto/p'` +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem looking up sonames" >&5 +$as_echo "problem looking up sonames" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="${saved_LIBS}" +{ $as_echo "$as_me:${as_lineno-$LINENO}: radosgw: openssl sonames $LIBSSL_SONAME $LIBCRYPTO_SONAME" >&5 +$as_echo "$as_me: radosgw: openssl sonames $LIBSSL_SONAME $LIBCRYPTO_SONAME" >&6;} +fi +SONAME_DEFINES="" +if test "x$LIBSSL_SONAME" != x; then : + +SONAME_DEFINES="$SONAME_DEFINES -DSSL_LIB=\\"'"'"$LIBSSL_SONAME\\"'"'"" + +fi +if test "x$LIBCRYPTO_SONAME" != x; then : + +SONAME_DEFINES="$SONAME_DEFINES -DCRYPTO_LIB=\\"'"'"$LIBCRYPTO_SONAME\\"'"'"" + +fi + + # fuse? # Check whether --with-fuse was given. @@ -21384,7 +21592,7 @@ JAVA_TEST=Test.java CLASS_TEST=Test.class cat << \EOF > $JAVA_TEST -/* #line 21387 "configure" */ +/* #line 21595 "configure" */ public class Test { } EOF @@ -26706,7 +26914,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ceph $as_me 10.2.6, which was +This file was extended by ceph $as_me 10.2.7, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26772,7 +26980,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -ceph config.status 10.2.6 +ceph config.status 10.2.7 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -Nru ceph-10.2.6/configure.ac ceph-10.2.7/configure.ac --- ceph-10.2.6/configure.ac 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/configure.ac 2017-04-10 11:44:25.000000000 +0000 @@ -8,7 +8,7 @@ # VERSION define is not used by the code. It gets a version string # from 'git describe'; see src/ceph_ver.[ch] -AC_INIT([ceph], [10.2.6], [ceph-devel@vger.kernel.org]) +AC_INIT([ceph], [10.2.7], [ceph-devel@vger.kernel.org]) AX_CXX_COMPILE_STDCXX_11(, mandatory) @@ -531,6 +531,30 @@ AC_DEFINE([HAVE_CURL_MULTI_WAIT], [1], [Define if have curl_multi_wait()])) ]) +AS_IF([test "$RADOSGW" = "1"], [ + AX_CHECK_OPENSSL([], + [AC_MSG_FAILURE([radosgw selected but OpenSSL not found])]) +AC_MSG_NOTICE([radosgw: openssl INCLUDES $OPENSSL_INCLUDES LIBS $OPENSSL_LIBS]) +AC_MSG_CHECKING(for radosgw/civetweb: sonames for openssl libraries) + saved_LIBS="${LIBS}" + LIBS="$OPENSSL_LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +#include ], [SSL *s = 0;printf ("%p %d\n", (void*)EVP_md5(), SSL_get_fd(s))])], + [AC_MSG_RESULT([linked]) +eval `$OBJDUMP -p ./conftest$ac_exeext | sed -n 's/^ NEEDED *libssl/LIBSSL_SONAME=libssl/p; +s/^ NEEDED *libcrypto/LIBCRYPTO_SONAME=libcrypto/p'`], + AC_MSG_RESULT([problem looking up sonames])) + LIBS="${saved_LIBS}" +AC_MSG_NOTICE([radosgw: openssl sonames $LIBSSL_SONAME $LIBCRYPTO_SONAME])]) +SONAME_DEFINES="" +AS_IF([test "x$LIBSSL_SONAME" != x], [ +SONAME_DEFINES="$SONAME_DEFINES -DSSL_LIB=\\"'"'"$LIBSSL_SONAME\\"'"'"" +]) +AS_IF([test "x$LIBCRYPTO_SONAME" != x], [ +SONAME_DEFINES="$SONAME_DEFINES -DCRYPTO_LIB=\\"'"'"$LIBCRYPTO_SONAME\\"'"'"" +]) +AC_SUBST(SONAME_DEFINES) + # fuse? AC_ARG_WITH([fuse], [AS_HELP_STRING([--without-fuse], [disable FUSE userspace client])], diff -Nru ceph-10.2.6/debian/changelog ceph-10.2.7/debian/changelog --- ceph-10.2.6/debian/changelog 2017-03-09 16:21:36.000000000 +0000 +++ ceph-10.2.7/debian/changelog 2017-04-21 08:21:10.000000000 +0000 @@ -1,3 +1,18 @@ +ceph (10.2.7-0ubuntu0.16.04.1) xenial; urgency=medium + + [ Billy Olsen ] + * Start ceph-all after static-network-up (LP: #1636322): + - d/p/start-ceph-all-after-network.patch: add dependency on + the static-network-up event before starting ceph-all. + + [ James Page ] + * New upstream point release (LP: #1684527): + - d/p/disable-openssl-linking.patch: Dropped, no longer required. + - d/control: Add BD on libssl-dev to support optional runtime + loading of openssl in the radosgw. + + -- James Page Fri, 21 Apr 2017 09:21:10 +0100 + ceph (10.2.6-0ubuntu0.16.04.1) xenial; urgency=medium * New upstream stable point release (LP: #1671117): diff -Nru ceph-10.2.6/debian/control ceph-10.2.7/debian/control --- ceph-10.2.6/debian/control 2017-03-09 16:21:33.000000000 +0000 +++ ceph-10.2.7/debian/control 2017-04-21 08:21:08.000000000 +0000 @@ -41,6 +41,7 @@ libnss3-dev, libsnappy-dev, libldap2-dev, + libssl-dev, libtool, libudev-dev, libxml2-dev, diff -Nru ceph-10.2.6/debian/patches/disable-openssl-linking.patch ceph-10.2.7/debian/patches/disable-openssl-linking.patch --- ceph-10.2.6/debian/patches/disable-openssl-linking.patch 2017-03-09 16:20:51.000000000 +0000 +++ ceph-10.2.7/debian/patches/disable-openssl-linking.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -Description: Disable build time linking with openssl - OpenSSL is not DFSG compatible with the rest of the Ceph - codebase; disable build time linking and switch back to - runtime use if end-users decide they want to use OpenSSL. -Author: James Page -Forwarded: not-needed - ---- a/src/rgw/Makefile.am -+++ b/src/rgw/Makefile.am -@@ -136,8 +136,7 @@ libcivetweb_la_SOURCES = \ - - libcivetweb_la_CXXFLAGS = ${CIVETWEB_INCLUDE} -fPIC -Woverloaded-virtual \ - ${AM_CXXFLAGS} --libcivetweb_la_CFLAGS = -I$(srcdir)/civetweb/include ${CIVETWEB_INCLUDE} -fPIC -DNO_SSL_DL --LIBCIVETWEB_DEPS += -lssl -lcrypto -+libcivetweb_la_CFLAGS = -I$(srcdir)/civetweb/include ${CIVETWEB_INCLUDE} -fPIC - - noinst_LTLIBRARIES += libcivetweb.la - diff -Nru ceph-10.2.6/debian/patches/series ceph-10.2.7/debian/patches/series --- ceph-10.2.6/debian/patches/series 2017-03-09 16:21:00.000000000 +0000 +++ ceph-10.2.7/debian/patches/series 2017-04-21 08:21:08.000000000 +0000 @@ -15,4 +15,4 @@ fix-argparse-defaults.patch fix-cycles-arch.patch skip-setup.py-makefiles.patch -disable-openssl-linking.patch +start-ceph-all-after-network.patch diff -Nru ceph-10.2.6/debian/patches/start-ceph-all-after-network.patch ceph-10.2.7/debian/patches/start-ceph-all-after-network.patch --- ceph-10.2.6/debian/patches/start-ceph-all-after-network.patch 1970-01-01 00:00:00.000000000 +0000 +++ ceph-10.2.7/debian/patches/start-ceph-all-after-network.patch 2017-04-21 08:21:08.000000000 +0000 @@ -0,0 +1,37 @@ +From e10e22a95f67c31947d4c0f33d69e4d8b929b0e8 Mon Sep 17 00:00:00 2001 +From: Billy Olsen +Date: Mon, 24 Oct 2016 15:13:51 -0700 +Forwarded: https://github.com/ceph/ceph/pull/11631 +Subject: [PATCH 1/1] upstart: start ceph-all after static-network-up + +Starting on runlevel [2345] allows the ceph services to +start before all of the networking is configured. This +introduces a race condition which allows a service to start +before the network it binds to is available. + +Add the static-network-up event as a dependency for the start +on directive in order to start the ceph services after all of +the network stanzas have been processed and executed in the +/etc/network/interfaces and /etc/network/interfaces.d/*.conf +files. + +Fixes: http://tracker.ceph.com/issues/17689 + +Signed-off-by: Billy Olsen +--- + src/upstart/ceph-all.conf | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/upstart/ceph-all.conf b/src/upstart/ceph-all.conf +index c0b0edd..52d0f08 100644 +--- a/src/upstart/ceph-all.conf ++++ b/src/upstart/ceph-all.conf +@@ -1,4 +1,4 @@ + description "Ceph" + +-start on runlevel [2345] ++start on runlevel [2345] and static-network-up + stop on runlevel [!2345] +-- +2.7.4 + diff -Nru ceph-10.2.6/doc/install/install-ceph-gateway.rst ceph-10.2.7/doc/install/install-ceph-gateway.rst --- ceph-10.2.6/doc/install/install-ceph-gateway.rst 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/doc/install/install-ceph-gateway.rst 2017-04-10 11:44:25.000000000 +0000 @@ -10,9 +10,8 @@ Ceph storage cluster, and the gateway host should have access to the public network. -.. note:: In version 0.80, the Ceph Object Gateway does not support SSL. You - may setup a reverse proxy server with SSL to dispatch HTTPS requests - as HTTP requests to CivetWeb. +.. note:: As of version 10.2.6, the Ceph Object Gateway **does** support SSL. + See `Using SSL with Civetweb`_ for information on how to set that up. Execute the Pre-Installation Procedure -------------------------------------- @@ -83,10 +82,6 @@ ``[client.rgw.]``, replacing ```` with the short node name of your Ceph Object Gateway node (i.e., ``hostname -s``). -.. note:: In version 0.94, the Ceph Object Gateway does not support SSL. You - may setup a reverse proxy web server with SSL to dispatch HTTPS - requests as HTTP requests to CivetWeb. - For example, if your node name is ``gateway-node1``, add a section like this after the ``[global]`` section:: @@ -145,6 +140,28 @@ iptables-save > /etc/iptables/rules.v4 +Using SSL with Civetweb +----------------------- +.. _Using SSL with Civetweb: + +Before using SSL with civetweb, you will need a certificate that will match +the host name that that will be used to access the Ceph Object Gateway. +You may wish to obtain one that has `subject alternate name` fields for +more flexibility. If you intend to use S3-style subdomains +(`Add Wildcard to DNS`_), you will need a `wildcard` certificate. + +Civetweb requires that the server key, server certificate, and any other +CA or intermediate certificates be supplied in one file. Each of these +items must be in `pem` form. Because the combined file contains the +secret key, it should be protected from unauthorized access. + +To configure ssl operation, append ``s`` to the port number. Currently +it is not possible to configure the radosgw to listen on both +http and https, you must pick only one. So:: + + [client.rgw.gateway-node1] + rgw_frontends = civetweb port=443s ssl_certificate=/etc/ceph/private/keyandcert.pem + Migrating from Apache to Civetweb --------------------------------- @@ -267,6 +284,7 @@ Add Wildcard to DNS ------------------- +.. _Add Wildcard to DNS: To use Ceph with S3-style subdomains (e.g., bucket-name.domain-name.com), you need to add a wildcard to the DNS record of the DNS server you use with the diff -Nru ceph-10.2.6/doc/Makefile ceph-10.2.7/doc/Makefile --- ceph-10.2.6/doc/Makefile 2017-03-07 13:31:50.000000000 +0000 +++ ceph-10.2.7/doc/Makefile 2017-04-10 11:45:43.000000000 +0000 @@ -99,6 +99,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -234,15 +235,18 @@ NSS_LIBS = -lnss3 -lnssutil3 -lsmime3 -lssl3 -lplds4 -lplc4 -lnspr4 OBJDUMP = objdump OBJEXT = o +OPENSSL_INCLUDES = +OPENSSL_LDFLAGS = +OPENSSL_LIBS = -lssl -lcrypto OTOOL = OTOOL64 = PACKAGE = ceph PACKAGE_BUGREPORT = ceph-devel@vger.kernel.org PACKAGE_NAME = ceph -PACKAGE_STRING = ceph 10.2.6 +PACKAGE_STRING = ceph 10.2.7 PACKAGE_TARNAME = ceph PACKAGE_URL = -PACKAGE_VERSION = 10.2.6 +PACKAGE_VERSION = 10.2.7 PATH_SEPARATOR = : PKG_CONFIG = /usr/bin/pkg-config PKG_CONFIG_LIBDIR = @@ -265,9 +269,10 @@ SED = /bin/sed SET_MAKE = SHELL = /bin/bash +SONAME_DEFINES = -DSSL_LIB=\"libssl.so.1.0.0\" -DCRYPTO_LIB=\"libcrypto.so.1.0.0\" SPHINX_BUILD = sphinx-build STRIP = strip -VERSION = 10.2.6 +VERSION = 10.2.7 WARN_ERROR_FORMAT_SECURITY = -Werror=format-security WARN_IGNORED_QUALIFIERS = -Wignored-qualifiers WARN_TYPE_LIMITS = -Wtype-limits diff -Nru ceph-10.2.6/doc/Makefile.in ceph-10.2.7/doc/Makefile.in --- ceph-10.2.6/doc/Makefile.in 2017-03-07 13:31:26.000000000 +0000 +++ ceph-10.2.7/doc/Makefile.in 2017-04-10 11:45:18.000000000 +0000 @@ -99,6 +99,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -234,6 +235,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -265,6 +269,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@ diff -Nru ceph-10.2.6/doc/rados/command/list-inconsistent-obj.json ceph-10.2.7/doc/rados/command/list-inconsistent-obj.json --- ceph-10.2.6/doc/rados/command/list-inconsistent-obj.json 1970-01-01 00:00:00.000000000 +0000 +++ ceph-10.2.7/doc/rados/command/list-inconsistent-obj.json 2017-04-10 11:44:25.000000000 +0000 @@ -0,0 +1,185 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "epoch": { + "description": "Scrub epoch", + "type": "integer" + }, + "inconsistents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "object": { + "description": "Identify a Ceph object", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "nspace": { + "type": "string" + }, + "locator": { + "type": "string" + }, + "version": { + "type": "integer", + "minimum": 0 + }, + "snap": { + "oneOf": [ + { + "type": "string", + "enum": [ "head", "snapdir" ] + }, + { + "type": "integer", + "minimum": 0 + } + ] + } + }, + "required": [ + "name", + "nspace", + "locator", + "version", + "snap" + ] + }, + "selected_object_info": { + "type": "string" + }, + "union_shard_errors": { + "description": "Union of all shard errors", + "type": "array", + "items": { + "enum": [ + "missing", + "stat_error", + "read_error", + "data_digest_mismatch_oi", + "omap_digest_mismatch_oi", + "size_mismatch_oi", + "ec_hash_error", + "ec_size_error", + "oi_attr_missing", + "oi_attr_corrupted" + ] + }, + "minItems": 0, + "uniqueItems": true + }, + "errors": { + "description": "Errors related to the analysis of this object", + "type": "array", + "items": { + "enum": [ + "object_info_inconsistency", + "data_digest_mismatch", + "omap_digest_mismatch", + "size_mismatch", + "attr_value_mismatch", + "attr_name_mismatch" + ] + }, + "minItems": 0, + "uniqueItems": true + }, + "shards": { + "description": "All found or expected shards", + "type": "array", + "items": { + "description": "Information about a particular shard of object", + "type": "object", + "properties": { + "object_info": { + "type": "string" + }, + "shard": { + "type": "integer" + }, + "osd": { + "type": "integer" + }, + "size": { + "type": "integer" + }, + "omap_digest": { + "description": "Hex representation (e.g. 0x1abd1234)", + "type": "string" + }, + "data_digest": { + "description": "Hex representation (e.g. 0x1abd1234)", + "type": "string" + }, + "errors": { + "description": "Errors with this shard", + "type": "array", + "items": { + "enum": [ + "missing", + "stat_error", + "read_error", + "data_digest_mismatch_oi", + "omap_digest_mismatch_oi", + "size_mismatch_oi", + "ec_hash_error", + "ec_size_error", + "oi_attr_missing", + "oi_attr_corrupted" + ] + }, + "minItems": 0, + "uniqueItems": true + }, + "attrs": { + "description": "If any shard's attr error is set then all attrs are here", + "type": "array", + "items": { + "description": "Information about a particular shard of object", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "Base64": { + "type": "boolean" + } + }, + "required": [ + "name", + "value", + "Base64" + ], + "additionalProperties": false, + "minItems": 1 + } + } + }, + "required": [ + "osd", + "errors" + ] + } + } + }, + "required": [ + "object", + "union_shard_errors", + "errors", + "shards" + ] + } + } + }, + "required": [ + "epoch", + "inconsistents" + ] +} diff -Nru ceph-10.2.6/doc/rados/command/list-inconsistent-snap.json ceph-10.2.7/doc/rados/command/list-inconsistent-snap.json --- ceph-10.2.6/doc/rados/command/list-inconsistent-snap.json 1970-01-01 00:00:00.000000000 +0000 +++ ceph-10.2.7/doc/rados/command/list-inconsistent-snap.json 2017-04-10 11:44:25.000000000 +0000 @@ -0,0 +1,87 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "epoch": { + "description": "Scrub epoch", + "type": "integer" + }, + "inconsistents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "nspace": { + "type": "string" + }, + "locator": { + "type": "string" + }, + "snap": { + "oneOf": [ + { + "type": "string", + "enum": [ + "head", + "snapdir" + ] + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "errors": { + "description": "Errors for this object's snap", + "type": "array", + "items": { + "enum": [ + "ss_attr_missing", + "ss_attr_corrupted", + "oi_attr_missing", + "oi_attr_corrupted", + "snapset_mismatch", + "head_mismatch", + "headless", + "size_mismatch", + "extra_clones", + "clone_missing" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "missing": { + "description": "List of missing clones if clone_missing error set", + "type": "array", + "items": { + "type": "integer" + } + }, + "extra_clones": { + "description": "List of extra clones if extra_clones error set", + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "name", + "nspace", + "locator", + "snap", + "errors" + ] + } + } + }, + "required": [ + "epoch", + "inconsistents" + ] +} diff -Nru ceph-10.2.6/doc/radosgw/s3.rst ceph-10.2.7/doc/radosgw/s3.rst --- ceph-10.2.6/doc/radosgw/s3.rst 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/doc/radosgw/s3.rst 2017-04-10 11:44:25.000000000 +0000 @@ -70,7 +70,7 @@ +---------------------------------+-----------------+----------------------------------------+ | **Copy Object** | Supported | | +---------------------------------+-----------------+----------------------------------------+ -| **Multipart Uploads** | Supported | (missing Copy Part) | +| **Multipart Uploads** | Supported | | +---------------------------------+-----------------+----------------------------------------+ Unsupported Header Fields diff -Nru ceph-10.2.6/m4/ax_check_openssl.m4 ceph-10.2.7/m4/ax_check_openssl.m4 --- ceph-10.2.6/m4/ax_check_openssl.m4 1970-01-01 00:00:00.000000000 +0000 +++ ceph-10.2.7/m4/ax_check_openssl.m4 2017-04-10 11:44:25.000000000 +0000 @@ -0,0 +1,124 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_openssl.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_OPENSSL([action-if-found[, action-if-not-found]]) +# +# DESCRIPTION +# +# Look for OpenSSL in a number of default spots, or in a user-selected +# spot (via --with-openssl). Sets +# +# OPENSSL_INCLUDES to the include directives required +# OPENSSL_LIBS to the -l directives required +# OPENSSL_LDFLAGS to the -L or -R flags required +# +# and calls ACTION-IF-FOUND or ACTION-IF-NOT-FOUND appropriately +# +# This macro sets OPENSSL_INCLUDES such that source files should use the +# openssl/ directory in include directives: +# +# #include +# +# LICENSE +# +# Copyright (c) 2009,2010 Zmanda Inc. +# Copyright (c) 2009,2010 Dustin J. Mitchell +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 8 + +AU_ALIAS([CHECK_SSL], [AX_CHECK_OPENSSL]) +AC_DEFUN([AX_CHECK_OPENSSL], [ + found=false + AC_ARG_WITH([openssl], + [AS_HELP_STRING([--with-openssl=DIR], + [root of the OpenSSL directory])], + [ + case "$withval" in + "" | y | ye | yes | n | no) + AC_MSG_ERROR([Invalid --with-openssl value]) + ;; + *) ssldirs="$withval" + ;; + esac + ], [ + # if pkg-config is installed and openssl has installed a .pc file, + # then use that information and don't search ssldirs + AC_PATH_PROG([PKG_CONFIG], [pkg-config]) + if test x"$PKG_CONFIG" != x""; then + OPENSSL_LDFLAGS=`$PKG_CONFIG openssl --libs-only-L 2>/dev/null` + if test $? = 0; then + OPENSSL_LIBS=`$PKG_CONFIG openssl --libs-only-l 2>/dev/null` + OPENSSL_INCLUDES=`$PKG_CONFIG openssl --cflags-only-I 2>/dev/null` + found=true + fi + fi + + # no such luck; use some default ssldirs + if ! $found; then + ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr" + fi + ] + ) + + + # note that we #include , so the OpenSSL headers have to be in + # an 'openssl' subdirectory + + if ! $found; then + OPENSSL_INCLUDES= + for ssldir in $ssldirs; do + AC_MSG_CHECKING([for openssl/ssl.h in $ssldir]) + if test -f "$ssldir/include/openssl/ssl.h"; then + OPENSSL_INCLUDES="-I$ssldir/include" + OPENSSL_LDFLAGS="-L$ssldir/lib" + OPENSSL_LIBS="-lssl -lcrypto" + found=true + AC_MSG_RESULT([yes]) + break + else + AC_MSG_RESULT([no]) + fi + done + + # if the file wasn't found, well, go ahead and try the link anyway -- maybe + # it will just work! + fi + + # try the preprocessor and linker with our new flags, + # being careful not to pollute the global LIBS, LDFLAGS, and CPPFLAGS + + AC_MSG_CHECKING([whether compiling and linking against OpenSSL works]) + echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \ + "OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&AS_MESSAGE_LOG_FD + + save_LIBS="$LIBS" + save_LDFLAGS="$LDFLAGS" + save_CPPFLAGS="$CPPFLAGS" + LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS" + LIBS="$OPENSSL_LIBS $LIBS" + CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include ], [SSL_new(NULL)])], + [ + AC_MSG_RESULT([yes]) + $1 + ], [ + AC_MSG_RESULT([no]) + $2 + ]) + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + + AC_SUBST([OPENSSL_INCLUDES]) + AC_SUBST([OPENSSL_LIBS]) + AC_SUBST([OPENSSL_LDFLAGS]) +]) diff -Nru ceph-10.2.6/Makefile.in ceph-10.2.7/Makefile.in --- ceph-10.2.6/Makefile.in 2017-03-07 13:31:26.000000000 +0000 +++ ceph-10.2.7/Makefile.in 2017-04-10 11:45:17.000000000 +0000 @@ -99,6 +99,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -520,6 +521,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -551,6 +555,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@ diff -Nru ceph-10.2.6/man/ceph.8 ceph-10.2.7/man/ceph.8 --- ceph-10.2.6/man/ceph.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph \- ceph administration tool . diff -Nru ceph-10.2.6/man/ceph-authtool.8 ceph-10.2.7/man/ceph-authtool.8 --- ceph-10.2.6/man/ceph-authtool.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-authtool.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-AUTHTOOL" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-AUTHTOOL" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-authtool \- ceph keyring manipulation tool . diff -Nru ceph-10.2.6/man/ceph-clsinfo.8 ceph-10.2.7/man/ceph-clsinfo.8 --- ceph-10.2.6/man/ceph-clsinfo.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-clsinfo.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-CLSINFO" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-CLSINFO" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-clsinfo \- show class object information . diff -Nru ceph-10.2.6/man/ceph-conf.8 ceph-10.2.7/man/ceph-conf.8 --- ceph-10.2.6/man/ceph-conf.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-conf.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-CONF" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-CONF" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-conf \- ceph conf file tool . diff -Nru ceph-10.2.6/man/ceph-create-keys.8 ceph-10.2.7/man/ceph-create-keys.8 --- ceph-10.2.6/man/ceph-create-keys.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-create-keys.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-CREATE-KEYS" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-CREATE-KEYS" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-create-keys \- ceph keyring generate tool . diff -Nru ceph-10.2.6/man/ceph-debugpack.8 ceph-10.2.7/man/ceph-debugpack.8 --- ceph-10.2.6/man/ceph-debugpack.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-debugpack.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-DEBUGPACK" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-DEBUGPACK" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-debugpack \- ceph debug packer utility . diff -Nru ceph-10.2.6/man/ceph-dencoder.8 ceph-10.2.7/man/ceph-dencoder.8 --- ceph-10.2.6/man/ceph-dencoder.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-dencoder.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-DENCODER" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-DENCODER" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-dencoder \- ceph encoder/decoder utility . diff -Nru ceph-10.2.6/man/ceph-deploy.8 ceph-10.2.7/man/ceph-deploy.8 --- ceph-10.2.6/man/ceph-deploy.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-deploy.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-DEPLOY" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-DEPLOY" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-deploy \- Ceph deployment tool . diff -Nru ceph-10.2.6/man/ceph-detect-init.8 ceph-10.2.7/man/ceph-detect-init.8 --- ceph-10.2.6/man/ceph-detect-init.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-detect-init.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-DETECT-INIT" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-DETECT-INIT" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-detect-init \- display the init system Ceph should use . diff -Nru ceph-10.2.6/man/ceph-disk.8 ceph-10.2.7/man/ceph-disk.8 --- ceph-10.2.6/man/ceph-disk.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-disk.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-DISK" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-DISK" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-disk \- Ceph disk utility for OSD . diff -Nru ceph-10.2.6/man/cephfs.8 ceph-10.2.7/man/cephfs.8 --- ceph-10.2.6/man/cephfs.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/cephfs.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPHFS" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPHFS" "8" "April 10, 2017" "dev" "Ceph" .SH NAME cephfs \- ceph file system options utility . diff -Nru ceph-10.2.6/man/ceph-fuse.8 ceph-10.2.7/man/ceph-fuse.8 --- ceph-10.2.6/man/ceph-fuse.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-fuse.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-FUSE" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-FUSE" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-fuse \- FUSE-based client for ceph . diff -Nru ceph-10.2.6/man/ceph-mds.8 ceph-10.2.7/man/ceph-mds.8 --- ceph-10.2.6/man/ceph-mds.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-mds.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-MDS" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-MDS" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-mds \- ceph metadata server daemon . diff -Nru ceph-10.2.6/man/ceph-mon.8 ceph-10.2.7/man/ceph-mon.8 --- ceph-10.2.6/man/ceph-mon.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-mon.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-MON" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-MON" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-mon \- ceph monitor daemon . diff -Nru ceph-10.2.6/man/ceph-osd.8 ceph-10.2.7/man/ceph-osd.8 --- ceph-10.2.6/man/ceph-osd.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-osd.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-OSD" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-OSD" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-osd \- ceph object storage daemon . diff -Nru ceph-10.2.6/man/ceph-post-file.8 ceph-10.2.7/man/ceph-post-file.8 --- ceph-10.2.6/man/ceph-post-file.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-post-file.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-POST-FILE" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-POST-FILE" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-post-file \- post files for ceph developers . diff -Nru ceph-10.2.6/man/ceph-rbdnamer.8 ceph-10.2.7/man/ceph-rbdnamer.8 --- ceph-10.2.6/man/ceph-rbdnamer.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-rbdnamer.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-RBDNAMER" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-RBDNAMER" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-rbdnamer \- udev helper to name RBD devices . diff -Nru ceph-10.2.6/man/ceph-rest-api.8 ceph-10.2.7/man/ceph-rest-api.8 --- ceph-10.2.6/man/ceph-rest-api.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-rest-api.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-REST-API" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-REST-API" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-rest-api \- ceph RESTlike administration server . diff -Nru ceph-10.2.6/man/ceph-run.8 ceph-10.2.7/man/ceph-run.8 --- ceph-10.2.6/man/ceph-run.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-run.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-RUN" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-RUN" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-run \- restart daemon on core dump . diff -Nru ceph-10.2.6/man/ceph-syn.8 ceph-10.2.7/man/ceph-syn.8 --- ceph-10.2.6/man/ceph-syn.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/ceph-syn.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CEPH-SYN" "8" "March 07, 2017" "dev" "Ceph" +.TH "CEPH-SYN" "8" "April 10, 2017" "dev" "Ceph" .SH NAME ceph-syn \- ceph synthetic workload generator . diff -Nru ceph-10.2.6/man/crushtool.8 ceph-10.2.7/man/crushtool.8 --- ceph-10.2.6/man/crushtool.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/crushtool.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CRUSHTOOL" "8" "March 07, 2017" "dev" "Ceph" +.TH "CRUSHTOOL" "8" "April 10, 2017" "dev" "Ceph" .SH NAME crushtool \- CRUSH map manipulation tool . diff -Nru ceph-10.2.6/man/librados-config.8 ceph-10.2.7/man/librados-config.8 --- ceph-10.2.6/man/librados-config.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/librados-config.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "LIBRADOS-CONFIG" "8" "March 07, 2017" "dev" "Ceph" +.TH "LIBRADOS-CONFIG" "8" "April 10, 2017" "dev" "Ceph" .SH NAME librados-config \- display information about librados . diff -Nru ceph-10.2.6/man/Makefile.in ceph-10.2.7/man/Makefile.in --- ceph-10.2.6/man/Makefile.in 2017-03-07 13:31:26.000000000 +0000 +++ ceph-10.2.7/man/Makefile.in 2017-04-10 11:45:18.000000000 +0000 @@ -158,6 +158,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -325,6 +326,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -356,6 +360,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@ diff -Nru ceph-10.2.6/man/monmaptool.8 ceph-10.2.7/man/monmaptool.8 --- ceph-10.2.6/man/monmaptool.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/monmaptool.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "MONMAPTOOL" "8" "March 07, 2017" "dev" "Ceph" +.TH "MONMAPTOOL" "8" "April 10, 2017" "dev" "Ceph" .SH NAME monmaptool \- ceph monitor cluster map manipulation tool . diff -Nru ceph-10.2.6/man/mount.ceph.8 ceph-10.2.7/man/mount.ceph.8 --- ceph-10.2.6/man/mount.ceph.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/mount.ceph.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "MOUNT.CEPH" "8" "March 07, 2017" "dev" "Ceph" +.TH "MOUNT.CEPH" "8" "April 10, 2017" "dev" "Ceph" .SH NAME mount.ceph \- mount a ceph file system . diff -Nru ceph-10.2.6/man/osdmaptool.8 ceph-10.2.7/man/osdmaptool.8 --- ceph-10.2.6/man/osdmaptool.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/osdmaptool.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "OSDMAPTOOL" "8" "March 07, 2017" "dev" "Ceph" +.TH "OSDMAPTOOL" "8" "April 10, 2017" "dev" "Ceph" .SH NAME osdmaptool \- ceph osd cluster map manipulation tool . diff -Nru ceph-10.2.6/man/rados.8 ceph-10.2.7/man/rados.8 --- ceph-10.2.6/man/rados.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rados.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RADOS" "8" "March 07, 2017" "dev" "Ceph" +.TH "RADOS" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rados \- rados object storage utility . diff -Nru ceph-10.2.6/man/radosgw.8 ceph-10.2.7/man/radosgw.8 --- ceph-10.2.6/man/radosgw.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/radosgw.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RADOSGW" "8" "March 07, 2017" "dev" "Ceph" +.TH "RADOSGW" "8" "April 10, 2017" "dev" "Ceph" .SH NAME radosgw \- rados REST gateway . diff -Nru ceph-10.2.6/man/radosgw-admin.8 ceph-10.2.7/man/radosgw-admin.8 --- ceph-10.2.6/man/radosgw-admin.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/radosgw-admin.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RADOSGW-ADMIN" "8" "March 07, 2017" "dev" "Ceph" +.TH "RADOSGW-ADMIN" "8" "April 10, 2017" "dev" "Ceph" .SH NAME radosgw-admin \- rados REST gateway user administration utility . diff -Nru ceph-10.2.6/man/rbd.8 ceph-10.2.7/man/rbd.8 --- ceph-10.2.6/man/rbd.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbd.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBD" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBD" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbd \- manage rados block device (RBD) images . diff -Nru ceph-10.2.6/man/rbd-fuse.8 ceph-10.2.7/man/rbd-fuse.8 --- ceph-10.2.6/man/rbd-fuse.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbd-fuse.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBD-FUSE" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBD-FUSE" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbd-fuse \- expose rbd images as files . diff -Nru ceph-10.2.6/man/rbdmap.8 ceph-10.2.7/man/rbdmap.8 --- ceph-10.2.6/man/rbdmap.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbdmap.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBDMAP" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBDMAP" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbdmap \- map RBD devices at boot time . diff -Nru ceph-10.2.6/man/rbd-mirror.8 ceph-10.2.7/man/rbd-mirror.8 --- ceph-10.2.6/man/rbd-mirror.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbd-mirror.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBD-MIRROR" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBD-MIRROR" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbd-mirror \- Ceph daemon for mirroring RBD images . diff -Nru ceph-10.2.6/man/rbd-nbd.8 ceph-10.2.7/man/rbd-nbd.8 --- ceph-10.2.6/man/rbd-nbd.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbd-nbd.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBD-NBD" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBD-NBD" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbd-nbd \- map rbd images to nbd device . diff -Nru ceph-10.2.6/man/rbd-replay.8 ceph-10.2.7/man/rbd-replay.8 --- ceph-10.2.6/man/rbd-replay.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbd-replay.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBD-REPLAY" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBD-REPLAY" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbd-replay \- replay rados block device (RBD) workloads . diff -Nru ceph-10.2.6/man/rbd-replay-many.8 ceph-10.2.7/man/rbd-replay-many.8 --- ceph-10.2.6/man/rbd-replay-many.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbd-replay-many.8 2017-04-10 11:45:56.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBD-REPLAY-MANY" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBD-REPLAY-MANY" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbd-replay-many \- replay a rados block device (RBD) workload on several clients . diff -Nru ceph-10.2.6/man/rbd-replay-prep.8 ceph-10.2.7/man/rbd-replay-prep.8 --- ceph-10.2.6/man/rbd-replay-prep.8 2017-03-07 13:32:03.000000000 +0000 +++ ceph-10.2.7/man/rbd-replay-prep.8 2017-04-10 11:45:55.000000000 +0000 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "RBD-REPLAY-PREP" "8" "March 07, 2017" "dev" "Ceph" +.TH "RBD-REPLAY-PREP" "8" "April 10, 2017" "dev" "Ceph" .SH NAME rbd-replay-prep \- prepare captured rados block device (RBD) workloads for replay . diff -Nru ceph-10.2.6/qa/suites/rados/basic/tasks/repair_test.yaml ceph-10.2.7/qa/suites/rados/basic/tasks/repair_test.yaml --- ceph-10.2.6/qa/suites/rados/basic/tasks/repair_test.yaml 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/suites/rados/basic/tasks/repair_test.yaml 2017-04-10 11:44:25.000000000 +0000 @@ -1,6 +1,21 @@ overrides: ceph: - log-whitelist: ['candidate had a stat error', 'candidate had a read error', 'deep-scrub 0 missing, 1 inconsistent objects', 'deep-scrub 0 missing, 4 inconsistent objects', 'deep-scrub 1 errors', 'deep-scrub 4 errors', '!= known omap_digest', '!= known data_digest', 'repair 0 missing, 1 inconsistent objects', 'repair 0 missing, 4 inconsistent objects', 'repair 1 errors, 1 fixed', 'repair 4 errors, 4 fixed', 'scrub 0 missing, 1 inconsistent', 'scrub 1 errors', 'size 1 != known size', '!= best guess'] + log-whitelist: + - candidate had a stat error + - candidate had a read error + - deep-scrub 0 missing, 1 inconsistent objects + - deep-scrub 0 missing, 4 inconsistent objects + - deep-scrub [0-9]+ errors + - '!= omap_digest' + - '!= data_digest' + - repair 0 missing, 1 inconsistent objects + - repair 0 missing, 4 inconsistent objects + - repair [0-9]+ errors, [0-9]+ fixed + - scrub 0 missing, 1 inconsistent objects + - scrub [0-9]+ errors + - 'size 1 != size' + - attr name mismatch + - Regular scrub request, losing deep-scrub details conf: osd: filestore debug inject read err : true diff -Nru ceph-10.2.6/qa/suites/rados/basic/tasks/scrub_test.yaml ceph-10.2.7/qa/suites/rados/basic/tasks/scrub_test.yaml --- ceph-10.2.6/qa/suites/rados/basic/tasks/scrub_test.yaml 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/suites/rados/basic/tasks/scrub_test.yaml 2017-04-10 11:44:25.000000000 +0000 @@ -1,18 +1,22 @@ overrides: ceph: log-whitelist: - - '!= best guess digest' - - '!= best guess data_digest' - - '!= best guess omap_digest' - - '!= known digest' - - '!= known data_digest' - - '!= known omap_digest' - - deep-scrub 0 missing, 1 inconsistent objects - - deep-scrub 1 errors - - repair 0 missing, 1 inconsistent objects - - repair 1 errors, 1 fixed - - shard [0-9]+ missing - - deep-scrub 1 missing, 0 inconsistent objects + - '!= data_digest' + - '!= omap_digest' + - '!= size' + - 'deep-scrub 0 missing, 1 inconsistent objects' + - 'deep-scrub [0-9]+ errors' + - 'repair 0 missing, 1 inconsistent objects' + - 'repair [0-9]+ errors, [0-9]+ fixed' + - 'shard [0-9]+ missing' + - 'deep-scrub 1 missing, 1 inconsistent objects' + - 'does not match object info size' + - 'attr name mistmatch' + - 'deep-scrub 1 missing, 0 inconsistent objects' + - 'failed to pick suitable auth object' + conf: + osd: + osd deep scrub update digest min age: 0 tasks: - install: - ceph: diff -Nru ceph-10.2.6/qa/suites/rados/thrash/workloads/pool-snaps-few-objects.yaml ceph-10.2.7/qa/suites/rados/thrash/workloads/pool-snaps-few-objects.yaml --- ceph-10.2.6/qa/suites/rados/thrash/workloads/pool-snaps-few-objects.yaml 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/suites/rados/thrash/workloads/pool-snaps-few-objects.yaml 2017-04-10 11:44:25.000000000 +0000 @@ -1,3 +1,7 @@ +override: + conf: + osd: + osd deep scrub update digest min age: 0 tasks: - rados: clients: [client.0] diff -Nru ceph-10.2.6/qa/suites/rgw/singleton/all/radosgw-admin.yaml ceph-10.2.7/qa/suites/rgw/singleton/all/radosgw-admin.yaml --- ceph-10.2.6/qa/suites/rgw/singleton/all/radosgw-admin.yaml 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/suites/rgw/singleton/all/radosgw-admin.yaml 2017-04-10 11:44:25.000000000 +0000 @@ -4,7 +4,6 @@ - volumes: # attached to each instance count: 4 size: 10 # GB ->>>>>>> 8af4c35f95... qa/suites/rgw: Add openstack volume configuration tasks: - install: - ceph: diff -Nru ceph-10.2.6/qa/tasks/repair_test.py ceph-10.2.7/qa/tasks/repair_test.py --- ceph-10.2.6/qa/tasks/repair_test.py 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/tasks/repair_test.py 2017-04-10 11:44:25.000000000 +0000 @@ -265,16 +265,17 @@ - 'candidate had a read error' - 'deep-scrub 0 missing, 1 inconsistent objects' - 'deep-scrub 0 missing, 4 inconsistent objects' - - 'deep-scrub 1 errors' - - 'deep-scrub 4 errors' - - '!= known omap_digest' + - 'deep-scrub [0-9]+ errors' + - '!= omap_digest' + - '!= data_digest' - 'repair 0 missing, 1 inconsistent objects' - 'repair 0 missing, 4 inconsistent objects' - - 'repair 1 errors, 1 fixed' - - 'repair 4 errors, 4 fixed' - - 'scrub 0 missing, 1 inconsistent' - - 'scrub 1 errors' - - 'size 1 != known size' + - 'repair [0-9]+ errors, [0-9]+ fixed' + - 'scrub 0 missing, 1 inconsistent objects' + - 'scrub [0-9]+ errors' + - 'size 1 != size' + - 'attr name mismatch' + - 'Regular scrub request, losing deep-scrub details' conf: osd: filestore debug inject read err: true diff -Nru ceph-10.2.6/qa/tasks/scrub_test.py ceph-10.2.7/qa/tasks/scrub_test.py --- ceph-10.2.6/qa/tasks/scrub_test.py 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/tasks/scrub_test.py 2017-04-10 11:44:25.000000000 +0000 @@ -271,7 +271,7 @@ self._check_attrs(inc, 'data_digest') def missing(self, inc): - assert 'missing' in inc['errors'] + assert 'missing' in inc['union_shard_errors'] self._check_errors(inc, 'missing') def size_mismatch(self, inc): @@ -291,6 +291,10 @@ omap_val = 'val' manager.do_rados(mon, ['-p', pool, 'setomapval', obj_name, omap_key, omap_val]) + # Update missing digests, requires "osd deep scrub update digest min age: 0" + pgnum = get_pgnum(pg) + manager.do_pg_scrub(pool, pgnum, 'deep-scrub') + messup = MessUp(manager, osd_remote, pool, osd_id, obj_name, obj_path, omap_key, omap_val) for test in [messup.rm_omap, messup.add_omap, messup.change_omap, @@ -329,12 +333,22 @@ - install: - ceph: log-whitelist: - - '!= known digest' - - '!= known omap_digest' + - '!= data_digest' + - '!= omap_digest' + - '!= size' - deep-scrub 0 missing, 1 inconsistent objects - - deep-scrub 1 errors + - deep-scrub [0-9]+ errors - repair 0 missing, 1 inconsistent objects - - repair 1 errors, 1 fixed + - repair [0-9]+ errors, [0-9]+ fixed + - shard [0-9]+ missing + - deep-scrub 1 missing, 1 inconsistent objects + - does not match object info size + - attr name mistmatch + - deep-scrub 1 missing, 0 inconsistent objects + - failed to pick suitable auth object + conf: + osd: + osd deep scrub update digest min age: 0 - scrub_test: """ if config is None: @@ -375,6 +389,10 @@ manager.do_rados(mon, ['-p', 'rbd', 'setomapheader', obj_name, 'hdr']) log.info('err is %d' % p.exitstatus) + # Update missing digests, requires "osd deep scrub update digest min age: 0" + pgnum = get_pgnum(pg) + manager.do_pg_scrub('rbd', pgnum, 'deep-scrub') + log.info('messing with PG %s on osd %d' % (pg, osd)) test_repair_corrupted_obj(ctx, manager, pg, osd_remote, obj_path, 'rbd') test_repair_bad_omap(ctx, manager, pg, osd, obj_name) diff -Nru ceph-10.2.6/qa/workunits/ceph-helpers.sh ceph-10.2.7/qa/workunits/ceph-helpers.sh --- ceph-10.2.6/qa/workunits/ceph-helpers.sh 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/workunits/ceph-helpers.sh 2017-04-10 11:44:25.000000000 +0000 @@ -897,6 +897,8 @@ # @param STDOUT the output of ceph-objectstore-tool # @return 0 on success, 1 on error # +# The value of $ceph_osd_args will be passed to restarted osds +# function objectstore_tool() { local dir=$1 shift @@ -909,7 +911,7 @@ --data-path $osd_data \ --journal-path $osd_data/journal \ "$@" || return 1 - activate_osd $dir $id >&2 || return 1 + activate_osd $dir $id $ceph_osd_args >&2 || return 1 wait_for_clean >&2 } @@ -1031,8 +1033,9 @@ # function get_last_scrub_stamp() { local pgid=$1 + local sname=${2:-last_scrub_stamp} ceph --format xml pg dump pgs 2>/dev/null | \ - $XMLSTARLET sel -t -m "//pg_stat[pgid='$pgid']/last_scrub_stamp" -v . + $XMLSTARLET sel -t -m "//pg_stat[pgid='$pgid']/$sname" -v . } function test_get_last_scrub_stamp() { @@ -1171,6 +1174,13 @@ wait_for_scrub $pgid "$last_scrub" } +function pg_deep_scrub() { + local pgid=$1 + local last_scrub=$(get_last_scrub_stamp $pgid last_deep_scrub_stamp) + ceph pg deep-scrub $pgid + wait_for_scrub $pgid "$last_scrub" last_deep_scrub_stamp +} + function test_pg_scrub() { local dir=$1 @@ -1250,9 +1260,10 @@ function wait_for_scrub() { local pgid=$1 local last_scrub="$2" + local sname=${3:-last_scrub_stamp} for ((i=0; i < $TIMEOUT; i++)); do - if test "$last_scrub" != "$(get_last_scrub_stamp $pgid)" ; then + if test "$last_scrub" != "$(get_last_scrub_stamp $pgid $sname)" ; then return 0 fi sleep 1 diff -Nru ceph-10.2.6/qa/workunits/cephtool/test.sh ceph-10.2.7/qa/workunits/cephtool/test.sh --- ceph-10.2.6/qa/workunits/cephtool/test.sh 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/qa/workunits/cephtool/test.sh 2017-04-10 11:44:25.000000000 +0000 @@ -1217,7 +1217,7 @@ ceph osd pool delete data data --yes-i-really-really-mean-it ceph osd pause - ceph osd dump | grep 'flags pauserd,pausewr' + ceph osd dump | grep 'flags.*pauserd,pausewr' ceph osd unpause ceph osd tree diff -Nru ceph-10.2.6/selinux/Makefile.in ceph-10.2.7/selinux/Makefile.in --- ceph-10.2.6/selinux/Makefile.in 2017-03-07 13:31:26.000000000 +0000 +++ ceph-10.2.7/selinux/Makefile.in 2017-04-10 11:45:18.000000000 +0000 @@ -99,6 +99,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -234,6 +235,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -265,6 +269,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@ diff -Nru ceph-10.2.6/src/civetweb/civetweb.h ceph-10.2.7/src/civetweb/civetweb.h --- ceph-10.2.6/src/civetweb/civetweb.h 2017-03-07 13:31:04.000000000 +0000 +++ ceph-10.2.7/src/civetweb/civetweb.h 2017-04-10 11:45:02.000000000 +0000 @@ -305,6 +305,10 @@ CIVETWEB_API struct mg_request_info *mg_get_request_info(struct mg_connection *); +/* Return the local address (server side) of the socket for a connection */ +CIVETWEB_API struct sockaddr * +mg_get_local_addr(struct mg_connection *); + /* Send data to the client. Return: 0 when the connection has been closed diff -Nru ceph-10.2.6/src/civetweb/include/civetweb.h ceph-10.2.7/src/civetweb/include/civetweb.h --- ceph-10.2.6/src/civetweb/include/civetweb.h 2017-03-07 13:31:04.000000000 +0000 +++ ceph-10.2.7/src/civetweb/include/civetweb.h 2017-04-10 11:45:02.000000000 +0000 @@ -305,6 +305,10 @@ CIVETWEB_API struct mg_request_info *mg_get_request_info(struct mg_connection *); +/* Return the local address (server side) of the socket for a connection */ +CIVETWEB_API struct sockaddr * +mg_get_local_addr(struct mg_connection *); + /* Send data to the client. Return: 0 when the connection has been closed diff -Nru ceph-10.2.6/src/civetweb/src/civetweb.c ceph-10.2.7/src/civetweb/src/civetweb.c --- ceph-10.2.6/src/civetweb/src/civetweb.c 2017-03-07 13:31:04.000000000 +0000 +++ ceph-10.2.7/src/civetweb/src/civetweb.c 2017-04-10 11:45:02.000000000 +0000 @@ -1169,6 +1169,11 @@ return &conn->request_info; } +struct sockaddr *mg_get_local_addr(struct mg_connection *conn) +{ + return &conn->client.lsa.sa; +} + /* Skip the characters until one of the delimiters characters found. 0-terminate resulting word. Skip the delimiter and following whitespaces. Advance pointer to buffer to the next word. Return found 0-terminated word. @@ -3493,8 +3498,10 @@ if (host == NULL) { snprintf(ebuf, ebuf_len, "%s", "NULL host"); +#ifndef NO_SSL_DL } else if (use_ssl && SSLv23_client_method == NULL) { snprintf(ebuf, ebuf_len, "%s", "SSL is not initialized"); +#endif /* TODO(lsm): use something threadsafe instead of gethostbyname() */ } else if ((he = gethostbyname(host)) == NULL) { snprintf(ebuf, ebuf_len, "gethostbyname(%s): %s", host, strerror(ERRNO)); @@ -3994,6 +4001,7 @@ } } +#ifndef RGW static int is_valid_http_method(const char *method) { return !strcmp(method, "GET") || !strcmp(method, "POST") || @@ -4003,6 +4011,7 @@ || !strcmp(method, "MKCOL") ; } +#endif /* Parse HTTP request, fill in mg_request_info structure. This function modifies the buffer by NUL-terminating diff -Nru ceph-10.2.6/src/CMakeLists.txt ceph-10.2.7/src/CMakeLists.txt --- ceph-10.2.6/src/CMakeLists.txt 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/CMakeLists.txt 2017-04-10 11:44:25.000000000 +0000 @@ -476,6 +476,7 @@ tools/RadosDump.cc tools/rados/RadosImport.cc tools/rados/PoolDump.cc + common/util.cc common/obj_bencher.cc) add_executable(rados ${rados_srcs}) target_link_libraries(rados librados global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} libradosstriper) @@ -1175,15 +1176,22 @@ set(civetweb_common_files civetweb/src/civetweb.c) add_library(civetweb_common_objs OBJECT ${civetweb_common_files}) - target_include_directories(civetweb_common_objs PUBLIC + target_include_directories(civetweb_common_objs PRIVATE "${CMAKE_SOURCE_DIR}/src/civetweb/include") - if(HAVE_OPENSSL) set_property(TARGET civetweb_common_objs - APPEND PROPERTY COMPILE_DEFINITIONS NO_SSL_DL=1) - target_include_directories(civetweb_common_objs PUBLIC - "${OPENSSL_INCLUDE_DIR}") - else(HAVE_OPENSSL) - endif(HAVE_OPENSSL) + APPEND PROPERTY COMPILE_DEFINITIONS USE_IPV6=1) + if(USE_OPENSSL) + set_property(TARGET civetweb_common_objs + APPEND PROPERTY COMPILE_DEFINITIONS NO_SSL_DL=1) + target_include_directories(civetweb_common_objs PRIVATE + "${SSL_INCLUDE_DIR}") + endif(USE_OPENSSL) + if (LIBSSL_SONAME) + set_property(TARGET civetweb_common_objs + APPEND PROPERTY COMPILE_DEFINITIONS SSL_LIB="${LIBSSL_SONAME}") + set_property(TARGET civetweb_common_objs + APPEND PROPERTY COMPILE_DEFINITIONS CRYPTO_LIB="${LIBCRYPTO_SONAME}") + endif() add_library(rgw_a STATIC ${rgw_a_srcs}) target_link_libraries(rgw_a librados cls_rgw_client cls_refcount_client diff -Nru ceph-10.2.6/src/common/cohort_lru.h ceph-10.2.7/src/common/cohort_lru.h --- ceph-10.2.6/src/common/cohort_lru.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/common/cohort_lru.h 2017-04-10 11:44:25.000000000 +0000 @@ -131,18 +131,14 @@ for (int ix = 0; ix < n_lanes; ++ix, lane_ix = next_evict_lane()) { Lane& lane = qlane[lane_ix]; - /* hiwat check */ - /* XXX try the hiwat check unlocked, then recheck locked */ - if (lane.q.size() > lane_hiwat) { - lane.lock.lock(); - if (lane.q.size() <= lane_hiwat) { - lane.lock.unlock(); - continue; - } - } else - continue; - // XXXX if object at LRU has refcnt==1, take it + /* if object at LRU has refcnt==1, it may be reclaimable */ Object* o = &(lane.q.back()); +#if 0 /* XXX save for refactor */ + std::cout << __func__ + << " " << o + << " refcnt: " << o->lru_refcnt + << std::endl; +#endif if (can_reclaim(o)) { ++(o->lru_refcnt); o->lru_flags |= FLAG_EVICTING; @@ -213,6 +209,23 @@ delete o; } lane.lock.unlock(); + } else if (unlikely(refcnt == SENTINEL_REFCNT)) { + Lane& lane = lane_of(o); + lane.lock.lock(); + refcnt = o->lru_refcnt.load(); + if (likely(refcnt == SENTINEL_REFCNT)) { + /* move to LRU */ + Object::Queue::iterator it = + Object::Queue::s_iterator_to(*o); + lane.q.erase(it); + /* hiwat check */ + if (lane.q.size() > lane_hiwat) { + delete o; + } else { + lane.q.push_back(*o); + } + } + lane.lock.unlock(); } } /* unref */ diff -Nru ceph-10.2.6/src/common/config_opts.h ceph-10.2.7/src/common/config_opts.h --- ceph-10.2.6/src/common/config_opts.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/common/config_opts.h 2017-04-10 11:44:25.000000000 +0000 @@ -1314,6 +1314,7 @@ OPTION(rgw_enforce_swift_acls, OPT_BOOL, true) OPTION(rgw_swift_token_expiration, OPT_INT, 24 * 3600) // time in seconds for swift token expiration OPTION(rgw_print_continue, OPT_BOOL, true) // enable if 100-Continue works +OPTION(rgw_print_prohibited_content_length, OPT_BOOL, false) // violate RFC 7230 and send Content-Length in 204 and 304 OPTION(rgw_remote_addr_param, OPT_STR, "REMOTE_ADDR") // e.g. X-Forwarded-For, if you have a reverse proxy OPTION(rgw_op_thread_timeout, OPT_INT, 10*60) OPTION(rgw_op_thread_suicide_timeout, OPT_INT, 0) diff -Nru ceph-10.2.6/src/common/scrub_types.cc ceph-10.2.7/src/common/scrub_types.cc --- ceph-10.2.6/src/common/scrub_types.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/common/scrub_types.cc 2017-04-10 11:44:25.000000000 +0000 @@ -27,6 +27,29 @@ reinterpret_cast(obj).encode(bl); } +void osd_shard_wrapper::encode(bufferlist& bl) const +{ + ENCODE_START(1, 1, bl); + ::encode(osd, bl); + ::encode(shard, bl); + ENCODE_FINISH(bl); +} + +void osd_shard_wrapper::decode(bufferlist::iterator& bp) +{ + DECODE_START(1, bp); + ::decode(osd, bp); + ::decode(shard, bp); + DECODE_FINISH(bp); +} + +namespace librados { + static void encode(const osd_shard_t& shard, bufferlist& bl) + { + reinterpret_cast(shard).encode(bl); + } +} + void shard_info_wrapper::set_object(const ScrubMap::object& object) { for (auto attr : object.attrs) { @@ -43,17 +66,11 @@ data_digest_present = true; data_digest = object.digest; } - if (object.read_error) { - errors |= SHARD_READ_ERR; - } - if (object.stat_error) { - errors |= SHARD_STAT_ERR; - } } void shard_info_wrapper::encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); + ENCODE_START(2, 1, bl); ::encode(errors, bl); if (has_shard_missing()) { return; @@ -64,12 +81,13 @@ ::encode(omap_digest, bl); ::encode(data_digest_present, bl); ::encode(data_digest, bl); + ::encode(selected_oi, bl); ENCODE_FINISH(bl); } void shard_info_wrapper::decode(bufferlist::iterator& bp) { - DECODE_START(1, bp); + DECODE_START(2, bp); ::decode(errors, bp); if (has_shard_missing()) { return; @@ -80,6 +98,8 @@ ::decode(omap_digest, bp); ::decode(data_digest_present, bp); ::decode(data_digest, bp); + if (struct_v > 1) + ::decode(selected_oi, bp); DECODE_FINISH(bp); } @@ -92,28 +112,28 @@ void inconsistent_obj_wrapper::add_shard(const pg_shard_t& pgs, const shard_info_wrapper& shard) { - errors |= shard.errors; - shards[pgs.osd] = shard; + union_shards.errors |= shard.errors; + shards.emplace(osd_shard_t{pgs.osd, int8_t(pgs.shard)}, shard); } void inconsistent_obj_wrapper::set_auth_missing(const hobject_t& hoid, - const map& maps) + const map& maps, + map &shard_map, + int &shallow_errors, int &deep_errors) { - errors |= (err_t::SHARD_MISSING | - err_t::SHARD_READ_ERR | - err_t::OMAP_DIGEST_MISMATCH | - err_t::DATA_DIGEST_MISMATCH | - err_t::ATTR_MISMATCH); for (auto pg_map : maps) { auto oid_object = pg_map.second->objects.find(hoid); - shard_info_wrapper shard; - if (oid_object == pg_map.second->objects.end()) { - shard.set_missing(); - } else { - shard.set_object(oid_object->second); - } - shards[pg_map.first.osd] = shard; + if (oid_object == pg_map.second->objects.end()) + shard_map[pg_map.first].set_missing(); + else + shard_map[pg_map.first].set_object(oid_object->second); + if (shard_map[pg_map.first].has_deep_errors()) + ++deep_errors; + else if (shard_map[pg_map.first].has_shallow_errors()) + ++shallow_errors; + union_shards.errors |= shard_map[pg_map.first].errors; + shards.emplace(osd_shard_t{pg_map.first.osd, pg_map.first.shard}, shard_map[pg_map.first]); } } @@ -126,19 +146,24 @@ void inconsistent_obj_wrapper::encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); + ENCODE_START(2, 2, bl); ::encode(errors, bl); ::encode(object, bl); + ::encode(version, bl); ::encode(shards, bl); + ::encode(union_shards.errors, bl); ENCODE_FINISH(bl); } void inconsistent_obj_wrapper::decode(bufferlist::iterator& bp) { - DECODE_START(1, bp); + DECODE_START(2, bp); + DECODE_OLDEST(2); ::decode(errors, bp); ::decode(object, bp); + ::decode(version, bp); ::decode(shards, bp); + ::decode(union_shards.errors, bp); DECODE_FINISH(bp); } diff -Nru ceph-10.2.6/src/common/scrub_types.h ceph-10.2.7/src/common/scrub_types.h --- ceph-10.2.6/src/common/scrub_types.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/common/scrub_types.h 2017-04-10 11:44:25.000000000 +0000 @@ -25,6 +25,19 @@ reinterpret_cast(obj).decode(bp); } +struct osd_shard_wrapper : public librados::osd_shard_t { + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& bp); +}; + +WRITE_CLASS_ENCODER(osd_shard_wrapper) + +namespace librados { + inline void decode(librados::osd_shard_t& shard, bufferlist::iterator& bp) { + reinterpret_cast(shard).decode(bp); + } +} + struct shard_info_wrapper : public librados::shard_info_t { public: shard_info_wrapper() = default; @@ -35,29 +48,38 @@ void set_missing() { errors |= err_t::SHARD_MISSING; } - void set_omap_digest_mismatch() { - errors |= err_t::OMAP_DIGEST_MISMATCH; - } void set_omap_digest_mismatch_oi() { errors |= err_t::OMAP_DIGEST_MISMATCH_OI; } - void set_data_digest_mismatch() { - errors |= err_t::DATA_DIGEST_MISMATCH; + void set_size_mismatch_oi() { + errors |= err_t::SIZE_MISMATCH_OI; } void set_data_digest_mismatch_oi() { errors |= err_t::DATA_DIGEST_MISMATCH_OI; } - void set_size_mismatch() { - errors |= err_t::SIZE_MISMATCH; + void set_read_error() { + errors |= err_t::SHARD_READ_ERR; } - void set_attr_missing() { - errors |= err_t::ATTR_MISSING; + void set_stat_error() { + errors |= err_t::SHARD_STAT_ERR; } - void set_attr_mismatch() { - errors |= err_t::ATTR_MISMATCH; + void set_ec_hash_mismatch() { + errors |= err_t::SHARD_EC_HASH_MISMATCH; } - void set_attr_unexpected() { - errors |= err_t::ATTR_UNEXPECTED; + void set_ec_size_mismatch() { + errors |= err_t::SHARD_EC_SIZE_MISMATCH; + } + void set_oi_attr_missing() { + errors |= err_t::OI_ATTR_MISSING; + } + void set_oi_attr_corrupted() { + errors |= err_t::OI_ATTR_CORRUPTED; + } + void set_ss_attr_missing() { + errors |= err_t::SS_ATTR_MISSING; + } + void set_ss_attr_corrupted() { + errors |= err_t::SS_ATTR_CORRUPTED; } void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bp); @@ -75,9 +97,30 @@ struct inconsistent_obj_wrapper : librados::inconsistent_obj_t { inconsistent_obj_wrapper(const hobject_t& hoid); + void set_object_info_inconsistency() { + errors |= obj_err_t::OBJECT_INFO_INCONSISTENCY; + } + void set_omap_digest_mismatch() { + errors |= obj_err_t::OMAP_DIGEST_MISMATCH; + } + void set_data_digest_mismatch() { + errors |= obj_err_t::DATA_DIGEST_MISMATCH; + } + void set_size_mismatch() { + errors |= obj_err_t::SIZE_MISMATCH; + } + void set_attr_value_mismatch() { + errors |= obj_err_t::ATTR_VALUE_MISMATCH; + } + void set_attr_name_mismatch() { + errors |= obj_err_t::ATTR_NAME_MISMATCH; + } void add_shard(const pg_shard_t& pgs, const shard_info_wrapper& shard); void set_auth_missing(const hobject_t& hoid, - const map& map); + const map&, + map&, + int &shallow_errors, int &deep_errors); + void set_version(uint64_t ver) { version = ver; } void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bp); }; diff -Nru ceph-10.2.6/src/common/util.cc ceph-10.2.7/src/common/util.cc --- ceph-10.2.6/src/common/util.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/common/util.cc 2017-04-10 11:44:25.000000000 +0000 @@ -263,3 +263,39 @@ } f->close_section(); } + + +// If non-printable characters found then convert bufferlist to +// base64 encoded string indicating whether it did. +string cleanbin(bufferlist &bl, bool &base64) +{ + bufferlist::iterator it; + for (it = bl.begin(); it != bl.end(); ++it) { + if (iscntrl(*it)) + break; + } + if (it == bl.end()) { + base64 = false; + string result(bl.c_str(), bl.length()); + return result; + } + + bufferlist b64; + bl.encode_base64(b64); + string encoded(b64.c_str(), b64.length()); + base64 = true; + return encoded; +} + +// If non-printable characters found then convert to "Base64:" followed by +// base64 encoding +string cleanbin(string &str) +{ + bool base64; + bufferlist bl; + bl.append(str); + string result = cleanbin(bl, base64); + if (base64) + result = "Base64:" + result; + return result; +} diff -Nru ceph-10.2.6/src/.git_version ceph-10.2.7/src/.git_version --- ceph-10.2.6/src/.git_version 2017-03-07 13:31:58.000000000 +0000 +++ ceph-10.2.7/src/.git_version 2017-04-10 11:45:50.000000000 +0000 @@ -1,2 +1,2 @@ -656b5b63ed7c43bd014bcafd81b001959d5f089f -v10.2.6 +50e863e0f4bc8f4b9e31156de690d765af245185 +v10.2.7 diff -Nru ceph-10.2.6/src/include/rados/rados_types.hpp ceph-10.2.7/src/include/rados/rados_types.hpp --- ceph-10.2.6/src/include/rados/rados_types.hpp 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/include/rados/rados_types.hpp 2017-04-10 11:44:25.000000000 +0000 @@ -51,24 +51,24 @@ }; struct err_t { - enum { - ATTR_UNEXPECTED = 1 << 0, + enum : uint64_t { SHARD_MISSING = 1 << 1, SHARD_STAT_ERR = 1 << 2, SHARD_READ_ERR = 1 << 3, - DATA_DIGEST_MISMATCH = 1 << 4, - OMAP_DIGEST_MISMATCH = 1 << 5, - SIZE_MISMATCH = 1 << 6, - ATTR_MISMATCH = 1 << 7, - ATTR_MISSING = 1 << 8, DATA_DIGEST_MISMATCH_OI = 1 << 9, OMAP_DIGEST_MISMATCH_OI = 1 << 10, SIZE_MISMATCH_OI = 1 << 11, + SHARD_EC_HASH_MISMATCH = 1 << 12, + SHARD_EC_SIZE_MISMATCH = 1 << 13, + OI_ATTR_MISSING = 1 << 14, + OI_ATTR_CORRUPTED = 1 << 15, + SS_ATTR_MISSING = 1 << 16, + SS_ATTR_CORRUPTED = 1 << 17 + // When adding more here add to either SHALLOW_ERRORS or DEEP_ERRORS }; uint64_t errors = 0; - bool has_attr_unexpected() const { - return errors & ATTR_UNEXPECTED; - } + static constexpr uint64_t SHALLOW_ERRORS = SHARD_MISSING|SHARD_STAT_ERR|SIZE_MISMATCH_OI|OI_ATTR_MISSING|OI_ATTR_CORRUPTED|SS_ATTR_MISSING|SS_ATTR_CORRUPTED; + static constexpr uint64_t DEEP_ERRORS = SHARD_READ_ERR|DATA_DIGEST_MISMATCH_OI|OMAP_DIGEST_MISMATCH_OI|SHARD_EC_HASH_MISMATCH|SHARD_EC_SIZE_MISMATCH; bool has_shard_missing() const { return errors & SHARD_MISSING; } @@ -78,31 +78,38 @@ bool has_read_error() const { return errors & SHARD_READ_ERR; } - bool has_data_digest_mismatch() const { - return errors & DATA_DIGEST_MISMATCH; - } - bool has_omap_digest_mismatch() const { - return errors & OMAP_DIGEST_MISMATCH; - } - // deep error bool has_data_digest_mismatch_oi() const { return errors & DATA_DIGEST_MISMATCH_OI; } - // deep error bool has_omap_digest_mismatch_oi() const { return errors & OMAP_DIGEST_MISMATCH_OI; } - bool has_size_mismatch() const { - return errors & SIZE_MISMATCH; - } bool has_size_mismatch_oi() const { return errors & SIZE_MISMATCH_OI; } - bool has_attr_mismatch() const { - return errors & ATTR_MISMATCH; + bool has_ec_hash_error() const { + return errors & SHARD_EC_HASH_MISMATCH; + } + bool has_ec_size_error() const { + return errors & SHARD_EC_SIZE_MISMATCH; + } + bool has_oi_attr_missing() const { + return errors & OI_ATTR_MISSING; + } + bool has_oi_attr_corrupted() const { + return errors & OI_ATTR_CORRUPTED; + } + bool has_ss_attr_missing() const { + return errors & SS_ATTR_MISSING; } - bool has_attr_missing() const { - return errors & ATTR_MISSING; + bool has_ss_attr_corrupted() const { + return errors & SS_ATTR_CORRUPTED; + } + bool has_shallow_errors() const { + return errors & SHALLOW_ERRORS; + } + bool has_deep_errors() const { + return errors & DEEP_ERRORS; } }; @@ -113,16 +120,72 @@ uint32_t omap_digest = 0; bool data_digest_present = false; uint32_t data_digest = 0; + bool selected_oi = false; +}; + +struct osd_shard_t { + int32_t osd; + int8_t shard; +}; + +inline bool operator<(const osd_shard_t &lhs, const osd_shard_t &rhs) { + if (lhs.osd < rhs.osd) + return true; + else if (lhs.osd > rhs.osd) + return false; + else + return lhs.shard < rhs.shard; +} + +struct obj_err_t { + enum : uint64_t { + OBJECT_INFO_INCONSISTENCY = 1 << 1, + // XXX: Can an older rados binary work if these bits stay the same? + DATA_DIGEST_MISMATCH = 1 << 4, + OMAP_DIGEST_MISMATCH = 1 << 5, + SIZE_MISMATCH = 1 << 6, + ATTR_VALUE_MISMATCH = 1 << 7, + ATTR_NAME_MISMATCH = 1 << 8, + // When adding more here add to either SHALLOW_ERRORS or DEEP_ERRORS + }; + uint64_t errors = 0; + static constexpr uint64_t SHALLOW_ERRORS = OBJECT_INFO_INCONSISTENCY|SIZE_MISMATCH|ATTR_VALUE_MISMATCH|ATTR_NAME_MISMATCH; + static constexpr uint64_t DEEP_ERRORS = DATA_DIGEST_MISMATCH|OMAP_DIGEST_MISMATCH; + bool has_object_info_inconsistency() const { + return errors & OBJECT_INFO_INCONSISTENCY; + } + bool has_data_digest_mismatch() const { + return errors & DATA_DIGEST_MISMATCH; + } + bool has_omap_digest_mismatch() const { + return errors & OMAP_DIGEST_MISMATCH; + } + bool has_size_mismatch() const { + return errors & SIZE_MISMATCH; + } + bool has_attr_value_mismatch() const { + return errors & ATTR_VALUE_MISMATCH; + } + bool has_attr_name_mismatch() const { + return errors & ATTR_NAME_MISMATCH; + } + bool has_shallow_errors() const { + return errors & SHALLOW_ERRORS; + } + bool has_deep_errors() const { + return errors & DEEP_ERRORS; + } }; -struct inconsistent_obj_t : err_t { +struct inconsistent_obj_t : obj_err_t { inconsistent_obj_t() = default; inconsistent_obj_t(const object_id_t& object) - : object{object} + : object{object}, version(0) {} object_id_t object; - // osd => shard_info - std::map shards; + uint64_t version; // XXX: Redundant with object info attr + std::map shards; + err_t union_shards; }; struct inconsistent_snapset_t { diff -Nru ceph-10.2.6/src/include/rados/rgw_file.h ceph-10.2.7/src/include/rados/rgw_file.h --- ceph-10.2.6/src/include/rados/rgw_file.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/include/rados/rgw_file.h 2017-04-10 11:44:25.000000000 +0000 @@ -26,7 +26,7 @@ #define LIBRGW_FILE_VER_MAJOR 1 #define LIBRGW_FILE_VER_MINOR 1 -#define LIBRGW_FILE_VER_EXTRA 1 +#define LIBRGW_FILE_VER_EXTRA 2 #define LIBRGW_FILE_VERSION(maj, min, extra) ((maj << 16) + (min << 8) + extra) #define LIBRGW_FILE_VERSION_CODE LIBRGW_FILE_VERSION(LIBRGW_FILE_VER_MAJOR, LIBRGW_FILE_VER_MINOR, LIBRGW_FILE_VER_EXTRA) @@ -87,6 +87,7 @@ */ #define RGW_LOOKUP_FLAG_NONE 0x0000 #define RGW_LOOKUP_FLAG_CREATE 0x0001 +#define RGW_LOOKUP_FLAG_RCB 0x0002 /* readdir callback hint */ int rgw_lookup(struct rgw_fs *rgw_fs, struct rgw_file_handle *parent_fh, const char *path, diff -Nru ceph-10.2.6/src/include/util.h ceph-10.2.7/src/include/util.h --- ceph-10.2.6/src/include/util.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/include/util.h 2017-04-10 11:44:25.000000000 +0000 @@ -81,4 +81,6 @@ /// @param type the service type of given @p services, for example @p osd or @p mon. void dump_services(Formatter* f, const map >& services, const char* type); +string cleanbin(bufferlist &bl, bool &b64); +string cleanbin(string &str); #endif /* CEPH_UTIL_H */ diff -Nru ceph-10.2.6/src/java/Makefile.in ceph-10.2.7/src/java/Makefile.in --- ceph-10.2.6/src/java/Makefile.in 2017-03-07 13:31:29.000000000 +0000 +++ ceph-10.2.7/src/java/Makefile.in 2017-04-10 11:45:21.000000000 +0000 @@ -104,6 +104,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -268,6 +269,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -299,6 +303,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@ diff -Nru ceph-10.2.6/src/librados/snap_set_diff.cc ceph-10.2.7/src/librados/snap_set_diff.cc --- ceph-10.2.6/src/librados/snap_set_diff.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/librados/snap_set_diff.cc 2017-04-10 11:44:25.000000000 +0000 @@ -17,7 +17,7 @@ void calc_snap_set_diff(CephContext *cct, const librados::snap_set_t& snap_set, librados::snap_t start, librados::snap_t end, interval_set *diff, uint64_t *end_size, - bool *end_exists) + bool *end_exists, librados::snap_t *clone_end_snap_id) { ldout(cct, 10) << "calc_snap_set_diff start " << start << " end " << end << ", snap_set seq " << snap_set.seq << dendl; @@ -26,6 +26,7 @@ diff->clear(); *end_size = 0; *end_exists = false; + *clone_end_snap_id = 0; for (vector::const_iterator r = snap_set.clones.begin(); r != snap_set.clones.end(); @@ -79,6 +80,7 @@ if (end <= b) { ldout(cct, 20) << " end" << dendl; *end_exists = true; + *clone_end_snap_id = b; break; } diff -Nru ceph-10.2.6/src/librados/snap_set_diff.h ceph-10.2.7/src/librados/snap_set_diff.h --- ceph-10.2.6/src/librados/snap_set_diff.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/librados/snap_set_diff.h 2017-04-10 11:44:25.000000000 +0000 @@ -12,6 +12,6 @@ const librados::snap_set_t& snap_set, librados::snap_t start, librados::snap_t end, interval_set *diff, uint64_t *end_size, - bool *end_exists); + bool *end_exists, librados::snap_t *clone_end_snap_id); #endif diff -Nru ceph-10.2.6/src/librbd/DiffIterate.cc ceph-10.2.7/src/librbd/DiffIterate.cc --- ceph-10.2.6/src/librbd/DiffIterate.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/librbd/DiffIterate.cc 2017-04-10 11:44:25.000000000 +0000 @@ -125,9 +125,10 @@ interval_set diff; uint64_t end_size; bool end_exists; + librados::snap_t clone_end_snap_id; calc_snap_set_diff(cct, m_snap_set, m_diff_context.from_snap_id, m_diff_context.end_snap_id, &diff, &end_size, - &end_exists); + &end_exists, &clone_end_snap_id); ldout(cct, 20) << " diff " << diff << " end_exists=" << end_exists << dendl; if (diff.empty()) { diff -Nru ceph-10.2.6/src/librbd/ExclusiveLock.cc ceph-10.2.7/src/librbd/ExclusiveLock.cc --- ceph-10.2.6/src/librbd/ExclusiveLock.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/librbd/ExclusiveLock.cc 2017-04-10 11:44:25.000000000 +0000 @@ -239,6 +239,7 @@ ldout(m_image_ctx.cct, 10) << this << " " << __func__ << dendl; assert(get_active_action() == ACTION_REQUEST_LOCK); + m_state = STATE_ACQUIRING; if (r >= 0) { execute_next_action(); diff -Nru ceph-10.2.6/src/Makefile.in ceph-10.2.7/src/Makefile.in --- ceph-10.2.6/src/Makefile.in 2017-03-07 13:31:29.000000000 +0000 +++ ceph-10.2.7/src/Makefile.in 2017-04-10 11:45:21.000000000 +0000 @@ -636,15 +636,14 @@ @ENABLE_CLIENT_TRUE@@WITH_OPENLDAP_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ -lldap @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_148 = librgw.la -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_149 = -lssl -lcrypto -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_150 = libcivetweb.la -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_151 = radosgw \ +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_149 = libcivetweb.la +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_150 = radosgw \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ radosgw-admin \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ radosgw-token \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ radosgw-object-expirer -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_152 = ceph_rgw_multiparser \ +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_151 = ceph_rgw_multiparser \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ ceph_rgw_jsonparser -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_153 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_152 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ rgw/rgw_acl.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ rgw/rgw_acl_s3.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ rgw/rgw_acl_swift.h \ @@ -730,28 +729,28 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ civetweb/include/civetweb_conf.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ civetweb/src/md5.h -@ENABLE_CLIENT_TRUE@am__append_154 = libcls_lock_client.la \ +@ENABLE_CLIENT_TRUE@am__append_153 = libcls_lock_client.la \ @ENABLE_CLIENT_TRUE@ libcls_refcount_client.la \ @ENABLE_CLIENT_TRUE@ libcls_version_client.la \ @ENABLE_CLIENT_TRUE@ libcls_log_client.la \ @ENABLE_CLIENT_TRUE@ libcls_statelog_client.la \ @ENABLE_CLIENT_TRUE@ libcls_timeindex_client.la \ @ENABLE_CLIENT_TRUE@ libcls_replica_log_client.la -@ENABLE_CLIENT_TRUE@am__append_155 = libcls_lock_client.la \ +@ENABLE_CLIENT_TRUE@am__append_154 = libcls_lock_client.la \ @ENABLE_CLIENT_TRUE@ libcls_refcount_client.la \ @ENABLE_CLIENT_TRUE@ libcls_replica_log_client.la +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_155 = libcls_rgw_client.la @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_156 = libcls_rgw_client.la -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_157 = libcls_rgw_client.la -@ENABLE_CLIENT_TRUE@am__append_158 = libcls_rbd_client.la \ +@ENABLE_CLIENT_TRUE@am__append_157 = libcls_rbd_client.la \ @ENABLE_CLIENT_TRUE@ libcls_user_client.la \ @ENABLE_CLIENT_TRUE@ libcls_cephfs_client.la \ @ENABLE_CLIENT_TRUE@ libcls_numops_client.la \ @ENABLE_CLIENT_TRUE@ libcls_journal_client.la -@ENABLE_CLIENT_TRUE@am__append_159 = libcls_rbd_client.la \ +@ENABLE_CLIENT_TRUE@am__append_158 = libcls_rbd_client.la \ @ENABLE_CLIENT_TRUE@ libcls_user_client.la \ @ENABLE_CLIENT_TRUE@ libcls_numops_client.la \ @ENABLE_CLIENT_TRUE@ libcls_journal_client.la -@ENABLE_CLIENT_TRUE@am__append_160 = \ +@ENABLE_CLIENT_TRUE@am__append_159 = \ @ENABLE_CLIENT_TRUE@ cls/lock/cls_lock_types.h \ @ENABLE_CLIENT_TRUE@ cls/lock/cls_lock_ops.h \ @ENABLE_CLIENT_TRUE@ cls/lock/cls_lock_client.h \ @@ -784,12 +783,12 @@ @ENABLE_CLIENT_TRUE@ cls/journal/cls_journal_client.h \ @ENABLE_CLIENT_TRUE@ cls/journal/cls_journal_types.h -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_161 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_160 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@ cls/rgw/cls_rgw_client.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@ cls/rgw/cls_rgw_ops.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@ cls/rgw/cls_rgw_types.h -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_162 = libcls_hello.la \ +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_161 = libcls_hello.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libcls_numops.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libcls_rbd.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libcls_lock.la \ @@ -800,16 +799,16 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libcls_timeindex.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libcls_replica_log.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libcls_user.la -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@@WITH_RADOSGW_TRUE@am__append_163 = libcls_rgw.la -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_164 = libcls_cephfs.la \ +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@@WITH_RADOSGW_TRUE@am__append_162 = libcls_rgw.la +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_163 = libcls_cephfs.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libcls_journal.la -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_165 = libcls_kvs.la -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_166 = \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_164 = libcls_kvs.la +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_165 = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ key_value_store/key_value_structure.h \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ key_value_store/kv_flat_btree_async.h \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ key_value_store/kvs_arg_types.h -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_167 = rbd_replay/ActionTypes.h \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_166 = rbd_replay/ActionTypes.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbd_replay/actions.hpp \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbd_replay/BoundedBuffer.hpp \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbd_replay/BufferReader.h \ @@ -819,27 +818,27 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbd_replay/rbd_loc.hpp \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbd_replay/rbd_replay_debug.hpp \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbd_replay/Replayer.hpp -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_168 = librbd_replay_types.la \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_167 = librbd_replay_types.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ librbd_replay.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ librbd_replay_ios.la -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_169 = librbd_replay_types.la -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_170 = rbd-replay -@ENABLE_CLIENT_TRUE@@WITH_BABELTRACE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_171 = rbd-replay-prep -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_172 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_168 = librbd_replay_types.la +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_169 = rbd-replay +@ENABLE_CLIENT_TRUE@@WITH_BABELTRACE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_170 = rbd-replay-prep +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_171 = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/test-erasure-code.sh \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/test-erasure-eio.sh -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_173 = test/erasure-code/ceph_erasure_code_benchmark.h \ +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_172 = test/erasure-code/ceph_erasure_code_benchmark.h \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/ceph_erasure_code_benchmark.h \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/ErasureCodeExample.h -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_174 = -ldl -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_175 = ceph_erasure_code_benchmark \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_173 = -ldl +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_174 = ceph_erasure_code_benchmark \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ceph_erasure_code -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_176 = -ldl -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_177 = ceph_erasure_code_non_regression -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_178 = -ldl -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_179 = -export-symbols-regex '.*__erasure_code_.*' -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_180 = libec_example.la \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_175 = -ldl +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_176 = ceph_erasure_code_non_regression +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_177 = -ldl +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_178 = -export-symbols-regex '.*__erasure_code_.*' +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_179 = libec_example.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libec_missing_entry_point.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libec_missing_version.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libec_hangs.la \ @@ -853,6 +852,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libec_test_shec_sse4.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libec_test_shec_sse3.la \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ libec_test_shec_generic.la +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_180 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_181 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_182 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_183 = -export-symbols-regex '.*__erasure_code_.*' @@ -861,20 +861,19 @@ @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_186 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_187 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_188 = -export-symbols-regex '.*__erasure_code_.*' -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_189 = -export-symbols-regex '.*__erasure_code_.*' -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_190 = -ldl -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_191 = unittest_erasure_code_plugin \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_189 = -ldl +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_190 = unittest_erasure_code_plugin \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_erasure_code \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_erasure_code_jerasure \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_erasure_code_plugin_jerasure +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_191 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_192 = -ldl -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_193 = -ldl -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@am__append_194 = -ldl -@ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@am__append_195 = unittest_erasure_code_isa \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@am__append_193 = -ldl +@ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@am__append_194 = unittest_erasure_code_isa \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ unittest_erasure_code_plugin_isa -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@am__append_196 = -ldl -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_197 = -ldl -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_198 = \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@am__append_195 = -ldl +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_196 = -ldl +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_197 = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_erasure_code_lrc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_erasure_code_plugin_lrc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_erasure_code_shec \ @@ -888,65 +887,65 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_compression_plugin_snappy \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_compression_zlib \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_compression_plugin_zlib +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_198 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_199 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_200 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_201 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_202 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_203 = -ldl -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_204 = -ldl +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_204 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_205 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_206 = -export-symbols-regex '.*__erasure_code_.*' @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_207 = -export-symbols-regex '.*__erasure_code_.*' -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_208 = -export-symbols-regex '.*__erasure_code_.*' -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@am__append_209 = test/messenger/message_helper.h \ +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@am__append_208 = test/messenger/message_helper.h \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/simple_dispatcher.h \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/xio_dispatcher.h +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE@am__append_209 = -ldl @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE@am__append_210 = -ldl -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE@am__append_211 = -ldl -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@am__append_212 = simple_server \ +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@am__append_211 = simple_server \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ simple_client xio_server \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ xio_client +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE@am__append_212 = -ldl @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE@am__append_213 = -ldl -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE@am__append_214 = -ldl -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_215 = test/compressor/compressor_example.h -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_216 = libceph_example.la +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_214 = test/compressor/compressor_example.h +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_215 = libceph_example.la +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_216 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_217 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_218 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_219 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_220 = -ldl -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_221 = -ldl +@COMPILER_HAS_VTA_TRUE@@ENABLE_CLIENT_TRUE@am__append_221 = -fno-var-tracking-assignments @COMPILER_HAS_VTA_TRUE@@ENABLE_CLIENT_TRUE@am__append_222 = -fno-var-tracking-assignments -@COMPILER_HAS_VTA_TRUE@@ENABLE_CLIENT_TRUE@am__append_223 = -fno-var-tracking-assignments -@ENABLE_CLIENT_TRUE@@WITH_RBD_TRUE@am__append_224 = -DWITH_RBD -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_225 = -DWITH_RADOSGW -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_226 = \ +@ENABLE_CLIENT_TRUE@@WITH_RBD_TRUE@am__append_223 = -DWITH_RBD +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_224 = -DWITH_RADOSGW +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__append_225 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@ $(LIBRGW) \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@ $(LIBRGW_DEPS) -@ENABLE_CLIENT_TRUE@am__append_227 = ceph-dencoder -@ENABLE_CLIENT_TRUE@am__append_228 = \ +@ENABLE_CLIENT_TRUE@am__append_226 = ceph-dencoder +@ENABLE_CLIENT_TRUE@am__append_227 = \ @ENABLE_CLIENT_TRUE@ test/encoding/test_ceph_time.h -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_229 = libradostest.la \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_228 = libradostest.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ librados_test_stub.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ libjournal_test_mock.la -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_230 = ceph_test_rados \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_229 = ceph_test_rados \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_test_mutate -@ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOS_TRUE@am__append_231 = test_build_librados -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_232 = \ +@ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOS_TRUE@am__append_230 = test_build_librados +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_231 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_smalliobench \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_omapbench \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_objectstore_bench -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@am__append_233 = ceph_kvstorebench \ +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@am__append_232 = ceph_kvstorebench \ @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_list_parallel \ @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_open_pools_parallel \ @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_delete_pools_parallel \ @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_watch_notify -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_234 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_233 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ unittest_librados \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ unittest_librados_config \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ unittest_journal -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_235 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_234 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_multi_stress_watch \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_test_cls_rbd \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_test_cls_refcount \ @@ -975,7 +974,7 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_api_lock \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_api_tmap_migrate \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_test_stress_watch -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_236 = test/librados_test_stub/LibradosTestStub.h \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_235 = test/librados_test_stub/LibradosTestStub.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/librados_test_stub/MockTestMemIoCtxImpl.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/librados_test_stub/MockTestMemRadosClient.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/librados_test_stub/TestClassHandler.h \ @@ -985,19 +984,19 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/librados_test_stub/TestMemIoCtxImpl.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/librados_test_stub/TestIoCtxImpl.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/journal/mock/MockJournaler.h -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_237 = ceph_smalliobenchrbd \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_236 = ceph_smalliobenchrbd \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ ceph_test_librbd \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ ceph_test_librbd_api \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ ceph_test_rbd_mirror \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ ceph_test_rbd_mirror_random_write -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_238 = unittest_rbd_replay -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_239 = librbd_test.la \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_237 = unittest_rbd_replay +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_238 = librbd_test.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ librbd_test_mock.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ librbd_mirror_test.la -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_240 = unittest_librbd \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_239 = unittest_librbd \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ unittest_rbd_mirror -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_241 = test/run-rbd-unit-tests.sh -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_242 = test/librbd/test_fixture.h \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_240 = test/run-rbd-unit-tests.sh +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_241 = test/librbd/test_fixture.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ test/librbd/test_mock_fixture.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ test/librbd/test_support.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ test/librbd/mock/MockAioImageRequestWQ.h \ @@ -1014,23 +1013,23 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ test/librbd/object_map/mock/MockInvalidateRequest.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ test/rbd_mirror/test_fixture.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ test/rbd_mirror/test_mock_fixture.h -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_243 = ceph_test_librbd_fsx -@ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@am__append_244 = libradosstripertest.la -@ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@am__append_245 = ceph_test_rados_striper_api_io \ +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_242 = ceph_test_librbd_fsx +@ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@am__append_243 = libradosstripertest.la +@ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@am__append_244 = ceph_test_rados_striper_api_io \ @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_striper_api_aio \ @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@ ceph_test_rados_striper_api_striping -@ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_246 = test_build_libcephfs -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_247 = unittest_encoding \ +@ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_245 = test_build_libcephfs +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_246 = unittest_encoding \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ unittest_base64 \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ unittest_run_cmd \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ unittest_simple_spin \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ unittest_libcephfs_config -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_248 = test/libcephfs/flock.cc -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_249 = ceph_test_libcephfs \ +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_247 = test/libcephfs/flock.cc +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_248 = ceph_test_libcephfs \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ ceph_test_c_headers -@CLANG_FALSE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_250 = -Werror -Wold-style-declaration -@ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_251 = test_build_librgw -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_252 = ceph_test_cors \ +@CLANG_FALSE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_249 = -Werror -Wold-style-declaration +@ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_250 = test_build_librgw +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@am__append_251 = ceph_test_cors \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ ceph_test_rgw_manifest \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ ceph_test_rgw_period_history \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ ceph_test_rgw_obj \ @@ -1043,20 +1042,20 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ librgw_file_gp \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ librgw_file_aw \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ librgw_file_nfsns -@ENABLE_SERVER_TRUE@am__append_253 = ceph_test_async_driver \ +@ENABLE_SERVER_TRUE@am__append_252 = ceph_test_async_driver \ @ENABLE_SERVER_TRUE@ ceph_test_msgr ceph_test_trans \ @ENABLE_SERVER_TRUE@ ceph_test_mon_workloadgen \ @ENABLE_SERVER_TRUE@ ceph_test_mon_msg ceph_perf_objectstore \ @ENABLE_SERVER_TRUE@ ceph_perf_local ceph_perf_msgr_server \ @ENABLE_SERVER_TRUE@ ceph_perf_msgr_client -@ENABLE_SERVER_TRUE@am__append_254 = test/perf_helper.h -@ENABLE_SERVER_TRUE@@LINUX_TRUE@am__append_255 = \ +@ENABLE_SERVER_TRUE@am__append_253 = test/perf_helper.h +@ENABLE_SERVER_TRUE@@LINUX_TRUE@am__append_254 = \ @ENABLE_SERVER_TRUE@@LINUX_TRUE@ ceph_test_objectstore \ @ENABLE_SERVER_TRUE@@LINUX_TRUE@ ceph_test_keyvaluedb \ @ENABLE_SERVER_TRUE@@LINUX_TRUE@ ceph_test_filestore -@ENABLE_SERVER_TRUE@@LINUX_TRUE@am__append_256 = unittest_bluefs \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@am__append_255 = unittest_bluefs \ @ENABLE_SERVER_TRUE@@LINUX_TRUE@ unittest_bluestore_types -@ENABLE_SERVER_TRUE@am__append_257 = \ +@ENABLE_SERVER_TRUE@am__append_256 = \ @ENABLE_SERVER_TRUE@ ceph_test_objectstore_workloadgen \ @ENABLE_SERVER_TRUE@ ceph_test_filestore_idempotent \ @ENABLE_SERVER_TRUE@ ceph_test_filestore_idempotent_sequence \ @@ -1064,47 +1063,47 @@ @ENABLE_SERVER_TRUE@ ceph_test_object_map \ @ENABLE_SERVER_TRUE@ ceph_test_keyvaluedb_atomicity \ @ENABLE_SERVER_TRUE@ ceph_test_keyvaluedb_iterators -@ENABLE_SERVER_TRUE@am__append_258 = unittest_transaction -@ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE@am__append_259 = ceph_smalliobenchfs \ +@ENABLE_SERVER_TRUE@am__append_257 = unittest_transaction +@ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE@am__append_258 = ceph_smalliobenchfs \ @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE@ ceph_smalliobenchdumb \ @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE@ ceph_tpbench -@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_260 = ceph_test_keys -@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_261 = get_command_descriptions -@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_262 = \ +@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_259 = ceph_test_keys +@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_260 = get_command_descriptions +@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_261 = \ @ENABLE_SERVER_TRUE@@WITH_MON_TRUE@ unittest_mon_moncap \ @ENABLE_SERVER_TRUE@@WITH_MON_TRUE@ unittest_mon_pgmap -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_263 = \ +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_262 = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_ecbackend \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_osdscrub \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_pglog \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_hitset \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_osd_osdcap \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ unittest_pageset +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_263 = -ldl @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_264 = -ldl -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_265 = -ldl -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_266 = ceph_test_snap_mapper -@ENABLE_SERVER_TRUE@@WITH_SLIBROCKSDB_TRUE@am__append_267 = unittest_rocksdb_option_static -@ENABLE_SERVER_TRUE@@WITH_DLIBROCKSDB_TRUE@am__append_268 = unittest_rocksdb_option -@ENABLE_SERVER_TRUE@am__append_269 = unittest_chain_xattr \ +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_265 = ceph_test_snap_mapper +@ENABLE_SERVER_TRUE@@WITH_SLIBROCKSDB_TRUE@am__append_266 = unittest_rocksdb_option_static +@ENABLE_SERVER_TRUE@@WITH_DLIBROCKSDB_TRUE@am__append_267 = unittest_rocksdb_option +@ENABLE_SERVER_TRUE@am__append_268 = unittest_chain_xattr \ @ENABLE_SERVER_TRUE@ unittest_lfnindex -@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@am__append_270 = unittest_mds_authcap -@WITH_BUILD_TESTS_TRUE@am__append_271 = test_build_libcommon -@LINUX_TRUE@am__append_272 = libsystest.la -@SOLARIS_TRUE@am__append_273 = \ +@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@am__append_269 = unittest_mds_authcap +@WITH_BUILD_TESTS_TRUE@am__append_270 = test_build_libcommon +@LINUX_TRUE@am__append_271 = libsystest.la +@SOLARIS_TRUE@am__append_272 = \ @SOLARIS_TRUE@ -lsocket -lnsl -@LINUX_TRUE@am__append_274 = unittest_blkdev -@LINUX_TRUE@am__append_275 = ceph_test_get_blkdev_size -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_276 = \ +@LINUX_TRUE@am__append_273 = unittest_blkdev +@LINUX_TRUE@am__append_274 = ceph_test_get_blkdev_size +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_275 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_scratchtool \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_scratchtoolpp \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ ceph_radosacl -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_277 = rados -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_278 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_276 = rados +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_277 = \ @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/action/Kernel.cc \ @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/action/Nbd.cc -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_279 = tools/rbd/ArgumentTypes.h \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_278 = tools/rbd/ArgumentTypes.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/IndentStream.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/OptionPrinter.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/Shell.h \ @@ -1136,26 +1135,26 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd_mirror/image_sync/SnapshotCreateRequest.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd_mirror/image_sync/SyncPointCreateRequest.h \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd_mirror/image_sync/SyncPointPruneRequest.h -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_280 = $(LIBKRBD) -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_281 = rbd -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_282 = rbd-nbd -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_283 = librbd_mirror_internal.la -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_284 = rbd-mirror -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_285 = ceph-client-debug -@ENABLE_SERVER_TRUE@am__append_286 = ceph-osdomap-tool \ +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_279 = $(LIBKRBD) +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_280 = rbd +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_281 = rbd-nbd +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_282 = librbd_mirror_internal.la +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_283 = rbd-mirror +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_284 = ceph-client-debug +@ENABLE_SERVER_TRUE@am__append_285 = ceph-osdomap-tool \ @ENABLE_SERVER_TRUE@ ceph-monstore-tool ceph-kvstore-tool -@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_287 = -ldl -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_288 = ceph-objectstore-tool -@ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@am__append_289 = cephfs-journal-tool \ +@ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE@am__append_286 = -ldl +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_287 = ceph-objectstore-tool +@ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@am__append_288 = cephfs-journal-tool \ @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@ cephfs-table-tool \ @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@ cephfs-data-scan -@WITH_LTTNG_TRUE@am__append_290 = \ +@WITH_LTTNG_TRUE@am__append_289 = \ @WITH_LTTNG_TRUE@ libosd_tp.la \ @WITH_LTTNG_TRUE@ libos_tp.la \ @WITH_LTTNG_TRUE@ librados_tp.la \ @WITH_LTTNG_TRUE@ librbd_tp.la -@WITH_LTTNG_TRUE@am__append_291 = \ +@WITH_LTTNG_TRUE@am__append_290 = \ @WITH_LTTNG_TRUE@ tracing/librados.h \ @WITH_LTTNG_TRUE@ tracing/librbd.h \ @WITH_LTTNG_TRUE@ tracing/objectstore.h \ @@ -1163,75 +1162,75 @@ @WITH_LTTNG_TRUE@ tracing/osd.h \ @WITH_LTTNG_TRUE@ tracing/pg.h -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_292 = \ +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_291 = \ @ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/pybind/rados/CMakeLists.txt \ @ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/pybind/rados/setup.py \ @ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/pybind/rados/rados.pyx $(srcdir)/pybind/rados/rados.pxd -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_293 = rados-pybind-all -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_294 = rados-pybind-clean -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_295 = rados-pybind-install-exec -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_296 = \ +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_292 = rados-pybind-all +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_293 = rados-pybind-clean +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_294 = rados-pybind-install-exec +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_295 = \ @ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(srcdir)/pybind/rbd/CMakeLists.txt \ @ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(srcdir)/pybind/rbd/setup.py \ @ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(srcdir)/pybind/rbd/rbd.pyx -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_297 = rbd-pybind-all -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_298 = rbd-pybind-clean -@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_299 = rbd-pybind-install-exec -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_300 = \ +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_296 = rbd-pybind-all +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_297 = rbd-pybind-clean +@ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_298 = rbd-pybind-install-exec +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_299 = \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/pybind/cephfs/CMakeLists.txt \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/pybind/cephfs/setup.py \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/pybind/cephfs/cephfs.pyx -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_301 = cephfs-pybind-all -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_302 = cephfs-pybind-clean -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_303 = cephfs-pybind-install-exec +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_300 = cephfs-pybind-all +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_301 = cephfs-pybind-clean +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@am__append_302 = cephfs-pybind-install-exec TESTS = $(am__EXEEXT_63) $(check_SCRIPTS) -@ENABLE_CLIENT_TRUE@am__append_304 = \ +@ENABLE_CLIENT_TRUE@am__append_303 = \ @ENABLE_CLIENT_TRUE@ pybind/ceph_argparse.py \ @ENABLE_CLIENT_TRUE@ pybind/ceph_daemon.py -@ENABLE_CLIENT_TRUE@am__append_305 = ceph-syn -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_306 = \ +@ENABLE_CLIENT_TRUE@am__append_304 = ceph-syn +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_305 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/bash_completion/rados \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ $(srcdir)/bash_completion/radosgw-admin -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_307 = librados-config -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_308 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@am__append_306 = librados-config +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_307 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(srcdir)/bash_completion/rbd -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_309 = \ +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_308 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ ceph-rbdnamer \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbd-replay-many \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ rbdmap -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_310 = libkrbd.la -@ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@am__append_311 = ceph-fuse -@ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@am__append_312 = mount.fuse.ceph -@ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_313 = rbd-fuse -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_314 = cephfs -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_315 = mount.ceph -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_316 = pybind/ceph_volume_client.py -@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_317 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=libcommon.a' -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_318 = libcephfs.la -@ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_319 = libcephfs_jni.la -@ENABLE_SERVER_TRUE@am__append_320 = ceph-run ceph-rest-api \ +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_309 = libkrbd.la +@ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@am__append_310 = ceph-fuse +@ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@am__append_311 = mount.fuse.ceph +@ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am__append_312 = rbd-fuse +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_313 = cephfs +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_314 = mount.ceph +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_315 = pybind/ceph_volume_client.py +@ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_316 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=libcommon.a' +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_317 = libcephfs.la +@ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@am__append_318 = libcephfs_jni.la +@ENABLE_SERVER_TRUE@am__append_319 = ceph-run ceph-rest-api \ @ENABLE_SERVER_TRUE@ ceph-debugpack ceph-crush-location \ @ENABLE_SERVER_TRUE@ ceph-coverage -@ENABLE_SERVER_TRUE@am__append_321 = pybind/ceph_rest_api.py -@ENABLE_SERVER_TRUE@am__append_322 = ceph-coverage init-ceph -@ENABLE_SERVER_TRUE@am__append_323 = init-ceph -@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_324 = ceph-mon -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_325 = \ +@ENABLE_SERVER_TRUE@am__append_320 = pybind/ceph_rest_api.py +@ENABLE_SERVER_TRUE@am__append_321 = ceph-coverage init-ceph +@ENABLE_SERVER_TRUE@am__append_322 = init-ceph +@ENABLE_SERVER_TRUE@@WITH_MON_TRUE@am__append_323 = ceph-mon +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_324 = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ceph-disk-udev -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_326 = \ +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_325 = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ceph-clsinfo -@ENABLE_SERVER_TRUE@@WITH_LTTNG_TRUE@@WITH_OSD_TRUE@am__append_327 = $(LIBOSD_TP) -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_328 = ceph-osd -@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@am__append_329 = ceph-mds +@ENABLE_SERVER_TRUE@@WITH_LTTNG_TRUE@@WITH_OSD_TRUE@am__append_326 = $(LIBOSD_TP) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@am__append_327 = ceph-osd +@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@am__append_328 = ceph-mds subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \ @@ -1243,6 +1242,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -3615,8 +3615,8 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ libcls_timeindex_client.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ libcls_statelog_client.la am__DEPENDENCIES_18 = $(am__append_49) $(am__append_138) \ - $(am__DEPENDENCIES_17) $(am__append_155) $(am__append_157) \ - $(am__append_159) $(am__append_169) + $(am__DEPENDENCIES_17) $(am__append_154) $(am__append_156) \ + $(am__append_158) $(am__append_168) am__DEPENDENCIES_19 = librgw.la $(am__DEPENDENCIES_1) @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@am__DEPENDENCIES_20 = \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@ $(am__DEPENDENCIES_19) \ @@ -5076,10 +5076,9 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ civetweb/src/radosgw-civetweb.$(OBJEXT) \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ rgw/rgw_main.$(OBJEXT) radosgw_OBJECTS = $(am_radosgw_OBJECTS) -am__DEPENDENCIES_27 = $(am__DEPENDENCIES_1) @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@radosgw_DEPENDENCIES = $(am__DEPENDENCIES_19) \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(LIBCIVETWEB) \ -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(am__DEPENDENCIES_27) \ +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(am__DEPENDENCIES_1) \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(am__DEPENDENCIES_12) \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(am__DEPENDENCIES_1) \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(am__DEPENDENCIES_10) @@ -5168,7 +5167,7 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__DEPENDENCIES_10) \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__DEPENDENCIES_1) \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__DEPENDENCIES_1) \ -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__append_280) +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__append_279) am__rbd_fuse_SOURCES_DIST = rbd_fuse/rbd-fuse.cc @ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@am_rbd_fuse_OBJECTS = rbd_fuse/rbd_fuse-rbd-fuse.$(OBJEXT) rbd_fuse_OBJECTS = $(am_rbd_fuse_OBJECTS) @@ -8500,6 +8499,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -8531,6 +8533,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@ @@ -8607,7 +8610,7 @@ AUTOMAKE_OPTIONS = gnu subdir-objects SUBDIRS = ocf java DIST_SUBDIRS = gmock ocf java -BUILT_SOURCES = $(am__append_291) $(am__append_323) +BUILT_SOURCES = $(am__append_290) $(am__append_322) # extra bits EXTRA_DIST = $(am__append_32) ceph-detect-init/AUTHORS.rst \ @@ -9329,8 +9332,8 @@ spdk/include/spdk/queue_extras.h spdk/include/spdk/file.h \ spdk/include/spdk/assert.h spdk/include/spdk/barrier.h \ spdk/include/spdk/mmio.h tracing/CMakeLists.txt \ - tracing/tracing-common.h $(am__append_292) $(am__append_296) \ - $(am__append_300) pybind/CMakeLists.txt \ + tracing/tracing-common.h $(am__append_291) $(am__append_295) \ + $(am__append_299) pybind/CMakeLists.txt \ $(srcdir)/$(shell_scripts:%=%.in) $(srcdir)/vstart.sh \ $(srcdir)/stop.sh ceph-run $(srcdir)/ceph-osd-prestart.sh \ $(srcdir)/ceph_common.sh $(srcdir)/init-radosgw \ @@ -9600,10 +9603,10 @@ include/unordered_set.h include/unordered_map.h \ include/timegm.h include/event_type.h $(am__append_133) \ $(am__append_136) $(am__append_137) $(am__append_142) \ - $(am__append_153) $(am__append_160) $(am__append_161) \ - $(am__append_166) $(am__append_167) $(am__append_173) \ - $(am__append_209) $(am__append_215) $(am__append_228) \ - $(am__append_236) $(am__append_242) $(am__append_254) \ + $(am__append_152) $(am__append_159) $(am__append_160) \ + $(am__append_165) $(am__append_166) $(am__append_172) \ + $(am__append_208) $(am__append_214) $(am__append_227) \ + $(am__append_235) $(am__append_241) $(am__append_253) \ test/bench/backend.h test/bench/bencher.h \ test/bench/detailed_stat_collector.h test/bench/distribution.h \ test/bench/dumb_backend.h test/bench/rados_backend.h \ @@ -9627,7 +9630,7 @@ test/system/st_rados_list_objects.h \ test/system/st_rados_notify.h test/system/st_rados_watch.h \ test/system/systest_runnable.h test/system/systest_settings.h \ - test/unit.h test/journal/RadosTestFixture.h $(am__append_279) \ + test/unit.h test/journal/RadosTestFixture.h $(am__append_278) \ tools/cephfs/JournalTool.h tools/cephfs/JournalScanner.h \ tools/cephfs/JournalFilter.h tools/cephfs/EventOutput.h \ tools/cephfs/Resetter.h tools/cephfs/Dumper.h \ @@ -9639,14 +9642,14 @@ bash_completion/ceph bash_completion/rados bash_completion/rbd \ bash_completion/radosgw-admin mount/canonicalize.c \ mount/mtab.c objclass/objclass.h -bin_SCRIPTS = $(am__append_31) $(am__append_309) $(am__append_320) \ - $(am__append_326) -sbin_SCRIPTS = $(am__append_312) +bin_SCRIPTS = $(am__append_31) $(am__append_308) $(am__append_319) \ + $(am__append_325) +sbin_SCRIPTS = $(am__append_311) su_sbin_SCRIPTS = dist_bin_SCRIPTS = lib_LTLIBRARIES = $(am__append_132) $(am__append_135) \ - $(am__append_141) $(am__append_148) $(am__append_290) \ - $(am__append_318) $(am__append_319) + $(am__append_141) $(am__append_148) $(am__append_289) \ + $(am__append_317) $(am__append_318) noinst_LTLIBRARIES = libarch.la libauth.la libcrush.la libmon_types.la \ $(am__append_50) libosd_types.la $(am__append_88) \ liberasure_code.la libcompressor.la libosdc.la \ @@ -9654,29 +9657,29 @@ libjson_spirit.la liblog.la libperfglue.la \ libcommon_internal.la libcommon_crc.la $(am__append_115) \ libcommon.la $(am__append_118) libmsg.la $(am__append_128) \ - librbd_types.la $(am__append_139) $(am__append_150) \ - $(am__append_154) $(am__append_156) $(am__append_158) \ - $(am__append_168) $(am__append_229) $(am__append_239) \ - $(am__append_244) $(am__append_272) $(am__append_283) \ - $(am__append_310) + librbd_types.la $(am__append_139) $(am__append_149) \ + $(am__append_153) $(am__append_155) $(am__append_157) \ + $(am__append_167) $(am__append_228) $(am__append_238) \ + $(am__append_243) $(am__append_271) $(am__append_282) \ + $(am__append_309) noinst_LIBRARIES = $(am__append_33) $(am__append_46) libos_types.a \ $(am__append_58) $(am__append_62) $(am__append_68) -radoslib_LTLIBRARIES = $(am__append_162) $(am__append_163) \ - $(am__append_164) $(am__append_165) +radoslib_LTLIBRARIES = $(am__append_161) $(am__append_162) \ + $(am__append_163) $(am__append_164) # like bin_PROGRAMS, but these targets are only built for debug builds -bin_DEBUGPROGRAMS = $(am__append_98) $(am__append_152) \ - $(am__append_175) $(am__append_230) $(am__append_231) \ - $(am__append_232) $(am__append_233) $(am__append_235) \ - $(am__append_237) $(am__append_243) $(am__append_245) \ - $(am__append_246) $(am__append_249) $(am__append_251) \ - $(am__append_252) $(am__append_253) $(am__append_255) \ - $(am__append_257) $(am__append_259) $(am__append_260) \ - $(am__append_266) ceph_test_timers ceph_test_signal_handlers \ - ceph_test_rewrite_latency ceph_test_crypto $(am__append_271) \ +bin_DEBUGPROGRAMS = $(am__append_98) $(am__append_151) \ + $(am__append_174) $(am__append_229) $(am__append_230) \ + $(am__append_231) $(am__append_232) $(am__append_234) \ + $(am__append_236) $(am__append_242) $(am__append_244) \ + $(am__append_245) $(am__append_248) $(am__append_250) \ + $(am__append_251) $(am__append_252) $(am__append_254) \ + $(am__append_256) $(am__append_258) $(am__append_259) \ + $(am__append_265) ceph_test_timers ceph_test_signal_handlers \ + ceph_test_rewrite_latency ceph_test_crypto $(am__append_270) \ ceph_bench_log ceph_test_objectcacher_stress \ - ceph_test_cfuse_cache_invalidate $(am__append_275) \ - $(am__append_276) $(am__append_285) $(am__append_286) \ + ceph_test_cfuse_cache_invalidate $(am__append_274) \ + $(am__append_275) $(am__append_284) $(am__append_285) \ ceph_psim # like sbin_SCRIPTS but can be used to install to e.g. /usr/sbin @@ -9686,12 +9689,12 @@ su_sbindir = /sbin # C/C++ tests to build and executed will be appended to this -check_TESTPROGRAMS = $(am__append_191) $(am__append_195) \ - $(am__append_198) $(am__append_234) $(am__append_238) \ - $(am__append_247) $(am__append_256) $(am__append_258) \ - $(am__append_262) $(am__append_263) $(am__append_267) \ - $(am__append_268) $(am__append_269) $(am__append_270) \ - unittest_addrs $(am__append_274) unittest_bloom_filter \ +check_TESTPROGRAMS = $(am__append_190) $(am__append_194) \ + $(am__append_197) $(am__append_233) $(am__append_237) \ + $(am__append_246) $(am__append_255) $(am__append_257) \ + $(am__append_261) $(am__append_262) $(am__append_266) \ + $(am__append_267) $(am__append_268) $(am__append_269) \ + unittest_addrs $(am__append_273) unittest_bloom_filter \ unittest_histogram unittest_prioritized_queue \ unittest_weighted_priority_queue unittest_str_map \ unittest_mutex_debug unittest_shunique_lock \ @@ -9753,7 +9756,7 @@ # GNU Library Public License for more details. # check_SCRIPTS = ceph-detect-init/run-tox.sh ceph-disk/run-tox.sh \ - $(am__append_172) $(am__append_241) \ + $(am__append_171) $(am__append_240) \ test/ceph_objectstore_tool.py test/test-ceph-helpers.sh \ test/cephtool-test-osd.sh test/cephtool-test-mon.sh \ test/cephtool-test-mds.sh test/cephtool-test-rados.sh \ @@ -9879,7 +9882,7 @@ $(LIBARCH) $(BOOST_RANDOM_LIBS) -luuid $(am__append_116) LIBRADOS_DEPS = $(am__append_129) LIBRGW_DEPS = $(am__append_146) $(am__append_147) -LIBCIVETWEB_DEPS = $(am__append_149) +LIBCIVETWEB_DEPS = # This is used by the dencoder test @@ -9887,17 +9890,17 @@ DENCODER_SOURCES = $(am__append_48) perfglue/disabled_heap_profiler.cc \ perfglue/disabled_stubs.cc $(am__append_143) DENCODER_DEPS = $(am__append_49) $(am__append_138) $(am__append_144) \ - $(am__append_155) $(am__append_157) $(am__append_159) \ - $(am__append_169) + $(am__append_154) $(am__append_156) $(am__append_158) \ + $(am__append_168) radoslibdir = $(libdir)/rados-classes -LOCAL_ALL = ceph-detect-init-all ceph-disk-all $(am__append_293) \ - $(am__append_297) $(am__append_301) -LOCAL_CLEAN = ceph-detect-init-clean ceph-disk-clean $(am__append_294) \ - $(am__append_298) $(am__append_302) base-clean-local +LOCAL_ALL = ceph-detect-init-all ceph-disk-all $(am__append_292) \ + $(am__append_296) $(am__append_300) +LOCAL_CLEAN = ceph-detect-init-clean ceph-disk-clean $(am__append_293) \ + $(am__append_297) $(am__append_301) base-clean-local LOCAL_INSTALLDATA = ceph-detect-init-install-data \ ceph-disk-install-data base-install-data-local -LOCAL_INSTALLEXEC = $(am__append_295) $(am__append_299) \ - $(am__append_303) +LOCAL_INSTALLEXEC = $(am__append_294) $(am__append_298) \ + $(am__append_302) libarch_la_SOURCES = \ arch/intel.c \ arch/arm.c \ @@ -10067,7 +10070,7 @@ libec_jerasure.la libec_lrc.la libec_shec_generic.la \ $(am__append_81) $(am__append_83) $(am__append_85) \ libec_shec.la $(am__append_90) -check_LTLIBRARIES = $(am__append_180) +check_LTLIBRARIES = $(am__append_179) jerasure_sources = \ erasure-code/ErasureCode.cc \ erasure-code/jerasure/jerasure/src/cauchy.c \ @@ -10374,7 +10377,7 @@ @LINUX_TRUE@liberasure_code_la_LIBADD = -ldl compressorlibdir = $(pkglibdir)/compressor compressorlib_LTLIBRARIES = libceph_zlib.la libceph_snappy.la \ - $(am__append_216) + $(am__append_215) zlib_sources = \ compressor/Compressor.cc \ compressor/zlib/CompressionPluginZlib.cc \ @@ -10757,7 +10760,7 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@libcivetweb_la_CXXFLAGS = ${CIVETWEB_INCLUDE} -fPIC -Woverloaded-virtual \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ ${AM_CXXFLAGS} -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@libcivetweb_la_CFLAGS = -I$(srcdir)/civetweb/include ${CIVETWEB_INCLUDE} -fPIC -DNO_SSL_DL +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@libcivetweb_la_CFLAGS = -I$(srcdir)/civetweb/include ${CIVETWEB_INCLUDE} -fPIC $(SONAME_DEFINES) @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@radosgw_SOURCES = \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ rgw/rgw_fcgi_process.cc \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ rgw/rgw_loadgen_process.cc \ @@ -10767,7 +10770,7 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ civetweb/src/civetweb.c \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ rgw/rgw_main.cc -@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@radosgw_CFLAGS = -I$(srcdir)/civetweb/include -fPIC -I$(srcdir)/xxHash ${CIVETWEB_INCLUDE} +@ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@radosgw_CFLAGS = -I$(srcdir)/civetweb/include -fPIC -I$(srcdir)/xxHash ${CIVETWEB_INCLUDE} $(SONAME_DEFINES) @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@radosgw_LDADD = $(LIBRGW) $(LIBCIVETWEB) $(LIBCIVETWEB_DEPS) $(LIBRGW_DEPS) $(RESOLV_LIBS) \ @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(CEPH_GLOBAL) @@ -10943,7 +10946,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_174) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_173) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ceph_erasure_code_non_regression_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/ceph_erasure_code_non_regression.cc @@ -10951,7 +10954,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_176) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_175) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ceph_erasure_code_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/ceph_erasure_code.cc @@ -10959,7 +10962,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_178) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_177) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_example_la_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ erasure-code/ErasureCode.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/ErasureCodePluginExample.cc @@ -10971,7 +10974,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_179) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_178) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_missing_entry_point_la_SOURCES = test/erasure-code/ErasureCodePluginMissingEntryPoint.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_missing_entry_point_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_missing_entry_point_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -10980,7 +10983,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_181) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_180) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_missing_version_la_SOURCES = test/erasure-code/ErasureCodePluginMissingVersion.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_missing_version_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_missing_version_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -10989,7 +10992,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_182) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_181) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_hangs_la_SOURCES = test/erasure-code/ErasureCodePluginHangs.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_hangs_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_hangs_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -10998,7 +11001,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_183) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_182) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_fail_to_initialize_la_SOURCES = test/erasure-code/ErasureCodePluginFailToInitialize.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_fail_to_initialize_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_fail_to_initialize_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11007,7 +11010,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_184) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_183) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_fail_to_register_la_SOURCES = test/erasure-code/ErasureCodePluginFailToRegister.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_fail_to_register_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_fail_to_register_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11016,7 +11019,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_185) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_184) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_neon_la_SOURCES = test/erasure-code/TestJerasurePluginNEON.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_neon_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_neon_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11025,7 +11028,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_186) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_185) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_sse4_la_SOURCES = test/erasure-code/TestJerasurePluginSSE4.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_sse4_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_sse4_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11034,7 +11037,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_187) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_186) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_sse3_la_SOURCES = test/erasure-code/TestJerasurePluginSSE3.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_sse3_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_sse3_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11043,7 +11046,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_188) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_187) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_generic_la_SOURCES = test/erasure-code/TestJerasurePluginGeneric.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_generic_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_jerasure_generic_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11052,7 +11055,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_189) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_188) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_plugin_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ erasure-code/ErasureCode.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodePlugin.cc @@ -11062,7 +11065,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_190) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_189) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ erasure-code/ErasureCode.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCode.cc @@ -11085,7 +11088,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_192) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_191) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_plugin_jerasure_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodePluginJerasure.cc @@ -11094,7 +11097,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_193) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_192) @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_isa_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ erasure-code/ErasureCode.cc \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodeIsa.cc @@ -11106,7 +11109,7 @@ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ libisa.la \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(LIBERASURE_CODE) \ -@ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(am__append_194) +@ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(am__append_193) @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_plugin_isa_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ erasure-code/ErasureCode.cc \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodePluginIsa.cc @@ -11117,7 +11120,7 @@ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(LIBERASURE_CODE) \ -@ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(am__append_196) +@ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@ $(am__append_195) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_lrc_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodeLrc.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${lrc_sources} @@ -11127,7 +11130,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_197) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_196) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_plugin_lrc_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodePluginLrc.cc @@ -11136,7 +11139,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_199) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_198) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_shec_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodeShec.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${shec_sources} @@ -11157,7 +11160,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_200) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_199) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_shec_all_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodeShec_all.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${shec_sources} @@ -11178,7 +11181,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_201) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_200) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_shec_thread_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodeShec_thread.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${shec_sources} @@ -11199,7 +11202,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_202) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_201) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_shec_arguments_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodeShec_arguments.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${shec_sources} @@ -11220,7 +11223,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_203) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_202) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_plugin_shec_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodePluginShec.cc @@ -11229,7 +11232,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_204) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_203) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_neon_la_SOURCES = test/erasure-code/TestShecPluginNEON.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_neon_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_neon_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11238,7 +11241,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_205) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_204) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_sse4_la_SOURCES = test/erasure-code/TestShecPluginSSE4.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_sse4_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_sse4_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11247,7 +11250,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_206) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_205) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_sse3_la_SOURCES = test/erasure-code/TestShecPluginSSE3.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_sse3_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_sse3_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11256,7 +11259,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_207) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_206) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_generic_la_SOURCES = test/erasure-code/TestShecPluginGeneric.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_generic_la_CFLAGS = ${AM_CFLAGS} @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libec_test_shec_generic_la_CXXFLAGS = ${AM_CXXFLAGS} @@ -11265,7 +11268,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${AM_LDFLAGS} -module \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -avoid-version -shared \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ -rpath /nowhere \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_208) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_207) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_erasure_code_example_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ erasure-code/ErasureCode.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/erasure-code/TestErasureCodeExample.cc @@ -11283,7 +11286,7 @@ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(PTHREAD_LIBS) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(EXTRALIBS) \ -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_210) +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_209) @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@simple_client_SOURCES = \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/simple_client.cc \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/simple_dispatcher.cc @@ -11295,7 +11298,7 @@ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(PTHREAD_LIBS) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(EXTRALIBS) \ -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_211) +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_210) @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@xio_server_SOURCES = \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/xio_server.cc \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/xio_dispatcher.cc @@ -11307,7 +11310,7 @@ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(PTHREAD_LIBS) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(EXTRALIBS) \ -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_213) +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_212) @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@xio_client_SOURCES = \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/xio_client.cc \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ test/messenger/xio_dispatcher.cc @@ -11319,7 +11322,7 @@ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(PTHREAD_LIBS) \ @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(EXTRALIBS) \ -@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_214) +@ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@ $(am__append_213) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@libceph_example_la_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ compressor/Compressor.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/compressor/compressor_plugin_example.cc @@ -11337,7 +11340,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_217) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_216) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_snappy_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/compressor/test_compression_snappy.cc \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ ${snappy_sources} @@ -11347,7 +11350,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_218) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_217) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_snappy_LDFLAGS = -lsnappy @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_plugin_snappy_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/compressor/test_compression_plugin_snappy.cc \ @@ -11359,7 +11362,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBCOMPRESSOR) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_219) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_218) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_plugin_snappy_LDFLAGS = -lsnappy @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_zlib_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/compressor/test_compression_zlib.cc \ @@ -11370,7 +11373,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBCOMMON) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_220) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_219) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_zlib_LDFLAGS = -lz @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_plugin_zlib_SOURCES = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ test/compressor/test_compression_plugin_zlib.cc \ @@ -11382,7 +11385,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBCOMPRESSOR) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_221) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_220) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_compression_plugin_zlib_LDFLAGS = -lz # This should use LIBMDS_TYPES once it exists @@ -11393,14 +11396,14 @@ @ENABLE_CLIENT_TRUE@ceph_dencoder_LDADD = $(LIBRADOS) $(LIBRBD_TYPES) \ @ENABLE_CLIENT_TRUE@ $(LIBOSD_TYPES) $(LIBOS_TYPES) \ @ENABLE_CLIENT_TRUE@ $(LIBMON_TYPES) $(DENCODER_DEPS) \ -@ENABLE_CLIENT_TRUE@ $(CEPH_GLOBAL) $(am__append_226) +@ENABLE_CLIENT_TRUE@ $(CEPH_GLOBAL) $(am__append_225) # These should always use explicit _CFLAGS/_CXXFLAGS so avoid basename conflicts @ENABLE_CLIENT_TRUE@ceph_dencoder_CFLAGS = ${AM_CFLAGS} \ -@ENABLE_CLIENT_TRUE@ $(am__append_222) +@ENABLE_CLIENT_TRUE@ $(am__append_221) @ENABLE_CLIENT_TRUE@ceph_dencoder_CXXFLAGS = ${AM_CXXFLAGS} \ -@ENABLE_CLIENT_TRUE@ $(am__append_223) $(am__append_224) \ -@ENABLE_CLIENT_TRUE@ $(am__append_225) +@ENABLE_CLIENT_TRUE@ $(am__append_222) $(am__append_223) \ +@ENABLE_CLIENT_TRUE@ $(am__append_224) @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@libradostest_la_SOURCES = \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/librados/test.cc \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@ test/librados/TestCase.cc @@ -11844,7 +11847,7 @@ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ test/libcephfs/multiclient.cc \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ test/libcephfs/access.cc \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ test/libcephfs/acl.cc \ -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ $(am__append_248) +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ $(am__append_247) @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ceph_test_libcephfs_LDADD = $(LIBRADOS) $(LIBCEPHFS) $(LIBCOMMON) $(UNITTEST_LDADD) @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ceph_test_libcephfs_CXXFLAGS = $(UNITTEST_CXXFLAGS) @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@unittest_encoding_SOURCES = test/encoding.cc @@ -11867,7 +11870,7 @@ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ -Wignored-qualifiers \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ -Wold-style-definition \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ -Wtype-limits \ -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ $(am__append_250) +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ $(am__append_249) @ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@test_build_librgw_SOURCES = \ @ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ test/buildtest_skeleton.cc \ @ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@ $(librgw_la_SOURCES) @@ -12095,13 +12098,13 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_osdscrub_LDADD = \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_264) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_263) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_pglog_SOURCES = test/osd/TestPGLog.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_pglog_CXXFLAGS = $(UNITTEST_CXXFLAGS) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_pglog_LDADD = $(LIBOSD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(UNITTEST_LDADD) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_265) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_264) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_hitset_SOURCES = test/osd/hitset.cc @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_hitset_CXXFLAGS = $(UNITTEST_CXXFLAGS) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@unittest_hitset_LDADD = $(LIBOSD) $(UNITTEST_LDADD) $(CEPH_GLOBAL) @@ -12168,7 +12171,7 @@ UNITTEST_LDADD = $(top_builddir)/src/gmock/lib/libgmock_main.la \ $(top_builddir)/src/gmock/lib/libgmock.la \ $(top_builddir)/src/gmock/gtest/lib/libgtest.la \ - $(PTHREAD_LIBS) $(am__append_273) + $(PTHREAD_LIBS) $(am__append_272) unittest_addrs_SOURCES = test/test_addrs.cc unittest_addrs_CXXFLAGS = $(UNITTEST_CXXFLAGS) unittest_addrs_LDADD = $(UNITTEST_LDADD) $(CEPH_GLOBAL) @@ -12411,7 +12414,7 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/action/Snap.cc \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/action/Status.cc \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ tools/rbd/action/Watch.cc \ -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__append_278) +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__append_277) @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@rbd_LDADD = libjournal.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ libcls_journal_client.la \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ libcls_rbd_client.la \ @@ -12422,7 +12425,7 @@ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(BOOST_REGEX_LIBS) \ @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \ -@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__append_280) +@ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@ $(am__append_279) @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@rbd_nbd_SOURCES = tools/rbd_nbd/rbd-nbd.cc @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@rbd_nbd_CXXFLAGS = $(AM_CXXFLAGS) @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@rbd_nbd_LDADD = $(LIBRBD) $(LIBRADOS) $(CEPH_GLOBAL) $(BOOST_REGEX_LIBS) @@ -12491,7 +12494,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBOS) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_287) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_286) @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@cephfs_journal_tool_SOURCES = \ @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@ tools/cephfs/cephfs-journal-tool.cc \ @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@ tools/cephfs/JournalTool.cc \ @@ -12597,7 +12600,7 @@ -e 's|@@GCOV_PREFIX_STRIP[@][@]|$(GCOV_PREFIX_STRIP)|g' shell_scripts = ceph-debugpack ceph-post-file ceph-crush-location \ - $(am__append_322) + $(am__append_321) doc_DATA = $(srcdir)/sample.ceph.conf sample.fetch_config # various scripts in $(libexecdir) @@ -12617,11 +12620,11 @@ PATH="$(abs_srcdir):$$PATH"; # pybind -python_PYTHON = $(am__append_304) $(am__append_316) $(am__append_321) +python_PYTHON = $(am__append_303) $(am__append_315) $(am__append_320) @ENABLE_CLIENT_TRUE@bash_completiondir = $(sysconfdir)/bash_completion.d @ENABLE_CLIENT_TRUE@bash_completion_DATA = \ @ENABLE_CLIENT_TRUE@ $(srcdir)/bash_completion/ceph \ -@ENABLE_CLIENT_TRUE@ $(am__append_306) $(am__append_308) +@ENABLE_CLIENT_TRUE@ $(am__append_305) $(am__append_307) @ENABLE_CLIENT_TRUE@ceph_syn_SOURCES = ceph_syn.cc \ @ENABLE_CLIENT_TRUE@ client/SyntheticClient.cc # uses g_conf.. \ @ENABLE_CLIENT_TRUE@ needs cleanup @@ -12650,7 +12653,7 @@ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ 1:0:0 \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ -export-symbols-regex \ @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ '^ceph_.*' \ -@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ $(am__append_317) +@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@ $(am__append_316) # jni library (java source is in src/java) @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@libcephfs_jni_la_SOURCES = \ @@ -12663,7 +12666,7 @@ @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@libcephfs_jni_la_CPPFLAGS = $(JDK_CPPFLAGS) $(AM_CPPFLAGS) @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@libcephfs_jni_la_LDFLAGS = ${AM_LDFLAGS} -version-info 1:0:0 @ENABLE_SERVER_TRUE@ceph_sbin_SCRIPTS = ceph-create-keys \ -@ENABLE_SERVER_TRUE@ $(am__append_325) +@ENABLE_SERVER_TRUE@ $(am__append_324) @ENABLE_SERVER_TRUE@@WITH_MON_TRUE@ceph_mon_SOURCES = ceph_mon.cc @ENABLE_SERVER_TRUE@@WITH_MON_TRUE@ceph_mon_LDADD = $(LIBMON) $(LIBOS) $(CEPH_GLOBAL) $(LIBCOMMON) $(LIBAUTH) $(LIBCOMMON) $(LIBMON_TYPES) @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ceph_osd_SOURCES = ceph_osd.cc @@ -12671,7 +12674,7 @@ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOSD) $(LIBOSD_TYPES) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(LIBOS_TYPES) $(LIBOS) \ @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(CEPH_GLOBAL) $(LIBCOMMON) \ -@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_327) +@ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@ $(am__append_326) @ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@ceph_mds_SOURCES = ceph_mds.cc @ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@ceph_mds_LDADD = $(LIBMDS) $(LIBOSDC) $(CEPH_GLOBAL) $(LIBCOMMON) @ENABLE_COVERAGE_TRUE@@ENABLE_SERVER_TRUE@COV_DIR = $(DESTDIR)$(libdir)/ceph/coverage diff -Nru ceph-10.2.6/src/ocf/Makefile.in ceph-10.2.7/src/ocf/Makefile.in --- ceph-10.2.6/src/ocf/Makefile.in 2017-03-07 13:31:29.000000000 +0000 +++ ceph-10.2.7/src/ocf/Makefile.in 2017-04-10 11:45:21.000000000 +0000 @@ -100,6 +100,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -264,6 +265,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -295,6 +299,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@ diff -Nru ceph-10.2.6/src/osd/ECBackend.cc ceph-10.2.7/src/osd/ECBackend.cc --- ceph-10.2.6/src/osd/ECBackend.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/ECBackend.cc 2017-04-10 11:44:25.000000000 +0000 @@ -146,7 +146,6 @@ << " missing_on_shards=" << rhs.missing_on_shards << " recovery_info=" << rhs.recovery_info << " recovery_progress=" << rhs.recovery_progress - << " pending_read=" << rhs.pending_read << " obc refcount=" << rhs.obc.use_count() << " state=" << ECBackend::RecoveryOp::tostr(rhs.state) << " waiting_on_pushes=" << rhs.waiting_on_pushes @@ -162,7 +161,6 @@ f->dump_stream("missing_on_shards") << missing_on_shards; f->dump_stream("recovery_info") << recovery_info; f->dump_stream("recovery_progress") << recovery_progress; - f->dump_bool("pending_read", pending_read); f->dump_stream("state") << tostr(state); f->dump_stream("waiting_on_pushes") << waiting_on_pushes; f->dump_stream("extent_requested") << extent_requested; @@ -189,6 +187,24 @@ return new ECRecoveryHandle; } +void ECBackend::_failed_push(const hobject_t &hoid, + pair &in) +{ + ECBackend::read_result_t &res = in.second; + dout(10) << __func__ << ": Read error " << hoid << " r=" + << res.r << " errors=" << res.errors << dendl; + dout(10) << __func__ << ": canceling recovery op for obj " << hoid + << dendl; + assert(recovery_ops.count(hoid)); + recovery_ops.erase(hoid); + + list fl; + for (auto&& i : res.errors) { + fl.push_back(i.first); + } + get_parent()->failed_push(fl, hoid); +} + struct OnRecoveryReadComplete : public GenContext &> { ECBackend *pg; @@ -198,9 +214,10 @@ : pg(pg), hoid(hoid) {} void finish(pair &in) { ECBackend::read_result_t &res = in.second; - // FIXME??? - assert(res.r == 0); - assert(res.errors.empty()); + if (!(res.r == 0 && res.errors.empty())) { + pg->_failed_push(hoid, in); + return; + } assert(res.returned.size() == 1); pg->handle_recovery_read_complete( hoid, @@ -1072,6 +1089,7 @@ unsigned is_complete = 0; // For redundant reads check for completion as each shard comes in, // or in a non-recovery read check for completion once all the shards read. + // TODO: It would be nice if recovery could send more reads too if (rop.do_redundant_reads || (!rop.for_recovery && rop.in_progress.empty())) { for (map::const_iterator iter = rop.complete.begin(); @@ -2099,15 +2117,15 @@ o.digest_present = false; return; } else { - if (hinfo->get_chunk_hash(get_parent()->whoami_shard().shard) != h.digest()) { - dout(0) << "_scan_list " << poid << " got incorrect hash on read" << dendl; - o.read_error = true; + if (hinfo->get_total_chunk_size() != pos) { + dout(0) << "_scan_list " << poid << " got incorrect size on read" << dendl; + o.ec_size_mismatch = true; return; } - if (hinfo->get_total_chunk_size() != pos) { - dout(0) << "_scan_list " << poid << " got incorrect size on read" << dendl; - o.read_error = true; + if (hinfo->get_chunk_hash(get_parent()->whoami_shard().shard) != h.digest()) { + dout(0) << "_scan_list " << poid << " got incorrect hash on read" << dendl; + o.ec_hash_mismatch = true; return; } diff -Nru ceph-10.2.6/src/osd/ECBackend.h ceph-10.2.7/src/osd/ECBackend.h --- ceph-10.2.6/src/osd/ECBackend.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/ECBackend.h 2017-04-10 11:44:25.000000000 +0000 @@ -202,7 +202,6 @@ ObjectRecoveryInfo recovery_info; ObjectRecoveryProgress recovery_progress; - bool pending_read; enum state_t { IDLE, READING, WRITING, COMPLETE } state; static const char* tostr(state_t state) { @@ -237,7 +236,7 @@ void dump(Formatter *f) const; - RecoveryOp() : pending_read(false), state(IDLE) {} + RecoveryOp() : state(IDLE) {} }; friend ostream &operator<<(ostream &lhs, const RecoveryOp &rhs); map recovery_ops; @@ -505,6 +504,8 @@ uint64_t be_get_ondisk_size(uint64_t logical_size) { return sinfo.logical_to_next_chunk_offset(logical_size); } + void _failed_push(const hobject_t &hoid, + pair &in); }; #endif diff -Nru ceph-10.2.6/src/osd/OSD.cc ceph-10.2.7/src/osd/OSD.cc --- ceph-10.2.6/src/osd/OSD.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/OSD.cc 2017-04-10 11:44:25.000000000 +0000 @@ -2392,6 +2392,13 @@ test_ops_hook, "Delay osd recovery by specified seconds"); assert(r == 0); + r = admin_socket->register_command( + "trigger_scrub", + "trigger_scrub " \ + "name=pgid,type=CephString ", + test_ops_hook, + "Trigger a scheduled scrub "); + assert(r == 0); } void OSD::create_logger() @@ -4059,13 +4066,13 @@ if (p->second.is_unhealthy(cutoff)) { if (p->second.last_rx_back == utime_t() || p->second.last_rx_front == utime_t()) { - derr << "heartbeat_check: no reply from " << p->second.con_front->get_peer_addr().get_sockaddr() + derr << "heartbeat_check: no reply from " << p->second.con_front->get_peer_addr().get_sockaddr_storage() << " osd." << p->first << " ever on either front or back, first ping sent " << p->second.first_tx << " (cutoff " << cutoff << ")" << dendl; // fail failure_queue[p->first] = p->second.last_tx; } else { - derr << "heartbeat_check: no reply from " << p->second.con_front->get_peer_addr().get_sockaddr() + derr << "heartbeat_check: no reply from " << p->second.con_front->get_peer_addr().get_sockaddr_storage() << " osd." << p->first << " since back " << p->second.last_rx_back << " front " << p->second.last_rx_front << " (cutoff " << cutoff << ")" << dendl; @@ -4483,6 +4490,44 @@ << "to " << service->cct->_conf->osd_recovery_delay_start; return; } + if (command == "trigger_scrub") { + spg_t pgid; + OSDMapRef curmap = service->get_osdmap(); + + string pgidstr; + + cmd_getval(service->cct, cmdmap, "pgid", pgidstr); + if (!pgid.parse(pgidstr.c_str())) { + ss << "Invalid pgid specified"; + return; + } + + PG *pg = service->osd->_lookup_lock_pg(pgid); + if (pg == nullptr) { + ss << "Can't find pg " << pgid; + return; + } + + if (pg->is_primary()) { + pg->unreg_next_scrub(); + const pg_pool_t *p = curmap->get_pg_pool(pgid.pool()); + double pool_scrub_max_interval = 0; + p->opts.get(pool_opts_t::SCRUB_MAX_INTERVAL, &pool_scrub_max_interval); + double scrub_max_interval = pool_scrub_max_interval > 0 ? + pool_scrub_max_interval : g_conf->osd_scrub_max_interval; + // Instead of marking must_scrub force a schedule scrub + utime_t stamp = ceph_clock_now(service->cct); + stamp -= scrub_max_interval; + stamp -= 100.0; // push back last scrub more for good measure + pg->info.history.last_scrub_stamp = stamp; + pg->reg_next_scrub(); + ss << "ok"; + } else { + ss << "Not primary"; + } + pg->unlock(); + return; + } ss << "Internal error - command=" << command; return; } diff -Nru ceph-10.2.6/src/osd/osd_types.cc ceph-10.2.7/src/osd/osd_types.cc --- ceph-10.2.6/src/osd/osd_types.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/osd_types.cc 2017-04-10 11:44:25.000000000 +0000 @@ -5358,7 +5358,8 @@ void ScrubMap::object::encode(bufferlist& bl) const { - ENCODE_START(7, 2, bl); + bool compat_read_error = read_error || ec_hash_mismatch || ec_size_mismatch; + ENCODE_START(8, 2, bl); ::encode(size, bl); ::encode(negative, bl); ::encode(attrs, bl); @@ -5368,16 +5369,19 @@ ::encode(snapcolls, bl); ::encode(omap_digest, bl); ::encode(omap_digest_present, bl); - ::encode(read_error, bl); + ::encode(compat_read_error, bl); ::encode(stat_error, bl); + ::encode(read_error, bl); + ::encode(ec_hash_mismatch, bl); + ::encode(ec_size_mismatch, bl); ENCODE_FINISH(bl); } void ScrubMap::object::decode(bufferlist::iterator& bl) { - DECODE_START_LEGACY_COMPAT_LEN(7, 2, 2, bl); + DECODE_START_LEGACY_COMPAT_LEN(8, 2, 2, bl); ::decode(size, bl); - bool tmp; + bool tmp, compat_read_error = false; ::decode(tmp, bl); negative = tmp; ::decode(attrs, bl); @@ -5400,13 +5404,23 @@ omap_digest_present = tmp; } if (struct_v >= 6) { - ::decode(tmp, bl); - read_error = tmp; + ::decode(compat_read_error, bl); } if (struct_v >= 7) { ::decode(tmp, bl); stat_error = tmp; } + if (struct_v >= 8) { + ::decode(tmp, bl); + read_error = tmp; + ::decode(tmp, bl); + ec_hash_mismatch = tmp; + ::decode(tmp, bl); + ec_size_mismatch = tmp; + } + // If older encoder found a read_error, set read_error + if (compat_read_error && !read_error && !ec_hash_mismatch && !ec_size_mismatch) + read_error = true; DECODE_FINISH(bl); } diff -Nru ceph-10.2.6/src/osd/osd_types.h ceph-10.2.7/src/osd/osd_types.h --- ceph-10.2.6/src/osd/osd_types.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/osd_types.h 2017-04-10 11:44:25.000000000 +0000 @@ -61,17 +61,24 @@ #define CEPH_OSD_FEATURE_INCOMPAT_PGMETA CompatSet::Feature(13, "pg meta object") -/// max recovery priority for MBackfillReserve -#define OSD_RECOVERY_PRIORITY_MAX 255u +/// min recovery priority for MBackfillReserve +#define OSD_RECOVERY_PRIORITY_MIN 0 -/// base recovery priority for MBackfillReserve -#define OSD_RECOVERY_PRIORITY_BASE 230u +/// base backfill priority for MBackfillReserve +#define OSD_BACKFILL_PRIORITY_BASE 100 /// base backfill priority for MBackfillReserve (degraded PG) -#define OSD_BACKFILL_DEGRADED_PRIORITY_BASE 200u +#define OSD_BACKFILL_DEGRADED_PRIORITY_BASE 140 + +/// base recovery priority for MBackfillReserve +#define OSD_RECOVERY_PRIORITY_BASE 180 + +/// base backfill priority for MBackfillReserve (inactive PG) +#define OSD_BACKFILL_INACTIVE_PRIORITY_BASE 220 + +/// max recovery priority for MBackfillReserve +#define OSD_RECOVERY_PRIORITY_MAX 255 -/// base backfill priority for MBackfillReserve -#define OSD_BACKFILL_PRIORITY_BASE 1u typedef hobject_t collection_list_handle_t; @@ -4042,12 +4049,14 @@ bool omap_digest_present:1; bool read_error:1; bool stat_error:1; + bool ec_hash_mismatch:1; + bool ec_size_mismatch:1; object() : // Init invalid size so it won't match if we get a stat EIO error size(-1), omap_digest(0), digest(0), nlinks(0), negative(false), digest_present(false), omap_digest_present(false), - read_error(false), stat_error(false) {} + read_error(false), stat_error(false), ec_hash_mismatch(false), ec_size_mismatch(false) {} void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl); @@ -4349,12 +4358,6 @@ WRITE_CLASS_ENCODER(obj_list_snap_response_t) -enum scrub_error_type { - CLEAN, - DEEP_ERROR, - SHALLOW_ERROR -}; - // PromoteCounter struct PromoteCounter { diff -Nru ceph-10.2.6/src/osd/PGBackend.cc ceph-10.2.7/src/osd/PGBackend.cc --- ceph-10.2.6/src/osd/PGBackend.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/PGBackend.cc 2017-04-10 11:44:25.000000000 +0000 @@ -398,64 +398,91 @@ } } -enum scrub_error_type PGBackend::be_compare_scrub_objects( +bool PGBackend::be_compare_scrub_objects( pg_shard_t auth_shard, const ScrubMap::object &auth, const object_info_t& auth_oi, const ScrubMap::object &candidate, - shard_info_wrapper &result, + shard_info_wrapper &shard_result, + inconsistent_obj_wrapper &obj_result, ostream &errorstream) { - enum scrub_error_type error = CLEAN; + enum { CLEAN, FOUND_ERROR } error = CLEAN; if (candidate.stat_error) { - error = SHALLOW_ERROR; + assert(shard_result.has_stat_error()); + error = FOUND_ERROR; errorstream << "candidate had a stat error"; } - if (candidate.read_error) { - error = DEEP_ERROR; + if (candidate.read_error || candidate.ec_hash_mismatch || candidate.ec_size_mismatch) { + error = FOUND_ERROR; errorstream << "candidate had a read error"; } if (auth.digest_present && candidate.digest_present) { if (auth.digest != candidate.digest) { if (error != CLEAN) errorstream << ", "; - error = DEEP_ERROR; - bool known = auth_oi.is_data_digest() && - auth.digest == auth_oi.data_digest; + error = FOUND_ERROR; errorstream << "data_digest 0x" << std::hex << candidate.digest - << " != " - << (known ? "known" : "best guess") - << " data_digest 0x" << auth.digest << std::dec - << " from auth shard " << auth_shard; - result.set_data_digest_mismatch(); + << " != data_digest 0x" << auth.digest << std::dec + << " from shard " << auth_shard; + obj_result.set_data_digest_mismatch(); } } if (auth.omap_digest_present && candidate.omap_digest_present) { if (auth.omap_digest != candidate.omap_digest) { if (error != CLEAN) errorstream << ", "; - error = DEEP_ERROR; - bool known = auth_oi.is_omap_digest() && - auth.omap_digest == auth_oi.omap_digest; + error = FOUND_ERROR; errorstream << "omap_digest 0x" << std::hex << candidate.omap_digest - << " != " - << (known ? "known" : "best guess") - << " omap_digest 0x" << auth.omap_digest << std::dec - << " from auth shard " << auth_shard; - result.set_omap_digest_mismatch(); + << " != omap_digest 0x" << auth.omap_digest << std::dec + << " from shard " << auth_shard; + obj_result.set_omap_digest_mismatch(); } } - if (!candidate.stat_error && auth.size != candidate.size) { + if (parent->get_pool().is_replicated()) { + if (auth_oi.is_data_digest() && candidate.digest_present) { + if (auth_oi.data_digest != candidate.digest) { + if (error != CLEAN) + errorstream << ", "; + error = FOUND_ERROR; + errorstream << "data_digest 0x" << std::hex << candidate.digest + << " != data_digest 0x" << auth_oi.data_digest << std::dec + << " from auth oi " << auth_oi; + shard_result.set_data_digest_mismatch_oi(); + } + } + if (auth_oi.is_omap_digest() && candidate.omap_digest_present) { + if (auth_oi.omap_digest != candidate.omap_digest) { + if (error != CLEAN) + errorstream << ", "; + error = FOUND_ERROR; + errorstream << "omap_digest 0x" << std::hex << candidate.omap_digest + << " != omap_digest 0x" << auth_oi.omap_digest << std::dec + << " from auth oi " << auth_oi; + shard_result.set_omap_digest_mismatch_oi(); + } + } + } + if (candidate.stat_error) + return error == FOUND_ERROR; + uint64_t oi_size = be_get_ondisk_size(auth_oi.size); + if (oi_size != candidate.size) { + if (error != CLEAN) + errorstream << ", "; + error = FOUND_ERROR; + errorstream << "size " << candidate.size + << " != size " << oi_size + << " from auth oi " << auth_oi; + shard_result.set_size_mismatch_oi(); + } + if (auth.size != candidate.size) { if (error != CLEAN) errorstream << ", "; - if (error != DEEP_ERROR) - error = SHALLOW_ERROR; - bool known = auth.size == be_get_ondisk_size(auth_oi.size); + error = FOUND_ERROR; errorstream << "size " << candidate.size - << " != " - << (known ? "known" : "best guess") - << " size " << auth.size; - result.set_size_mismatch(); + << " != size " << auth.size + << " from shard " << auth_shard; + obj_result.set_size_mismatch(); } for (map::const_iterator i = auth.attrs.begin(); i != auth.attrs.end(); @@ -463,17 +490,15 @@ if (!candidate.attrs.count(i->first)) { if (error != CLEAN) errorstream << ", "; - if (error != DEEP_ERROR) - error = SHALLOW_ERROR; - errorstream << "missing attr " << i->first; - result.set_attr_missing(); + error = FOUND_ERROR; + errorstream << "attr name mismatch '" << i->first << "'"; + obj_result.set_attr_name_mismatch(); } else if (candidate.attrs.find(i->first)->second.cmp(i->second)) { if (error != CLEAN) errorstream << ", "; - if (error != DEEP_ERROR) - error = SHALLOW_ERROR; - errorstream << "attr value mismatch " << i->first; - result.set_attr_mismatch(); + error = FOUND_ERROR; + errorstream << "attr value mismatch '" << i->first << "'"; + obj_result.set_attr_value_mismatch(); } } for (map::const_iterator i = candidate.attrs.begin(); @@ -482,21 +507,35 @@ if (!auth.attrs.count(i->first)) { if (error != CLEAN) errorstream << ", "; - if (error != DEEP_ERROR) - error = SHALLOW_ERROR; - errorstream << "extra attr " << i->first; - result.set_attr_unexpected(); + error = FOUND_ERROR; + errorstream << "attr name mismatch '" << i->first << "'"; + obj_result.set_attr_name_mismatch(); } } - return error; + return error == FOUND_ERROR; +} + +static int dcount(const object_info_t &oi) +{ + int count = 0; + if (oi.is_data_digest()) + count++; + if (oi.is_omap_digest()) + count++; + return count; } map::const_iterator PGBackend::be_select_auth_object( const hobject_t &obj, const map &maps, - object_info_t *auth_oi) + object_info_t *auth_oi, + map &shard_map, + inconsistent_obj_wrapper &object_error) { + eversion_t auth_version; + bufferlist auth_bl; + map::const_iterator auth = maps.end(); for (map::const_iterator j = maps.begin(); j != maps.end(); @@ -506,76 +545,81 @@ if (i == j->second->objects.end()) { continue; } - if (i->second.read_error || i->second.stat_error) { - // scrub encountered read error or stat_error, probably corrupt - dout(10) << __func__ << ": rejecting osd " << j->first - << " for obj " << obj - << "," << (i->second.read_error ? " read_error" : "") - << (i->second.stat_error ? " stat_error" : "") - << dendl; - continue; + string error_string; + auto& shard_info = shard_map[j->first]; + if (i->second.read_error) { + shard_info.set_read_error(); + error_string += " read_error"; + } + if (i->second.ec_hash_mismatch) { + shard_info.set_ec_hash_mismatch(); + error_string += " ec_hash_mismatch"; + } + if (i->second.ec_size_mismatch) { + shard_info.set_ec_size_mismatch(); + error_string += " ec_size_mismatch"; } - map::iterator k = i->second.attrs.find(OI_ATTR); + + object_info_t oi; + bufferlist bl; + map::iterator k; + + if (i->second.stat_error) { + shard_info.set_stat_error(); + error_string += " stat_error"; + // With stat_error no further checking + // We don't need to also see a missing_object_info_attr + goto out; + } + + k = i->second.attrs.find(OI_ATTR); if (k == i->second.attrs.end()) { // no object info on object, probably corrupt - dout(10) << __func__ << ": rejecting osd " << j->first - << " for obj " << obj - << ", no oi attr" - << dendl; - continue; + shard_info.set_oi_attr_missing(); + error_string += " oi_attr_missing"; + goto out; } - - bufferlist bl; bl.push_back(k->second); - object_info_t oi; try { bufferlist::iterator bliter = bl.begin(); ::decode(oi, bliter); } catch (...) { - dout(10) << __func__ << ": rejecting osd " << j->first - << " for obj " << obj - << ", corrupt oi attr" - << dendl; // invalid object info, probably corrupt - continue; + shard_info.set_oi_attr_corrupted(); + error_string += " oi_attr_corrupted"; + goto out; } - // note candidate in case we can't find anything better, because - // something is better than nothing. FIXME. - auth = j; - *auth_oi = oi; - - uint64_t correct_size = be_get_ondisk_size(oi.size); - if (correct_size != i->second.size) { - // invalid size, probably corrupt - dout(10) << __func__ << ": rejecting osd " << j->first + if (auth_version != eversion_t()) { + if (!object_error.has_object_info_inconsistency() && !(bl == auth_bl)) { + object_error.set_object_info_inconsistency(); + error_string += " object_info_inconsistency"; + } + } + + // Don't use this particular shard because it won't be able to repair data + // XXX: For now we can't pick one shard for repair and another's object info + if (i->second.read_error || i->second.ec_hash_mismatch || i->second.ec_size_mismatch) + goto out; + + if (auth_version == eversion_t() || oi.version > auth_version || + (oi.version == auth_version && dcount(oi) > dcount(*auth_oi))) { + auth = j; + *auth_oi = oi; + auth_version = oi.version; + auth_bl.clear(); + auth_bl.append(bl); + } + +out: + // Check error_string because some errors already generated messages + if (error_string != "") { + dout(10) << __func__ << ": error(s) osd " << j->first << " for obj " << obj - << ", size mismatch" + << "," << error_string << dendl; - // invalid object info, probably corrupt - continue; - } - if (parent->get_pool().is_replicated()) { - if (oi.is_data_digest() && i->second.digest_present && - oi.data_digest != i->second.digest) { - dout(10) << __func__ << ": rejecting osd " << j->first - << " for obj " << obj - << ", data digest mismatch 0x" << std::hex - << i->second.digest << " != 0x" << oi.data_digest - << std::dec << dendl; - continue; - } - if (oi.is_omap_digest() && i->second.omap_digest_present && - oi.omap_digest != i->second.omap_digest) { - dout(10) << __func__ << ": rejecting osd " << j->first - << " for obj " << obj - << ", omap digest mismatch 0x" << std::hex - << i->second.omap_digest << " != 0x" << oi.omap_digest - << std::dec << dendl; - continue; - } } - break; + // Keep scanning other shards } dout(10) << __func__ << ": selecting osd " << auth->first << " for obj " << obj @@ -614,60 +658,77 @@ k != master_set.end(); ++k) { object_info_t auth_oi; - map::const_iterator auth = - be_select_auth_object(*k, maps, &auth_oi); + map shard_map; + inconsistent_obj_wrapper object_error{*k}; + map::const_iterator auth = + be_select_auth_object(*k, maps, &auth_oi, shard_map, object_error); + list auth_list; if (auth == maps.end()) { - object_error.set_auth_missing(*k, maps); - ++shallow_errors; + object_error.set_version(0); + object_error.set_auth_missing(*k, maps, shard_map, shallow_errors, deep_errors); + if (object_error.has_deep_errors()) + ++deep_errors; + else if (object_error.has_shallow_errors()) + ++shallow_errors; + store->add_object_error(k->pool, object_error); errorstream << pgid.pgid << " soid " << *k - << ": failed to pick suitable auth object\n"; + << ": failed to pick suitable object info\n"; continue; } - auth_list.push_back(auth->first); - + object_error.set_version(auth_oi.user_version); ScrubMap::object& auth_object = auth->second->objects[*k]; set cur_missing; set cur_inconsistent; - bool clean = true; + for (j = maps.begin(); j != maps.end(); ++j) { if (j == auth) - continue; - shard_info_wrapper shard_info; + shard_map[auth->first].selected_oi = true; if (j->second->objects.count(*k)) { - shard_info.set_object(j->second->objects[*k]); + shard_map[j->first].set_object(j->second->objects[*k]); // Compare stringstream ss; - enum scrub_error_type error = - be_compare_scrub_objects(auth->first, + bool found = be_compare_scrub_objects(auth->first, auth_object, auth_oi, j->second->objects[*k], - shard_info, + shard_map[j->first], + object_error, ss); - if (error != CLEAN) { - clean = false; + // Some errors might have already been set in be_select_auth_object() + if (shard_map[j->first].errors != 0) { cur_inconsistent.insert(j->first); - if (error == SHALLOW_ERROR) - ++shallow_errors; - else + if (shard_map[j->first].has_deep_errors()) ++deep_errors; - errorstream << pgid << " shard " << j->first << ": soid " << *k + else + ++shallow_errors; + // Only true if be_compare_scrub_objects() found errors and put something + // in ss. + if (found) + errorstream << pgid << " shard " << j->first << ": soid " << *k << " " << ss.str() << "\n"; } else { + // XXX: The auth shard might get here that we don't know + // that it has the "correct" data. auth_list.push_back(j->first); } } else { - clean = false; cur_missing.insert(j->first); + shard_map[j->first].set_missing(); + // Can't have any other errors if there is no information available ++shallow_errors; errorstream << pgid << " shard " << j->first << " missing " << *k << "\n"; - shard_info.set_missing(); } - object_error.add_shard(j->first, shard_info); + object_error.add_shard(j->first, shard_map[j->first]); + } + + if (auth_list.empty()) { + errorstream << pgid.pgid << " soid " << *k + << ": failed to pick suitable auth object\n"; + goto out; } if (!cur_missing.empty()) { missing[*k] = cur_missing; @@ -677,12 +738,7 @@ } if (!cur_inconsistent.empty() || !cur_missing.empty()) { authoritative[*k] = auth_list; - shard_info_wrapper auth_shard{auth_object}; - object_error.add_shard(auth->first, auth_shard); - } - - if (clean && - parent->get_pool().is_replicated()) { + } else if (parent->get_pool().is_replicated()) { enum { NO = 0, MAYBE = 1, @@ -702,12 +758,10 @@ update = MAYBE; } - shard_info_wrapper auth_shard{auth_object}; // recorded digest != actual digest? if (auth_oi.is_data_digest() && auth_object.digest_present && auth_oi.data_digest != auth_object.digest) { - auth_shard.set_data_digest_mismatch_oi(); - ++deep_errors; + assert(shard_map[auth->first].has_data_digest_mismatch_oi()); errorstream << pgid << " recorded data digest 0x" << std::hex << auth_oi.data_digest << " != on disk 0x" << auth_object.digest << std::dec << " on " << auth_oi.soid @@ -717,8 +771,7 @@ } if (auth_oi.is_omap_digest() && auth_object.omap_digest_present && auth_oi.omap_digest != auth_object.omap_digest) { - auth_shard.set_omap_digest_mismatch_oi(); - ++deep_errors; + assert(shard_map[auth->first].has_omap_digest_mismatch_oi()); errorstream << pgid << " recorded omap digest 0x" << std::hex << auth_oi.omap_digest << " != on disk 0x" << auth_object.omap_digest << std::dec @@ -726,7 +779,6 @@ if (repair) update = FORCE; } - object_error.add_shard(auth->first, auth_shard); if (update != NO) { utime_t age = now - auth_oi.local_mtime; @@ -742,7 +794,12 @@ } } } - if (object_error.errors) { +out: + if (object_error.has_deep_errors()) + ++deep_errors; + else if (object_error.has_shallow_errors()) + ++shallow_errors; + if (object_error.errors || object_error.union_shards.errors) { store->add_object_error(k->pool, object_error); } } diff -Nru ceph-10.2.6/src/osd/PGBackend.h ceph-10.2.7/src/osd/PGBackend.h --- ceph-10.2.6/src/osd/PGBackend.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/PGBackend.h 2017-04-10 11:44:25.000000000 +0000 @@ -31,6 +31,7 @@ class Store; } struct shard_info_wrapper; +struct inconsistent_obj_wrapper; /** * PGBackend @@ -94,7 +95,7 @@ pg_shard_t peer, const hobject_t oid) = 0; - virtual void failed_push(pg_shard_t from, const hobject_t &soid) = 0; + virtual void failed_push(const list &from, const hobject_t &soid) = 0; virtual void cancel_pull(const hobject_t &soid) = 0; @@ -582,17 +583,20 @@ void be_scan_list( ScrubMap &map, const vector &ls, bool deep, uint32_t seed, ThreadPool::TPHandle &handle); - enum scrub_error_type be_compare_scrub_objects( + bool be_compare_scrub_objects( pg_shard_t auth_shard, const ScrubMap::object &auth, const object_info_t& auth_oi, const ScrubMap::object &candidate, shard_info_wrapper& shard_error, + inconsistent_obj_wrapper &result, ostream &errorstream); map::const_iterator be_select_auth_object( const hobject_t &obj, const map &maps, - object_info_t *auth_oi); + object_info_t *auth_oi, + map &shard_map, + inconsistent_obj_wrapper &object_error); void be_compare_scrubmaps( const map &maps, bool repair, diff -Nru ceph-10.2.6/src/osd/PG.cc ceph-10.2.7/src/osd/PG.cc --- ceph-10.2.6/src/osd/PG.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/PG.cc 2017-04-10 11:44:25.000000000 +0000 @@ -2126,18 +2126,31 @@ int pool_recovery_priority = 0; pool.info.opts.get(pool_opts_t::RECOVERY_PRIORITY, &pool_recovery_priority); - unsigned ret = OSD_RECOVERY_PRIORITY_BASE + pool_recovery_priority; - if (ret > OSD_RECOVERY_PRIORITY_MAX) + int ret = OSD_RECOVERY_PRIORITY_BASE + pool_recovery_priority; + + // Clamp to valid range + if (ret > OSD_RECOVERY_PRIORITY_MAX) { ret = OSD_RECOVERY_PRIORITY_MAX; - return ret; + } else if (ret < OSD_RECOVERY_PRIORITY_MIN) { + ret = OSD_RECOVERY_PRIORITY_MIN; + } + + static_assert(OSD_RECOVERY_PRIORITY_MIN < OSD_RECOVERY_PRIORITY_MAX, "Invalid priority range"); + static_assert(OSD_RECOVERY_PRIORITY_MIN >= 0, "Priority range must match unsigned type"); + + return static_cast(ret); } unsigned PG::get_backfill_priority() { // a higher value -> a higher priority - unsigned ret = OSD_BACKFILL_PRIORITY_BASE; - if (is_undersized()) { + int ret = OSD_BACKFILL_PRIORITY_BASE; + if (acting.size() < pool.info.min_size) { + // inactive: no. of replicas < min_size, highest priority since it blocks IO + ret = OSD_BACKFILL_INACTIVE_PRIORITY_BASE + (pool.info.min_size - acting.size()); + + } else if (is_undersized()) { // undersized: OSD_BACKFILL_DEGRADED_PRIORITY_BASE + num missing replicas assert(pool.info.size > actingset.size()); ret = OSD_BACKFILL_DEGRADED_PRIORITY_BASE + (pool.info.size - actingset.size()); @@ -2146,9 +2159,20 @@ // degraded: baseline degraded ret = OSD_BACKFILL_DEGRADED_PRIORITY_BASE; } - assert (ret < OSD_RECOVERY_PRIORITY_MAX); - return ret; + // Adjust with pool's recovery priority + int pool_recovery_priority = 0; + pool.info.opts.get(pool_opts_t::RECOVERY_PRIORITY, &pool_recovery_priority); + ret += pool_recovery_priority; + + // Clamp to valid range + if (ret > OSD_RECOVERY_PRIORITY_MAX) { + ret = OSD_RECOVERY_PRIORITY_MAX; + } else if (ret < OSD_RECOVERY_PRIORITY_MIN) { + ret = OSD_RECOVERY_PRIORITY_MIN; + } + + return static_cast(ret); } void PG::finish_recovery(list& tfin) @@ -3328,6 +3352,7 @@ // returns true if a scrub has been newly kicked off bool PG::sched_scrub() { + bool nodeep_scrub = false; assert(_lock.is_locked()); if (!(is_primary() && is_active() && is_clean() && !is_scrubbing())) { return false; @@ -3351,8 +3376,10 @@ //NODEEP_SCRUB so ignore time initiated deep-scrub if (osd->osd->get_osdmap()->test_flag(CEPH_OSDMAP_NODEEP_SCRUB) || - pool.info.has_flag(pg_pool_t::FLAG_NODEEP_SCRUB)) + pool.info.has_flag(pg_pool_t::FLAG_NODEEP_SCRUB)) { time_for_deep = false; + nodeep_scrub = true; + } if (!scrubber.must_scrub) { assert(!scrubber.must_deep_scrub); @@ -3410,6 +3437,24 @@ if (time_for_deep) { dout(10) << "sched_scrub: scrub will be deep" << dendl; state_set(PG_STATE_DEEP_SCRUB); + } else if (!scrubber.must_deep_scrub && info.stats.stats.sum.num_deep_scrub_errors) { + if (!nodeep_scrub) { + osd->clog->info() << "osd." << osd->whoami + << " pg " << info.pgid + << " Deep scrub errors, upgrading scrub to deep-scrub"; + state_set(PG_STATE_DEEP_SCRUB); + } else if (!scrubber.must_scrub) { + osd->clog->error() << "osd." << osd->whoami + << " pg " << info.pgid + << " Regular scrub skipped due to deep-scrub errors and nodeep-scrub set"; + clear_scrub_reserved(); + scrub_unreserve_replicas(); + return false; + } else { + osd->clog->error() << "osd." << osd->whoami + << " pg " << info.pgid + << " Regular scrub request, losing deep-scrub details"; + } } queue_scrub(); } else { @@ -3832,8 +3877,12 @@ const hobject_t& soid, list > *ok_peers, pg_shard_t bad_peer) { + list op_shards; + for (auto i : *ok_peers) { + op_shards.push_back(i.second); + } dout(10) << "repair_object " << soid << " bad_peer osd." - << bad_peer << " ok_peers osd.{" << ok_peers << "}" << dendl; + << bad_peer << " ok_peers osd.{" << op_shards << "}" << dendl; ScrubMap::object &po = ok_peers->back().first; eversion_t v; bufferlist bv; @@ -4523,7 +4572,7 @@ oss << "ok"; if (!deep_scrub && info.stats.stats.sum.num_deep_scrub_errors) oss << " ( " << info.stats.stats.sum.num_deep_scrub_errors - << " remaining deep scrub error(s) )"; + << " remaining deep scrub error details lost)"; if (repair) oss << ", " << scrubber.fixed << " fixed"; oss << "\n"; diff -Nru ceph-10.2.6/src/osd/ReplicatedBackend.cc ceph-10.2.7/src/osd/ReplicatedBackend.cc --- ceph-10.2.6/src/osd/ReplicatedBackend.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/ReplicatedBackend.cc 2017-04-10 11:44:25.000000000 +0000 @@ -1429,7 +1429,7 @@ dout(7) << "pull " << soid << " v " << v - << " on osds " << *p + << " on osds " << q->second << " from osd." << fromshard << dendl; @@ -2357,7 +2357,8 @@ void ReplicatedBackend::_failed_push(pg_shard_t from, const hobject_t &soid) { - get_parent()->failed_push(from, soid); + list fl = { from }; + get_parent()->failed_push(fl, soid); pull_from_peer[from].erase(soid); if (pull_from_peer[from].empty()) pull_from_peer.erase(from); diff -Nru ceph-10.2.6/src/osd/ReplicatedPG.cc ceph-10.2.7/src/osd/ReplicatedPG.cc --- ceph-10.2.6/src/osd/ReplicatedPG.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/ReplicatedPG.cc 2017-04-10 11:44:25.000000000 +0000 @@ -8593,7 +8593,7 @@ ObcLockManager &&manager, boost::optional > &&on_complete) { - dout(10) << __func__ << entries << dendl; + dout(10) << __func__ << " " << entries << dendl; assert(is_primary()); ObjectStore::Transaction t; @@ -8943,7 +8943,14 @@ } } - object_info_t oi(bv); + object_info_t oi; + try { + bufferlist::iterator bliter = bv.begin(); + ::decode(oi, bliter); + } catch (...) { + dout(0) << __func__ << ": obc corrupt: " << soid << dendl; + return ObjectContextRef(); // -ENOENT! + } assert(oi.soid.pool == (int64_t)info.pgid.pool()); @@ -9588,13 +9595,20 @@ } } - -void ReplicatedPG::failed_push(pg_shard_t from, const hobject_t &soid) +void ReplicatedPG::failed_push(const list &from, const hobject_t &soid) { + dout(20) << __func__ << ": " << soid << dendl; assert(recovering.count(soid)); + auto obc = recovering[soid]; + if (obc) { + list blocked_ops; + obc->drop_recovery_read(&blocked_ops); + requeue_ops(blocked_ops); + } recovering.erase(soid); - missing_loc.remove_location(soid, from); - dout(0) << "_failed_push " << soid << " from shard " << from + for (auto&& i : from) + missing_loc.remove_location(soid, i); + dout(0) << __func__ << " " << soid << " from shard " << from << ", reps on " << missing_loc.get_locations(soid) << " unfound? " << missing_loc.is_unfound(soid) << dendl; finish_recovery_op(soid); // close out this attempt, @@ -9863,6 +9877,7 @@ [=]() { requeue_ops(waiting_for_all_missing); waiting_for_all_missing.clear(); + requeue_object_waiters(waiting_for_unreadable_object); osd->queue_for_recovery(this); stringstream ss; @@ -10241,7 +10256,7 @@ void ReplicatedPG::cancel_pull(const hobject_t &soid) { - dout(20) << __func__ << ": soid" << dendl; + dout(20) << __func__ << ": " << soid << dendl; assert(recovering.count(soid)); ObjectContextRef obc = recovering[soid]; if (obc) { diff -Nru ceph-10.2.6/src/osd/ReplicatedPG.h ceph-10.2.7/src/osd/ReplicatedPG.h --- ceph-10.2.6/src/osd/ReplicatedPG.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/osd/ReplicatedPG.h 2017-04-10 11:44:25.000000000 +0000 @@ -280,7 +280,7 @@ void on_global_recover( const hobject_t &oid, const object_stat_sum_t &stat_diff); - void failed_push(pg_shard_t from, const hobject_t &soid); + void failed_push(const list &from, const hobject_t &soid) override; void cancel_pull(const hobject_t &soid); template diff -Nru ceph-10.2.6/src/rgw/librgw.cc ceph-10.2.7/src/rgw/librgw.cc --- ceph-10.2.6/src/rgw/librgw.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/librgw.cc 2017-04-10 11:44:25.000000000 +0000 @@ -629,7 +629,18 @@ std::lock_guard lg(librgw_mtx); if (! g_ceph_context) { vector args; + std::vector spl_args; + // last non-0 argument will be split and consumed + if (argc > 1) { + const std::string spl_arg{argv[(--argc)]}; + get_str_vec(spl_arg, " \t", spl_args); + } argv_to_vec(argc, const_cast(argv), args); + // append split args, if any + for (const auto& elt : spl_args) { + args.push_back(elt.c_str()); + } + env_to_vec(args); rc = rgwlib.init(args); } } diff -Nru ceph-10.2.6/src/rgw/Makefile.am ceph-10.2.7/src/rgw/Makefile.am --- ceph-10.2.6/src/rgw/Makefile.am 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/Makefile.am 2017-04-10 11:44:25.000000000 +0000 @@ -136,8 +136,7 @@ libcivetweb_la_CXXFLAGS = ${CIVETWEB_INCLUDE} -fPIC -Woverloaded-virtual \ ${AM_CXXFLAGS} -libcivetweb_la_CFLAGS = -I$(srcdir)/civetweb/include ${CIVETWEB_INCLUDE} -fPIC -DNO_SSL_DL -LIBCIVETWEB_DEPS += -lssl -lcrypto +libcivetweb_la_CFLAGS = -I$(srcdir)/civetweb/include ${CIVETWEB_INCLUDE} -fPIC $(SONAME_DEFINES) noinst_LTLIBRARIES += libcivetweb.la @@ -150,7 +149,7 @@ civetweb/src/civetweb.c \ rgw/rgw_main.cc -radosgw_CFLAGS = -I$(srcdir)/civetweb/include -fPIC -I$(srcdir)/xxHash ${CIVETWEB_INCLUDE} +radosgw_CFLAGS = -I$(srcdir)/civetweb/include -fPIC -I$(srcdir)/xxHash ${CIVETWEB_INCLUDE} $(SONAME_DEFINES) radosgw_LDADD = $(LIBRGW) $(LIBCIVETWEB) $(LIBCIVETWEB_DEPS) $(LIBRGW_DEPS) $(RESOLV_LIBS) \ $(CEPH_GLOBAL) bin_PROGRAMS += radosgw diff -Nru ceph-10.2.6/src/rgw/rgw_civetweb.cc ceph-10.2.7/src/rgw/rgw_civetweb.cc --- ceph-10.2.6/src/rgw/rgw_civetweb.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_civetweb.cc 2017-04-10 11:44:25.000000000 +0000 @@ -29,11 +29,22 @@ return r; } -RGWMongoose::RGWMongoose(mg_connection *_conn, int _port) - : conn(_conn), port(_port), status_num(0), header_done(false), +RGWMongoose::RGWMongoose(mg_connection *_conn) + : conn(_conn), status_num(0), header_done(false), sent_header(false), has_content_length(false), explicit_keepalive(false), explicit_conn_close(false) { + sockaddr *lsa = mg_get_local_addr(conn); + switch(lsa->sa_family) { + case AF_INET: + port = ntohs(((struct sockaddr_in*)lsa)->sin_port); + break; + case AF_INET6: + port = ntohs(((struct sockaddr_in6*)lsa)->sin6_port); + break; + default: + port = -1; + } } int RGWMongoose::read_data(char *buf, int len) @@ -64,9 +75,11 @@ * 'given in the response.' * */ - if (status_num == 204 || status_num == 304) { + if ((status_num == 204 || status_num == 304) && + ! g_conf->rgw_print_prohibited_content_length) { has_content_length = true; } else if (0 && data.length() == 0) { + /* XXX this never happens */ has_content_length = true; print("Transfer-Enconding: %s\r\n", "chunked"); data.append("0\r\n\r\n", sizeof("0\r\n\r\n")-1); @@ -144,14 +157,12 @@ env.set("REMOTE_USER", info->remote_user); env.set("SCRIPT_URI", info->uri); /* FIXME */ + if (port <= 0) + lderr(cct) << "init_env: bug: invalid port number" << dendl; char port_buf[16]; snprintf(port_buf, sizeof(port_buf), "%d", port); env.set("SERVER_PORT", port_buf); - if (info->is_ssl) { - if (port == 0) { - strcpy(port_buf,"443"); - } env.set("SERVER_PORT_SECURE", port_buf); } } diff -Nru ceph-10.2.6/src/rgw/rgw_civetweb_frontend.cc ceph-10.2.7/src/rgw/rgw_civetweb_frontend.cc --- ceph-10.2.6/src/rgw/rgw_civetweb_frontend.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_civetweb_frontend.cc 2017-04-10 11:44:25.000000000 +0000 @@ -18,7 +18,7 @@ OpsLogSocket* olog = pe->olog; RGWRequest req(store->get_new_req_id()); - RGWMongoose client_io(conn, pe->port); + RGWMongoose client_io(conn); int ret = process_request(pe->store, rest, &req, &client_io, olog); if (ret < 0) { @@ -39,6 +39,7 @@ map conf_map = conf->get_config_map(); conf->get_val("port", "80", &port_str); conf_map.erase("port"); + std::replace(port_str.begin(), port_str.end(), '+', ','); conf_map["listening_ports"] = port_str; set_conf_default(conf_map, "enable_keep_alive", "yes"); set_conf_default(conf_map, "num_threads", thread_pool_buf); diff -Nru ceph-10.2.6/src/rgw/rgw_civetweb.h ceph-10.2.7/src/rgw/rgw_civetweb.h --- ceph-10.2.6/src/rgw/rgw_civetweb.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_civetweb.h 2017-04-10 11:44:25.000000000 +0000 @@ -38,7 +38,7 @@ int complete_request(); int send_content_length(uint64_t len); - RGWMongoose(mg_connection *_conn, int _port); + RGWMongoose(mg_connection *_conn); void flush(); }; diff -Nru ceph-10.2.6/src/rgw/rgw_data_sync.cc ceph-10.2.7/src/rgw/rgw_data_sync.cc --- ceph-10.2.6/src/rgw/rgw_data_sync.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_data_sync.cc 2017-04-10 11:44:25.000000000 +0000 @@ -1493,17 +1493,20 @@ lock.get_write(); data_sync_cr = new RGWDataSyncControlCR(&sync_env, num_shards); + data_sync_cr->get(); // run() will drop a ref, so take another lock.unlock(); + r = run(data_sync_cr); - if (r < 0) { - ldout(store->ctx(), 0) << "ERROR: failed to run sync" << dendl; - return r; - } lock.get_write(); + data_sync_cr->put(); data_sync_cr = NULL; lock.unlock(); + if (r < 0) { + ldout(store->ctx(), 0) << "ERROR: failed to run sync" << dendl; + return r; + } return 0; } diff -Nru ceph-10.2.6/src/rgw/rgw_fcgi.cc ceph-10.2.7/src/rgw/rgw_fcgi.cc --- ceph-10.2.6/src/rgw/rgw_fcgi.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_fcgi.cc 2017-04-10 11:44:25.000000000 +0000 @@ -52,8 +52,10 @@ * Status 204 should not include a content-length header * RFC7230 says so */ - if (status_num == 204) + if ((status_num == 204) && + ! g_conf->rgw_print_prohibited_content_length) { return 0; + } char buf[21]; snprintf(buf, sizeof(buf), "%" PRIu64, len); diff -Nru ceph-10.2.6/src/rgw/rgw_file.cc ceph-10.2.7/src/rgw/rgw_file.cc --- ceph-10.2.6/src/rgw/rgw_file.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_file.cc 2017-04-10 11:44:25.000000000 +0000 @@ -204,6 +204,7 @@ int rc = rgwlib.get_fe()->execute_req(&req); if ((rc == 0) && (req.get_ret() == 0)) { + rgw_fh->set_atime(real_clock::to_timespec(real_clock::now())); *bytes_read = req.nread; } @@ -266,7 +267,8 @@ } rgw_fh->flags |= RGWFileHandle::FLAG_DELETED; - fh_cache.remove(rgw_fh->fh.fh_hk.object, rgw_fh, cohort::lru::FLAG_NONE); + fh_cache.remove(rgw_fh->fh.fh_hk.object, rgw_fh, + RGWFileHandle::FHCache::FLAG_LOCK); #if 1 /* XXX verify clear cache */ fh_key fhk(rgw_fh->fh.fh_hk); @@ -275,6 +277,12 @@ assert(!nfh); #endif + if (! rc) { + real_time t = real_clock::now(); + parent->set_mtime(real_clock::to_timespec(t)); + parent->set_ctime(real_clock::to_timespec(t)); + } + rgw_fh->mtx.unlock(); unref(rgw_fh); @@ -387,7 +395,7 @@ << dendl; } } - break; + goto out; default: abort(); } /* switch */ @@ -434,6 +442,8 @@ rc = valid_s3_bucket_name(bname, false /* relaxed */); if (rc != 0) { rgw_fh->flags |= RGWFileHandle::FLAG_DELETED; + fh_cache.remove(rgw_fh->fh.fh_hk.object, rgw_fh, + RGWFileHandle::FHCache::FLAG_LOCK); rgw_fh->mtx.unlock(); unref(rgw_fh); get<0>(mkr) = nullptr; @@ -454,6 +464,7 @@ buffer::list bl; string dir_name = /* XXX get rid of this some day soon, too */ parent->relative_object_name(); + /* creating objects w/leading '/' makes a mess */ if ((dir_name.size() > 0) && (dir_name.back() != '/')) @@ -461,6 +472,17 @@ dir_name += name; dir_name += "/"; + /* need valid S3 name (characters, length <= 1024, etc) */ + if (! valid_s3_object_name(dir_name)) { + rgw_fh->flags |= RGWFileHandle::FLAG_DELETED; + fh_cache.remove(rgw_fh->fh.fh_hk.object, rgw_fh, + RGWFileHandle::FHCache::FLAG_LOCK); + rgw_fh->mtx.unlock(); + unref(rgw_fh); + get<0>(mkr) = nullptr; + return mkr; + } + RGWPutObjRequest req(get_context(), get_user(), parent->bucket_name(), dir_name, bl); @@ -483,6 +505,9 @@ if (!rc) rc = rc2; } else { + real_time t = real_clock::now(); + parent->set_mtime(real_clock::to_timespec(t)); + parent->set_ctime(real_clock::to_timespec(t)); rgw_fh->mtx.unlock(); /* !LOCKED */ } @@ -533,9 +558,13 @@ if (rgw_fh) { if (get<1>(fhr) & RGWFileHandle::FLAG_CREATE) { /* fill in stat data */ + real_time t = real_clock::now(); rgw_fh->create_stat(st, mask); - rgw_fh->set_times(real_clock::now()); + rgw_fh->set_times(t); rgw_fh->open_for_create(); // XXX needed? + + parent->set_mtime(real_clock::to_timespec(t)); + parent->set_ctime(real_clock::to_timespec(t)); } (void) rgw_fh->stat(st); get<0>(mkr) = rgw_fh; @@ -571,6 +600,10 @@ buffer::list ux_key, ux_attrs; string obj_name{rgw_fh->relative_object_name()}; + if (rgw_fh->is_dir()) { + obj_name += "/"; + } + RGWSetAttrsRequest req(cct, get_user(), rgw_fh->bucket_name(), obj_name); rgw_fh->create_stat(st, mask); @@ -583,7 +616,29 @@ rc = rgwlib.get_fe()->execute_req(&req); rc2 = req.get_ret(); - return (((rc == 0) && (rc2 == 0)) ? 0 : -EIO); + if (rc == -ENOENT) { + /* special case: materialize placeholder dir */ + buffer::list bl; + RGWPutObjRequest req(get_context(), get_user(), rgw_fh->bucket_name(), + obj_name, bl); + + rgw_fh->encode_attrs(ux_key, ux_attrs); /* because std::moved */ + + /* save attrs */ + req.emplace_attr(RGW_ATTR_UNIX_KEY1, std::move(ux_key)); + req.emplace_attr(RGW_ATTR_UNIX1, std::move(ux_attrs)); + + rc = rgwlib.get_fe()->execute_req(&req); + rc2 = req.get_ret(); + } + + if ((rc != 0) || (rc2 != 0)) { + return -EIO; + } + + rgw_fh->set_ctime(real_clock::to_timespec(real_clock::now())); + + return 0; } /* RGWLibFS::setattr */ void RGWLibFS::close() @@ -701,6 +756,49 @@ } while (! (stop || shutdown)); } /* RGWLibFS::gc */ + std::ostream& operator<<(std::ostream &os, + RGWFileHandle const &rgw_fh) + { + const auto& fhk = rgw_fh.get_key(); + const auto& fh = const_cast(rgw_fh).get_fh(); + os << "fh_type) { + case RGW_FS_TYPE_DIRECTORY: + os << "type=DIRECTORY;"; + break; + case RGW_FS_TYPE_FILE: + os << "type=FILE;"; + break; + default: + os << "type=UNKNOWN;"; + break; + }; + os << "fid=" << fhk.fh_hk.bucket << ":" << fhk.fh_hk.object << ";"; + os << "name=" << rgw_fh.object_name() << ";"; + os << "refcnt=" << rgw_fh.get_refcnt() << ";"; + os << ">"; + return os; + } + + RGWFileHandle::~RGWFileHandle() { + /* in the non-delete case, handle may still be in handle table */ + if (fh_hook.is_linked()) { + fs->fh_cache.remove(fh.fh_hk.object, this, FHCache::FLAG_LOCK); + } + /* cond-unref parent */ + if (parent && (! parent->is_root())) { + /* safe because if parent->unref causes its deletion, + * there are a) by refcnt, no other objects/paths pointing + * to it and b) by the semantics of valid iteration of + * fh_lru (observed, e.g., by cohort_lru::drain()) + * no unsafe iterators reaching it either--n.b., this constraint + * is binding oncode which may in future attempt to e.g., + * cause the eviction of objects in LRU order */ + (void) get_fs()->fh_lru.unref(parent, cohort::lru::FLAG_NONE); + } + } + void RGWFileHandle::encode_attrs(ceph::buffer::list& ux_key1, ceph::buffer::list& ux_attrs1) { @@ -722,7 +820,13 @@ } /* RGWFileHandle::decode_attrs */ bool RGWFileHandle::reclaim() { - fs->fh_cache.remove(fh.fh_hk.object, this, cohort::lru::FLAG_NONE); + lsubdout(fs->get_context(), rgw, 17) + << __func__ << " " << *this + << dendl; + /* remove if still in fh_cache */ + if (fh_hook.is_linked()) { + fs->fh_cache.remove(fh.fh_hk.object, this, FHCache::FLAG_LOCK); + } return true; } /* RGWFileHandle::reclaim */ @@ -1088,6 +1192,7 @@ if (! op_ret) { /* update stats */ rgw_fh->set_mtime(real_clock::to_timespec(mtime)); + rgw_fh->set_ctime(real_clock::to_timespec(mtime)); rgw_fh->set_size(bytes_written); } @@ -1289,9 +1394,10 @@ LookupFHResult fhr; if (parent->is_root()) { - /* special: lookup on root itself */ - if (strcmp(path, "/") == 0) { - rgw_fh = fs->ref(parent); + /* special: parent lookup--note lack of ref()! */ + if (unlikely((strcmp(path, "..") == 0) || + (strcmp(path, "/") == 0))) { + rgw_fh = parent; } else { fhr = fs->stat_bucket(parent, path, RGWFileHandle::FLAG_NONE); rgw_fh = get<0>(fhr); @@ -1299,7 +1405,11 @@ return -ENOENT; } } else { - fhr = fs->stat_leaf(parent, path, RGWFileHandle::FLAG_EXACT_MATCH); + /* lookup in a readdir callback */ + uint32_t sl_flags = (flags & RGW_LOOKUP_FLAG_RCB) + ? RGWFileHandle::FLAG_NONE + : RGWFileHandle::FLAG_EXACT_MATCH; + fhr = fs->stat_leaf(parent, path, sl_flags); if (! get<0>(fhr)) { if (! (flags & RGW_LOOKUP_FLAG_CREATE)) return -ENOENT; @@ -1343,8 +1453,12 @@ { RGWLibFS *fs = static_cast(rgw_fs->fs_private); RGWFileHandle* rgw_fh = get_rgwfh(fh); - fs->unref(rgw_fh); + lsubdout(fs->get_context(), rgw, 17) + << __func__ << " " << *rgw_fh + << dendl; + + fs->unref(rgw_fh); return 0; } @@ -1357,7 +1471,7 @@ RGWLibFS *fs = static_cast(rgw_fs->fs_private); RGWFileHandle* rgw_fh = get_rgwfh(fh); - return -(fs->getattr(rgw_fh, st)); + return fs->getattr(rgw_fh, st); } /* diff -Nru ceph-10.2.6/src/rgw/rgw_file.h ceph-10.2.7/src/rgw/rgw_file.h --- ceph-10.2.6/src/rgw/rgw_file.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_file.h 2017-04-10 11:44:25.000000000 +0000 @@ -24,9 +24,9 @@ #include #include #include +#include #include "xxhash.h" #include "include/buffer.h" -#include "common/sstring.hh" #include "common/cohort_lru.h" #include "common/ceph_timer.h" #include "rgw_common.h" @@ -164,11 +164,7 @@ using lock_guard = std::lock_guard; using unique_lock = std::unique_lock; - /* median file name length (HPC) has been found to be 16, - * w/90% of file names <= 31 (Yifan Wang, CMU) */ - using dirent_string = basic_sstring; - - using marker_cache_t = flat_map; + using marker_cache_t = flat_map; struct State { uint64_t dev; @@ -346,6 +342,13 @@ break; } } + + if (mask & RGW_SETATTR_ATIME) + state.atime = st->st_atim; + if (mask & RGW_SETATTR_MTIME) + state.mtime = st->st_mtim; + if (mask & RGW_SETATTR_CTIME) + state.ctime = st->st_ctim; } int stat(struct stat* st) { @@ -444,27 +447,26 @@ } } - void add_marker(uint64_t off, const boost::string_ref& marker, + void add_marker(uint64_t off, const rgw_obj_key& marker, uint8_t obj_type) { using std::get; directory* d = get(&variant_type); if (d) { unique_lock guard(mtx); - // XXXX check for failure (dup key) d->marker_cache.insert( - marker_cache_t::value_type(off, marker.data())); + marker_cache_t::value_type(off, marker)); } } - std::string find_marker(uint64_t off) { // XXX copy + const rgw_obj_key* find_marker(uint64_t off) { using std::get; directory* d = get(&variant_type); if (d) { const auto& iter = d->marker_cache.find(off); if (iter != d->marker_cache.end()) - return iter->second; + return &(iter->second); } - return ""; + return nullptr; } bool is_open() const { return flags & FLAG_OPEN; } @@ -477,7 +479,7 @@ bool deleted() const { return flags & FLAG_DELETED; } bool stateless_open() const { return flags & FLAG_STATELESS_OPEN; } - uint32_t open(uint32_t gsh_flags) { + int open(uint32_t gsh_flags) { lock_guard guard(mtx); if (! (flags & FLAG_OPEN)) { if (gsh_flags & RGW_OPEN_FLAG_V3) { @@ -486,7 +488,7 @@ flags |= FLAG_OPEN; return 0; } - return EPERM; + return -EPERM; } int readdir(rgw_readdir_cb rcb, void *cb_arg, uint64_t *offset, bool *eof, @@ -634,7 +636,10 @@ typedef cohort::lru::TreeX FHCache; - virtual ~RGWFileHandle() {} + virtual ~RGWFileHandle(); + + friend std::ostream& operator<<(std::ostream &os, + RGWFileHandle const &rgw_fh); class Factory : public cohort::lru::ObjectFactory { @@ -805,7 +810,7 @@ void release_evict(RGWFileHandle* fh) { /* remove from cache, releases sentinel ref */ fh_cache.remove(fh->fh.fh_hk.object, fh, - RGWFileHandle::FHCache::FLAG_NONE); + RGWFileHandle::FHCache::FLAG_LOCK); /* release call-path ref */ (void) fh_lru.unref(fh, cohort::lru::FLAG_NONE); } @@ -883,6 +888,11 @@ } lat.lock->unlock(); /* !LATCHED */ get<0>(fhr) = fh; + if (fh) { + lsubdout(get_context(), rgw, 17) + << __func__ << " 1 " << *fh + << dendl; + } return fhr; } /* lookup_fh(const fh_key&) */ @@ -949,6 +959,10 @@ /* inserts, releasing latch */ fh_cache.insert_latched(fh, lat, RGWFileHandle::FHCache::FLAG_UNLOCK); get<1>(fhr) |= RGWFileHandle::FLAG_CREATE; + /* ref parent (non-initial ref cannot fail on valid object) */ + if (! parent->is_root()) { + (void) fh_lru.ref(parent, cohort::lru::FLAG_NONE); + } goto out; /* !LATCHED */ } else { lat.lock->unlock(); @@ -958,15 +972,24 @@ lat.lock->unlock(); /* !LATCHED */ out: get<0>(fhr) = fh; + if (fh) { + lsubdout(get_context(), rgw, 17) + << __func__ << " 2 " << *fh + << dendl; + } return fhr; } /* lookup_fh(RGWFileHandle*, const char *, const uint32_t) */ inline void unref(RGWFileHandle* fh) { - (void) fh_lru.unref(fh, cohort::lru::FLAG_NONE); + if (likely(! fh->is_root())) { + (void) fh_lru.unref(fh, cohort::lru::FLAG_NONE); + } } inline RGWFileHandle* ref(RGWFileHandle* fh) { - fh_lru.ref(fh, cohort::lru::FLAG_NONE); + if (likely(! fh->is_root())) { + fh_lru.ref(fh, cohort::lru::FLAG_NONE); + } return fh; } @@ -1093,13 +1116,9 @@ void* _cb_arg, uint64_t* _offset) : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), offset(_offset), cb_arg(_cb_arg), rcb(_rcb), ix(0) { - const std::string& sm = rgw_fh->find_marker(*offset); - if (sm.size() > 0) { - RGWListBuckets::marker = - rgw_fh->relative_object_name(); - if (marker.back() != '/') - marker += "/"; - marker += sm; + const auto& mk = rgw_fh->find_marker(*offset); + if (mk) { + marker = mk->name; } op = this; } @@ -1161,11 +1180,13 @@ // do nothing } - int operator()(const boost::string_ref& name, const boost::string_ref& marker) { + int operator()(const boost::string_ref& name, + const boost::string_ref& marker) { uint64_t off = XXH64(name.data(), name.length(), fh_key::seed); *offset = off; /* update traversal cache */ - rgw_fh->add_marker(off, marker, RGW_FS_TYPE_DIRECTORY); + rgw_fh->add_marker(off, rgw_obj_key{marker.data(), ""}, + RGW_FS_TYPE_DIRECTORY); rcb(name.data(), cb_arg, off); return 0; } @@ -1198,12 +1219,9 @@ void* _cb_arg, uint64_t* _offset) : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), offset(_offset), cb_arg(_cb_arg), rcb(_rcb), ix(0) { - const std::string& sm{rgw_fh->find_marker(*offset)}; - if (sm.size() > 0) { - RGWListBucket::marker = {rgw_fh->relative_object_name(), ""}; - if (marker.name.back() != '/') - marker.name += "/"; - marker.name += sm; + const auto& mk = rgw_fh->find_marker(*offset); + if (mk) { + marker = *mk; } default_max = 1000; // XXX was being omitted op = this; @@ -1246,7 +1264,7 @@ return 0; } - int operator()(const boost::string_ref name, const boost::string_ref marker, + int operator()(const boost::string_ref name, const rgw_obj_key& marker, uint8_t type) { assert(name.length() > 0); // XXX @@ -1291,7 +1309,7 @@ << dendl; /* call me maybe */ - this->operator()(sref, sref, RGW_FS_TYPE_FILE); + this->operator()(sref, next_marker, RGW_FS_TYPE_FILE); ++ix; } for (auto& iter : common_prefixes) { @@ -1324,7 +1342,7 @@ << " cpref=" << sref << dendl; - this->operator()(sref, sref, RGW_FS_TYPE_DIRECTORY); + this->operator()(sref, next_marker, RGW_FS_TYPE_DIRECTORY); ++ix; } } diff -Nru ceph-10.2.6/src/rgw/rgw_formats.cc ceph-10.2.7/src/rgw/rgw_formats.cc --- ceph-10.2.6/src/rgw/rgw_formats.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_formats.cc 2017-04-10 11:44:25.000000000 +0000 @@ -25,6 +25,7 @@ : buf(NULL), len(0), max_len(0), + wrote_something(false), min_stack_level(0), use_kv(ukv) { @@ -41,7 +42,7 @@ return; if (len) { - os << buf << "\n"; + os << buf; os.flush(); } @@ -156,13 +157,14 @@ vsnprintf(buf, LARGE_SIZE, fmt, ap); const char *eol; - if (len) { + if (wrote_something) { if (use_kv && entry.is_array && entry.size > 1) eol = ", "; else eol = "\n"; } else eol = ""; + wrote_something = true; if (use_kv && !entry.is_array) write_data("%s%s: %s", eol, name, buf); @@ -268,10 +270,11 @@ va_end(ap); const char *eol; - if (len) + if (wrote_something) { eol = "\n"; - else + } else eol = ""; + wrote_something = true; if (use_kv && !entry.is_array) write_data("%s%s: %s", eol, name, buf); diff -Nru ceph-10.2.6/src/rgw/rgw_formats.h ceph-10.2.7/src/rgw/rgw_formats.h --- ceph-10.2.6/src/rgw/rgw_formats.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_formats.h 2017-04-10 11:44:25.000000000 +0000 @@ -56,6 +56,7 @@ std::list stack; size_t min_stack_level; bool use_kv; + bool wrote_something; }; class RGWFormatterFlusher { diff -Nru ceph-10.2.6/src/rgw/rgw_main.cc ceph-10.2.7/src/rgw/rgw_main.cc --- ceph-10.2.6/src/rgw/rgw_main.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_main.cc 2017-04-10 11:44:25.000000000 +0000 @@ -62,6 +62,10 @@ #include "include/types.h" #include "common/BackTrace.h" +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + #define dout_subsys ceph_subsys_rgw using namespace std; @@ -439,10 +443,7 @@ fe = new RGWFCGXFrontend(fcgi_pe, config); } else if (framework == "civetweb" || framework == "mongoose") { - int port; - config->get_val("port", 80, &port); - - RGWProcessEnv env = { store, &rest, olog, port }; + RGWProcessEnv env = { store, &rest, olog, 0 }; fe = new RGWMongooseFrontend(env, config); } else if (framework == "loadgen") { @@ -480,6 +481,12 @@ realm_watcher.add_watcher(RGWRealmNotify::Reload, reloader); realm_watcher.add_watcher(RGWRealmNotify::ZonesNeedPeriod, pusher); +#if defined(HAVE_SYS_PRCTL_H) + if (prctl(PR_SET_DUMPABLE, 1) == -1) { + cerr << "warning: unable to set dumpable flag: " << cpp_strerror(errno) << std::endl; + } +#endif + wait_shutdown(); derr << "shutting down" << dendl; diff -Nru ceph-10.2.6/src/rgw/rgw_op.cc ceph-10.2.7/src/rgw/rgw_op.cc --- ceph-10.2.6/src/rgw/rgw_op.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_op.cc 2017-04-10 11:44:25.000000000 +0000 @@ -1825,7 +1825,7 @@ if (op_ret < 0) return op_ret; - if (buckets.count() >= s->user->max_buckets) { + if (int32_t(buckets.count()) >= s->user->max_buckets) { return -ERR_TOO_MANY_BUCKETS; } } @@ -2230,8 +2230,30 @@ int RGWPutObj::verify_permission() { - if (!verify_bucket_permission(s, RGW_PERM_WRITE)) + if (copy_source) { + + RGWAccessControlPolicy cs_policy(s->cct); + map cs_attrs; + rgw_bucket cs_bucket(copy_source_bucket_info.bucket); + rgw_obj_key cs_object(copy_source_object_name, copy_source_version_id); + + /* check source object permissions */ + if (read_policy(store, s, copy_source_bucket_info, cs_attrs, &cs_policy, cs_bucket, cs_object) < 0) { + return -EACCES; + } + + /* system request overrides permission checks */ + if (!s->system_request && + !cs_policy.verify_permission(s->user->user_id, s->perm_mask, + RGW_PERM_READ)) { + return -EACCES; + } + + } + + if (!verify_bucket_permission(s, RGW_PERM_WRITE)) { return -EACCES; + } return 0; } @@ -2407,6 +2429,59 @@ rgw_bucket_object_pre_exec(s); } +class RGWPutObj_CB : public RGWGetDataCB +{ + RGWPutObj *op; +public: + RGWPutObj_CB(RGWPutObj *_op) : op(_op) {} + virtual ~RGWPutObj_CB() {} + + int handle_data(bufferlist& bl, off_t bl_ofs, off_t bl_len) { + return op->get_data_cb(bl, bl_ofs, bl_len); + } +}; + +int RGWPutObj::get_data_cb(bufferlist& bl, off_t bl_ofs, off_t bl_len) +{ + bufferlist bl_tmp; + bl.copy(bl_ofs, bl_len, bl_tmp); + + bl_aux.append(bl_tmp); + + return bl_len; +} + +int RGWPutObj::get_data(const off_t fst, const off_t lst, bufferlist& bl) +{ + RGWPutObj_CB cb(this); + int ret = 0; + + int64_t new_ofs, new_end; + + new_ofs = fst; + new_end = lst; + + rgw_obj_key obj_key(copy_source_object_name, copy_source_version_id); + rgw_obj obj(copy_source_bucket_info.bucket, obj_key.name); + obj.set_instance(obj_key.instance); + + RGWRados::Object op_target(store, copy_source_bucket_info, *static_cast(s->obj_ctx), obj); + RGWRados::Object::Read read_op(&op_target); + + ret = read_op.prepare(&new_ofs, &new_end); + if (ret < 0) + return ret; + + ret = read_op.iterate(new_ofs, new_end, &cb); + if (ret < 0) { + return ret; + } + + bl.claim_append(bl_aux); + + return ret; +} + void RGWPutObj::execute() { RGWPutObjProcessor *processor = NULL; @@ -2418,7 +2493,9 @@ bufferlist bl, aclbl; int len; map::iterator iter; - bool multipart; + bool multipart; + off_t fst; + off_t lst; bool need_calc_md5 = (dlo_manifest == NULL) && (slo_info == NULL); @@ -2498,9 +2575,24 @@ goto done; } + fst = copy_source_range_fst; + lst = copy_source_range_lst; + do { bufferlist data_in; - len = get_data(data_in); + if (fst > lst) + break; + if (!copy_source) { + len = get_data(data_in); + } else { + uint64_t cur_lst = min(fst + s->cct->_conf->rgw_max_chunk_size - 1, lst); + op_ret = get_data(fst, cur_lst, data_in); + if (op_ret < 0) + goto done; + len = data_in.length(); + s->content_length += len; + fst += len; + } if (len < 0) { op_ret = len; goto done; diff -Nru ceph-10.2.6/src/rgw/rgw_op.h ceph-10.2.7/src/rgw/rgw_op.h --- ceph-10.2.6/src/rgw/rgw_op.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_op.h 2017-04-10 11:44:25.000000000 +0000 @@ -650,6 +650,15 @@ const char *supplied_etag; const char *if_match; const char *if_nomatch; + const char *copy_source; + const char *copy_source_range; + RGWBucketInfo copy_source_bucket_info; + string copy_source_tenant_name; + string copy_source_bucket_name; + string copy_source_object_name; + string copy_source_version_id; + off_t copy_source_range_fst; + off_t copy_source_range_lst; string etag; bool chunked_upload; RGWAccessControlPolicy policy; @@ -659,6 +668,7 @@ ceph::real_time mtime; uint64_t olh_epoch; string version_id; + bufferlist bl_aux; ceph::real_time delete_at; @@ -668,6 +678,10 @@ supplied_etag(NULL), if_match(NULL), if_nomatch(NULL), + copy_source(NULL), + copy_source_range(NULL), + copy_source_range_fst(0), + copy_source_range_lst(0), chunked_upload(0), dlo_manifest(NULL), slo_info(NULL), @@ -693,6 +707,9 @@ void pre_exec(); void execute(); + int get_data_cb(bufferlist& bl, off_t bl_ofs, off_t bl_len); + int get_data(const off_t fst, const off_t lst, bufferlist& bl); + virtual int get_params() = 0; virtual int get_data(bufferlist& bl) = 0; virtual void send_response() = 0; diff -Nru ceph-10.2.6/src/rgw/rgw_rados.cc ceph-10.2.7/src/rgw/rgw_rados.cc --- ceph-10.2.6/src/rgw/rgw_rados.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_rados.cc 2017-04-10 11:44:25.000000000 +0000 @@ -1176,6 +1176,10 @@ return ret; } + // clear zone short ids of removed zones. period_map.update() will add the + // remaining zones back + period_map.short_zone_ids.clear(); + for (auto& iter : zonegroups) { RGWZoneGroup zg(string(), iter); ret = zg.init(cct, store); diff -Nru ceph-10.2.6/src/rgw/rgw_rest_s3.cc ceph-10.2.7/src/rgw/rgw_rest_s3.cc --- ceph-10.2.6/src/rgw/rgw_rest_s3.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_rest_s3.cc 2017-04-10 11:44:25.000000000 +0000 @@ -1041,18 +1041,92 @@ int RGWPutObj_ObjStore_S3::get_params() { + RGWObjectCtx& obj_ctx = *static_cast(s->obj_ctx); + map src_attrs; + size_t pos; + int ret; + RGWAccessControlPolicy_S3 s3policy(s->cct); if (!s->length) return -ERR_LENGTH_REQUIRED; - int r = create_s3_policy(s, store, s3policy, s->owner); - if (r < 0) - return r; + ret = create_s3_policy(s, store, s3policy, s->owner); + if (ret < 0) + return ret; policy = s3policy; if_match = s->info.env->get("HTTP_IF_MATCH"); if_nomatch = s->info.env->get("HTTP_IF_NONE_MATCH"); + copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE"); + copy_source_range = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE_RANGE"); + + /* handle x-amz-copy-source */ + + if (copy_source) { + copy_source_bucket_name = copy_source; + pos = copy_source_bucket_name.find("/"); + if (pos == std::string::npos) { + ret = -EINVAL; + ldout(s->cct, 5) << "x-amz-copy-source bad format" << dendl; + return ret; + } + copy_source_object_name = copy_source_bucket_name.substr(pos + 1, copy_source_bucket_name.size()); + copy_source_bucket_name = copy_source_bucket_name.substr(0, pos); +#define VERSION_ID_STR "?versionId=" + pos = copy_source_object_name.find(VERSION_ID_STR); + if (pos == std::string::npos) { + url_decode(copy_source_object_name, copy_source_object_name); + } else { + copy_source_version_id = copy_source_object_name.substr(pos + sizeof(VERSION_ID_STR) - 1); + url_decode(copy_source_object_name.substr(0, pos), copy_source_object_name); + } + pos = copy_source_bucket_name.find(":"); + if (pos == std::string::npos) { + copy_source_tenant_name = s->src_tenant_name; + } else { + copy_source_tenant_name = copy_source_bucket_name.substr(0, pos); + copy_source_bucket_name = copy_source_bucket_name.substr(pos + 1, copy_source_bucket_name.size()); + if (copy_source_bucket_name.empty()) { + ret = -EINVAL; + ldout(s->cct, 5) << "source bucket name is empty" << dendl; + return ret; + } + } + ret = store->get_bucket_info(obj_ctx, + copy_source_tenant_name, + copy_source_bucket_name, + copy_source_bucket_info, + NULL, &src_attrs); + if (ret < 0) { + ldout(s->cct, 5) << __func__ << "(): get_bucket_info() returned ret=" << ret << dendl; + return ret; + } + + /* handle x-amz-copy-source-range */ + + if (copy_source_range) { + string range = copy_source_range; + pos = range.find("="); + if (pos == std::string::npos) { + ret = -EINVAL; + ldout(s->cct, 5) << "x-amz-copy-source-range bad format" << dendl; + return ret; + } + range = range.substr(pos + 1); + pos = range.find("-"); + if (pos == std::string::npos) { + ret = -EINVAL; + ldout(s->cct, 5) << "x-amz-copy-source-range bad format" << dendl; + return ret; + } + string first = range.substr(0, pos); + string last = range.substr(pos + 1); + copy_source_range_fst = strtoull(first.c_str(), NULL, 10); + copy_source_range_lst = strtoull(last.c_str(), NULL, 10); + } + + } /* copy_source */ return RGWPutObj_ObjStore::get_params(); } @@ -1238,8 +1312,28 @@ s->cct->_conf->rgw_s3_success_create_obj_status); set_req_state_err(s, op_ret); } - dump_etag(s, etag.c_str()); - dump_content_length(s, 0); + if (!copy_source) { + dump_etag(s, etag.c_str()); + dump_content_length(s, 0); + } else { + dump_errno(s); + end_header(s, this, "application/xml"); + dump_start(s); + struct tm tmp; + utime_t ut(mtime); + time_t secs = (time_t)ut.sec(); + gmtime_r(&secs, &tmp); + char buf[TIME_BUF_SIZE]; + s->formatter->open_object_section_in_ns("CopyPartResult", + "http://s3.amazonaws.com/doc/2006-03-01/"); + if (strftime(buf, sizeof(buf), "%Y-%m-%dT%T.000Z", &tmp) > 0) { + s->formatter->dump_string("LastModified", buf); + } + s->formatter->dump_string("ETag", etag); + s->formatter->close_section(); + rgw_flush_formatter_and_reset(s, s->formatter); + return; + } } if (s->system_request && !real_clock::is_zero(mtime)) { dump_epoch_header(s, "Rgwx-Mtime", mtime); @@ -2114,10 +2208,6 @@ int RGWCopyObj_ObjStore_S3::get_params() { - if (s->info.env->get("HTTP_X_AMZ_COPY_SOURCE_RANGE")) { - return -ERR_NOT_IMPLEMENTED; - } - if_mod = s->info.env->get("HTTP_X_AMZ_COPY_IF_MODIFIED_SINCE"); if_unmod = s->info.env->get("HTTP_X_AMZ_COPY_IF_UNMODIFIED_SINCE"); if_match = s->info.env->get("HTTP_X_AMZ_COPY_IF_MATCH"); @@ -3079,10 +3169,11 @@ s->has_acl_header = s->info.env->exists_prefix("HTTP_X_AMZ_GRANT"); const char *copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE"); - if (copy_source) { + + if (copy_source && !s->info.env->get("HTTP_X_AMZ_COPY_SOURCE_RANGE")) { ret = RGWCopyObj::parse_copy_location(copy_source, - s->init_state.src_bucket, - s->src_object); + s->init_state.src_bucket, + s->src_object); if (!ret) { ldout(s->cct, 0) << "failed to parse copy location" << dendl; return -EINVAL; // XXX why not -ERR_INVALID_BUCKET_NAME or -ERR_BAD_URL? @@ -3677,10 +3768,12 @@ } string token_value = string(t); if (using_qs && (token == "host")) { - if (!port.empty() && port != "80" && port != "0") { - token_value = token_value + ":" + port; - } else if (!secure_port.empty() && secure_port != "443") { - token_value = token_value + ":" + secure_port; + if (!secure_port.empty()) { + if (secure_port != "443") + token_value = token_value + ":" + secure_port; + } else if (!port.empty()) { + if (port != "80") + token_value = token_value + ":" + port; } } canonical_hdrs_map[token] = rgw_trim_whitespace(token_value); diff -Nru ceph-10.2.6/src/rgw/rgw_rest_swift.cc ceph-10.2.7/src/rgw/rgw_rest_swift.cc --- ceph-10.2.6/src/rgw/rgw_rest_swift.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_rest_swift.cc 2017-04-10 11:44:25.000000000 +0000 @@ -528,8 +528,7 @@ swift_ver_location = boost::in_place(std::string()); } - std::string vloc = s->info.env->get("HTTP_X_VERSIONS_LOCATION", ""); - if (vloc.size()) { + if (s->info.env->exists("HTTP_X_VERSIONS_LOCATION")) { /* If the Swift's versioning is globally disabled but someone wants to * enable it for a given container, new version of Swift will generate * the precondition failed error. */ @@ -537,7 +536,7 @@ return -ERR_PRECONDITION_FAILED; } - swift_ver_location = std::move(vloc); + swift_ver_location = s->info.env->get("HTTP_X_VERSIONS_LOCATION", ""); } return 0; diff -Nru ceph-10.2.6/src/rgw/rgw_sync.cc ceph-10.2.7/src/rgw/rgw_sync.cc --- ceph-10.2.6/src/rgw/rgw_sync.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/rgw/rgw_sync.cc 2017-04-10 11:44:25.000000000 +0000 @@ -1557,6 +1557,7 @@ ldout(sync_env->cct, 10) << *this << ": failed to fetch more log entries, retcode=" << retcode << dendl; yield lease_cr->go_down(); drain_all(); + *reset_backoff = false; // back off and try again later return retcode; } *reset_backoff = true; /* if we got to this point, all systems function */ @@ -1566,6 +1567,13 @@ yield call(new RGWReadMDLogEntriesCR(sync_env, mdlog, shard_id, &max_marker, INCREMENTAL_MAX_ENTRIES, &log_entries, &truncated)); + if (retcode < 0) { + ldout(sync_env->cct, 10) << *this << ": failed to list mdlog entries, retcode=" << retcode << dendl; + yield lease_cr->go_down(); + drain_all(); + *reset_backoff = false; // back off and try again later + return retcode; + } for (log_iter = log_entries.begin(); log_iter != log_entries.end(); ++log_iter) { if (!period_marker.empty() && period_marker < log_iter->id) { done_with_period = true; @@ -1636,12 +1644,13 @@ rgw_meta_sync_marker sync_marker; const std::string period_marker; + static constexpr bool exit_on_error = false; // retry on all errors public: RGWMetaSyncShardControlCR(RGWMetaSyncEnv *_sync_env, const rgw_bucket& _pool, const std::string& period, RGWMetadataLog* mdlog, uint32_t _shard_id, const rgw_meta_sync_marker& _marker, std::string&& period_marker) - : RGWBackoffControlCR(_sync_env->cct, true), sync_env(_sync_env), + : RGWBackoffControlCR(_sync_env->cct, exit_on_error), sync_env(_sync_env), pool(_pool), period(period), mdlog(mdlog), shard_id(_shard_id), sync_marker(_marker), period_marker(std::move(period_marker)) {} diff -Nru ceph-10.2.6/src/test/erasure-code/test-erasure-eio.sh ceph-10.2.7/src/test/erasure-code/test-erasure-eio.sh --- ceph-10.2.6/src/test/erasure-code/test-erasure-eio.sh 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/test/erasure-code/test-erasure-eio.sh 2017-04-10 11:44:25.000000000 +0000 @@ -205,7 +205,6 @@ else dd if=/dev/urandom bs=$bytes count=1 of=$dir/CORRUPT fi - objectstore_tool $dir $osd_id --op list $objname objectstore_tool $dir $osd_id $objname set-bytes $dir/CORRUPT || return 1 rm -f $dir/CORRUPT } diff -Nru ceph-10.2.6/src/test/librados_test_stub/MockTestMemIoCtxImpl.h ceph-10.2.7/src/test/librados_test_stub/MockTestMemIoCtxImpl.h --- ceph-10.2.6/src/test/librados_test_stub/MockTestMemIoCtxImpl.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/test/librados_test_stub/MockTestMemIoCtxImpl.h 2017-04-10 11:44:25.000000000 +0000 @@ -79,6 +79,11 @@ return TestMemIoCtxImpl::notify(o, bl, timeout_ms, pbl); } + MOCK_METHOD1(set_snap_read, void(snap_t)); + void do_set_snap_read(snap_t snap_id) { + return TestMemIoCtxImpl::set_snap_read(snap_id); + } + MOCK_METHOD4(read, int(const std::string& oid, size_t len, uint64_t off, @@ -142,6 +147,7 @@ ON_CALL(*this, list_watchers(_, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_list_watchers)); ON_CALL(*this, notify(_, _, _, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_notify)); ON_CALL(*this, read(_, _, _, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_read)); + ON_CALL(*this, set_snap_read(_)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_set_snap_read)); ON_CALL(*this, remove(_, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_remove)); ON_CALL(*this, selfmanaged_snap_create(_)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_selfmanaged_snap_create)); ON_CALL(*this, selfmanaged_snap_remove(_)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_selfmanaged_snap_remove)); diff -Nru ceph-10.2.6/src/test/osd/osd-scrub-repair.sh ceph-10.2.7/src/test/osd/osd-scrub-repair.sh --- ceph-10.2.6/src/test/osd/osd-scrub-repair.sh 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/test/osd/osd-scrub-repair.sh 2017-04-10 11:44:25.000000000 +0000 @@ -16,6 +16,20 @@ # source $CEPH_ROOT/qa/workunits/ceph-helpers.sh +# Test development and debugging +# Set to "yes" in order to ignore diff errors and save results to update test +getjson="no" + +termwidth=$(stty -a | head -1 | sed -e 's/.*columns \([0-9]*\).*/\1/') +if test -n "$termwidth" ; then termwidth="-W ${termwidth}"; fi + +# Ignore the epoch and filter out the attr '_' value because it has date information and won't match +jqfilter='.inconsistents | (.[].shards[].attrs[] | select(.name == "_") | .value) |= "----Stripped-by-test----"' +sortkeys='import json; import sys ; JSON=sys.stdin.read() ; ud = json.loads(JSON) ; print json.dumps(ud, sort_keys=True, indent=2)' + +# Remove items are not consistent across runs, the pg interval and client +sedfilter='s/\([ ]*\"\(selected_\)*object_info\":.*head[(]\)[^[:space:]]* [^[:space:]]* \(.*\)/\1\3/' + function run() { local dir=$1 shift @@ -35,11 +49,16 @@ local dir=$1 local poolname=$2 local obj=${3:-SOMETHING} + local scrub=${4:-noscrub} - wait_for_clean || return 1 - - ceph osd set noscrub || return 1 - ceph osd set nodeep-scrub || return 1 + if [ "$scrub" = "noscrub" ]; + then + ceph osd set noscrub || return 1 + ceph osd set nodeep-scrub || return 1 + else + ceph osd unset noscrub || return 1 + ceph osd unset nodeep-scrub || return 1 + fi local payload=ABCDEF echo $payload > $dir/ORIGINAL @@ -57,6 +76,7 @@ run_mon $dir a --osd_pool_default_size=2 || return 1 run_osd $dir 0 || return 1 run_osd $dir 1 || return 1 + wait_for_clean || return 1 add_something $dir $poolname corrupt_and_repair_one $dir $poolname $(get_not_primary $poolname SOMETHING) || return 1 @@ -127,8 +147,6 @@ objectstore_tool $dir $osd SOMETHING list-attrs || return 1 rados --pool $poolname get SOMETHING $dir/COPY || return 1 diff $dir/ORIGINAL $dir/COPY || return 1 - - wait_for_clean || return 1 } function corrupt_and_repair_erasure_coded() { @@ -162,33 +180,36 @@ # Launch a cluster with 5 seconds scrub interval setup $dir || return 1 run_mon $dir a || return 1 - for id in $(seq 0 2) ; do - run_osd $dir $id \ - --osd-scrub-auto-repair=true \ + local ceph_osd_args="--osd-scrub-auto-repair=true \ --osd-deep-scrub-interval=5 \ --osd-scrub-max-interval=5 \ --osd-scrub-min-interval=5 \ - --osd-scrub-interval-randomize-ratio=0 + --osd-scrub-interval-randomize-ratio=0" + for id in $(seq 0 2) ; do + run_osd $dir $id $ceph_osd_args done + wait_for_clean || return 1 # Create an EC pool ceph osd erasure-code-profile set myprofile \ k=2 m=1 ruleset-failure-domain=osd || return 1 ceph osd pool create $poolname 8 8 erasure myprofile || return 1 + wait_for_clean || return 1 # Put an object local payload=ABCDEF echo $payload > $dir/ORIGINAL rados --pool $poolname put SOMETHING $dir/ORIGINAL || return 1 - wait_for_clean || return 1 # Remove the object from one shard physically + # Restarted osd get $ceph_osd_args passed objectstore_tool $dir $(get_not_primary $poolname SOMETHING) SOMETHING remove || return 1 # Wait for auto repair local pgid=$(get_pg $poolname SOMETHING) wait_for_scrub $pgid "$(get_last_scrub_stamp $pgid)" wait_for_clean || return 1 # Verify - the file should be back + # Restarted osd get $ceph_osd_args passed objectstore_tool $dir $(get_not_primary $poolname SOMETHING) SOMETHING list-attrs || return 1 rados --pool $poolname get SOMETHING $dir/COPY || return 1 diff $dir/ORIGINAL $dir/COPY || return 1 @@ -312,31 +333,39 @@ wait_for_clean || return 1 # Put an object and remove the two shards (including primary) - add_something $dir $poolname OBJ0 || return 1 - local -a osds=($(get_osds $poolname OBJ0)) - - pids="" - run_in_background pids objectstore_tool $dir ${osds[0]} OBJ0 remove - run_in_background pids objectstore_tool $dir ${osds[1]} OBJ0 remove - wait_background pids - return_code=$? - if [ $return_code -ne 0 ]; then return $return_code; fi - + add_something $dir $poolname MOBJ0 || return 1 + local -a osds0=($(get_osds $poolname MOBJ0)) # Put another object and remove two shards (excluding primary) - add_something $dir $poolname OBJ1 || return 1 - local -a osds=($(get_osds $poolname OBJ1)) + add_something $dir $poolname MOBJ1 || return 1 + local -a osds1=($(get_osds $poolname MOBJ1)) - pids="" - run_in_background pids objectstore_tool $dir ${osds[1]} OBJ1 remove - run_in_background pids objectstore_tool $dir ${osds[2]} OBJ1 remove - wait_background pids - return_code=$? - if [ $return_code -ne 0 ]; then return $return_code; fi + # Stop all osd daemons + for id in $(seq 0 2) ; do + kill_daemons $dir TERM osd.$id >&2 < /dev/null || return 1 + done + id=${osds0[0]} + ceph-objectstore-tool --data-path $dir/$id --journal-path $dir/$id/journal \ + MOBJ0 remove || return 1 + id=${osds0[1]} + ceph-objectstore-tool --data-path $dir/$id --journal-path $dir/$id/journal \ + MOBJ0 remove || return 1 + + id=${osds1[1]} + ceph-objectstore-tool --data-path $dir/$id --journal-path $dir/$id/journal \ + MOBJ1 remove || return 1 + id=${osds1[2]} + ceph-objectstore-tool --data-path $dir/$id --journal-path $dir/$id/journal \ + MOBJ1 remove || return 1 + + for id in $(seq 0 2) ; do + activate_osd $dir $id >&2 || return 1 + done + wait_for_clean >&2 # Get get - both objects should in the same PG - local pg=$(get_pg $poolname OBJ0) + local pg=$(get_pg $poolname MOBJ0) # Repair the PG, which triggers the recovering, # and should mark the object as unfound @@ -344,7 +373,7 @@ for i in $(seq 0 120) ; do [ $i -lt 60 ] || return 1 - matches=$(ceph pg $pg list_missing | egrep "OBJ0|OBJ1" | wc -l) + matches=$(ceph pg $pg list_missing | egrep "MOBJ0|MOBJ1" | wc -l) [ $matches -eq 2 ] && break done @@ -357,7 +386,7 @@ function TEST_corrupt_scrub_replicated() { local dir=$1 local poolname=csr_pool - local total_objs=4 + local total_objs=15 setup $dir || return 1 run_mon $dir a --osd_pool_default_size=2 || return 1 @@ -368,20 +397,1175 @@ ceph osd pool create $poolname 1 1 || return 1 wait_for_clean || return 1 - for i in $(seq 0 $total_objs) ; do - objname=OBJ${i} - add_something $dir $poolname $objname - if [ $i = "0" ]; - then - local payload=UVWXYZ - echo $payload > $dir/CORRUPT - objectstore_tool $dir $(expr $i % 2) $objname set-bytes $dir/CORRUPT || return 1 - else - objectstore_tool $dir $(expr $i % 2) $objname remove || return 1 - fi + for i in $(seq 1 $total_objs) ; do + objname=ROBJ${i} + add_something $dir $poolname $objname + + rados --pool $poolname setomapheader $objname hdr-$objname || return 1 + rados --pool $poolname setomapval $objname key-$objname val-$objname || return 1 + + # Alternate corruption between osd.0 and osd.1 + local osd=$(expr $i % 2) + + case $i in + 1) + # Size (deep scrub data_digest too) + local payload=UVWXYZZZ + echo $payload > $dir/CORRUPT + objectstore_tool $dir $osd $objname set-bytes $dir/CORRUPT || return 1 + ;; + + 2) + # digest (deep scrub only) + local payload=UVWXYZ + echo $payload > $dir/CORRUPT + objectstore_tool $dir $osd $objname set-bytes $dir/CORRUPT || return 1 + ;; + + 3) + # missing + objectstore_tool $dir $osd $objname remove || return 1 + ;; + + 4) + # Modify omap value (deep scrub only) + objectstore_tool $dir $osd $objname set-omap key-$objname $dir/CORRUPT || return 1 + ;; + + 5) + # Delete omap key (deep scrub only) + objectstore_tool $dir $osd $objname rm-omap key-$objname || return 1 + ;; + + 6) + # Add extra omap key (deep scrub only) + echo extra > $dir/extra-val + objectstore_tool $dir $osd $objname set-omap key2-$objname $dir/extra-val || return 1 + rm $dir/extra-val + ;; + + 7) + # Modify omap header (deep scrub only) + echo -n newheader > $dir/hdr + objectstore_tool $dir $osd $objname set-omaphdr $dir/hdr || return 1 + rm $dir/hdr + ;; + + 8) + rados --pool $poolname setxattr $objname key1-$objname val1-$objname || return 1 + rados --pool $poolname setxattr $objname key2-$objname val2-$objname || return 1 + + # Break xattrs + echo -n bad-val > $dir/bad-val + objectstore_tool $dir $osd $objname set-attr _key1-$objname $dir/bad-val || return 1 + objectstore_tool $dir $osd $objname rm-attr _key2-$objname || return 1 + echo -n val3-$objname > $dir/newval + objectstore_tool $dir $osd $objname set-attr _key3-$objname $dir/newval || return 1 + rm $dir/bad-val $dir/newval + ;; + + 9) + objectstore_tool $dir $osd $objname get-attr _ > $dir/robj9-oi + echo -n D > $dir/change + rados --pool $poolname put $objname $dir/change + objectstore_tool $dir $osd $objname set-attr _ $dir/robj9-oi + rm $dir/oi $dir/change + ;; + + # ROBJ10 must be handled after digests are re-computed by a deep scrub below + # ROBJ11 must be handled with config change before deep scrub + # ROBJ12 must be handled with config change before scrubs + # ROBJ13 must be handled before scrubs + + 14) + echo -n bad-val > $dir/bad-val + objectstore_tool $dir 0 $objname set-attr _ $dir/bad-val || return 1 + objectstore_tool $dir 1 $objname rm-attr _ || return 1 + rm $dir/bad-val + ;; + + 15) + objectstore_tool $dir $osd $objname rm-attr _ || return 1 + + esac + done + + local pg=$(get_pg $poolname ROBJ0) + + set_config osd 0 filestore_debug_inject_read_err true || return 1 + set_config osd 1 filestore_debug_inject_read_err true || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.1.asok \ + injectdataerr $poolname ROBJ11 || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.0.asok \ + injectmdataerr $poolname ROBJ12 || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.0.asok \ + injectmdataerr $poolname ROBJ13 || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.1.asok \ + injectdataerr $poolname ROBJ13 || return 1 + + pg_scrub $pg + + rados list-inconsistent-pg $poolname > $dir/json || return 1 + # Check pg count + test $(jq '. | length' $dir/json) = "1" || return 1 + # Check pgid + test $(jq -r '.[0]' $dir/json) = $pg || return 1 + + rados list-inconsistent-obj $pg > $dir/json || return 1 + # Get epoch for repair-get requests + epoch=$(jq .epoch $dir/json) + + jq "$jqfilter" << EOF | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/checkcsjson +{ + "inconsistents": [ + { + "shards": [ + { + "size": 7, + "errors": [], + "osd": 0 + }, + { + "size": 9, + "errors": [ + "size_mismatch_oi" + ], + "osd": 1 + } + ], + "selected_object_info": "2:ce3f1d6a:::ROBJ1:head(16'3 client.4130.0:1 dirty|omap|data_digest s 7 uv 3 dd 2ddbf8f5)", + "union_shard_errors": [ + "size_mismatch_oi" + ], + "errors": [ + "size_mismatch" + ], + "object": { + "version": 3, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ1" + } + }, + { + "shards": [ + { + "errors": [ + "stat_error" + ], + "osd": 0 + }, + { + "size": 7, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:bc819597:::ROBJ12:head(98'39 client.4320.0:1 dirty|omap|data_digest s 7 uv 39 dd 2ddbf8f5)", + "union_shard_errors": [ + "stat_error" + ], + "errors": [], + "object": { + "version": 39, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ12" + } + }, + { + "shards": [ + { + "errors": [ + "stat_error" + ], + "osd": 0 + }, + { + "size": 7, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:d60617f9:::ROBJ13:head(100'42 client.4325.0:1 dirty|omap|data_digest s 7 uv 42 dd 2ddbf8f5)", + "union_shard_errors": [ + "stat_error" + ], + "errors": [], + "object": { + "version": 42, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ13" + } + }, + { + "shards": [ + { + "size": 7, + "errors": [ + "oi_attr_corrupted" + ], + "osd": 0 + }, + { + "size": 7, + "errors": [ + "oi_attr_missing" + ], + "osd": 1 + } + ], + "union_shard_errors": [ + "oi_attr_missing", + "oi_attr_corrupted" + ], + "errors": [], + "object": { + "version": 0, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ14" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "size": 7, + "errors": [], + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "size": 7, + "errors": [ + "oi_attr_missing" + ], + "osd": 1 + } + ], + "selected_object_info": "2:30259878:::ROBJ15:head(113'48 client.4357.0:1 dirty|omap|data_digest s 7 uv 48 dd 2ddbf8f5)", + "union_shard_errors": [ + "oi_attr_missing" + ], + "errors": [ + "attr_name_mismatch" + ], + "object": { + "version": 48, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ15" + } + }, + { + "shards": [ + { + "size": 7, + "errors": [], + "osd": 0 + }, + { + "errors": [ + "missing" + ], + "osd": 1 + } + ], + "selected_object_info": "2:f2a5b2a4:::ROBJ3:head(30'9 client.4162.0:1 dirty|omap|data_digest s 7 uv 9 dd 2ddbf8f5)", + "union_shard_errors": [ + "missing" + ], + "errors": [], + "object": { + "version": 9, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ3" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "bad-val", + "name": "_key1-ROBJ8" + }, + { + "Base64": false, + "value": "val3-ROBJ8", + "name": "_key3-ROBJ8" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "size": 7, + "errors": [], + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "val1-ROBJ8", + "name": "_key1-ROBJ8" + }, + { + "Base64": false, + "value": "val2-ROBJ8", + "name": "_key2-ROBJ8" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "size": 7, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:86586531:::ROBJ8:head(65'26 client.4244.0:1 dirty|omap|data_digest s 7 uv 26 dd 2ddbf8f5)", + "union_shard_errors": [], + "errors": [ + "attr_value_mismatch", + "attr_name_mismatch" + ], + "object": { + "version": 26, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ8" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "object_info": "2:ffdb2004:::ROBJ9:head(87'30 client.4294.0:1 dirty|omap|data_digest s 1 uv 30 dd 2b63260d)", + "size": 1, + "errors": [], + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "object_info": "2:ffdb2004:::ROBJ9:head(82'29 client.4282.0:1 dirty|omap|data_digest s 7 uv 29 dd 2ddbf8f5)", + "size": 1, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:ffdb2004:::ROBJ9:head(87'30 client.4294.0:1 dirty|omap|data_digest s 1 uv 30 dd 2b63260d)", + "union_shard_errors": [], + "errors": [ + "object_info_inconsistency", + "attr_value_mismatch" + ], + "object": { + "version": 30, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ9" + } + } + ], + "epoch": 0 +} +EOF + + jq "$jqfilter" $dir/json | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/csjson + diff -y $termwidth $dir/checkcsjson $dir/csjson || test $getjson = "yes" || return 1 + if test $getjson = "yes" + then + jq '.' $dir/json > save1.json + fi + + if which jsonschema > /dev/null; + then + jsonschema -i $dir/json $CEPH_ROOT/doc/rados/command/list-inconsistent-obj.json || return 1 + fi + + # Compute an old omap digest and save oi + CEPH_ARGS='' ceph daemon $dir//ceph-osd.0.asok \ + config set osd_deep_scrub_update_digest_min_age 0 + CEPH_ARGS='' ceph daemon $dir//ceph-osd.1.asok \ + config set osd_deep_scrub_update_digest_min_age 0 + pg_deep_scrub $pg + + objname=ROBJ9 + # Change data and size again because digest was recomputed + echo -n ZZZ > $dir/change + rados --pool $poolname put $objname $dir/change + # Set one to an even older value + objectstore_tool $dir 0 $objname set-attr _ $dir/robj9-oi + rm $dir/oi $dir/change + + objname=ROBJ10 + objectstore_tool $dir 1 $objname get-attr _ > $dir/oi + rados --pool $poolname setomapval $objname key2-$objname val2-$objname + objectstore_tool $dir 0 $objname set-attr _ $dir/oi + objectstore_tool $dir 1 $objname set-attr _ $dir/oi + rm $dir/oi + + set_config osd 0 filestore_debug_inject_read_err true || return 1 + set_config osd 1 filestore_debug_inject_read_err true || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.1.asok \ + injectdataerr $poolname ROBJ11 || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.0.asok \ + injectmdataerr $poolname ROBJ12 || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.0.asok \ + injectmdataerr $poolname ROBJ13 || return 1 + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.1.asok \ + injectdataerr $poolname ROBJ13 || return 1 + pg_deep_scrub $pg + + rados list-inconsistent-pg $poolname > $dir/json || return 1 + # Check pg count + test $(jq '. | length' $dir/json) = "1" || return 1 + # Check pgid + test $(jq -r '.[0]' $dir/json) = $pg || return 1 + + rados list-inconsistent-obj $pg > $dir/json || return 1 + # Get epoch for repair-get requests + epoch=$(jq .epoch $dir/json) + + jq "$jqfilter" << EOF | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/checkcsjson +{ + "inconsistents": [ + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xf5fba2c6", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "data_digest": "0x2d4a11c2", + "omap_digest": "0xf5fba2c6", + "size": 9, + "errors": [ + "data_digest_mismatch_oi", + "size_mismatch_oi" + ], + "osd": 1 + } + ], + "selected_object_info": "2:ce3f1d6a:::ROBJ1:head(16'3 client.4130.0:1 dirty|omap|data_digest s 7 uv 3 dd 2ddbf8f5)", + "union_shard_errors": [ + "data_digest_mismatch_oi", + "size_mismatch_oi" + ], + "errors": [ + "data_digest_mismatch", + "size_mismatch" + ], + "object": { + "version": 3, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ1" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xa8dd5adc", + "size": 7, + "errors": [ + "omap_digest_mismatch_oi" + ], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xa8dd5adc", + "size": 7, + "errors": [ + "omap_digest_mismatch_oi" + ], + "osd": 1 + } + ], + "selected_object_info": "2:b1f19cbd:::ROBJ10:head(118'52 osd.0.0:10 dirty|omap|data_digest|omap_digest s 7 uv 33 dd 2ddbf8f5 od c2025a24)", + "union_shard_errors": [ + "omap_digest_mismatch_oi" + ], + "errors": [], + "object": { + "version": 33, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ10" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xa03cef03", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "size": 7, + "errors": [ + "read_error" + ], + "osd": 1 + } + ], + "selected_object_info": "2:87abbf36:::ROBJ11:head(96'36 client.4315.0:1 dirty|omap|data_digest s 7 uv 36 dd 2ddbf8f5)", + "union_shard_errors": [ + "read_error" + ], + "errors": [], + "object": { + "version": 36, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ11" + } + }, + { + "shards": [ + { + "errors": [ + "stat_error" + ], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x067f306a", + "size": 7, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:bc819597:::ROBJ12:head(98'39 client.4320.0:1 dirty|omap|data_digest s 7 uv 39 dd 2ddbf8f5)", + "union_shard_errors": [ + "stat_error" + ], + "errors": [], + "object": { + "version": 39, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ12" + } + }, + { + "shards": [ + { + "errors": [ + "stat_error" + ], + "osd": 0 + }, + { + "size": 7, + "errors": [ + "read_error" + ], + "osd": 1 + } + ], + "union_shard_errors": [ + "stat_error", + "read_error" + ], + "errors": [], + "object": { + "version": 0, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ13" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x4f14f849", + "size": 7, + "errors": [ + "oi_attr_corrupted" + ], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x4f14f849", + "size": 7, + "errors": [ + "oi_attr_missing" + ], + "osd": 1 + } + ], + "union_shard_errors": [ + "oi_attr_missing", + "oi_attr_corrupted" + ], + "errors": [], + "object": { + "version": 0, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ14" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x2d2a4d6e", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x2d2a4d6e", + "size": 7, + "errors": [ + "oi_attr_missing" + ], + "osd": 1 + } + ], + "selected_object_info": "2:30259878:::ROBJ15:head(113'48 client.4357.0:1 dirty|omap|data_digest s 7 uv 48 dd 2ddbf8f5)", + "union_shard_errors": [ + "oi_attr_missing" + ], + "errors": [ + "attr_name_mismatch" + ], + "object": { + "version": 48, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ15" + } + }, + { + "shards": [ + { + "data_digest": "0x578a4830", + "omap_digest": "0xf8e11918", + "size": 7, + "errors": [ + "data_digest_mismatch_oi" + ], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xf8e11918", + "size": 7, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:e97ce31e:::ROBJ2:head(23'6 client.4146.0:1 dirty|omap|data_digest s 7 uv 6 dd 2ddbf8f5)", + "union_shard_errors": [ + "data_digest_mismatch_oi" + ], + "errors": [ + "data_digest_mismatch" + ], + "object": { + "version": 6, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ2" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x00b35dfd", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "errors": [ + "missing" + ], + "osd": 1 + } + ], + "selected_object_info": "2:f2a5b2a4:::ROBJ3:head(30'9 client.4162.0:1 dirty|omap|data_digest s 7 uv 9 dd 2ddbf8f5)", + "union_shard_errors": [ + "missing" + ], + "errors": [], + "object": { + "version": 9, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ3" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xd7178dfe", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xe2d46ea4", + "size": 7, + "errors": [ + "omap_digest_mismatch_oi" + ], + "osd": 1 + } + ], + "selected_object_info": "2:f4981d31:::ROBJ4:head(118'53 osd.0.0:11 dirty|omap|data_digest|omap_digest s 7 uv 12 dd 2ddbf8f5 od d7178dfe)", + "union_shard_errors": [ + "omap_digest_mismatch_oi" + ], + "errors": [ + "omap_digest_mismatch" + ], + "object": { + "version": 12, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ4" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x1a862a41", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x06cac8f6", + "size": 7, + "errors": [ + "omap_digest_mismatch_oi" + ], + "osd": 1 + } + ], + "selected_object_info": "2:f4bfd4d1:::ROBJ5:head(118'54 osd.0.0:12 dirty|omap|data_digest|omap_digest s 7 uv 15 dd 2ddbf8f5 od 1a862a41)", + "union_shard_errors": [ + "omap_digest_mismatch_oi" + ], + "errors": [ + "omap_digest_mismatch" + ], + "object": { + "version": 15, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ5" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x689ee887", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x179c919f", + "size": 7, + "errors": [ + "omap_digest_mismatch_oi" + ], + "osd": 1 + } + ], + "selected_object_info": "2:a53c12e8:::ROBJ6:head(118'51 osd.0.0:9 dirty|omap|data_digest|omap_digest s 7 uv 18 dd 2ddbf8f5 od 689ee887)", + "union_shard_errors": [ + "omap_digest_mismatch_oi" + ], + "errors": [ + "omap_digest_mismatch" + ], + "object": { + "version": 18, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ6" + } + }, + { + "shards": [ + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xefced57a", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "data_digest": "0x2ddbf8f5", + "omap_digest": "0x6a73cc07", + "size": 7, + "errors": [ + "omap_digest_mismatch_oi" + ], + "osd": 1 + } + ], + "selected_object_info": "2:8b55fa4b:::ROBJ7:head(118'50 osd.0.0:8 dirty|omap|data_digest|omap_digest s 7 uv 21 dd 2ddbf8f5 od efced57a)", + "union_shard_errors": [ + "omap_digest_mismatch_oi" + ], + "errors": [ + "omap_digest_mismatch" + ], + "object": { + "version": 21, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ7" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "bad-val", + "name": "_key1-ROBJ8" + }, + { + "Base64": false, + "value": "val3-ROBJ8", + "name": "_key3-ROBJ8" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xd6be81dc", + "size": 7, + "errors": [], + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "val1-ROBJ8", + "name": "_key1-ROBJ8" + }, + { + "Base64": false, + "value": "val2-ROBJ8", + "name": "_key2-ROBJ8" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "data_digest": "0x2ddbf8f5", + "omap_digest": "0xd6be81dc", + "size": 7, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:86586531:::ROBJ8:head(118'49 osd.0.0:7 dirty|omap|data_digest|omap_digest s 7 uv 26 dd 2ddbf8f5 od d6be81dc)", + "union_shard_errors": [], + "errors": [ + "attr_value_mismatch", + "attr_name_mismatch" + ], + "object": { + "version": 26, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ8" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "object_info": "2:ffdb2004:::ROBJ9:head(82'29 client.4282.0:1 dirty|omap|data_digest s 7 uv 29 dd 2ddbf8f5)", + "data_digest": "0x1f26fb26", + "omap_digest": "0x2eecc539", + "size": 3, + "errors": [], + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "object_info": "2:ffdb2004:::ROBJ9:head(118'56 client.4386.0:1 dirty|omap|data_digest|omap_digest s 3 uv 56 dd 1f26fb26 od 2eecc539)", + "data_digest": "0x1f26fb26", + "omap_digest": "0x2eecc539", + "size": 3, + "errors": [], + "osd": 1 + } + ], + "selected_object_info": "2:ffdb2004:::ROBJ9:head(118'56 client.4386.0:1 dirty|omap|data_digest|omap_digest s 3 uv 56 dd 1f26fb26 od 2eecc539)", + "union_shard_errors": [], + "errors": [ + "object_info_inconsistency", + "attr_value_mismatch" + ], + "object": { + "version": 56, + "snap": "head", + "locator": "", + "nspace": "", + "name": "ROBJ9" + } + } + ], + "epoch": 0 +} +EOF + + jq "$jqfilter" $dir/json | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/csjson + diff -y $termwidth $dir/checkcsjson $dir/csjson || test $getjson = "yes" || return 1 + if test $getjson = "yes" + then + jq '.' $dir/json > save2.json + fi + + if which jsonschema > /dev/null; + then + jsonschema -i $dir/json $CEPH_ROOT/doc/rados/command/list-inconsistent-obj.json || return 1 + fi + + rados rmpool $poolname $poolname --yes-i-really-really-mean-it + teardown $dir || return 1 +} + + +# +# Test scrub errors for an erasure coded pool +# +function TEST_corrupt_scrub_erasure() { + local dir=$1 + local poolname=ecpool + local profile=myprofile + local total_objs=5 + + setup $dir || return 1 + run_mon $dir a || return 1 + for id in $(seq 0 2) ; do + run_osd $dir $id || return 1 + done + wait_for_clean || return 1 + + ceph osd erasure-code-profile set $profile \ + k=2 m=1 ruleset-failure-domain=osd || return 1 + ceph osd pool create $poolname 1 1 erasure $profile \ + || return 1 + wait_for_clean || return 1 + + for i in $(seq 1 $total_objs) ; do + objname=EOBJ${i} + add_something $dir $poolname $objname + + local osd=$(expr $i % 2) + + case $i in + 1) + # Size (deep scrub data_digest too) + local payload=UVWXYZZZ + echo $payload > $dir/CORRUPT + objectstore_tool $dir $osd $objname set-bytes $dir/CORRUPT || return 1 + ;; + + 2) + # Corrupt EC shard + dd if=/dev/urandom of=$dir/CORRUPT bs=2048 count=1 + objectstore_tool $dir $osd $objname set-bytes $dir/CORRUPT || return 1 + ;; + + 3) + # missing + objectstore_tool $dir $osd $objname remove || return 1 + ;; + + 4) + rados --pool $poolname setxattr $objname key1-$objname val1-$objname || return 1 + rados --pool $poolname setxattr $objname key2-$objname val2-$objname || return 1 + + # Break xattrs + echo -n bad-val > $dir/bad-val + objectstore_tool $dir $osd $objname set-attr _key1-$objname $dir/bad-val || return 1 + objectstore_tool $dir $osd $objname rm-attr _key2-$objname || return 1 + echo -n val3-$objname > $dir/newval + objectstore_tool $dir $osd $objname set-attr _key3-$objname $dir/newval || return 1 + rm $dir/bad-val $dir/newval + ;; + + 5) + # Corrupt EC shard + dd if=/dev/urandom of=$dir/CORRUPT bs=2048 count=2 + objectstore_tool $dir $osd $objname set-bytes $dir/CORRUPT || return 1 + ;; + + esac done - local pg=$(get_pg $poolname OBJ0) + local pg=$(get_pg $poolname EOBJ0) + pg_scrub $pg rados list-inconsistent-pg $poolname > $dir/json || return 1 @@ -393,13 +1577,660 @@ rados list-inconsistent-obj $pg > $dir/json || return 1 # Get epoch for repair-get requests epoch=$(jq .epoch $dir/json) - # Check object count - test $(jq '.inconsistents | length' $dir/json) = "$total_objs" || return 1 + + jq "$jqfilter" << EOF | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/checkcsjson +{ + "inconsistents": [ + { + "shards": [ + { + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "size": 9, + "errors": [ + "size_mismatch_oi" + ], + "shard": 1, + "osd": 1 + }, + { + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:9175b684:::EOBJ1:head(22'1 client.4175.0:1 dirty|data_digest|omap_digest s 7 uv 1 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [ + "size_mismatch_oi" + ], + "errors": [ + "size_mismatch" + ], + "object": { + "version": 1, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ1" + } + }, + { + "shards": [ + { + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "errors": [ + "missing" + ], + "shard": 1, + "osd": 1 + }, + { + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:b197b25d:::EOBJ3:head(35'3 client.4246.0:1 dirty|data_digest|omap_digest s 7 uv 3 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [ + "missing" + ], + "errors": [], + "object": { + "version": 3, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ3" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "bad-val", + "name": "_key1-EOBJ4" + }, + { + "Base64": false, + "value": "val3-EOBJ4", + "name": "_key3-EOBJ4" + }, + { + "Base64": true, + "value": "AQEYAAAAAAgAAAAAAAADAAAAL6fPBLB8dlsvp88E", + "name": "hinfo_key" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "val1-EOBJ4", + "name": "_key1-EOBJ4" + }, + { + "Base64": false, + "value": "val2-EOBJ4", + "name": "_key2-EOBJ4" + }, + { + "Base64": true, + "value": "AQEYAAAAAAgAAAAAAAADAAAAL6fPBLB8dlsvp88E", + "name": "hinfo_key" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "size": 2048, + "errors": [], + "shard": 1, + "osd": 1 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "val1-EOBJ4", + "name": "_key1-EOBJ4" + }, + { + "Base64": false, + "value": "val2-EOBJ4", + "name": "_key2-EOBJ4" + }, + { + "Base64": true, + "value": "AQEYAAAAAAgAAAAAAAADAAAAL6fPBLB8dlsvp88E", + "name": "hinfo_key" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:5e723e06:::EOBJ4:head(42'6 client.4261.0:1 dirty|data_digest|omap_digest s 7 uv 6 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [], + "errors": [ + "attr_value_mismatch", + "attr_name_mismatch" + ], + "object": { + "version": 6, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ4" + } + }, + { + "shards": [ + { + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "size": 4096, + "errors": [ + "size_mismatch_oi" + ], + "shard": 1, + "osd": 1 + }, + { + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:8549dfb5:::EOBJ5:head(59'7 client.4296.0:1 dirty|data_digest|omap_digest s 7 uv 7 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [ + "size_mismatch_oi" + ], + "errors": [ + "size_mismatch" + ], + "object": { + "version": 7, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ5" + } + } + ], + "epoch": 0 +} +EOF + + jq "$jqfilter" $dir/json | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/csjson + diff -y $termwidth $dir/checkcsjson $dir/csjson || test $getjson = "yes" || return 1 + if test $getjson = "yes" + then + jq '.' $dir/json > save3.json + fi + + if which jsonschema > /dev/null; + then + jsonschema -i $dir/json $CEPH_ROOT/doc/rados/command/list-inconsistent-obj.json || return 1 + fi + + pg_deep_scrub $pg + + rados list-inconsistent-pg $poolname > $dir/json || return 1 + # Check pg count + test $(jq '. | length' $dir/json) = "1" || return 1 + # Check pgid + test $(jq -r '.[0]' $dir/json) = $pg || return 1 + + rados list-inconsistent-obj $pg > $dir/json || return 1 + # Get epoch for repair-get requests + epoch=$(jq .epoch $dir/json) + + jq "$jqfilter" << EOF | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/checkcsjson +{ + "inconsistents": [ + { + "shards": [ + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "size": 9, + "errors": [ + "read_error", + "size_mismatch_oi" + ], + "shard": 1, + "osd": 1 + }, + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:9175b684:::EOBJ1:head(22'1 client.4175.0:1 dirty|data_digest|omap_digest s 7 uv 1 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [ + "read_error", + "size_mismatch_oi" + ], + "errors": [ + "size_mismatch" + ], + "object": { + "version": 1, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ1" + } + }, + { + "shards": [ + { + "size": 2048, + "errors": [ + "ec_hash_error" + ], + "shard": 2, + "osd": 0 + }, + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 1, + "osd": 1 + }, + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:9babd184:::EOBJ2:head(29'2 client.4213.0:1 dirty|data_digest|omap_digest s 7 uv 2 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [ + "ec_hash_error" + ], + "errors": [], + "object": { + "version": 2, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ2" + } + }, + { + "shards": [ + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "errors": [ + "missing" + ], + "shard": 1, + "osd": 1 + }, + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:b197b25d:::EOBJ3:head(35'3 client.4246.0:1 dirty|data_digest|omap_digest s 7 uv 3 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [ + "missing" + ], + "errors": [], + "object": { + "version": 3, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ3" + } + }, + { + "shards": [ + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "bad-val", + "name": "_key1-EOBJ4" + }, + { + "Base64": false, + "value": "val3-EOBJ4", + "name": "_key3-EOBJ4" + }, + { + "Base64": true, + "value": "AQEYAAAAAAgAAAAAAAADAAAAL6fPBLB8dlsvp88E", + "name": "hinfo_key" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "val1-EOBJ4", + "name": "_key1-EOBJ4" + }, + { + "Base64": false, + "value": "val2-EOBJ4", + "name": "_key2-EOBJ4" + }, + { + "Base64": true, + "value": "AQEYAAAAAAgAAAAAAAADAAAAL6fPBLB8dlsvp88E", + "name": "hinfo_key" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 1, + "osd": 1 + }, + { + "attrs": [ + { + "Base64": true, + "value": "", + "name": "_" + }, + { + "Base64": false, + "value": "val1-EOBJ4", + "name": "_key1-EOBJ4" + }, + { + "Base64": false, + "value": "val2-EOBJ4", + "name": "_key2-EOBJ4" + }, + { + "Base64": true, + "value": "AQEYAAAAAAgAAAAAAAADAAAAL6fPBLB8dlsvp88E", + "name": "hinfo_key" + }, + { + "Base64": true, + "value": "AgIZAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==", + "name": "snapset" + } + ], + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:5e723e06:::EOBJ4:head(42'6 client.4261.0:1 dirty|data_digest|omap_digest s 7 uv 6 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [], + "errors": [ + "attr_value_mismatch", + "attr_name_mismatch" + ], + "object": { + "version": 6, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ4" + } + }, + { + "shards": [ + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 2, + "osd": 0 + }, + { + "size": 4096, + "errors": [ + "size_mismatch_oi", + "ec_size_error" + ], + "shard": 1, + "osd": 1 + }, + { + "data_digest": "0x04cfa72f", + "omap_digest": "0xffffffff", + "size": 2048, + "errors": [], + "shard": 0, + "osd": 2 + } + ], + "selected_object_info": "2:8549dfb5:::EOBJ5:head(59'7 client.4296.0:1 dirty|data_digest|omap_digest s 7 uv 7 dd 2ddbf8f5 od ffffffff)", + "union_shard_errors": [ + "size_mismatch_oi", + "ec_size_error" + ], + "errors": [ + "size_mismatch" + ], + "object": { + "version": 7, + "snap": "head", + "locator": "", + "nspace": "", + "name": "EOBJ5" + } + } + ], + "epoch": 0 +} +EOF + + jq "$jqfilter" $dir/json | python -c "$sortkeys" | sed -e "$sedfilter" > $dir/csjson + diff -y $termwidth $dir/checkcsjson $dir/csjson || test $getjson = "yes" || return 1 + if test $getjson = "yes" + then + jq '.' $dir/json > save4.json + fi + + if which jsonschema > /dev/null; + then + jsonschema -i $dir/json $CEPH_ROOT/doc/rados/command/list-inconsistent-obj.json || return 1 + fi rados rmpool $poolname $poolname --yes-i-really-really-mean-it teardown $dir || return 1 } +# +# Test to make sure that a periodic scrub won't cause deep-scrub info to be lost +# +function TEST_periodic_scrub_replicated() { + local dir=$1 + local poolname=psr_pool + local objname=POBJ + + setup $dir || return 1 + run_mon $dir a --osd_pool_default_size=2 || return 1 + local ceph_osd_args="--osd-scrub-interval-randomize-ratio=0 --osd-deep-scrub-randomize-ratio=0" + run_osd $dir 0 $ceph_osd_args || return 1 + run_osd $dir 1 $ceph_osd_args || return 1 + wait_for_clean || return 1 + + ceph osd pool create $poolname 1 1 || return 1 + wait_for_clean || return 1 + + local osd=0 + add_something $dir $poolname $objname scrub || return 1 + local primary=$(get_primary $poolname $objname) + local pg=$(get_pg $poolname $objname) + + # Add deep-scrub only error + local payload=UVWXYZ + echo $payload > $dir/CORRUPT + # Uses $ceph_osd_args for osd restart + objectstore_tool $dir $osd $objname set-bytes $dir/CORRUPT || return 1 + + # No scrub information available, so expect failure + set -o pipefail + ! rados list-inconsistent-obj $pg | jq '.' || return 1 + set +o pipefail + + pg_deep_scrub $pg || return 1 + + # Make sure bad object found + rados list-inconsistent-obj $pg | jq '.' | grep -q $objname || return 1 + + local last_scrub=$(get_last_scrub_stamp $pg) + # Fake a schedule scrub + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.${primary}.asok \ + trigger_scrub $pg || return 1 + # Wait for schedule regular scrub + wait_for_scrub $pg "$last_scrub" + + # It needed to be upgraded + grep -q "Deep scrub errors, upgrading scrub to deep-scrub" $dir/osd.${primary}.log || return 1 + + # Bad object still known + rados list-inconsistent-obj $pg | jq '.' | grep -q $objname || return 1 + + # Can't upgrade with this set + ceph osd set nodeep-scrub + + # Fake a schedule scrub + local last_scrub=$(get_last_scrub_stamp $pg) + CEPH_ARGS='' ceph --admin-daemon $dir/ceph-osd.${primary}.asok \ + trigger_scrub $pg || return 1 + # Wait for schedule regular scrub + # to notice scrub and skip it + local found=false + for i in $(seq 14 -1 0) + do + sleep 1 + ! grep -q "Regular scrub skipped due to deep-scrub errors and nodeep-scrub set" $dir/osd.${primary}.log || { found=true ; break; } + echo Time left: $i seconds + done + test $found = "true" || return 1 + + # Bad object still known + rados list-inconsistent-obj $pg | jq '.' | grep -q $objname || return 1 + + # Request a regular scrub and it will be done + pg_scrub $pg + grep -q "Regular scrub request, losing deep-scrub details" $dir/osd.${primary}.log || return 1 + + # deep-scrub error is no longer present + rados list-inconsistent-obj $pg | jq '.' | grep -qv $objname || return 1 +} + main osd-scrub-repair "$@" diff -Nru ceph-10.2.6/src/test/osd/osd-scrub-snaps.sh ceph-10.2.7/src/test/osd/osd-scrub-snaps.sh --- ceph-10.2.6/src/test/osd/osd-scrub-snaps.sh 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/test/osd/osd-scrub-snaps.sh 2017-04-10 11:44:25.000000000 +0000 @@ -196,6 +196,11 @@ jq -c '.inconsistents | sort' $dir/json > $dir/csjson diff $dir/csjson $dir/checkcsjson || return 1 + if which jsonschema > /dev/null; + then + jsonschema -i $dir/json $CEPH_ROOT/doc/rados/command/list-inconsistent-snap.json || return 1 + fi + for i in `seq 1 7` do rados -p $poolname rmsnap snap$i diff -Nru ceph-10.2.6/src/test/rbd_mirror/image_sync/test_mock_ObjectCopyRequest.cc ceph-10.2.7/src/test/rbd_mirror/image_sync/test_mock_ObjectCopyRequest.cc --- ceph-10.2.6/src/test/rbd_mirror/image_sync/test_mock_ObjectCopyRequest.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/test/rbd_mirror/image_sync/test_mock_ObjectCopyRequest.cc 2017-04-10 11:44:25.000000000 +0000 @@ -30,11 +30,16 @@ #include "tools/rbd_mirror/image_sync/ObjectCopyRequest.cc" template class rbd::mirror::image_sync::ObjectCopyRequest; +bool operator==(const SnapContext& rhs, const SnapContext& lhs) { + return (rhs.seq == lhs.seq && rhs.snaps == lhs.snaps); +} + namespace rbd { namespace mirror { namespace image_sync { using ::testing::_; +using ::testing::DoAll; using ::testing::DoDefault; using ::testing::InSequence; using ::testing::Invoke; @@ -82,7 +87,20 @@ } void expect_list_snaps(librbd::MockTestImageCtx &mock_image_ctx, + librados::MockTestMemIoCtxImpl &mock_io_ctx, + const librados::snap_set_t &snap_set) { + expect_set_snap_read(mock_io_ctx, CEPH_SNAPDIR); + EXPECT_CALL(mock_io_ctx, + list_snaps(mock_image_ctx.image_ctx->get_object_name(0), _)) + .WillOnce(DoAll(WithArg<1>(Invoke([&snap_set](librados::snap_set_t *out_snap_set) { + *out_snap_set = snap_set; + })), + Return(0))); + } + + void expect_list_snaps(librbd::MockTestImageCtx &mock_image_ctx, librados::MockTestMemIoCtxImpl &mock_io_ctx, int r) { + expect_set_snap_read(mock_io_ctx, CEPH_SNAPDIR); auto &expect = EXPECT_CALL(mock_io_ctx, list_snaps(mock_image_ctx.image_ctx->get_object_name(0), _)); @@ -108,6 +126,11 @@ 0, on_finish); } + void expect_set_snap_read(librados::MockTestMemIoCtxImpl &mock_io_ctx, + uint64_t snap_id) { + EXPECT_CALL(mock_io_ctx, set_snap_read(snap_id)); + } + void expect_read(librados::MockTestMemIoCtxImpl &mock_io_ctx, uint64_t offset, uint64_t length, int r) { auto &expect = EXPECT_CALL(mock_io_ctx, read(_, length, offset, _)); @@ -129,8 +152,9 @@ } void expect_write(librados::MockTestMemIoCtxImpl &mock_io_ctx, - uint64_t offset, uint64_t length, int r) { - auto &expect = EXPECT_CALL(mock_io_ctx, write(_, _, length, offset, _)); + uint64_t offset, uint64_t length, + const SnapContext &snapc, int r) { + auto &expect = EXPECT_CALL(mock_io_ctx, write(_, _, length, offset, snapc)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -139,9 +163,10 @@ } void expect_write(librados::MockTestMemIoCtxImpl &mock_io_ctx, - const interval_set &extents, int r) { + const interval_set &extents, + const SnapContext &snapc, int r) { for (auto extent : extents) { - expect_write(mock_io_ctx, extent.first, extent.second, r); + expect_write(mock_io_ctx, extent.first, extent.second, snapc, r); if (r < 0) { break; } @@ -212,6 +237,7 @@ m_snap_map.rbegin()->second.end()); } m_snap_map[remote_snap_id] = local_snap_ids; + m_remote_snap_ids.push_back(remote_snap_id); m_local_snap_ids.push_back(local_snap_id); return 0; } @@ -297,6 +323,7 @@ librbd::ImageCtx *m_local_image_ctx; MockObjectCopyRequest::SnapMap m_snap_map; + std::vector m_remote_snap_ids; std::vector m_local_snap_ids; }; @@ -349,8 +376,9 @@ InSequence seq; expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[0]); expect_read(mock_remote_io_ctx, 0, one.range_end(), 0); - expect_write(mock_local_io_ctx, 0, one.range_end(), 0); + expect_write(mock_local_io_ctx, 0, one.range_end(), {0, {}}, 0); expect_update_object_map(mock_local_image_ctx, mock_object_map, m_local_snap_ids[0], OBJECT_EXISTS, 0); @@ -359,6 +387,99 @@ ASSERT_EQ(0, compare_objects()); } +TEST_F(TestMockImageSyncObjectCopyRequest, ReadMissingStaleSnapSet) { + ASSERT_EQ(0, create_snap("one")); + ASSERT_EQ(0, create_snap("two")); + + // scribble some data + interval_set one; + scribble(m_remote_image_ctx, 10, 102400, &one); + ASSERT_EQ(0, create_snap("three")); + + ASSERT_EQ(0, create_snap("sync")); + librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx); + librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); + + librbd::MockObjectMap mock_object_map; + mock_local_image_ctx.object_map = &mock_object_map; + + expect_test_features(mock_local_image_ctx); + + C_SaferCond ctx; + MockObjectCopyRequest *request = create_request(mock_remote_image_ctx, + mock_local_image_ctx, &ctx); + + librados::MockTestMemIoCtxImpl &mock_remote_io_ctx(get_mock_io_ctx( + request->get_remote_io_ctx())); + librados::MockTestMemIoCtxImpl &mock_local_io_ctx(get_mock_io_ctx( + request->get_local_io_ctx())); + + librados::clone_info_t dummy_clone_info; + dummy_clone_info.cloneid = librados::SNAP_HEAD; + dummy_clone_info.size = 123; + + librados::snap_set_t dummy_snap_set1; + dummy_snap_set1.clones.push_back(dummy_clone_info); + + dummy_clone_info.size = 234; + librados::snap_set_t dummy_snap_set2; + dummy_snap_set2.clones.push_back(dummy_clone_info); + + InSequence seq; + expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, dummy_snap_set1); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[3]); + expect_read(mock_remote_io_ctx, 0, 123, -ENOENT); + expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, dummy_snap_set2); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[3]); + expect_read(mock_remote_io_ctx, 0, 234, -ENOENT); + expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[3]); + expect_read(mock_remote_io_ctx, 0, one.range_end(), 0); + expect_write(mock_local_io_ctx, 0, one.range_end(), + {m_local_snap_ids[1], {m_local_snap_ids[1], + m_local_snap_ids[0]}}, + 0); + expect_update_object_map(mock_local_image_ctx, mock_object_map, + m_local_snap_ids[2], OBJECT_EXISTS, 0); + expect_update_object_map(mock_local_image_ctx, mock_object_map, + m_local_snap_ids[3], OBJECT_EXISTS_CLEAN, 0); + + request->send(); + ASSERT_EQ(0, ctx.wait()); + ASSERT_EQ(0, compare_objects()); +} + +TEST_F(TestMockImageSyncObjectCopyRequest, ReadMissingUpToDateSnapMap) { + // scribble some data + interval_set one; + scribble(m_remote_image_ctx, 10, 102400, &one); + + ASSERT_EQ(0, create_snap("sync")); + librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx); + librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); + + librbd::MockObjectMap mock_object_map; + mock_local_image_ctx.object_map = &mock_object_map; + + expect_test_features(mock_local_image_ctx); + + C_SaferCond ctx; + MockObjectCopyRequest *request = create_request(mock_remote_image_ctx, + mock_local_image_ctx, &ctx); + + librados::MockTestMemIoCtxImpl &mock_remote_io_ctx(get_mock_io_ctx( + request->get_remote_io_ctx())); + + InSequence seq; + expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[0]); + expect_read(mock_remote_io_ctx, 0, one.range_end(), -ENOENT); + expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + + request->send(); + ASSERT_EQ(-ENOENT, ctx.wait()); +} + TEST_F(TestMockImageSyncObjectCopyRequest, ReadError) { // scribble some data interval_set one; @@ -382,6 +503,7 @@ InSequence seq; expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[0]); expect_read(mock_remote_io_ctx, 0, one.range_end(), -EINVAL); request->send(); @@ -413,8 +535,9 @@ InSequence seq; expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[0]); expect_read(mock_remote_io_ctx, 0, one.range_end(), 0); - expect_write(mock_local_io_ctx, 0, one.range_end(), -EINVAL); + expect_write(mock_local_io_ctx, 0, one.range_end(), {0, {}}, -EINVAL); request->send(); ASSERT_EQ(-EINVAL, ctx.wait()); @@ -456,10 +579,13 @@ InSequence seq; expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[0]); expect_read(mock_remote_io_ctx, 0, one.range_end(), 0); - expect_write(mock_local_io_ctx, 0, one.range_end(), 0); + expect_write(mock_local_io_ctx, 0, one.range_end(), {0, {}}, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[2]); expect_read(mock_remote_io_ctx, two, 0); - expect_write(mock_local_io_ctx, two, 0); + expect_write(mock_local_io_ctx, two, + {m_local_snap_ids[0], {m_local_snap_ids[0]}}, 0); expect_update_object_map(mock_local_image_ctx, mock_object_map, m_local_snap_ids[0], OBJECT_EXISTS, 0); expect_update_object_map(mock_local_image_ctx, mock_object_map, @@ -505,8 +631,9 @@ InSequence seq; expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[0]); expect_read(mock_remote_io_ctx, 0, one.range_end(), 0); - expect_write(mock_local_io_ctx, 0, one.range_end(), 0); + expect_write(mock_local_io_ctx, 0, one.range_end(), {0, {}}, 0); expect_truncate(mock_local_io_ctx, trim_offset, 0); expect_update_object_map(mock_local_image_ctx, mock_object_map, m_local_snap_ids[0], OBJECT_EXISTS, 0); @@ -523,6 +650,7 @@ interval_set one; scribble(m_remote_image_ctx, 10, 102400, &one); ASSERT_EQ(0, create_snap("one")); + ASSERT_EQ(0, create_snap("two")); // remove the object uint64_t object_size = 1 << m_remote_image_ctx->order; @@ -547,11 +675,14 @@ InSequence seq; expect_list_snaps(mock_remote_image_ctx, mock_remote_io_ctx, 0); + expect_set_snap_read(mock_remote_io_ctx, m_remote_snap_ids[1]); expect_read(mock_remote_io_ctx, 0, one.range_end(), 0); - expect_write(mock_local_io_ctx, 0, one.range_end(), 0); + expect_write(mock_local_io_ctx, 0, one.range_end(), {0, {}}, 0); expect_remove(mock_local_io_ctx, 0); expect_update_object_map(mock_local_image_ctx, mock_object_map, m_local_snap_ids[0], OBJECT_EXISTS, 0); + expect_update_object_map(mock_local_image_ctx, mock_object_map, + m_local_snap_ids[1], OBJECT_EXISTS_CLEAN, 0); request->send(); ASSERT_EQ(0, ctx.wait()); diff -Nru ceph-10.2.6/src/tools/ceph_objectstore_tool.cc ceph-10.2.7/src/tools/ceph_objectstore_tool.cc --- ceph-10.2.6/src/tools/ceph_objectstore_tool.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/tools/ceph_objectstore_tool.cc 2017-04-10 11:44:25.000000000 +0000 @@ -41,6 +41,7 @@ #include "rebuild_mondb.h" #include "ceph_objectstore_tool.h" #include "include/compat.h" +#include "include/util.h" namespace po = boost::program_options; using namespace std; @@ -295,29 +296,6 @@ super_header sh; uint64_t testalign; -// Convert non-printable characters to '\###' -static void cleanbin(string &str) -{ - bool cleaned = false; - string clean; - - for (string::iterator it = str.begin(); it != str.end(); ++it) { - if (!isprint(*it)) { - clean.push_back('\\'); - clean.push_back('0' + ((*it >> 6) & 7)); - clean.push_back('0' + ((*it >> 3) & 7)); - clean.push_back('0' + (*it & 7)); - cleaned = true; - } else { - clean.push_back(*it); - } - } - - if (cleaned) - str = clean; - return; -} - static int get_fd_data(int fd, bufferlist &bl) { uint64_t total = 0; @@ -1486,7 +1464,7 @@ for (map::iterator i = aset.begin();i != aset.end(); ++i) { string key(i->first); if (outistty) - cleanbin(key); + key = cleanbin(key); cout << key << std::endl; } return 0; @@ -1507,7 +1485,7 @@ for (map::iterator i = oset.begin();i != oset.end(); ++i) { string key(i->first); if (outistty) - cleanbin(key); + key = cleanbin(key); cout << key << std::endl; } } @@ -1613,7 +1591,7 @@ string value(bp.c_str(), bp.length()); if (outistty) { - cleanbin(value); + value = cleanbin(value); value.push_back('\n'); } cout << value; @@ -1689,7 +1667,7 @@ bufferlist bl = out.begin()->second; string value(bl.c_str(), bl.length()); if (outistty) { - cleanbin(value); + value = cleanbin(value); value.push_back('\n'); } cout << value; @@ -1760,7 +1738,7 @@ string header(hdrbl.c_str(), hdrbl.length()); if (outistty) { - cleanbin(header); + header = cleanbin(header); header.push_back('\n'); } cout << header; diff -Nru ceph-10.2.6/src/tools/rados/rados.cc ceph-10.2.7/src/tools/rados/rados.cc --- ceph-10.2.6/src/tools/rados/rados.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/tools/rados/rados.cc 2017-04-10 11:44:25.000000000 +0000 @@ -44,6 +44,7 @@ #include "cls/lock/cls_lock_client.h" #include "include/compat.h" +#include "include/util.h" #include "common/hobject.h" #include "PoolDump.h" @@ -1282,19 +1283,43 @@ return 0; } +static void dump_errors(const err_t &err, Formatter &f, const char *name) +{ + f.open_array_section(name); + if (err.has_shard_missing()) + f.dump_string("error", "missing"); + if (err.has_stat_error()) + f.dump_string("error", "stat_error"); + if (err.has_read_error()) + f.dump_string("error", "read_error"); + if (err.has_data_digest_mismatch_oi()) + f.dump_string("error", "data_digest_mismatch_oi"); + if (err.has_omap_digest_mismatch_oi()) + f.dump_string("error", "omap_digest_mismatch_oi"); + if (err.has_size_mismatch_oi()) + f.dump_string("error", "size_mismatch_oi"); + if (err.has_ec_hash_error()) + f.dump_string("error", "ec_hash_error"); + if (err.has_ec_size_error()) + f.dump_string("error", "ec_size_error"); + if (err.has_oi_attr_missing()) + f.dump_string("error", "oi_attr_missing"); + if (err.has_oi_attr_corrupted()) + f.dump_string("error", "oi_attr_corrupted"); + f.close_section(); +} + static void dump_shard(const shard_info_t& shard, const inconsistent_obj_t& inc, Formatter &f) { - // A missing shard just has that error and nothing else - if (shard.has_shard_missing()) { - f.open_array_section("errors"); - f.dump_string("error", "missing"); - f.close_section(); + dump_errors(shard, f, "errors"); + + if (shard.has_shard_missing()) return; - } - f.dump_unsigned("size", shard.size); + if (!shard.has_stat_error()) + f.dump_unsigned("size", shard.size); if (shard.omap_digest_present) { f.dump_format("omap_digest", "0x%08x", shard.omap_digest); } @@ -1302,44 +1327,48 @@ f.dump_format("data_digest", "0x%08x", shard.data_digest); } - f.open_array_section("errors"); - if (shard.has_read_error()) - f.dump_string("error", "read_error"); - if (shard.has_data_digest_mismatch()) - f.dump_string("error", "data_digest_mismatch"); - if (shard.has_omap_digest_mismatch()) - f.dump_string("error", "omap_digest_mismatch"); - if (shard.has_size_mismatch()) - f.dump_string("error", "size_mismatch"); - if (!shard.has_read_error()) { - if (shard.has_data_digest_mismatch_oi()) - f.dump_string("error", "data_digest_mismatch_oi"); - if (shard.has_omap_digest_mismatch_oi()) - f.dump_string("error", "omap_digest_mismatch_oi"); - if (shard.has_size_mismatch_oi()) - f.dump_string("error", "size_mismatch_oi"); - } - if (shard.has_attr_missing()) - f.dump_string("error", "attr_missing"); - if (shard.has_attr_unexpected()) - f.dump_string("error", "attr_unexpected"); - f.close_section(); - - if (inc.has_attr_mismatch()) { - f.open_object_section("attrs"); + if (!shard.has_oi_attr_missing() && !shard.has_oi_attr_corrupted() && + inc.has_object_info_inconsistency()) { + object_info_t oi; + bufferlist bl; + map::iterator k = (const_cast(shard)).attrs.find(OI_ATTR); + assert(k != shard.attrs.end()); // Can't be missing + bufferlist::iterator bliter = k->second.begin(); + ::decode(oi, bliter); // Can't be corrupted + f.dump_stream("object_info") << oi; + } + if (inc.has_attr_name_mismatch() || inc.has_attr_value_mismatch()) { + f.open_array_section("attrs"); for (auto kv : shard.attrs) { f.open_object_section("attr"); f.dump_string("name", kv.first); - bufferlist b64; - kv.second.encode_base64(b64); - string v(b64.c_str(), b64.length()); - f.dump_string("value", v); + bool b64; + f.dump_string("value", cleanbin(kv.second, b64)); + f.dump_bool("Base64", b64); f.close_section(); } f.close_section(); } } +static void dump_obj_errors(const obj_err_t &err, Formatter &f) +{ + f.open_array_section("errors"); + if (err.has_object_info_inconsistency()) + f.dump_string("error", "object_info_inconsistency"); + if (err.has_data_digest_mismatch()) + f.dump_string("error", "data_digest_mismatch"); + if (err.has_omap_digest_mismatch()) + f.dump_string("error", "omap_digest_mismatch"); + if (err.has_size_mismatch()) + f.dump_string("error", "size_mismatch"); + if (err.has_attr_value_mismatch()) + f.dump_string("error", "attr_value_mismatch"); + if (err.has_attr_name_mismatch()) + f.dump_string("error", "attr_name_mismatch"); + f.close_section(); +} + static void dump_object_id(const object_id_t& object, Formatter &f) { @@ -1364,32 +1393,33 @@ { f.open_object_section("object"); dump_object_id(inc.object, f); + f.dump_unsigned("version", inc.version); f.close_section(); - f.open_array_section("errors"); - if (inc.has_attr_unexpected()) - f.dump_string("error", "attr_unexpected"); - if (inc.has_shard_missing()) - f.dump_string("error", "missing"); - if (inc.has_stat_error()) - f.dump_string("error", "stat_error"); - if (inc.has_read_error()) - f.dump_string("error", "read_error"); - if (inc.has_data_digest_mismatch()) - f.dump_string("error", "data_digest_mismatch"); - if (inc.has_omap_digest_mismatch()) - f.dump_string("error", "omap_digest_mismatch"); - if (inc.has_size_mismatch()) - f.dump_string("error", "size_mismatch"); - if (inc.has_attr_mismatch()) - f.dump_string("error", "attr_mismatch"); - f.close_section(); - + dump_obj_errors(inc, f); + dump_errors(inc.union_shards, f, "union_shard_errors"); + for (const auto& shard_info : inc.shards) { + shard_info_t shard = const_cast(shard_info.second); + if (shard.selected_oi) { + object_info_t oi; + bufferlist bl; + auto k = shard.attrs.find(OI_ATTR); + assert(k != shard.attrs.end()); // Can't be missing + bufferlist::iterator bliter = k->second.begin(); + ::decode(oi, bliter); // Can't be corrupted + f.dump_stream("selected_object_info") << oi; + break; + } + } f.open_array_section("shards"); - for (auto osd_shard : inc.shards) { + for (const auto& shard_info : inc.shards) { f.open_object_section("shard"); - f.dump_int("osd", osd_shard.first); - dump_shard(osd_shard.second, inc, f); + auto& osd_shard = shard_info.first; + f.dump_int("osd", osd_shard.osd); + auto shard = osd_shard.shard; + if (shard != shard_id_t::NO_SHARD) + f.dump_unsigned("shard", shard); + dump_shard(shard_info.second, inc, f); f.close_section(); } f.close_section(); diff -Nru ceph-10.2.6/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.cc ceph-10.2.7/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.cc --- ceph-10.2.6/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.cc 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.cc 2017-04-10 11:44:25.000000000 +0000 @@ -12,6 +12,22 @@ #define dout_prefix *_dout << "rbd::mirror::image_sync::ObjectCopyRequest: " \ << this << " " << __func__ +namespace librados { + +bool operator==(const clone_info_t& rhs, const clone_info_t& lhs) { + return (rhs.cloneid == lhs.cloneid && + rhs.snaps == lhs.snaps && + rhs.overlap == lhs.overlap && + rhs.size == lhs.size); +} + +bool operator==(const snap_set_t& rhs, const snap_set_t& lhs) { + return (rhs.clones == lhs.clones && + rhs.seq == lhs.seq); +} + +} // namespace librados + namespace rbd { namespace mirror { namespace image_sync { @@ -54,6 +70,8 @@ ObjectCopyRequest, &ObjectCopyRequest::handle_list_snaps>(this); librados::ObjectReadOperation op; + m_snap_set = {}; + m_snap_ret = 0; op.list_snaps(&m_snap_set, &m_snap_ret); m_remote_io_ctx.snap_set_read(CEPH_SNAPDIR); @@ -75,12 +93,26 @@ finish(0); return; } + if (r < 0) { derr << ": failed to list snaps: " << cpp_strerror(r) << dendl; finish(r); return; } + if (m_retry_missing_read) { + if (m_snap_set == m_retry_snap_set) { + derr << ": read encountered missing object using up-to-date snap set" + << dendl; + finish(-ENOENT); + return; + } + + dout(20) << ": retrying using updated snap set" << dendl; + m_retry_missing_read = false; + m_retry_snap_set = {}; + } + compute_diffs(); send_read_object(); } @@ -97,24 +129,24 @@ auto &sync_ops = m_snap_sync_ops.begin()->second; assert(!sync_ops.empty()); - // map the sync op start snap id back to the necessary read snap id - librados::snap_t remote_snap_seq = m_snap_sync_ops.begin()->first; - m_remote_io_ctx.snap_set_read(remote_snap_seq); - bool read_required = false; librados::ObjectReadOperation op; for (auto &sync_op : sync_ops) { - switch (std::get<0>(sync_op)) { + switch (sync_op.type) { case SYNC_OP_TYPE_WRITE: if (!read_required) { + // map the sync op start snap id back to the necessary read snap id + librados::snap_t remote_snap_seq = + m_snap_sync_ops.begin()->first.second; + m_remote_io_ctx.snap_set_read(remote_snap_seq); + dout(20) << ": remote_snap_seq=" << remote_snap_seq << dendl; read_required = true; } - dout(20) << ": read op: " << std::get<1>(sync_op) << "~" - << std::get<2>(sync_op) << dendl; - op.read(std::get<1>(sync_op), std::get<2>(sync_op), - &std::get<3>(sync_op), nullptr); + dout(20) << ": read op: " << sync_op.offset << "~" << sync_op.length + << dendl; + op.read(sync_op.offset, sync_op.length, &sync_op.out_bl, nullptr); break; default: break; @@ -138,6 +170,15 @@ void ObjectCopyRequest::handle_read_object(int r) { dout(20) << ": r=" << r << dendl; + if (r == -ENOENT) { + m_retry_snap_set = m_snap_set; + m_retry_missing_read = true; + + dout(5) << ": object missing potentially due to removed snapshot" << dendl; + send_list_snaps(); + return; + } + if (r < 0) { derr << ": failed to read from remote object: " << cpp_strerror(r) << dendl; @@ -153,7 +194,7 @@ // retrieve the local snap context for the op SnapIds local_snap_ids; librados::snap_t local_snap_seq = 0; - librados::snap_t remote_snap_seq = m_snap_sync_ops.begin()->first; + librados::snap_t remote_snap_seq = m_snap_sync_ops.begin()->first.first; if (remote_snap_seq != 0) { auto snap_map_it = m_snap_map->find(remote_snap_seq); assert(snap_map_it != m_snap_map->end()); @@ -176,15 +217,15 @@ librados::ObjectWriteOperation op; for (auto &sync_op : sync_ops) { - switch (std::get<0>(sync_op)) { + switch (sync_op.type) { case SYNC_OP_TYPE_WRITE: - dout(20) << ": write op: " << std::get<1>(sync_op) << "~" - << std::get<3>(sync_op).length() << dendl; - op.write(std::get<1>(sync_op), std::get<3>(sync_op)); + dout(20) << ": write op: " << sync_op.offset << "~" + << sync_op.out_bl.length() << dendl; + op.write(sync_op.offset, sync_op.out_bl); break; case SYNC_OP_TYPE_TRUNC: - dout(20) << ": trunc op: " << std::get<1>(sync_op) << dendl; - op.truncate(std::get<1>(sync_op)); + dout(20) << ": trunc op: " << sync_op.offset << dendl; + op.truncate(sync_op.offset); break; case SYNC_OP_TYPE_REMOVE: dout(20) << ": remove op" << dendl; @@ -279,6 +320,10 @@ void ObjectCopyRequest::compute_diffs() { CephContext *cct = m_local_image_ctx->cct; + m_snap_sync_ops = {}; + m_snap_object_states = {}; + + librados::snap_t remote_sync_pont_snap_id = m_snap_map->rbegin()->first; uint64_t prev_end_size = 0; bool prev_exists = false; librados::snap_t start_remote_snap_id = 0; @@ -290,12 +335,15 @@ interval_set diff; uint64_t end_size; bool exists; + librados::snap_t clone_end_snap_id; calc_snap_set_diff(cct, m_snap_set, start_remote_snap_id, - end_remote_snap_id, &diff, &end_size, &exists); + end_remote_snap_id, &diff, &end_size, &exists, + &clone_end_snap_id); dout(20) << ": " << "start_remote_snap=" << start_remote_snap_id << ", " << "end_remote_snap_id=" << end_remote_snap_id << ", " + << "clone_end_snap_id=" << clone_end_snap_id << ", " << "end_local_snap_id=" << end_local_snap_id << ", " << "diff=" << diff << ", " << "end_size=" << end_size << ", " @@ -317,33 +365,43 @@ uint8_t object_state = OBJECT_EXISTS; if (m_local_image_ctx->test_features(RBD_FEATURE_FAST_DIFF, m_local_image_ctx->snap_lock) && - diff.empty() && end_size == prev_end_size) { + prev_exists && diff.empty() && end_size == prev_end_size) { object_state = OBJECT_EXISTS_CLEAN; } m_snap_object_states[end_local_snap_id] = object_state; } + // reads should be issued against the newest (existing) snapshot within + // the associated snapshot object clone. writes should be issued + // against the oldest snapshot in the snap_map. + assert(clone_end_snap_id >= end_remote_snap_id); + if (clone_end_snap_id > remote_sync_pont_snap_id) { + // do not read past the sync point snapshot + clone_end_snap_id = remote_sync_pont_snap_id; + } + // object write/zero, or truncate + // NOTE: a single snapshot clone might represent multiple snapshots, but + // the write/zero and truncate ops will only be associated with the first + // snapshot encountered within the clone since the diff will be empty for + // subsequent snapshots and the size will remain constant for a clone. for (auto it = diff.begin(); it != diff.end(); ++it) { dout(20) << ": read/write op: " << it.get_start() << "~" << it.get_len() << dendl; - m_snap_sync_ops[end_remote_snap_id].emplace_back(SYNC_OP_TYPE_WRITE, - it.get_start(), - it.get_len(), - bufferlist()); + m_snap_sync_ops[{end_remote_snap_id, clone_end_snap_id}].emplace_back( + SYNC_OP_TYPE_WRITE, it.get_start(), it.get_len()); } if (end_size < prev_end_size) { dout(20) << ": trunc op: " << end_size << dendl; - m_snap_sync_ops[end_remote_snap_id].emplace_back(SYNC_OP_TYPE_TRUNC, - end_size, 0U, - bufferlist()); + m_snap_sync_ops[{end_remote_snap_id, clone_end_snap_id}].emplace_back( + SYNC_OP_TYPE_TRUNC, end_size, 0U); } } else { if (prev_exists) { // object remove dout(20) << ": remove op" << dendl; - m_snap_sync_ops[end_remote_snap_id].emplace_back(SYNC_OP_TYPE_REMOVE, - 0U, 0U, bufferlist()); + m_snap_sync_ops[{end_remote_snap_id, end_remote_snap_id}].emplace_back( + SYNC_OP_TYPE_REMOVE, 0U, 0U); } } diff -Nru ceph-10.2.6/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.h ceph-10.2.7/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.h --- ceph-10.2.6/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.h 2017-03-07 13:30:23.000000000 +0000 +++ ceph-10.2.7/src/tools/rbd_mirror/image_sync/ObjectCopyRequest.h 2017-04-10 11:44:25.000000000 +0000 @@ -11,7 +11,6 @@ #include #include #include -#include #include class Context; @@ -55,9 +54,11 @@ * * | * v - * LIST_SNAPS - * | - * v + * LIST_SNAPS < * * * + * | * (-ENOENT and snap set stale) + * | * * * * * * + * | * + * v * * READ_OBJECT <--------\ * | | (repeat for each snapshot) * v | @@ -81,9 +82,21 @@ SYNC_OP_TYPE_REMOVE }; - typedef std::tuple SyncOp; + struct SyncOp { + SyncOp(SyncOpType type, uint64_t offset, uint64_t length) + : type(type), offset(offset), length(length) { + } + + SyncOpType type; + uint64_t offset; + uint64_t length; + + bufferlist out_bl; + }; + typedef std::list SyncOps; - typedef std::map SnapSyncOps; + typedef std::pair WriteReadSnapIds; + typedef std::map SnapSyncOps; typedef std::map SnapObjectStates; ImageCtxT *m_local_image_ctx; @@ -100,6 +113,9 @@ librados::snap_set_t m_snap_set; int m_snap_ret; + bool m_retry_missing_read = false; + librados::snap_set_t m_retry_snap_set; + SnapSyncOps m_snap_sync_ops; SnapObjectStates m_snap_object_states; diff -Nru ceph-10.2.6/systemd/Makefile.in ceph-10.2.7/systemd/Makefile.in --- ceph-10.2.6/systemd/Makefile.in 2017-03-07 13:31:29.000000000 +0000 +++ ceph-10.2.7/systemd/Makefile.in 2017-04-10 11:45:21.000000000 +0000 @@ -100,6 +100,7 @@ $(top_srcdir)/m4/ax_c_pretty_func.m4 \ $(top_srcdir)/m4/ax_c_var_func.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_static_cast.m4 \ $(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \ @@ -264,6 +265,9 @@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPENSSL_INCLUDES = @OPENSSL_INCLUDES@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -295,6 +299,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SONAME_DEFINES = @SONAME_DEFINES@ SPHINX_BUILD = @SPHINX_BUILD@ STRIP = @STRIP@ VERSION = @VERSION@