From 181888fb293938ba79f4c96c14bf1459f38d18af Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabian=20Gr=C3=BCnbichler?= Date: Fri, 29 Sep 2017 09:57:31 +0200 Subject: [PATCH] update sources to v12.2.1 --- ceph/CMakeLists.txt | 2 +- ceph/PendingReleaseNotes | 16 + ceph/alpine/APKBUILD | 6 +- ceph/ceph.spec | 12 +- ceph/ceph.spec.in | 6 +- ceph/debian/changelog | 6 + ceph/doc/cephfs/health-messages.rst | 28 +- ceph/doc/cephfs/mds-config-ref.rst | 23 +- ceph/doc/images/esx_iscsi_chap.png | Bin 0 -> 19668 bytes ceph/doc/images/esx_iscsi_conf.png | Bin 0 -> 58300 bytes ceph/doc/images/esx_iscsi_disc.png | Bin 0 -> 16505 bytes ceph/doc/images/esx_iscsi_general.png | Bin 0 -> 9136 bytes ceph/doc/images/esx_iscsi_rescan.png | Bin 0 -> 62103 bytes ceph/doc/images/esx_iscsi_select_device.png | Bin 0 -> 63316 bytes ceph/doc/images/esx_iscsi_select_mru.png | Bin 0 -> 18346 bytes .../images/win2016_iscsi_advanced_window.png | Bin 0 -> 21371 bytes .../win2016_iscsi_connect_to_target.png | Bin 0 -> 6956 bytes .../doc/images/win2016_iscsi_devices_mpio.png | Bin 0 -> 10913 bytes .../images/win2016_iscsi_discovery_tab.png | Bin 0 -> 21808 bytes ceph/doc/images/win2016_iscsi_target_tab.png | Bin 0 -> 20594 bytes ceph/doc/images/win2016_iscsi_target_tab2.png | Bin 0 -> 22340 bytes ceph/doc/images/win2016_mpclaim_output.png | Bin 0 -> 18464 bytes .../images/win2016_mpio_set_failover_only.png | Bin 0 -> 13334 bytes ceph/doc/man/8/ceph.rst | 2 +- ceph/doc/rbd/index.rst | 14 +- ceph/doc/rbd/iscsi-initiator-esx.rst | 36 ++ ceph/doc/rbd/iscsi-initiator-rhel.rst | 90 ++++ ceph/doc/rbd/iscsi-initiator-win.rst | 100 ++++ ceph/doc/rbd/iscsi-initiators.rst | 10 + ceph/doc/rbd/iscsi-monitoring.rst | 103 ++++ ceph/doc/rbd/iscsi-overview.rst | 50 ++ ceph/doc/rbd/iscsi-requirements.rst | 49 ++ ceph/doc/rbd/iscsi-target-ansible.rst | 343 +++++++++++++ ceph/doc/rbd/iscsi-target-cli.rst | 163 ++++++ ceph/doc/rbd/iscsi-targets.rst | 27 + ceph/qa/objectstore/bluestore-bitmap.yaml | 39 ++ ceph/qa/objectstore/bluestore-comp.yaml | 3 +- ceph/qa/objectstore/bluestore.yaml | 6 +- ceph/qa/run_xfstests.sh | 284 ++--------- ceph/qa/run_xfstests_krbd.sh | 91 ---- ceph/qa/standalone/crush/crush-classes.sh | 1 + ceph/qa/standalone/mon/osd-pool-df.sh | 75 +++ ceph/qa/standalone/mon/test_pool_quota.sh | 2 +- .../tasks/alternate-pool.yaml | 20 + .../basic_functional/tasks/client-limits.yaml | 2 + .../fs/basic_functional/tasks/data-scan.yaml | 1 + .../multiclient/tasks/cephfs_misc_tests.yaml | 1 + .../kcephfs/recovery/tasks/auto-repair.yaml | 1 + .../kcephfs/recovery/tasks/client-limits.yaml | 3 + .../recovery/tasks/client-recovery.yaml | 1 + .../kcephfs/recovery/tasks/data-scan.yaml | 1 + .../kcephfs/recovery/tasks/failover.yaml | 7 +- .../kcephfs/recovery/whitelist_health.yaml | 1 + .../kcephfs/thrash/thrashosds-health.yaml | 1 + .../kcephfs/thrash/whitelist_health.yaml | 1 + .../krbd/singleton/tasks/rbd_xfstests.yaml | 23 +- .../thrash/d-require-luminous/at-end.yaml | 2 + ceph/qa/suites/rbd/cli/pool/ec-data-pool.yaml | 4 - .../suites/rbd/librbd/pool/ec-data-pool.yaml | 4 - .../workloads/dynamic_features_no_cache.yaml | 4 +- ceph/qa/suites/rbd/mirror/cluster/2-node.yaml | 8 +- .../qa/suites/rbd/qemu/pool/ec-data-pool.yaml | 4 - ceph/qa/suites/rgw/multisite/overrides.yaml | 2 + ceph/qa/suites/upgrade/luminous-x/parallel/% | 0 .../upgrade/luminous-x/parallel/0-cluster/+ | 0 .../parallel/0-cluster/openstack.yaml | 4 + .../luminous-x/parallel/0-cluster/start.yaml | 39 ++ .../parallel/1-ceph-install/luminous.yaml | 43 ++ .../upgrade/luminous-x/parallel/2-workload/+ | 0 .../parallel/2-workload/blogbench.yaml | 14 + .../parallel/2-workload/ec-rados-default.yaml | 24 + .../parallel/2-workload/rados_api.yaml | 11 + .../parallel/2-workload/rados_loadgenbig.yaml | 11 + .../parallel/2-workload/test_rbd_api.yaml | 11 + .../parallel/2-workload/test_rbd_python.yaml | 11 + .../3-upgrade-sequence/upgrade-all.yaml | 16 + .../upgrade-mon-osd-mds.yaml | 35 ++ .../luminous-x/parallel/5-final-workload/+ | 0 .../parallel/5-final-workload/blogbench.yaml | 13 + .../rados-snaps-few-objects.yaml | 17 + .../5-final-workload/rados_loadgenmix.yaml | 9 + .../5-final-workload/rados_mon_thrash.yaml | 18 + .../parallel/5-final-workload/rbd_cls.yaml | 9 + .../5-final-workload/rbd_import_export.yaml | 11 + .../parallel/5-final-workload/rgw_swift.yaml | 13 + .../upgrade/luminous-x/parallel/distros | 1 + .../upgrade/luminous-x/parallel/objectstore | 1 + .../luminous-x/stress-split-erasure-code/% | 0 .../stress-split-erasure-code/0-cluster | 1 + .../2-partial-upgrade | 1 + .../3-thrash/default.yaml | 25 + .../4-ec-workload.yaml | 22 + .../5-finish-upgrade.yaml | 1 + .../7-final-workload.yaml | 35 ++ .../stress-split-erasure-code/distros | 1 + .../stress-split-erasure-code/objectstore | 1 + .../thrashosds-health.yaml | 1 + .../suites/upgrade/luminous-x/stress-split/% | 0 .../luminous-x/stress-split/0-cluster/+ | 0 .../stress-split/0-cluster/openstack.yaml | 6 + .../stress-split/0-cluster/start.yaml | 29 ++ .../stress-split/1-ceph-install/luminous.yaml | 17 + .../2-partial-upgrade/firsthalf.yaml | 12 + .../stress-split/3-thrash/default.yaml | 25 + .../luminous-x/stress-split/4-workload/+ | 0 .../stress-split/4-workload/radosbench.yaml | 40 ++ .../stress-split/4-workload/rbd-cls.yaml | 10 + .../4-workload/rbd-import-export.yaml | 12 + .../stress-split/4-workload/rbd_api.yaml | 10 + .../stress-split/4-workload/readwrite.yaml | 16 + .../4-workload/snaps-few-objects.yaml | 18 + .../stress-split/5-finish-upgrade.yaml | 9 + .../stress-split/7-final-workload/+ | 0 .../7-final-workload/rbd-python.yaml | 10 + .../7-final-workload/rgw-swift.yaml | 11 + .../7-final-workload/snaps-many-objects.yaml | 16 + .../upgrade/luminous-x/stress-split/distros | 1 + .../stress-split/objectstore/bluestore.yaml | 1 + .../objectstore/filestore-xfs.yaml | 1 + .../stress-split/thrashosds-health.yaml | 1 + ceph/qa/tasks/ceph.py | 2 +- ceph/qa/tasks/ceph_manager.py | 1 + ceph/qa/tasks/ceph_test_case.py | 1 + ceph/qa/tasks/cephfs/cephfs_test_case.py | 21 +- ceph/qa/tasks/cephfs/filesystem.py | 65 ++- ceph/qa/tasks/cephfs/test_client_limits.py | 8 +- ceph/qa/tasks/cephfs/test_client_recovery.py | 21 +- ceph/qa/tasks/cephfs/test_data_scan.py | 86 +--- ceph/qa/tasks/cephfs/test_misc.py | 6 +- ceph/qa/tasks/cephfs/test_recovery_pool.py | 220 ++++++++ ceph/qa/tasks/mgr/test_failover.py | 10 + ceph/qa/tasks/radosgw_admin.py | 425 ++++++++++++++-- ceph/qa/tasks/rbd.py | 20 +- ceph/qa/tasks/rgw.py | 2 +- ceph/qa/tasks/util/rados.py | 6 +- ceph/qa/tasks/vstart_runner.py | 24 +- ceph/qa/workunits/cephtool/test.sh | 3 + ceph/qa/workunits/mon/crush_ops.sh | 2 + ceph/qa/workunits/rbd/import_export.sh | 8 +- ceph/selinux/ceph.te | 6 +- ceph/src/.git_version | 4 +- ceph/src/CMakeLists.txt | 9 +- .../ceph_volume/devices/lvm/activate.py | 23 +- .../ceph_volume/devices/lvm/api.py | 264 +++++++++- .../ceph_volume/devices/lvm/prepare.py | 42 +- .../ceph_volume/devices/lvm/trigger.py | 2 +- .../src/ceph-volume/ceph_volume/exceptions.py | 10 + .../ceph-volume/ceph_volume/tests/conftest.py | 26 + .../tests/devices/lvm/test_activate.py | 34 ++ .../ceph_volume/tests/devices/lvm/test_api.py | 98 ++++ .../tests/devices/lvm/test_trigger.py | 6 + .../ceph_volume/tests/functional/Vagrantfile | 32 +- .../functional/centos7/create/group_vars/all | 10 +- .../ceph_volume/tests/functional/tox.ini | 2 +- .../functional/xenial/create/group_vars/all | 10 +- ceph/src/ceph-volume/ceph_volume/util/disk.py | 24 + ceph/src/ceph.in | 41 +- ceph/src/ceph_release | 2 +- ceph/src/client/Client.cc | 473 ++++++++++++++++-- ceph/src/client/Client.h | 1 - ceph/src/client/fuse_ll.cc | 2 +- ceph/src/cls/rbd/cls_rbd.cc | 32 +- ceph/src/common/Formatter.cc | 4 + ceph/src/common/Formatter.h | 6 + ceph/src/common/LogClient.h | 18 + ceph/src/common/admin_socket.cc | 3 +- ceph/src/common/cohort_lru.h | 2 +- ceph/src/common/legacy_config_opts.h | 108 ---- ceph/src/common/options.cc | 182 ++++--- ceph/src/common/util.cc | 16 + ceph/src/crush/CrushWrapper.h | 15 +- ceph/src/include/alloc_ptr.h | 91 ++++ ceph/src/include/btree_interval_set.h | 43 +- ceph/src/include/compact_map.h | 6 + ceph/src/include/counter.h | 16 +- ceph/src/include/encoding.h | 6 +- ceph/src/include/interval_set.h | 18 +- ceph/src/include/lru.h | 322 +++++------- ceph/src/include/mempool.h | 7 + ceph/src/include/rados.h | 4 +- ceph/src/include/util.h | 2 + ceph/src/include/xlist.h | 4 +- ceph/src/librbd/ImageCtx.cc | 82 +-- ceph/src/librbd/ImageCtx.h | 1 + ceph/src/librbd/ImageState.cc | 2 +- ceph/src/librbd/ImageWatcher.cc | 3 +- ceph/src/librbd/Journal.cc | 2 +- ceph/src/librbd/image/CreateRequest.cc | 16 +- ceph/src/librbd/internal.cc | 13 +- ceph/src/librbd/io/ImageRequestWQ.cc | 12 +- ceph/src/librbd/operation/ObjectMapIterate.cc | 2 +- ceph/src/mds/Beacon.cc | 8 +- ceph/src/mds/CDentry.cc | 2 + ceph/src/mds/CDentry.h | 7 +- ceph/src/mds/CDir.cc | 21 +- ceph/src/mds/CDir.h | 1 + ceph/src/mds/CInode.cc | 8 +- ceph/src/mds/CInode.h | 1 + ceph/src/mds/FSMap.cc | 2 +- ceph/src/mds/Locker.cc | 16 +- ceph/src/mds/MDCache.cc | 263 +++++----- ceph/src/mds/MDCache.h | 41 +- ceph/src/mds/MDLog.cc | 2 +- ceph/src/mds/MDSCacheObject.cc | 10 +- ceph/src/mds/MDSCacheObject.h | 109 ++-- ceph/src/mds/MDSDaemon.cc | 6 + ceph/src/mds/MDSRank.cc | 8 + ceph/src/mds/Migrator.cc | 36 +- ceph/src/mds/Server.cc | 79 +-- ceph/src/mds/Server.h | 2 +- ceph/src/mds/SessionMap.cc | 2 +- ceph/src/mds/SessionMap.h | 2 +- ceph/src/mds/SimpleLock.h | 7 +- ceph/src/messages/MOSDPGRecoveryDelete.h | 14 +- ceph/src/messages/MOSDPGRecoveryDeleteReply.h | 14 +- ceph/src/mgr/PyFormatter.h | 2 +- ceph/src/mgr/PyState.cc | 4 +- ceph/src/mon/CreatingPGs.h | 1 + ceph/src/mon/MDSMonitor.cc | 9 +- ceph/src/mon/MgrMonitor.cc | 13 +- ceph/src/mon/MgrMonitor.h | 11 +- ceph/src/mon/MgrStatMonitor.h | 4 + ceph/src/mon/MonCommands.h | 6 + ceph/src/mon/MonOpRequest.h | 2 +- ceph/src/mon/Monitor.cc | 133 ++++- ceph/src/mon/Monitor.h | 20 + ceph/src/mon/OSDMonitor.cc | 120 ++++- ceph/src/mon/PGMap.cc | 4 +- ceph/src/mon/PGMap.h | 9 + ceph/src/os/bluestore/BlueFS.cc | 9 +- ceph/src/os/bluestore/BlueStore.cc | 54 +- ceph/src/os/bluestore/BlueStore.h | 3 +- ceph/src/os/bluestore/StupidAllocator.cc | 17 +- ceph/src/os/bluestore/StupidAllocator.h | 9 +- ceph/src/os/bluestore/aio.cc | 18 +- ceph/src/os/bluestore/bluestore_types.cc | 2 +- ceph/src/osd/OSD.cc | 41 +- ceph/src/osd/OSD.h | 5 + ceph/src/osd/OSDMap.cc | 35 +- ceph/src/osd/PG.cc | 17 +- ceph/src/osd/PGLog.cc | 126 +++-- ceph/src/osd/PGLog.h | 44 +- ceph/src/osd/PrimaryLogPG.cc | 7 +- ceph/src/osd/osd_types.h | 10 + ceph/src/pybind/mgr/dashboard/base.html | 7 +- ceph/src/pybind/mgr/dashboard/health.html | 16 +- ceph/src/pybind/mgr/dashboard/module.py | 4 +- ceph/src/rgw/rgw_admin.cc | 29 +- ceph/src/rgw/rgw_asio_frontend.cc | 4 +- ceph/src/rgw/rgw_bucket.cc | 43 +- ceph/src/rgw/rgw_civetweb_frontend.cc | 4 +- ceph/src/rgw/rgw_client_io.h | 4 +- ceph/src/rgw/rgw_client_io_filters.h | 67 ++- ceph/src/rgw/rgw_common.h | 1 + ceph/src/rgw/rgw_crypt.cc | 6 + ceph/src/rgw/rgw_data_sync.cc | 18 +- ceph/src/rgw/rgw_fcgi_process.cc | 4 +- ceph/src/rgw/rgw_formats.h | 1 + ceph/src/rgw/rgw_lc.cc | 9 +- ceph/src/rgw/rgw_lc.h | 56 ++- ceph/src/rgw/rgw_lc_s3.cc | 47 +- ceph/src/rgw/rgw_lc_s3.h | 28 +- ceph/src/rgw/rgw_loadgen_process.cc | 2 +- ceph/src/rgw/rgw_log.cc | 5 + ceph/src/rgw/rgw_metadata.cc | 40 +- ceph/src/rgw/rgw_metadata.h | 7 +- ceph/src/rgw/rgw_op.cc | 2 + ceph/src/rgw/rgw_op.h | 1 + ceph/src/rgw/rgw_quota.cc | 6 +- ceph/src/rgw/rgw_rados.cc | 127 ++++- ceph/src/rgw/rgw_rados.h | 34 +- ceph/src/rgw/rgw_rest_client.cc | 2 +- ceph/src/rgw/rgw_rest_conn.cc | 5 +- ceph/src/rgw/rgw_rest_conn.h | 2 +- ceph/src/rgw/rgw_rest_metadata.cc | 40 +- ceph/src/rgw/rgw_rest_s3.cc | 10 + ceph/src/rgw/rgw_sync.cc | 87 ++-- ceph/src/rgw/rgw_user.cc | 22 +- ceph/src/rocksdb/CMakeLists.txt | 2 +- ceph/src/rocksdb/util/crc32c.cc | 14 +- .../cli-integration/rbd/formatted-output.t | 4 +- ceph/src/test/cli/rbd/help.t | 32 +- ceph/src/test/cls_rbd/test_cls_rbd.cc | 3 +- ceph/src/test/common/test_lru.cc | 131 +++-- ceph/src/test/libcephfs/test.cc | 33 +- ceph/src/test/librbd/journal/test_Entries.cc | 4 +- ceph/src/test/librbd/journal/test_Replay.cc | 14 +- .../managed_lock/test_mock_AcquireRequest.cc | 5 +- ceph/src/test/librbd/mock/MockImageCtx.h | 4 +- ceph/src/test/librbd/test_MirroringWatcher.cc | 17 +- ceph/src/test/librbd/test_internal.cc | 2 +- ceph/src/test/mon/PGMap.cc | 6 +- ceph/src/test/osd/TestPGLog.cc | 126 ++--- .../rbd_mirror/test_mock_LeaderWatcher.cc | 4 +- ceph/src/test/rgw/rgw_multi/tests.py | 42 ++ ceph/src/tools/ceph_objectstore_tool.cc | 14 +- ceph/src/tools/rbd/ArgumentTypes.cc | 2 +- ceph/src/tools/rbd/Utils.cc | 10 +- ceph/src/tools/rbd/action/DiskUsage.cc | 2 +- ceph/src/tools/rbd/action/Export.cc | 6 +- ceph/src/tools/rbd/action/ImageMeta.cc | 78 +-- ceph/src/tools/rbd/action/Import.cc | 8 +- ceph/src/tools/rbd/action/Kernel.cc | 3 +- ceph/src/tools/rbd/action/List.cc | 4 +- ceph/src/tools/rbd/action/MirrorPool.cc | 3 +- ceph/src/tools/rbd_mirror/ImageDeleter.cc | 3 +- ceph/src/tools/rbd_mirror/ImageReplayer.cc | 9 +- .../tools/rbd_mirror/ImageSyncThrottler.cc | 6 +- ceph/src/tools/rbd_mirror/InstanceReplayer.cc | 3 +- ceph/src/tools/rbd_mirror/InstanceWatcher.cc | 2 +- ceph/src/tools/rbd_mirror/Instances.cc | 6 +- ceph/src/tools/rbd_mirror/LeaderWatcher.cc | 12 +- ceph/src/tools/rbd_mirror/Mirror.cc | 2 +- ceph/src/tools/rbd_mirror/PoolReplayer.cc | 4 +- ceph/src/tools/rbd_mirror/Threads.cc | 6 +- .../rbd_mirror/image_sync/ImageCopyRequest.cc | 5 +- ceph/src/tools/rbd_nbd/rbd-nbd.cc | 22 +- 317 files changed, 6129 insertions(+), 2072 deletions(-) create mode 100755 ceph/doc/images/esx_iscsi_chap.png create mode 100755 ceph/doc/images/esx_iscsi_conf.png create mode 100755 ceph/doc/images/esx_iscsi_disc.png create mode 100755 ceph/doc/images/esx_iscsi_general.png create mode 100755 ceph/doc/images/esx_iscsi_rescan.png create mode 100755 ceph/doc/images/esx_iscsi_select_device.png create mode 100755 ceph/doc/images/esx_iscsi_select_mru.png create mode 100755 ceph/doc/images/win2016_iscsi_advanced_window.png create mode 100755 ceph/doc/images/win2016_iscsi_connect_to_target.png create mode 100755 ceph/doc/images/win2016_iscsi_devices_mpio.png create mode 100755 ceph/doc/images/win2016_iscsi_discovery_tab.png create mode 100755 ceph/doc/images/win2016_iscsi_target_tab.png create mode 100755 ceph/doc/images/win2016_iscsi_target_tab2.png create mode 100644 ceph/doc/images/win2016_mpclaim_output.png create mode 100755 ceph/doc/images/win2016_mpio_set_failover_only.png create mode 100644 ceph/doc/rbd/iscsi-initiator-esx.rst create mode 100644 ceph/doc/rbd/iscsi-initiator-rhel.rst create mode 100644 ceph/doc/rbd/iscsi-initiator-win.rst create mode 100644 ceph/doc/rbd/iscsi-initiators.rst create mode 100644 ceph/doc/rbd/iscsi-monitoring.rst create mode 100644 ceph/doc/rbd/iscsi-overview.rst create mode 100644 ceph/doc/rbd/iscsi-requirements.rst create mode 100644 ceph/doc/rbd/iscsi-target-ansible.rst create mode 100644 ceph/doc/rbd/iscsi-target-cli.rst create mode 100644 ceph/doc/rbd/iscsi-targets.rst create mode 100644 ceph/qa/objectstore/bluestore-bitmap.yaml mode change 100644 => 100755 ceph/qa/run_xfstests.sh delete mode 100644 ceph/qa/run_xfstests_krbd.sh create mode 100755 ceph/qa/standalone/mon/osd-pool-df.sh create mode 100644 ceph/qa/suites/fs/basic_functional/tasks/alternate-pool.yaml create mode 120000 ceph/qa/suites/kcephfs/recovery/whitelist_health.yaml create mode 120000 ceph/qa/suites/kcephfs/thrash/thrashosds-health.yaml create mode 120000 ceph/qa/suites/kcephfs/thrash/whitelist_health.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/% create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/0-cluster/+ create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/0-cluster/openstack.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/0-cluster/start.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/1-ceph-install/luminous.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/2-workload/+ create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/2-workload/blogbench.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/2-workload/ec-rados-default.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/2-workload/rados_api.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/2-workload/rados_loadgenbig.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/2-workload/test_rbd_api.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/2-workload/test_rbd_python.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/3-upgrade-sequence/upgrade-all.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/3-upgrade-sequence/upgrade-mon-osd-mds.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/+ create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/blogbench.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/rados-snaps-few-objects.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/rados_loadgenmix.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/rados_mon_thrash.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/rbd_cls.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/rbd_import_export.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/parallel/5-final-workload/rgw_swift.yaml create mode 120000 ceph/qa/suites/upgrade/luminous-x/parallel/distros create mode 120000 ceph/qa/suites/upgrade/luminous-x/parallel/objectstore create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/% create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/0-cluster create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/2-partial-upgrade create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/3-thrash/default.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/4-ec-workload.yaml create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/5-finish-upgrade.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/7-final-workload.yaml create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/distros create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/objectstore create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split-erasure-code/thrashosds-health.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/% create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/0-cluster/+ create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/0-cluster/openstack.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/0-cluster/start.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/1-ceph-install/luminous.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/2-partial-upgrade/firsthalf.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/3-thrash/default.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/4-workload/+ create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/4-workload/radosbench.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/4-workload/rbd-cls.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/4-workload/rbd-import-export.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/4-workload/rbd_api.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/4-workload/readwrite.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/4-workload/snaps-few-objects.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/5-finish-upgrade.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/7-final-workload/+ create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/7-final-workload/rbd-python.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/7-final-workload/rgw-swift.yaml create mode 100644 ceph/qa/suites/upgrade/luminous-x/stress-split/7-final-workload/snaps-many-objects.yaml create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split/distros create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split/objectstore/bluestore.yaml create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split/objectstore/filestore-xfs.yaml create mode 120000 ceph/qa/suites/upgrade/luminous-x/stress-split/thrashosds-health.yaml create mode 100644 ceph/qa/tasks/cephfs/test_recovery_pool.py create mode 100644 ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/test_activate.py create mode 100644 ceph/src/ceph-volume/ceph_volume/util/disk.py create mode 100644 ceph/src/include/alloc_ptr.h diff --git a/ceph/CMakeLists.txt b/ceph/CMakeLists.txt index 17468f255..c358e3e97 100644 --- a/ceph/CMakeLists.txt +++ b/ceph/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 2.8.11) project(ceph) -set(VERSION 12.2.0) +set(VERSION 12.2.1) if(POLICY CMP0046) # Tweak policies (this one disables "missing" dependency warning) diff --git a/ceph/PendingReleaseNotes b/ceph/PendingReleaseNotes index ac1a79f6d..9ca48cdab 100644 --- a/ceph/PendingReleaseNotes +++ b/ceph/PendingReleaseNotes @@ -11,3 +11,19 @@ New commands "pg cancel-force-recovery" and "pg cancel-force-backfill" restore default recovery/backfill priority of previously forced pgs. + +12.2.1 +------ + +* Clusters will need to upgrade to 12.2.1 before upgrading to any + Mimic 13.y.z version (either a development release or an eventual + stable Mimic release). + +- *CephFS*: + + * Limiting MDS cache via a memory limit is now supported using the new + mds_cache_memory_limit config option (1GB by default). A cache reservation + can also be specified using mds_cache_reservation as a percentage of the + limit (5% by default). Limits by inode count are still supported using + mds_cache_size. Setting mds_cache_size to 0 (the default) disables the + inode limit. diff --git a/ceph/alpine/APKBUILD b/ceph/alpine/APKBUILD index ac9156f6d..5fd0a9a24 100644 --- a/ceph/alpine/APKBUILD +++ b/ceph/alpine/APKBUILD @@ -1,7 +1,7 @@ # Contributor: John Coyle # Maintainer: John Coyle pkgname=ceph -pkgver=12.2.0 +pkgver=12.2.1 pkgrel=0 pkgdesc="Ceph is a distributed object store and file system" pkgusers="ceph" @@ -63,7 +63,7 @@ makedepends=" xmlstarlet yasm " -source="ceph-12.2.0.tar.bz2" +source="ceph-12.2.1.tar.bz2" subpackages=" $pkgname-base $pkgname-common @@ -116,7 +116,7 @@ _sysconfdir=/etc _udevrulesdir=/etc/udev/rules.d _python_sitelib=/usr/lib/python2.7/site-packages -builddir=$srcdir/ceph-12.2.0 +builddir=$srcdir/ceph-12.2.1 build() { export CEPH_BUILD_VIRTUALENV=$builddir diff --git a/ceph/ceph.spec b/ceph/ceph.spec index 458191e58..00d09ee21 100644 --- a/ceph/ceph.spec +++ b/ceph/ceph.spec @@ -61,7 +61,7 @@ # main package definition ################################################################################# Name: ceph -Version: 12.2.0 +Version: 12.2.1 Release: 0%{?dist} %if 0%{?fedora} || 0%{?rhel} Epoch: 2 @@ -76,7 +76,7 @@ License: LGPL-2.1 and CC-BY-SA-1.0 and GPL-2.0 and BSL-1.0 and BSD-3-Clause and Group: System/Filesystems %endif URL: http://ceph.com/ -Source0: http://ceph.com/download/ceph-12.2.0.tar.bz2 +Source0: http://ceph.com/download/ceph-12.2.1.tar.bz2 %if 0%{?suse_version} %if 0%{?is_opensuse} ExclusiveArch: x86_64 aarch64 ppc64 ppc64le @@ -341,6 +341,7 @@ Summary: Ceph fuse-based client %if 0%{?suse_version} Group: System/Filesystems %endif +Requires: fuse %description fuse FUSE based client for Ceph distributed network file system @@ -772,7 +773,7 @@ python-rbd, python-rgw or python-cephfs instead. # common ################################################################################# %prep -%autosetup -p1 -n ceph-12.2.0 +%autosetup -p1 -n ceph-12.2.1 %build %if 0%{with cephfs_java} @@ -1528,10 +1529,7 @@ fi %{_libdir}/librbd_tp.so.* %endif -%post -n librbd1 -/sbin/ldconfig -mkdir -p /usr/lib64/qemu/ -ln -sf %{_libdir}/librbd.so.1 /usr/lib64/qemu/librbd.so.1 +%post -n librbd1 -p /sbin/ldconfig %postun -n librbd1 -p /sbin/ldconfig diff --git a/ceph/ceph.spec.in b/ceph/ceph.spec.in index 4749bc717..b45c9feec 100644 --- a/ceph/ceph.spec.in +++ b/ceph/ceph.spec.in @@ -341,6 +341,7 @@ Summary: Ceph fuse-based client %if 0%{?suse_version} Group: System/Filesystems %endif +Requires: fuse %description fuse FUSE based client for Ceph distributed network file system @@ -1528,10 +1529,7 @@ fi %{_libdir}/librbd_tp.so.* %endif -%post -n librbd1 -/sbin/ldconfig -mkdir -p /usr/lib64/qemu/ -ln -sf %{_libdir}/librbd.so.1 /usr/lib64/qemu/librbd.so.1 +%post -n librbd1 -p /sbin/ldconfig %postun -n librbd1 -p /sbin/ldconfig diff --git a/ceph/debian/changelog b/ceph/debian/changelog index 3fef34d2b..f05243917 100644 --- a/ceph/debian/changelog +++ b/ceph/debian/changelog @@ -1,3 +1,9 @@ +ceph (12.2.1-1) stable; urgency=medium + + * New upstream release + + -- Ceph Release Team Tue, 26 Sep 2017 16:27:06 +0000 + ceph (12.2.0-1) stable; urgency=medium * New upstream release diff --git a/ceph/doc/cephfs/health-messages.rst b/ceph/doc/cephfs/health-messages.rst index 54b4f7144..3e68e9371 100644 --- a/ceph/doc/cephfs/health-messages.rst +++ b/ceph/doc/cephfs/health-messages.rst @@ -71,14 +71,14 @@ so at all. This message appears if a client has taken longer than Message: "Client *name* failing to respond to cache pressure" Code: MDS_HEALTH_CLIENT_RECALL, MDS_HEALTH_CLIENT_RECALL_MANY -Description: Clients maintain a metadata cache. Items (such as inodes) -in the client cache are also pinned in the MDS cache, so when the MDS -needs to shrink its cache (to stay within ``mds_cache_size``), it -sends messages to clients to shrink their caches too. If the client -is unresponsive or buggy, this can prevent the MDS from properly staying -within its ``mds_cache_size`` and it may eventually run out of memory -and crash. This message appears if a client has taken more than -``mds_recall_state_timeout`` (default 60s) to comply. +Description: Clients maintain a metadata cache. Items (such as inodes) in the +client cache are also pinned in the MDS cache, so when the MDS needs to shrink +its cache (to stay within ``mds_cache_size`` or ``mds_cache_memory_limit``), it +sends messages to clients to shrink their caches too. If the client is +unresponsive or buggy, this can prevent the MDS from properly staying within +its cache limits and it may eventually run out of memory and crash. This +message appears if a client has taken more than ``mds_recall_state_timeout`` +(default 60s) to comply. Message: "Client *name* failing to advance its oldest client/flush tid" Code: MDS_HEALTH_CLIENT_OLDEST_TID, MDS_HEALTH_CLIENT_OLDEST_TID_MANY @@ -119,9 +119,9 @@ This message appears if any client requests have taken longer than Message: "Too many inodes in cache" Code: MDS_HEALTH_CACHE_OVERSIZED -Description: The MDS is not succeeding in trimming its cache to comply -with the limit set by the administrator. If the MDS cache becomes too large, -the daemon may exhaust available memory and crash. -This message appears if the actual cache size (in inodes) is at least 50% -greater than ``mds_cache_size`` (default 100000). - +Description: The MDS is not succeeding in trimming its cache to comply with the +limit set by the administrator. If the MDS cache becomes too large, the daemon +may exhaust available memory and crash. By default, this message appears if +the actual cache size (in inodes or memory) is at least 50% greater than +``mds_cache_size`` (default 100000) or ``mds_cache_memory_limit`` (default +1GB). Modify ``mds_health_cache_threshold`` to set the warning ratio. diff --git a/ceph/doc/cephfs/mds-config-ref.rst b/ceph/doc/cephfs/mds-config-ref.rst index b3446d698..4f7bea3ef 100644 --- a/ceph/doc/cephfs/mds-config-ref.rst +++ b/ceph/doc/cephfs/mds-config-ref.rst @@ -19,13 +19,30 @@ :Type: 64-bit Integer Unsigned :Default: ``1ULL << 40`` +``mds cache memory limit`` + +:Description: The memory limit the MDS should enforce for its cache. + Administrators should use this instead of ``mds cache size``. +:Type: 64-bit Integer Unsigned +:Default: ``1073741824`` + +``mds cache reservation`` + +:Description: The cache reservation (memory or inodes) for the MDS cache to maintain. + Once the MDS begins dipping into its reservation, it will recall + client state until its cache size shrinks to restore the + reservation. +:Type: Float +:Default: ``0.05`` ``mds cache size`` -:Description: The number of inodes to cache. +:Description: The number of inodes to cache. A value of 0 indicates an + unlimited number. It is recommended to use + ``mds_cache_memory_limit`` to limit the amount of memory the MDS + cache uses. :Type: 32-bit Integer -:Default: ``100000`` - +:Default: ``0`` ``mds cache mid`` diff --git a/ceph/doc/images/esx_iscsi_chap.png b/ceph/doc/images/esx_iscsi_chap.png new file mode 100755 index 0000000000000000000000000000000000000000..4372222dfecf49b5f2c75eb4f665161cc4d2dd72 GIT binary patch literal 19668 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 literal 0 HcmV?d00001 diff --git a/ceph/doc/images/esx_iscsi_disc.png b/ceph/doc/images/esx_iscsi_disc.png new file mode 100755 index 0000000000000000000000000000000000000000..338a1ebab2b5488572487de6bb1aa29b73969552 GIT binary patch literal 16505 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 FzW}Z@0{Q>| literal 0 HcmV?d00001 diff --git a/ceph/doc/images/esx_iscsi_general.png b/ceph/doc/images/esx_iscsi_general.png new file mode 100755 index 0000000000000000000000000000000000000000..75a576494e2fd94e365b305f8147909e7b330542 GIT binary patch literal 9136 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%0AuMY+bk0Z(sRw2?yBPx#rVU* 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Ν!Q4s%+8&Yo_4 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 W>4hMP2!^Am?Z{zkbLKw?G5-btuSYEa literal 0 HcmV?d00001 diff --git a/ceph/doc/images/esx_iscsi_select_mru.png b/ceph/doc/images/esx_iscsi_select_mru.png new file mode 100755 index 0000000000000000000000000000000000000000..c3c9c4717b7e5ab8322120f863fac149c3be4011 GIT binary patch literal 18346 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𝔒h5uk83im!64fy8uVfgY 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 R2~ZZT^Im?QWRGiE{{^I7lW+h4 literal 0 HcmV?d00001 diff --git a/ceph/doc/images/win2016_iscsi_connect_to_target.png b/ceph/doc/images/win2016_iscsi_connect_to_target.png new file mode 100755 index 0000000000000000000000000000000000000000..29d9e1267689cf6300aed175cf1c9da57b423aa9 GIT binary patch literal 6956 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

-
  • None found
  • diff --git a/ceph/src/pybind/mgr/dashboard/health.html b/ceph/src/pybind/mgr/dashboard/health.html index 59dc312d9..48cea82f1 100644 --- a/ceph/src/pybind/mgr/dashboard/health.html +++ b/ceph/src/pybind/mgr/dashboard/health.html @@ -165,7 +165,7 @@ }, options: { center_text: raw_usage_text, - responsive: false, + responsive: true, legend: {display: false}, animation: {duration: 0} } @@ -199,7 +199,7 @@ ] }, options: { - responsive: false, + responsive: true, legend: {display: false}, animation: {duration: 0} } @@ -297,13 +297,15 @@ {df.stats.total_objects | dimless} - - + +
    + +
    - +
    + +
    diff --git a/ceph/src/pybind/mgr/dashboard/module.py b/ceph/src/pybind/mgr/dashboard/module.py index ea1e8a7e8..10b5c37ed 100644 --- a/ceph/src/pybind/mgr/dashboard/module.py +++ b/ceph/src/pybind/mgr/dashboard/module.py @@ -294,7 +294,7 @@ class Module(MgrModule): ) + "/s" metadata = self.get_metadata('mds', info['name']) - mds_versions[metadata['ceph_version']].append(info['name']) + mds_versions[metadata.get('ceph_version', 'unknown')].append(info['name']) rank_table.append( { "rank": rank, @@ -363,7 +363,7 @@ class Module(MgrModule): standby_table = [] for standby in fsmap['standbys']: metadata = self.get_metadata('mds', standby['name']) - mds_versions[metadata['ceph_version']].append(standby['name']) + mds_versions[metadata.get('ceph_version', 'unknown')].append(standby['name']) standby_table.append({ 'name': standby['name'] diff --git a/ceph/src/rgw/rgw_admin.cc b/ceph/src/rgw/rgw_admin.cc index fb820e638..9c0826822 100644 --- a/ceph/src/rgw/rgw_admin.cc +++ b/ceph/src/rgw/rgw_admin.cc @@ -2396,6 +2396,7 @@ int main(int argc, const char **argv) string start_marker; string end_marker; int max_entries = -1; + bool max_entries_specified = false; int admin = false; bool admin_specified = false; int system = false; @@ -2557,6 +2558,7 @@ int main(int argc, const char **argv) max_buckets_specified = true; } else if (ceph_argparse_witharg(args, i, &val, "--max-entries", (char*)NULL)) { max_entries = (int)strict_strtol(val.c_str(), 10, &err); + max_entries_specified = true; if (!err.empty()) { cerr << "ERROR: failed to parse max entries: " << err << std::endl; return EINVAL; @@ -5852,6 +5854,11 @@ next: if (inconsistent_index == false) { RGWBucketAdminOp::remove_bucket(store, bucket_op, bypass_gc, true); } else { + if (!yes_i_really_mean_it) { + cerr << "using --inconsistent_index can corrupt the bucket index " << std::endl + << "do you really mean it? (requires --yes-i-really-mean-it)" << std::endl; + return 1; + } RGWBucketAdminOp::remove_bucket(store, bucket_op, bypass_gc, false); } } @@ -6093,31 +6100,47 @@ next: } void *handle; int max = 1000; - int ret = store->meta_mgr->list_keys_init(metadata_key, &handle); + int ret = store->meta_mgr->list_keys_init(metadata_key, marker, &handle); if (ret < 0) { cerr << "ERROR: can't get key: " << cpp_strerror(-ret) << std::endl; return -ret; } bool truncated; + uint64_t count = 0; + if (max_entries_specified) { + formatter->open_object_section("result"); + } formatter->open_array_section("keys"); + uint64_t left; do { list keys; - ret = store->meta_mgr->list_keys_next(handle, max, keys, &truncated); + left = (max_entries_specified ? max_entries - count : max); + ret = store->meta_mgr->list_keys_next(handle, left, keys, &truncated); if (ret < 0 && ret != -ENOENT) { cerr << "ERROR: lists_keys_next(): " << cpp_strerror(-ret) << std::endl; return -ret; } if (ret != -ENOENT) { for (list::iterator iter = keys.begin(); iter != keys.end(); ++iter) { formatter->dump_string("key", *iter); + ++count; } formatter->flush(cout); } - } while (truncated); + } while (truncated && left > 0); formatter->close_section(); + + if (max_entries_specified) { + encode_json("truncated", truncated, formatter); + encode_json("count", count, formatter); + if (truncated) { + encode_json("marker", store->meta_mgr->get_marker(handle), formatter); + } + formatter->close_section(); + } formatter->flush(cout); store->meta_mgr->list_keys_complete(handle); diff --git a/ceph/src/rgw/rgw_asio_frontend.cc b/ceph/src/rgw/rgw_asio_frontend.cc index 5fc1deec4..ee6be6256 100644 --- a/ceph/src/rgw/rgw_asio_frontend.cc +++ b/ceph/src/rgw/rgw_asio_frontend.cc @@ -111,11 +111,11 @@ static void handle_connection(RGWProcessEnv& env, tcp::socket socket, rgw::asio::ClientIO real_client{socket, parser, buffer}; auto real_client_io = rgw::io::add_reordering( - rgw::io::add_buffering( + rgw::io::add_buffering(cct, rgw::io::add_chunking( rgw::io::add_conlen_controlling( &real_client)))); - RGWRestfulIO client(&real_client_io); + RGWRestfulIO client(cct, &real_client_io); process_request(env.store, env.rest, &req, env.uri_prefix, *env.auth_registry, &client, env.olog); diff --git a/ceph/src/rgw/rgw_bucket.cc b/ceph/src/rgw/rgw_bucket.cc index 41b7d1231..0da6dd587 100644 --- a/ceph/src/rgw/rgw_bucket.cc +++ b/ceph/src/rgw/rgw_bucket.cc @@ -12,6 +12,7 @@ #include "common/errno.h" #include "common/ceph_json.h" +#include "common/backport14.h" #include "rgw_rados.h" #include "rgw_acl.h" #include "rgw_acl_s3.h" @@ -2164,13 +2165,17 @@ public: pool = store->get_zone_params().domain_root; } - int list_keys_init(RGWRados *store, void **phandle) override - { - list_keys_info *info = new list_keys_info; + int list_keys_init(RGWRados *store, const string& marker, void **phandle) override { + auto info = ceph::make_unique(); info->store = store; - *phandle = (void *)info; + int ret = store->list_raw_objects_init(store->get_zone_params().domain_root, marker, + &info->ctx); + if (ret < 0) { + return ret; + } + *phandle = (void *)info.release(); return 0; } @@ -2186,8 +2191,8 @@ public: list unfiltered_keys; - int ret = store->list_raw_objects(store->get_zone_params().domain_root, no_filter, - max, info->ctx, unfiltered_keys, truncated); + int ret = store->list_raw_objects_next(no_filter, max, info->ctx, + unfiltered_keys, truncated); if (ret < 0 && ret != -ENOENT) return ret; if (ret == -ENOENT) { @@ -2213,6 +2218,11 @@ public: list_keys_info *info = static_cast(handle); delete info; } + + string get_marker(void *handle) { + list_keys_info *info = static_cast(handle); + return info->store->list_raw_objs_get_cursor(info->ctx); + } }; class RGWBucketInstanceMetadataHandler : public RGWMetadataHandler { @@ -2354,13 +2364,17 @@ public: pool = store->get_zone_params().domain_root; } - int list_keys_init(RGWRados *store, void **phandle) override - { - list_keys_info *info = new list_keys_info; + int list_keys_init(RGWRados *store, const string& marker, void **phandle) override { + auto info = ceph::make_unique(); info->store = store; - *phandle = (void *)info; + int ret = store->list_raw_objects_init(store->get_zone_params().domain_root, marker, + &info->ctx); + if (ret < 0) { + return ret; + } + *phandle = (void *)info.release(); return 0; } @@ -2376,8 +2390,8 @@ public: list unfiltered_keys; - int ret = store->list_raw_objects(store->get_zone_params().domain_root, no_filter, - max, info->ctx, unfiltered_keys, truncated); + int ret = store->list_raw_objects_next(no_filter, max, info->ctx, + unfiltered_keys, truncated); if (ret < 0 && ret != -ENOENT) return ret; if (ret == -ENOENT) { @@ -2407,6 +2421,11 @@ public: delete info; } + string get_marker(void *handle) { + list_keys_info *info = static_cast(handle); + return info->store->list_raw_objs_get_cursor(info->ctx); + } + /* * hash entry for mdlog placement. Use the same hash key we'd have for the bucket entry * point, so that the log entries end up at the same log shard, so that we process them diff --git a/ceph/src/rgw/rgw_civetweb_frontend.cc b/ceph/src/rgw/rgw_civetweb_frontend.cc index 4b1fd766c..8cf7a20b0 100644 --- a/ceph/src/rgw/rgw_civetweb_frontend.cc +++ b/ceph/src/rgw/rgw_civetweb_frontend.cc @@ -24,11 +24,11 @@ int RGWCivetWebFrontend::process(struct mg_connection* const conn) RGWCivetWeb cw_client(conn); auto real_client_io = rgw::io::add_reordering( - rgw::io::add_buffering( + rgw::io::add_buffering(dout_context, rgw::io::add_chunking( rgw::io::add_conlen_controlling( &cw_client)))); - RGWRestfulIO client_io(&real_client_io); + RGWRestfulIO client_io(dout_context, &real_client_io); RGWRequest req(env.store->get_new_req_id()); int ret = process_request(env.store, env.rest, &req, env.uri_prefix, diff --git a/ceph/src/rgw/rgw_client_io.h b/ceph/src/rgw/rgw_client_io.h index d06eaea3c..8579b2383 100644 --- a/ceph/src/rgw/rgw_client_io.h +++ b/ceph/src/rgw/rgw_client_io.h @@ -339,8 +339,8 @@ class RGWRestfulIO : public rgw::io::AccountingFilter { public: ~RGWRestfulIO() override = default; - RGWRestfulIO(rgw::io::RestfulClient* engine) - : AccountingFilter(std::move(engine)) { + RGWRestfulIO(CephContext *_cx, rgw::io::RestfulClient* engine) + : AccountingFilter(_cx, std::move(engine)) { } void add_filter(std::shared_ptr new_filter) { diff --git a/ceph/src/rgw/rgw_client_io_filters.h b/ceph/src/rgw/rgw_client_io_filters.h index 0862f33d3..04761fc78 100644 --- a/ceph/src/rgw/rgw_client_io_filters.h +++ b/ceph/src/rgw/rgw_client_io_filters.h @@ -20,20 +20,24 @@ class AccountingFilter : public DecoratedRestfulClient, bool enabled; uint64_t total_sent; uint64_t total_received; + CephContext *cct; public: template - AccountingFilter(U&& decoratee) + AccountingFilter(CephContext *cct, U&& decoratee) : DecoratedRestfulClient(std::forward(decoratee)), enabled(false), total_sent(0), - total_received(0) { + total_received(0), cct(cct) { } size_t send_status(const int status, const char* const status_name) override { const auto sent = DecoratedRestfulClient::send_status(status, status_name); + lsubdout(cct, rgw, 30) << "AccountingFilter::send_status: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; if (enabled) { total_sent += sent; } @@ -42,6 +46,9 @@ public: size_t send_100_continue() override { const auto sent = DecoratedRestfulClient::send_100_continue(); + lsubdout(cct, rgw, 30) << "AccountingFilter::send_100_continue: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; if (enabled) { total_sent += sent; } @@ -51,6 +58,9 @@ public: size_t send_header(const boost::string_ref& name, const boost::string_ref& value) override { const auto sent = DecoratedRestfulClient::send_header(name, value); + lsubdout(cct, rgw, 30) << "AccountingFilter::send_header: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; if (enabled) { total_sent += sent; } @@ -59,6 +69,9 @@ public: size_t send_content_length(const uint64_t len) override { const auto sent = DecoratedRestfulClient::send_content_length(len); + lsubdout(cct, rgw, 30) << "AccountingFilter::send_content_length: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; if (enabled) { total_sent += sent; } @@ -67,6 +80,9 @@ public: size_t send_chunked_transfer_encoding() override { const auto sent = DecoratedRestfulClient::send_chunked_transfer_encoding(); + lsubdout(cct, rgw, 30) << "AccountingFilter::send_chunked_transfer_encoding: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; if (enabled) { total_sent += sent; } @@ -75,6 +91,9 @@ public: size_t complete_header() override { const auto sent = DecoratedRestfulClient::complete_header(); + lsubdout(cct, rgw, 30) << "AccountingFilter::complete_header: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; if (enabled) { total_sent += sent; } @@ -83,6 +102,8 @@ public: size_t recv_body(char* buf, size_t max) override { const auto received = DecoratedRestfulClient::recv_body(buf, max); + lsubdout(cct, rgw, 30) << "AccountingFilter::recv_body: e=" + << (enabled ? "1" : "0") << ", received=" << received << dendl; if (enabled) { total_received += received; } @@ -92,6 +113,20 @@ public: size_t send_body(const char* const buf, const size_t len) override { const auto sent = DecoratedRestfulClient::send_body(buf, len); + lsubdout(cct, rgw, 30) << "AccountingFilter::send_body: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; + if (enabled) { + total_sent += sent; + } + return sent; + } + + size_t complete_request() override { + const auto sent = DecoratedRestfulClient::complete_request(); + lsubdout(cct, rgw, 30) << "AccountingFilter::complete_request: e=" + << (enabled ? "1" : "0") << ", sent=" << sent << ", total=" + << total_sent << dendl; if (enabled) { total_sent += sent; } @@ -108,6 +143,8 @@ public: void set_account(bool enabled) override { this->enabled = enabled; + lsubdout(cct, rgw, 30) << "AccountingFilter::set_account: e=" + << (enabled ? "1" : "0") << dendl; } }; @@ -122,13 +159,14 @@ protected: bool has_content_length; bool buffer_data; + CephContext *cct; public: template - BufferingFilter(U&& decoratee) + BufferingFilter(CephContext *cct, U&& decoratee) : DecoratedRestfulClient(std::forward(decoratee)), has_content_length(false), - buffer_data(false) { + buffer_data(false), cct(cct) { } size_t send_content_length(const uint64_t len) override; @@ -144,6 +182,9 @@ size_t BufferingFilter::send_body(const char* const buf, { if (buffer_data) { data.append(buf, len); + + lsubdout(cct, rgw, 30) << "BufferingFilter::send_body: defer count = " + << len << dendl; return 0; } @@ -170,6 +211,8 @@ size_t BufferingFilter::complete_header() if (! has_content_length) { /* We will dump everything in complete_request(). */ buffer_data = true; + lsubdout(cct, rgw, 30) << "BufferingFilter::complete_header: has_content_length=" + << (has_content_length ? "1" : "0") << dendl; return 0; } @@ -182,8 +225,16 @@ size_t BufferingFilter::complete_request() size_t sent = 0; if (! has_content_length) { + /* It is not correct to count these bytes here, + * because they can only be part of the header. + * Therefore force count to 0. + */ sent += DecoratedRestfulClient::send_content_length(data.length()); sent += DecoratedRestfulClient::complete_header(); + lsubdout(cct, rgw, 30) << + "BufferingFilter::complete_request: !has_content_length: IGNORE: sent=" + << sent << dendl; + sent = 0; } if (buffer_data) { @@ -195,14 +246,18 @@ size_t BufferingFilter::complete_request() } data.clear(); buffer_data = false; + lsubdout(cct, rgw, 30) << "BufferingFilter::complete_request: buffer_data: sent=" + << sent << dendl; } return sent + DecoratedRestfulClient::complete_request(); } template static inline -BufferingFilter add_buffering(T&& t) { - return BufferingFilter(std::forward(t)); +BufferingFilter add_buffering( +CephContext *cct, +T&& t) { + return BufferingFilter(cct, std::forward(t)); } diff --git a/ceph/src/rgw/rgw_common.h b/ceph/src/rgw/rgw_common.h index 4fb476859..8d299cf39 100644 --- a/ceph/src/rgw/rgw_common.h +++ b/ceph/src/rgw/rgw_common.h @@ -67,6 +67,7 @@ using ceph::crypto::MD5; #define RGW_ATTR_EXPIRES RGW_ATTR_PREFIX "expires" #define RGW_ATTR_DELETE_AT RGW_ATTR_PREFIX "delete_at" #define RGW_ATTR_ID_TAG RGW_ATTR_PREFIX "idtag" +#define RGW_ATTR_TAIL_TAG RGW_ATTR_PREFIX "tail_tag" #define RGW_ATTR_SHADOW_OBJ RGW_ATTR_PREFIX "shadow_name" #define RGW_ATTR_MANIFEST RGW_ATTR_PREFIX "manifest" #define RGW_ATTR_USER_MANIFEST RGW_ATTR_PREFIX "user_manifest" diff --git a/ceph/src/rgw/rgw_crypt.cc b/ceph/src/rgw/rgw_crypt.cc index 88abd3b83..4d5b00ff6 100644 --- a/ceph/src/rgw/rgw_crypt.cc +++ b/ceph/src/rgw/rgw_crypt.cc @@ -1155,6 +1155,12 @@ int rgw_s3_prepare_decrypt(struct req_state* s, int res = 0; std::string stored_mode = get_str_attribute(attrs, RGW_ATTR_CRYPT_MODE); ldout(s->cct, 15) << "Encryption mode: " << stored_mode << dendl; + + const char *req_sse = s->info.env->get("HTTP_X_AMZ_SERVER_SIDE_ENCRYPTION", NULL); + if (nullptr != req_sse && (s->op == OP_GET || s->op == OP_HEAD)) { + return -ERR_INVALID_REQUEST; + } + if (stored_mode == "SSE-C-AES256") { if (s->cct->_conf->rgw_crypt_require_ssl && !s->info.env->exists("SERVER_PORT_SECURE")) { diff --git a/ceph/src/rgw/rgw_data_sync.cc b/ceph/src/rgw/rgw_data_sync.cc index 5d070e5a4..8fe6497f2 100644 --- a/ceph/src/rgw/rgw_data_sync.cc +++ b/ceph/src/rgw/rgw_data_sync.cc @@ -1020,6 +1020,12 @@ public: #define BUCKET_SHARD_SYNC_SPAWN_WINDOW 20 #define DATA_SYNC_MAX_ERR_ENTRIES 10 +enum RemoteDatalogStatus { + RemoteNotTrimmed = 0, + RemoteTrimmed = 1, + RemoteMightTrimmed = 2 +}; + class RGWDataSyncShardCR : public RGWCoroutine { RGWDataSyncEnv *sync_env; @@ -1042,6 +1048,7 @@ class RGWDataSyncShardCR : public RGWCoroutine { RGWDataChangesLogInfo shard_info; string datalog_marker; + RemoteDatalogStatus remote_trimmed; Mutex inc_lock; Cond inc_cond; @@ -1089,7 +1096,7 @@ public: pool(_pool), shard_id(_shard_id), sync_marker(_marker), - marker_tracker(NULL), truncated(false), inc_lock("RGWDataSyncShardCR::inc_lock"), + marker_tracker(NULL), truncated(false), remote_trimmed(RemoteNotTrimmed), inc_lock("RGWDataSyncShardCR::inc_lock"), total_entries(0), spawn_window(BUCKET_SHARD_SYNC_SPAWN_WINDOW), reset_backoff(NULL), lease_cr(nullptr), lease_stack(nullptr), error_repo(nullptr), max_error_entries(DATA_SYNC_MAX_ERR_ENTRIES), retry_backoff_secs(RETRY_BACKOFF_SECS_DEFAULT) { @@ -1294,10 +1301,13 @@ public: return set_cr_error(retcode); } datalog_marker = shard_info.marker; + remote_trimmed = RemoteNotTrimmed; #define INCREMENTAL_MAX_ENTRIES 100 ldout(sync_env->cct, 20) << __func__ << ":" << __LINE__ << ": shard_id=" << shard_id << " datalog_marker=" << datalog_marker << " sync_marker.marker=" << sync_marker.marker << dendl; if (datalog_marker > sync_marker.marker) { spawned_keys.clear(); + if (sync_marker.marker.empty()) + remote_trimmed = RemoteMightTrimmed; //remote data log shard might be trimmed; yield call(new RGWReadRemoteDataLogShardCR(sync_env, shard_id, &sync_marker.marker, &log_entries, &truncated)); if (retcode < 0) { ldout(sync_env->cct, 0) << "ERROR: failed to read remote data log info: ret=" << retcode << dendl; @@ -1305,6 +1315,10 @@ public: drain_all(); return set_cr_error(retcode); } + if ((remote_trimmed == RemoteMightTrimmed) && sync_marker.marker.empty() && log_entries.empty()) + remote_trimmed = RemoteTrimmed; + else + remote_trimmed = RemoteNotTrimmed; for (log_iter = log_entries.begin(); log_iter != log_entries.end(); ++log_iter) { ldout(sync_env->cct, 20) << __func__ << ":" << __LINE__ << ": shard_id=" << shard_id << " log_entry: " << log_iter->log_id << ":" << log_iter->log_timestamp << ":" << log_iter->entry.key << dendl; if (!marker_tracker->index_key_to_marker(log_iter->entry.key, log_iter->log_id)) { @@ -1343,7 +1357,7 @@ public: } } ldout(sync_env->cct, 20) << __func__ << ":" << __LINE__ << ": shard_id=" << shard_id << " datalog_marker=" << datalog_marker << " sync_marker.marker=" << sync_marker.marker << dendl; - if (datalog_marker == sync_marker.marker) { + if (datalog_marker == sync_marker.marker || remote_trimmed == RemoteTrimmed) { #define INCREMENTAL_INTERVAL 20 yield wait(utime_t(INCREMENTAL_INTERVAL, 0)); } diff --git a/ceph/src/rgw/rgw_fcgi_process.cc b/ceph/src/rgw/rgw_fcgi_process.cc index 332cde297..3d6eac2b5 100644 --- a/ceph/src/rgw/rgw_fcgi_process.cc +++ b/ceph/src/rgw/rgw_fcgi_process.cc @@ -118,10 +118,10 @@ void RGWFCGXProcess::handle_request(RGWRequest* r) RGWFCGX fcgxfe(req->fcgx); auto real_client_io = rgw::io::add_reordering( - rgw::io::add_buffering( + rgw::io::add_buffering(cct, rgw::io::add_chunking( &fcgxfe))); - RGWRestfulIO client_io(&real_client_io); + RGWRestfulIO client_io(cct, &real_client_io); int ret = process_request(store, rest, req, uri_prefix, diff --git a/ceph/src/rgw/rgw_formats.h b/ceph/src/rgw/rgw_formats.h index 6c7d00628..a50965873 100644 --- a/ceph/src/rgw/rgw_formats.h +++ b/ceph/src/rgw/rgw_formats.h @@ -29,6 +29,7 @@ public: void set_status(int status, const char* status_name) override {}; void output_header() override {}; void output_footer() override {}; + void enable_line_break() override {}; void flush(ostream& os) override; void reset() override; diff --git a/ceph/src/rgw/rgw_lc.cc b/ceph/src/rgw/rgw_lc.cc index 2990bff1e..cad0304e3 100644 --- a/ceph/src/rgw/rgw_lc.cc +++ b/ceph/src/rgw/rgw_lc.cc @@ -67,7 +67,14 @@ bool RGWLifecycleConfiguration::_add_rule(LCRule *rule) op.mp_expiration = rule->get_mp_expiration().get_days(); } op.dm_expiration = rule->get_dm_expiration(); - auto ret = prefix_map.insert(pair(rule->get_prefix(), op)); + + std::string prefix; + if (rule->get_filter().has_prefix()){ + prefix = rule->get_filter().get_prefix(); + } else { + prefix = rule->get_prefix(); + } + auto ret = prefix_map.emplace(std::move(prefix), std::move(op)); return ret.second; } diff --git a/ceph/src/rgw/rgw_lc.h b/ceph/src/rgw/rgw_lc.h index dd6a1a7f0..0a655c5c3 100644 --- a/ceph/src/rgw/rgw_lc.h +++ b/ceph/src/rgw/rgw_lc.h @@ -91,6 +91,47 @@ public: }; WRITE_CLASS_ENCODER(LCExpiration) +class LCFilter +{ + protected: + std::string prefix; + // TODO add support for tagging + public: + const std::string& get_prefix() const{ + return prefix; + } + + void set_prefix(const string& _prefix){ + prefix = _prefix; + } + + void set_prefix(std::string&& _prefix){ + prefix = std::move(_prefix); + } + + bool empty() const { + return prefix.empty(); + } + + bool has_prefix() const { + return !prefix.empty(); + } + + void encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + ::encode(prefix, bl); + ENCODE_FINISH(bl); + } + void decode(bufferlist::iterator& bl) { + DECODE_START(1, bl); + ::decode(prefix, bl); + DECODE_FINISH(bl); + } +}; +WRITE_CLASS_ENCODER(LCFilter); + + + class LCRule { protected: @@ -100,6 +141,7 @@ protected: LCExpiration expiration; LCExpiration noncur_expiration; LCExpiration mp_expiration; + LCFilter filter; bool dm_expiration = false; public: @@ -115,11 +157,15 @@ public: string& get_status() { return status; } - + string& get_prefix() { return prefix; } + LCFilter& get_filter() { + return filter; + } + LCExpiration& get_expiration() { return expiration; } @@ -167,7 +213,7 @@ public: bool valid(); void encode(bufferlist& bl) const { - ENCODE_START(4, 1, bl); + ENCODE_START(5, 1, bl); ::encode(id, bl); ::encode(prefix, bl); ::encode(status, bl); @@ -175,10 +221,11 @@ public: ::encode(noncur_expiration, bl); ::encode(mp_expiration, bl); ::encode(dm_expiration, bl); + ::encode(filter, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { - DECODE_START_LEGACY_COMPAT_LEN(4, 1, 1, bl); + DECODE_START_LEGACY_COMPAT_LEN(5, 1, 1, bl); ::decode(id, bl); ::decode(prefix, bl); ::decode(status, bl); @@ -192,6 +239,9 @@ public: if (struct_v >= 4) { ::decode(dm_expiration, bl); } + if (struct_v >= 5) { + ::decode(filter, bl); + } DECODE_FINISH(bl); } diff --git a/ceph/src/rgw/rgw_lc_s3.cc b/ceph/src/rgw/rgw_lc_s3.cc index ea64847a0..b03c4c32b 100644 --- a/ceph/src/rgw/rgw_lc_s3.cc +++ b/ceph/src/rgw/rgw_lc_s3.cc @@ -80,15 +80,41 @@ bool LCRule_S3::xml_end(const char *el) { status.clear(); dm_expiration = false; + // S3 generates a 48 bit random ID, maybe we could generate shorter IDs + static constexpr auto LC_ID_LENGTH = 48; + lc_id = static_cast(find_first("ID")); - if (!lc_id) - return false; - id = lc_id->get_data(); + if (lc_id){ + id = lc_id->get_data(); + } else { + gen_rand_alphanumeric_lower(nullptr, &id, LC_ID_LENGTH); + } + + + XMLObj *obj = find_first("Filter"); + + if (obj){ + string _prefix; + RGWXMLDecoder::decode_xml("Prefix", _prefix, obj); + filter.set_prefix(std::move(_prefix)); + } else { + // Ideally the following code should be deprecated and we should return + // False here, The new S3 LC configuration xml spec. makes Filter mandatory + // and Prefix optional. However older clients including boto2 still generate + // xml according to the older spec, where Prefix existed outside of Filter + // and S3 itself seems to be sloppy on enforcing the mandatory Filter + // argument. A day will come when S3 enforces their own xml-spec, but it is + // not this day + + lc_prefix = static_cast(find_first("Prefix")); + + if (!lc_prefix){ + return false; + } + + prefix = lc_prefix->get_data(); + } - lc_prefix = static_cast(find_first("Prefix")); - if (!lc_prefix) - return false; - prefix = lc_prefix->get_data(); lc_status = static_cast(find_first("Status")); if (!lc_status) @@ -126,7 +152,12 @@ bool LCRule_S3::xml_end(const char *el) { void LCRule_S3::to_xml(CephContext *cct, ostream& out) { out << "" ; out << "" << id << ""; - out << "" << prefix << ""; + if (!filter.empty()) { + LCFilter_S3& lc_filter = static_cast(filter); + lc_filter.to_xml(out); + } else { + out << "" << prefix << ""; + } out << "" << status << ""; if (!expiration.empty() || dm_expiration) { LCExpiration_S3 expir(expiration.get_days_str(), expiration.get_date(), dm_expiration); diff --git a/ceph/src/rgw/rgw_lc_s3.h b/ceph/src/rgw/rgw_lc_s3.h index ed1af0c00..7ff1bf71b 100644 --- a/ceph/src/rgw/rgw_lc_s3.h +++ b/ceph/src/rgw/rgw_lc_s3.h @@ -26,6 +26,25 @@ public: string& to_str() { return data; } }; +class LCFilter_S3 : public LCFilter, public XMLObj +{ + public: + ~LCFilter_S3() override {} + string& to_str() { return data; } + void to_xml(ostream& out){ + out << ""; + if (!prefix.empty()) + out << "" << prefix << ""; + out << ""; + } + void dump_xml(Formatter *f) const { + f->open_object_section("Filter"); + if (!prefix.empty()) + encode_xml("Prefix", prefix, f); + f->close_section(); // Filter + } +}; + class LCStatus_S3 : public XMLObj { public: @@ -150,7 +169,13 @@ public: void dump_xml(Formatter *f) const { f->open_object_section("Rule"); encode_xml("ID", id, f); - encode_xml("Prefix", prefix, f); + // In case of an empty filter and an empty Prefix, we defer to Prefix. + if (!filter.empty()) { + const LCFilter_S3& lc_filter = static_cast(filter); + lc_filter.dump_xml(f); + } else { + encode_xml("Prefix", prefix, f); + } encode_xml("Status", status, f); if (!expiration.empty() || dm_expiration) { LCExpiration_S3 expir(expiration.get_days_str(), expiration.get_date(), dm_expiration); @@ -164,6 +189,7 @@ public: const LCMPExpiration_S3& mp_expir = static_cast(mp_expiration); mp_expir.dump_xml(f); } + f->close_section(); // Rule } }; diff --git a/ceph/src/rgw/rgw_loadgen_process.cc b/ceph/src/rgw/rgw_loadgen_process.cc index fef37f805..13a344e3b 100644 --- a/ceph/src/rgw/rgw_loadgen_process.cc +++ b/ceph/src/rgw/rgw_loadgen_process.cc @@ -131,7 +131,7 @@ void RGWLoadGenProcess::handle_request(RGWRequest* r) env.sign(access_key); RGWLoadGenIO real_client_io(&env); - RGWRestfulIO client_io(&real_client_io); + RGWRestfulIO client_io(cct, &real_client_io); int ret = process_request(store, rest, req, uri_prefix, *auth_registry, &client_io, olog); diff --git a/ceph/src/rgw/rgw_log.cc b/ceph/src/rgw/rgw_log.cc index 7bceab0aa..588aa0a26 100644 --- a/ceph/src/rgw/rgw_log.cc +++ b/ceph/src/rgw/rgw_log.cc @@ -221,6 +221,11 @@ static void log_usage(struct req_state *s, const string& op_name) if (!s->is_err()) data.successful_ops = 1; + ldout(s->cct, 30) << "log_usage: bucket_name=" << bucket_name + << " tenant=" << s->bucket_tenant + << ", bytes_sent=" << bytes_sent << ", bytes_received=" + << bytes_received << ", success=" << data.successful_ops << dendl; + entry.add(op_name, data); utime_t ts = ceph_clock_now(); diff --git a/ceph/src/rgw/rgw_metadata.cc b/ceph/src/rgw/rgw_metadata.cc index f81c4490a..6c554810e 100644 --- a/ceph/src/rgw/rgw_metadata.cc +++ b/ceph/src/rgw/rgw_metadata.cc @@ -273,8 +273,8 @@ obj_version& RGWMetadataObject::get_version() class RGWMetadataTopHandler : public RGWMetadataHandler { struct iter_data { - list sections; - list::iterator iter; + set sections; + set::iterator iter; }; public: @@ -290,10 +290,14 @@ public: int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) override { return -ENOTSUP; } - int list_keys_init(RGWRados *store, void **phandle) override { + int list_keys_init(RGWRados *store, const string& marker, void **phandle) override { iter_data *data = new iter_data; - store->meta_mgr->get_sections(data->sections); - data->iter = data->sections.begin(); + list sections; + store->meta_mgr->get_sections(sections); + for (auto& s : sections) { + data->sections.insert(s); + } + data->iter = data->sections.lower_bound(marker); *phandle = data; @@ -314,6 +318,16 @@ public: delete data; } + + virtual string get_marker(void *handle) { + iter_data *data = static_cast(handle); + + if (data->iter != data->sections.end()) { + return *(data->iter); + } + + return string(); + } }; static RGWMetadataTopHandler md_top_handler; @@ -830,8 +844,12 @@ struct list_keys_handle { RGWMetadataHandler *handler; }; - int RGWMetadataManager::list_keys_init(string& section, void **handle) +{ + return list_keys_init(section, string(), handle); +} + +int RGWMetadataManager::list_keys_init(string& section, const string& marker, void **handle) { string entry; RGWMetadataHandler *handler; @@ -845,7 +863,7 @@ int RGWMetadataManager::list_keys_init(string& section, void **handle) list_keys_handle *h = new list_keys_handle; h->handler = handler; - ret = handler->list_keys_init(store, &h->handle); + ret = handler->list_keys_init(store, marker, &h->handle); if (ret < 0) { delete h; return ret; @@ -865,7 +883,6 @@ int RGWMetadataManager::list_keys_next(void *handle, int max, list& keys return handler->list_keys_next(h->handle, max, keys, truncated); } - void RGWMetadataManager::list_keys_complete(void *handle) { list_keys_handle *h = static_cast(handle); @@ -876,6 +893,13 @@ void RGWMetadataManager::list_keys_complete(void *handle) delete h; } +string RGWMetadataManager::get_marker(void *handle) +{ + list_keys_handle *h = static_cast(handle); + + return h->handler->get_marker(h->handle); +} + void RGWMetadataManager::dump_log_entry(cls_log_entry& entry, Formatter *f) { f->open_object_section("entry"); diff --git a/ceph/src/rgw/rgw_metadata.h b/ceph/src/rgw/rgw_metadata.h index 4d077e8f8..f6dc2db03 100644 --- a/ceph/src/rgw/rgw_metadata.h +++ b/ceph/src/rgw/rgw_metadata.h @@ -79,10 +79,12 @@ public: real_time mtime, JSONObj *obj, sync_type_t type) = 0; virtual int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) = 0; - virtual int list_keys_init(RGWRados *store, void **phandle) = 0; + virtual int list_keys_init(RGWRados *store, const string& marker, void **phandle) = 0; virtual int list_keys_next(void *handle, int max, list& keys, bool *truncated) = 0; virtual void list_keys_complete(void *handle) = 0; + virtual string get_marker(void *handle) = 0; + /* key to use for hashing entries for log shard placement */ virtual void get_hash_key(const string& section, const string& key, string& hash_key) { hash_key = section + ":" + key; @@ -352,9 +354,12 @@ public: int remove(string& metadata_key); int list_keys_init(string& section, void **phandle); + int list_keys_init(string& section, const string& marker, void **phandle); int list_keys_next(void *handle, int max, list& keys, bool *truncated); void list_keys_complete(void *handle); + string get_marker(void *handle); + void dump_log_entry(cls_log_entry& entry, Formatter *f); void get_sections(list& sections); diff --git a/ceph/src/rgw/rgw_op.cc b/ceph/src/rgw/rgw_op.cc index c59c53766..ac6f7b700 100644 --- a/ceph/src/rgw/rgw_op.cc +++ b/ceph/src/rgw/rgw_op.cc @@ -3017,6 +3017,7 @@ int RGWPutObjProcessor_Multipart::do_complete(size_t accounted_size, head_obj_op.meta.owner = s->owner.get_id(); head_obj_op.meta.delete_at = delete_at; head_obj_op.meta.zones_trace = zones_trace; + head_obj_op.meta.modify_tail = true; int r = head_obj_op.write_meta(obj_len, accounted_size, attrs); if (r < 0) @@ -5450,6 +5451,7 @@ void RGWCompleteMultipart::execute() obj_op.meta.ptag = &s->req_id; /* use req_id as operation tag */ obj_op.meta.owner = s->owner.get_id(); obj_op.meta.flags = PUT_OBJ_CREATE; + obj_op.meta.modify_tail = true; op_ret = obj_op.write_meta(ofs, accounted_size, attrs); if (op_ret < 0) return; diff --git a/ceph/src/rgw/rgw_op.h b/ceph/src/rgw/rgw_op.h index d3a63aee7..d9ce2b400 100644 --- a/ceph/src/rgw/rgw_op.h +++ b/ceph/src/rgw/rgw_op.h @@ -203,6 +203,7 @@ protected: bool partial_content; bool range_parsed; bool skip_manifest; + bool skip_decrypt{false}; rgw_obj obj; utime_t gc_invalidate_time; bool is_slo; diff --git a/ceph/src/rgw/rgw_quota.cc b/ceph/src/rgw/rgw_quota.cc index 8e050a059..d94dc0ca4 100644 --- a/ceph/src/rgw/rgw_quota.cc +++ b/ceph/src/rgw/rgw_quota.cc @@ -241,19 +241,19 @@ public: const uint64_t rounded_added = rgw_rounded_objsize(added_bytes); const uint64_t rounded_removed = rgw_rounded_objsize(removed_bytes); - if ((entry->stats.size + added_bytes - removed_bytes) >= 0) { + if (((int64_t)(entry->stats.size + added_bytes - removed_bytes)) >= 0) { entry->stats.size += added_bytes - removed_bytes; } else { entry->stats.size = 0; } - if ((entry->stats.size_rounded + rounded_added - rounded_removed) >= 0) { + if (((int64_t)(entry->stats.size_rounded + rounded_added - rounded_removed)) >= 0) { entry->stats.size_rounded += rounded_added - rounded_removed; } else { entry->stats.size_rounded = 0; } - if ((entry->stats.num_objects + objs_delta) >= 0) { + if (((int64_t)(entry->stats.num_objects + objs_delta)) >= 0) { entry->stats.num_objects += objs_delta; } else { entry->stats.num_objects = 0; diff --git a/ceph/src/rgw/rgw_rados.cc b/ceph/src/rgw/rgw_rados.cc index 7a1fce857..9df547a19 100644 --- a/ceph/src/rgw/rgw_rados.cc +++ b/ceph/src/rgw/rgw_rados.cc @@ -2780,6 +2780,7 @@ int RGWPutObjProcessor_Atomic::do_complete(size_t accounted_size, const string& obj_op.meta.delete_at = delete_at; obj_op.meta.user_data = user_data; obj_op.meta.zones_trace = zones_trace; + obj_op.meta.modify_tail = true; r = obj_op.write_meta(obj_len, accounted_size, attrs); if (r < 0) { @@ -6823,7 +6824,8 @@ int RGWRados::swift_versioning_restore(RGWObjectCtx& obj_ctx, * Returns: 0 on success, -ERR# otherwise. */ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_size, - map& attrs, bool assume_noent, + map& attrs, + bool assume_noent, bool modify_tail, void *_index_op) { RGWRados::Bucket::UpdateIndex *index_op = static_cast(_index_op); @@ -6856,7 +6858,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si if (!ptag && !index_op->get_optag()->empty()) { ptag = index_op->get_optag(); } - r = target->prepare_atomic_modification(op, reset_obj, ptag, meta.if_match, meta.if_nomatch, false); + r = target->prepare_atomic_modification(op, reset_obj, ptag, meta.if_match, meta.if_nomatch, false, modify_tail); if (r < 0) return r; @@ -7072,13 +7074,13 @@ int RGWRados::Object::Write::write_meta(uint64_t size, uint64_t accounted_size, bool assume_noent = (meta.if_match == NULL && meta.if_nomatch == NULL); int r; if (assume_noent) { - r = _do_write_meta(size, accounted_size, attrs, assume_noent, (void *)&index_op); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op); if (r == -EEXIST) { assume_noent = false; } } if (!assume_noent) { - r = _do_write_meta(size, accounted_size, attrs, assume_noent, (void *)&index_op); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op); } return r; } @@ -7391,6 +7393,12 @@ static void set_copy_attrs(map& src_attrs, if (!attrs[RGW_ATTR_ETAG].length()) { attrs[RGW_ATTR_ETAG] = src_attrs[RGW_ATTR_ETAG]; } + if (!attrs[RGW_ATTR_TAIL_TAG].length()) { + auto ttiter = src_attrs.find(RGW_ATTR_TAIL_TAG); + if (ttiter != src_attrs.end()) { + attrs[RGW_ATTR_TAIL_TAG] = src_attrs[RGW_ATTR_TAIL_TAG]; + } + } break; case RGWRados::ATTRSMOD_MERGE: for (map::iterator it = src_attrs.begin(); it != src_attrs.end(); ++it) { @@ -7422,6 +7430,7 @@ int RGWRados::rewrite_obj(RGWBucketInfo& dest_bucket_info, rgw_obj& obj) return ret; attrset.erase(RGW_ATTR_ID_TAG); + attrset.erase(RGW_ATTR_TAIL_TAG); uint64_t max_chunk_size; @@ -7579,10 +7588,15 @@ int RGWRados::stat_remote_obj(RGWObjectCtx& obj_ctx, obj_time_weight dest_mtime_weight; + constexpr bool prepend_meta = true; + constexpr bool get_op = true; + constexpr bool rgwx_stat = true; + constexpr bool sync_manifest = true; + constexpr bool skip_decrypt = true; int ret = conn->get_obj(user_id, info, src_obj, pmod, unmod_ptr, dest_mtime_weight.zone_short_id, dest_mtime_weight.pg_ver, - true /* prepend_meta */, true /* GET */, true /* rgwx-stat */, - true /* sync manifest */, &cb, &in_stream_req); + prepend_meta, get_op, rgwx_stat, + sync_manifest, skip_decrypt, &cb, &in_stream_req); if (ret < 0) { return ret; } @@ -7750,10 +7764,15 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, } } + static constexpr bool prepend_meta = true; + static constexpr bool get_op = true; + static constexpr bool rgwx_stat = false; + static constexpr bool sync_manifest = true; + static constexpr bool skip_decrypt = true; ret = conn->get_obj(user_id, info, src_obj, pmod, unmod_ptr, dest_mtime_weight.zone_short_id, dest_mtime_weight.pg_ver, - true /* prepend_meta */, true /* GET */, false /* rgwx-stat */, - true /* sync manifest */, &cb, &in_stream_req); + prepend_meta, get_op, rgwx_stat, + sync_manifest, skip_decrypt, &cb, &in_stream_req); if (ret < 0) { goto set_err_state; } @@ -8117,6 +8136,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, } if (!copy_itself) { + attrs.erase(RGW_ATTR_TAIL_TAG); manifest = astate->manifest; const rgw_bucket_placement& tail_placement = manifest.get_tail_placement(); if (tail_placement.bucket.name.empty()) { @@ -8163,6 +8183,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, write_op.meta.category = category; write_op.meta.olh_epoch = olh_epoch; write_op.meta.delete_at = delete_at; + write_op.meta.modify_tail = !copy_itself; ret = write_op.write_meta(obj_size, astate->accounted_size, attrs); if (ret < 0) { @@ -8475,7 +8496,7 @@ int RGWRados::Object::complete_atomic_modification() return 0; } - string tag = state->obj_tag.to_str(); + string tag = (state->tail_tag.length() > 0 ? state->tail_tag.to_str() : state->obj_tag.to_str()); return store->gc->send_chain(chain, tag, false); // do it async } @@ -8692,13 +8713,17 @@ int RGWRados::defer_gc(void *ctx, const RGWBucketInfo& bucket_info, const rgw_ob return -EINVAL; } - if (state->obj_tag.length() == 0) {// check for backward compatibility + string tag; + + if (state->tail_tag.length() > 0) { + tag = state->tail_tag.c_str(); + } else if (state->obj_tag.length() > 0) { + tag = state->obj_tag.c_str(); + } else { ldout(cct, 20) << "state->obj_tag is empty, not deferring gc operation" << dendl; return -EINVAL; } - string tag = state->obj_tag.c_str(); - ldout(cct, 0) << "defer chain tag=" << tag << dendl; return gc->defer_chain(tag, false); @@ -8861,7 +8886,7 @@ int RGWRados::Object::Delete::delete_obj() return -ENOENT; } - r = target->prepare_atomic_modification(op, false, NULL, NULL, NULL, true); + r = target->prepare_atomic_modification(op, false, NULL, NULL, NULL, true, false); if (r < 0) return r; @@ -9195,6 +9220,10 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, const RGWBucketInfo& bucket s->shadow_obj[bl.length()] = '\0'; } s->obj_tag = s->attrset[RGW_ATTR_ID_TAG]; + auto ttiter = s->attrset.find(RGW_ATTR_TAIL_TAG); + if (ttiter != s->attrset.end()) { + s->tail_tag = s->attrset[RGW_ATTR_TAIL_TAG]; + } bufferlist manifest_bl = s->attrset[RGW_ATTR_MANIFEST]; if (manifest_bl.length()) { @@ -9467,7 +9496,8 @@ void RGWRados::SystemObject::invalidate_state() } int RGWRados::Object::prepare_atomic_modification(ObjectWriteOperation& op, bool reset_obj, const string *ptag, - const char *if_match, const char *if_nomatch, bool removal_op) + const char *if_match, const char *if_nomatch, bool removal_op, + bool modify_tail) { int r = get_state(&state, false); if (r < 0) @@ -9551,6 +9581,9 @@ int RGWRados::Object::prepare_atomic_modification(ObjectWriteOperation& op, bool ldout(store->ctx(), 10) << "setting object write_tag=" << state->write_tag << dendl; op.setxattr(RGW_ATTR_ID_TAG, bl); + if (modify_tail) { + op.setxattr(RGW_ATTR_TAIL_TAG, bl); + } return 0; } @@ -12203,6 +12236,31 @@ int RGWRados::pool_iterate_begin(const rgw_pool& pool, RGWPoolIterCtx& ctx) return 0; } +int RGWRados::pool_iterate_begin(const rgw_pool& pool, const string& cursor, RGWPoolIterCtx& ctx) +{ + librados::IoCtx& io_ctx = ctx.io_ctx; + librados::NObjectIterator& iter = ctx.iter; + + int r = open_pool_ctx(pool, io_ctx); + if (r < 0) + return r; + + librados::ObjectCursor oc; + if (!oc.from_str(cursor)) { + ldout(cct, 10) << "failed to parse cursor: " << cursor << dendl; + return -EINVAL; + } + + iter = io_ctx.nobjects_begin(oc); + + return 0; +} + +string RGWRados::pool_iterate_get_cursor(RGWPoolIterCtx& ctx) +{ + return ctx.iter.get_cursor().to_str(); +} + int RGWRados::pool_iterate(RGWPoolIterCtx& ctx, uint32_t num, vector& objs, bool *is_truncated, RGWAccessListFilter *filter) { @@ -12242,21 +12300,27 @@ struct RGWAccessListFilterPrefix : public RGWAccessListFilter { } }; -int RGWRados::list_raw_objects(const rgw_pool& pool, const string& prefix_filter, - int max, RGWListRawObjsCtx& ctx, list& oids, - bool *is_truncated) +int RGWRados::list_raw_objects_init(const rgw_pool& pool, const string& marker, RGWListRawObjsCtx *ctx) { - RGWAccessListFilterPrefix filter(prefix_filter); - - if (!ctx.initialized) { - int r = pool_iterate_begin(pool, ctx.iter_ctx); + if (!ctx->initialized) { + int r = pool_iterate_begin(pool, marker, ctx->iter_ctx); if (r < 0) { ldout(cct, 10) << "failed to list objects pool_iterate_begin() returned r=" << r << dendl; return r; } - ctx.initialized = true; + ctx->initialized = true; } + return 0; +} +int RGWRados::list_raw_objects_next(const string& prefix_filter, int max, + RGWListRawObjsCtx& ctx, list& oids, + bool *is_truncated) +{ + if (!ctx.initialized) { + return -EINVAL; + } + RGWAccessListFilterPrefix filter(prefix_filter); vector objs; int r = pool_iterate(ctx.iter_ctx, max, objs, is_truncated, &filter); if (r < 0) { @@ -12273,6 +12337,25 @@ int RGWRados::list_raw_objects(const rgw_pool& pool, const string& prefix_filter return oids.size(); } +int RGWRados::list_raw_objects(const rgw_pool& pool, const string& prefix_filter, + int max, RGWListRawObjsCtx& ctx, list& oids, + bool *is_truncated) +{ + if (!ctx.initialized) { + int r = list_raw_objects_init(pool, string(), &ctx); + if (r < 0) { + return r; + } + } + + return list_raw_objects_next(prefix_filter, max, ctx, oids, is_truncated); +} + +string RGWRados::list_raw_objs_get_cursor(RGWListRawObjsCtx& ctx) +{ + return pool_iterate_get_cursor(ctx.iter_ctx); +} + int RGWRados::list_bi_log_entries(RGWBucketInfo& bucket_info, int shard_id, string& marker, uint32_t max, std::list& result, bool *truncated) { diff --git a/ceph/src/rgw/rgw_rados.h b/ceph/src/rgw/rgw_rados.h index 23caafd63..6984192f0 100644 --- a/ceph/src/rgw/rgw_rados.h +++ b/ceph/src/rgw/rgw_rados.h @@ -874,6 +874,7 @@ struct RGWObjState { ceph::real_time mtime; uint64_t epoch; bufferlist obj_tag; + bufferlist tail_tag; string write_tag; bool fake_tag; RGWObjManifest manifest; @@ -908,6 +909,9 @@ struct RGWObjState { if (rhs.obj_tag.length()) { obj_tag = rhs.obj_tag; } + if (rhs.tail_tag.length()) { + tail_tag = rhs.tail_tag; + } write_tag = rhs.write_tag; fake_tag = rhs.fake_tag; if (rhs.has_manifest) { @@ -2517,11 +2521,17 @@ public: return rgw_shards_max(); } + int get_raw_obj_ref(const rgw_raw_obj& obj, rgw_rados_ref *ref); + int list_raw_objects_init(const rgw_pool& pool, const string& marker, RGWListRawObjsCtx *ctx); + int list_raw_objects_next(const string& prefix_filter, int max, + RGWListRawObjsCtx& ctx, list& oids, + bool *is_truncated); int list_raw_objects(const rgw_pool& pool, const string& prefix_filter, int max, RGWListRawObjsCtx& ctx, list& oids, bool *is_truncated); + string list_raw_objs_get_cursor(RGWListRawObjsCtx& ctx); int list_raw_prefixed_objs(const rgw_pool& pool, const string& prefix, list& result); int list_zonegroups(list& zonegroups); @@ -2702,7 +2712,7 @@ public: void invalidate_state(); int prepare_atomic_modification(librados::ObjectWriteOperation& op, bool reset_obj, const string *ptag, - const char *ifmatch, const char *ifnomatch, bool removal_op); + const char *ifmatch, const char *ifnomatch, bool removal_op, bool modify_tail); int complete_atomic_modification(); public: @@ -2798,17 +2808,19 @@ public: bool canceled; const string *user_data; rgw_zone_set *zones_trace; + bool modify_tail; MetaParams() : mtime(NULL), rmattrs(NULL), data(NULL), manifest(NULL), ptag(NULL), remove_objs(NULL), category(RGW_OBJ_CATEGORY_MAIN), flags(0), - if_match(NULL), if_nomatch(NULL), olh_epoch(0), canceled(false), user_data(nullptr), zones_trace(nullptr) {} + if_match(NULL), if_nomatch(NULL), olh_epoch(0), canceled(false), user_data(nullptr), zones_trace(nullptr), + modify_tail(false) {} } meta; explicit Write(RGWRados::Object *_target) : target(_target) {} int _do_write_meta(uint64_t size, uint64_t accounted_size, map& attrs, - bool assume_noent, + bool modify_tail, bool assume_noent, void *index_op); int write_meta(uint64_t size, uint64_t accounted_size, map& attrs); @@ -3644,6 +3656,22 @@ public: */ int pool_iterate_begin(const rgw_pool& pool, RGWPoolIterCtx& ctx); + /** + * Init pool iteration + * pool: pool to use + * cursor: position to start iteration + * ctx: context object to use for the iteration + * Returns: 0 on success, -ERR# otherwise. + */ + int pool_iterate_begin(const rgw_pool& pool, const string& cursor, RGWPoolIterCtx& ctx); + + /** + * Get pool iteration position + * ctx: context object to use for the iteration + * Returns: string representation of position + */ + string pool_iterate_get_cursor(RGWPoolIterCtx& ctx); + /** * Iterate over pool return object names, use optional filter * ctx: iteration context, initialized with pool_iterate_begin() diff --git a/ceph/src/rgw/rgw_rest_client.cc b/ceph/src/rgw/rgw_rest_client.cc index fb61f326b..22bbfe80f 100644 --- a/ceph/src/rgw/rgw_rest_client.cc +++ b/ceph/src/rgw/rgw_rest_client.cc @@ -391,7 +391,7 @@ struct grant_type_to_header grants_headers_def[] = { static bool grants_by_type_check_perm(map& grants_by_type, int perm, ACLGrant& grant, int check_perm) { - if ((perm & check_perm) == perm) { + if ((perm & check_perm) == check_perm) { grants_by_type_add_one_grant(grants_by_type, check_perm, grant); return true; } diff --git a/ceph/src/rgw/rgw_rest_conn.cc b/ceph/src/rgw/rgw_rest_conn.cc index aa3e0c888..d94a5643f 100644 --- a/ceph/src/rgw/rgw_rest_conn.cc +++ b/ceph/src/rgw/rgw_rest_conn.cc @@ -156,7 +156,7 @@ int RGWRESTConn::get_obj(const rgw_user& uid, req_info *info /* optional */, rgw const real_time *mod_ptr, const real_time *unmod_ptr, uint32_t mod_zone_id, uint64_t mod_pg_ver, bool prepend_metadata, bool get_op, bool rgwx_stat, - bool sync_manifest, RGWGetDataCB *cb, + bool sync_manifest, bool skip_decrypt, RGWGetDataCB *cb, RGWRESTStreamRWRequest **req) { string url; @@ -175,6 +175,9 @@ int RGWRESTConn::get_obj(const rgw_user& uid, req_info *info /* optional */, rgw if (sync_manifest) { params.push_back(param_pair_t(RGW_SYS_PARAM_PREFIX "sync-manifest", "")); } + if (skip_decrypt) { + params.push_back(param_pair_t(RGW_SYS_PARAM_PREFIX "skip-decrypt", "")); + } if (!obj.key.instance.empty()) { const string& instance = obj.key.instance; params.push_back(param_pair_t("versionId", instance)); diff --git a/ceph/src/rgw/rgw_rest_conn.h b/ceph/src/rgw/rgw_rest_conn.h index f4a1005b6..e9941856f 100644 --- a/ceph/src/rgw/rgw_rest_conn.h +++ b/ceph/src/rgw/rgw_rest_conn.h @@ -94,7 +94,7 @@ public: const ceph::real_time *mod_ptr, const ceph::real_time *unmod_ptr, uint32_t mod_zone_id, uint64_t mod_pg_ver, bool prepend_metadata, bool get_op, bool rgwx_stat, bool sync_manifest, - RGWGetDataCB *cb, RGWRESTStreamRWRequest **req); + bool skip_decrypt, RGWGetDataCB *cb, RGWRESTStreamRWRequest **req); int complete_request(RGWRESTStreamRWRequest *req, string& etag, ceph::real_time *mtime, uint64_t *psize, map& attrs); int get_resource(const string& resource, diff --git a/ceph/src/rgw/rgw_rest_metadata.cc b/ceph/src/rgw/rgw_rest_metadata.cc index 099a206e5..e6239347d 100644 --- a/ceph/src/rgw/rgw_rest_metadata.cc +++ b/ceph/src/rgw/rgw_rest_metadata.cc @@ -68,6 +68,24 @@ const string RGWOp_Metadata_List::name() { } void RGWOp_Metadata_List::execute() { + string marker = s->info.args.get("marker"); + bool max_entries_specified; + string max_entries_str = s->info.args.get("max-entries", &max_entries_specified); + + bool extended_response = (max_entries_specified); /* for backward compatibility, if max-entries is not specified + we will send the old response format */ + uint64_t max_entries = 0; + + if (max_entries_specified) { + string err; + max_entries = (unsigned)strict_strtol(max_entries_str.c_str(), 10, &err); + if (!err.empty()) { + dout(5) << "Error parsing max-entries " << max_entries_str << dendl; + http_ret = -EINVAL; + return; + } + } + string metadata_key; frame_metadata_key(s, metadata_key); @@ -75,19 +93,26 @@ void RGWOp_Metadata_List::execute() { void *handle; int max = 1000; - http_ret = store->meta_mgr->list_keys_init(metadata_key, &handle); + http_ret = store->meta_mgr->list_keys_init(metadata_key, marker, &handle); if (http_ret < 0) { dout(5) << "ERROR: can't get key: " << cpp_strerror(http_ret) << dendl; return; } bool truncated; + uint64_t count = 0; + + if (extended_response) { + s->formatter->open_object_section("result"); + } s->formatter->open_array_section("keys"); + uint64_t left; do { list keys; - http_ret = store->meta_mgr->list_keys_next(handle, max, keys, &truncated); + left = (max_entries_specified ? max_entries - count : max); + http_ret = store->meta_mgr->list_keys_next(handle, left, keys, &truncated); if (http_ret < 0) { dout(5) << "ERROR: lists_keys_next(): " << cpp_strerror(http_ret) << dendl; @@ -97,12 +122,21 @@ void RGWOp_Metadata_List::execute() { for (list::iterator iter = keys.begin(); iter != keys.end(); ++iter) { s->formatter->dump_string("key", *iter); + ++count; } - } while (truncated); + } while (truncated && left > 0); s->formatter->close_section(); + if (extended_response) { + encode_json("truncated", truncated, s->formatter); + encode_json("count", count, s->formatter); + if (truncated) { + encode_json("marker", store->meta_mgr->get_marker(handle), s->formatter); + } + s->formatter->close_section(); + } store->meta_mgr->list_keys_complete(handle); http_ret = 0; diff --git a/ceph/src/rgw/rgw_rest_s3.cc b/ceph/src/rgw/rgw_rest_s3.cc index 9c504ca59..aa5b525d0 100644 --- a/ceph/src/rgw/rgw_rest_s3.cc +++ b/ceph/src/rgw/rgw_rest_s3.cc @@ -129,6 +129,12 @@ int RGWGetObj_ObjStore_S3::get_params() // all of the data from its parts. the parts will sync as separate objects skip_manifest = s->info.args.exists(RGW_SYS_PARAM_PREFIX "sync-manifest"); + // multisite sync requests should fetch encrypted data, along with the + // attributes needed to support decryption on the other zone + if (s->system_request) { + skip_decrypt = s->info.args.exists(RGW_SYS_PARAM_PREFIX "skip-decrypt"); + } + return RGWGetObj_ObjStore::get_params(); } @@ -337,6 +343,10 @@ send_data: int RGWGetObj_ObjStore_S3::get_decrypt_filter(std::unique_ptr *filter, RGWGetDataCB* cb, bufferlist* manifest_bl) { + if (skip_decrypt) { // bypass decryption for multisite sync requests + return 0; + } + int res = 0; std::unique_ptr block_crypt; res = rgw_s3_prepare_decrypt(s, attrs, &block_crypt, crypt_http_responses); diff --git a/ceph/src/rgw/rgw_sync.cc b/ceph/src/rgw/rgw_sync.cc index 0f6a27084..d45d9a92e 100644 --- a/ceph/src/rgw/rgw_sync.cc +++ b/ceph/src/rgw/rgw_sync.cc @@ -775,7 +775,20 @@ class RGWFetchAllMetaCR : public RGWCoroutine { list sections; list::iterator sections_iter; - list result; + + struct meta_list_result { + list keys; + string marker; + uint64_t count{0}; + bool truncated{false}; + + void decode_json(JSONObj *obj) { + JSONDecoder::decode_json("keys", keys, obj); + JSONDecoder::decode_json("marker", marker, obj); + JSONDecoder::decode_json("count", count, obj); + JSONDecoder::decode_json("truncated", truncated, obj); + } + } result; list::iterator iter; std::unique_ptr entries_index; @@ -785,6 +798,8 @@ class RGWFetchAllMetaCR : public RGWCoroutine { bool lost_lock; bool failed; + string marker; + map& markers; public: @@ -863,41 +878,47 @@ public: rearrange_sections(); sections_iter = sections.begin(); for (; sections_iter != sections.end(); ++sections_iter) { - yield { - string entrypoint = string("/admin/metadata/") + *sections_iter; - /* FIXME: need a better scaling solution here, requires streaming output */ - call(new RGWReadRESTResourceCR >(cct, conn, sync_env->http_manager, - entrypoint, NULL, &result)); - } - if (get_ret_status() < 0) { - ldout(cct, 0) << "ERROR: failed to fetch metadata section: " << *sections_iter << dendl; - yield entries_index->finish(); - yield lease_cr->go_down(); - drain_all(); - return set_cr_error(get_ret_status()); - } - iter = result.begin(); - for (; iter != result.end(); ++iter) { - if (!lease_cr->is_locked()) { - lost_lock = true; - break; + do { + yield { +#define META_FULL_SYNC_CHUNK_SIZE "1000" + string entrypoint = string("/admin/metadata/") + *sections_iter; + rgw_http_param_pair pairs[] = { { "max-entries", META_FULL_SYNC_CHUNK_SIZE }, + { "marker", result.marker.c_str() }, + { NULL, NULL } }; + result.keys.clear(); + call(new RGWReadRESTResourceCR(cct, conn, sync_env->http_manager, + entrypoint, pairs, &result)); } - yield; // allow entries_index consumer to make progress - - ldout(cct, 20) << "list metadata: section=" << *sections_iter << " key=" << *iter << dendl; - string s = *sections_iter + ":" + *iter; - int shard_id; - RGWRados *store = sync_env->store; - int ret = store->meta_mgr->get_log_shard_id(*sections_iter, *iter, &shard_id); - if (ret < 0) { - ldout(cct, 0) << "ERROR: could not determine shard id for " << *sections_iter << ":" << *iter << dendl; - ret_status = ret; - break; + if (get_ret_status() < 0) { + ldout(cct, 0) << "ERROR: failed to fetch metadata section: " << *sections_iter << dendl; + yield entries_index->finish(); + yield lease_cr->go_down(); + drain_all(); + return set_cr_error(get_ret_status()); } - if (!entries_index->append(s, shard_id)) { - break; + iter = result.keys.begin(); + for (; iter != result.keys.end(); ++iter) { + if (!lease_cr->is_locked()) { + lost_lock = true; + break; + } + yield; // allow entries_index consumer to make progress + + ldout(cct, 20) << "list metadata: section=" << *sections_iter << " key=" << *iter << dendl; + string s = *sections_iter + ":" + *iter; + int shard_id; + RGWRados *store = sync_env->store; + int ret = store->meta_mgr->get_log_shard_id(*sections_iter, *iter, &shard_id); + if (ret < 0) { + ldout(cct, 0) << "ERROR: could not determine shard id for " << *sections_iter << ":" << *iter << dendl; + ret_status = ret; + break; + } + if (!entries_index->append(s, shard_id)) { + break; + } } - } + } while (result.truncated); } yield { if (!entries_index->finish()) { diff --git a/ceph/src/rgw/rgw_user.cc b/ceph/src/rgw/rgw_user.cc index 41a5492b9..ebe795e7d 100644 --- a/ceph/src/rgw/rgw_user.cc +++ b/ceph/src/rgw/rgw_user.cc @@ -11,6 +11,7 @@ #include "common/Formatter.h" #include "common/ceph_json.h" #include "common/RWLock.h" +#include "common/backport14.h" #include "rgw_rados.h" #include "rgw_acl.h" @@ -2772,13 +2773,19 @@ public: pool = store->get_zone_params().user_uid_pool; } - int list_keys_init(RGWRados *store, void **phandle) override + int list_keys_init(RGWRados *store, const string& marker, void **phandle) override { - list_keys_info *info = new list_keys_info; + auto info = ceph::make_unique(); info->store = store; - *phandle = (void *)info; + int ret = store->list_raw_objects_init(store->get_zone_params().user_uid_pool, marker, + &info->ctx); + if (ret < 0) { + return ret; + } + + *phandle = (void *)info.release(); return 0; } @@ -2794,8 +2801,8 @@ public: list unfiltered_keys; - int ret = store->list_raw_objects(store->get_zone_params().user_uid_pool, no_filter, - max, info->ctx, unfiltered_keys, truncated); + int ret = store->list_raw_objects_next(no_filter, max, info->ctx, + unfiltered_keys, truncated); if (ret < 0 && ret != -ENOENT) return ret; if (ret == -ENOENT) { @@ -2821,6 +2828,11 @@ public: list_keys_info *info = static_cast(handle); delete info; } + + string get_marker(void *handle) { + list_keys_info *info = static_cast(handle); + return info->store->list_raw_objs_get_cursor(info->ctx); + } }; void rgw_user_init(RGWRados *store) diff --git a/ceph/src/rocksdb/CMakeLists.txt b/ceph/src/rocksdb/CMakeLists.txt index 1b1719de5..5f82b33af 100644 --- a/ceph/src/rocksdb/CMakeLists.txt +++ b/ceph/src/rocksdb/CMakeLists.txt @@ -125,7 +125,7 @@ if(WIN32) endif() endif() else() - option(WITH_SSE42 "build with SSE4.2" ON) + option(WITH_SSE42 "build with SSE4.2" OFF) if(WITH_SSE42) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2") endif() diff --git a/ceph/src/rocksdb/util/crc32c.cc b/ceph/src/rocksdb/util/crc32c.cc index 42bedc244..2c8cb097d 100644 --- a/ceph/src/rocksdb/util/crc32c.cc +++ b/ceph/src/rocksdb/util/crc32c.cc @@ -327,6 +327,15 @@ static inline void Slow_CRC32(uint64_t* l, uint8_t const **p) { table0_[c >> 24]; } +#if defined(HAVE_SSE42) && defined(__GNUC__) +#if defined(__clang__) +#if __has_cpp_attribute(gnu::target) +__attribute__ ((target ("sse4.2"))) +#endif +#else // gcc supports this since 4.4 +__attribute__ ((target ("sse4.2"))) +#endif +#endif static inline void Fast_CRC32(uint64_t* l, uint8_t const **p) { #ifdef __SSE4_2__ #ifdef __LP64__ @@ -397,8 +406,7 @@ uint32_t ExtendImpl(uint32_t crc, const char* buf, size_t size) { static bool isSSE42() { #if defined(__GNUC__) && defined(__x86_64__) && !defined(IOS_CROSS_COMPILE) uint32_t c_; - uint32_t d_; - __asm__("cpuid" : "=c"(c_), "=d"(d_) : "a"(1) : "ebx"); + __asm__("cpuid" : "=c"(c_) : "a"(1) : "ebx", "edx"); return c_ & (1U << 20); // copied from CpuId.h in Folly. #elif defined(_WIN64) int info[4]; @@ -425,7 +433,7 @@ bool IsFastCrc32Supported() { #endif } -Function ChosenExtend = Choose_Extend(); +static Function ChosenExtend = Choose_Extend(); uint32_t Extend(uint32_t crc, const char* buf, size_t size) { return ChosenExtend(crc, buf, size); diff --git a/ceph/src/test/cli-integration/rbd/formatted-output.t b/ceph/src/test/cli-integration/rbd/formatted-output.t index 69d7679d9..54c63733f 100644 --- a/ceph/src/test/cli-integration/rbd/formatted-output.t +++ b/ceph/src/test/cli-integration/rbd/formatted-output.t @@ -6,9 +6,9 @@ ls on empty pool never containing images $ rados -p rbd rm rbd_directory >/dev/null 2>&1 || true $ rbd ls $ rbd ls --format json - [] (no-eol) + [] $ rbd ls --format xml - (no-eol) + create ======= diff --git a/ceph/src/test/cli/rbd/help.t b/ceph/src/test/cli/rbd/help.t index a509ffd4e..06cfa294f 100644 --- a/ceph/src/test/cli/rbd/help.t +++ b/ceph/src/test/cli/rbd/help.t @@ -141,7 +141,7 @@ Skip test on FreeBSD as it generates different output there. -p [ --pool ] arg pool name --image arg image name --snap arg snapshot name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help clone @@ -301,7 +301,7 @@ Skip test on FreeBSD as it generates different output there. --snap arg snapshot name --from-snap arg snapshot starting point --whole-object compare whole object - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help disk-usage @@ -320,7 +320,7 @@ Skip test on FreeBSD as it generates different output there. -p [ --pool ] arg pool name --image arg image name --snap arg snapshot name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) --from-snap arg snapshot starting point @@ -453,7 +453,7 @@ Skip test on FreeBSD as it generates different output there. Optional arguments -p [ --pool ] arg pool name --image arg image name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help image-meta remove @@ -575,7 +575,7 @@ Skip test on FreeBSD as it generates different output there. --image arg image name --snap arg snapshot name --image-id arg image id - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help journal client disconnect @@ -654,7 +654,7 @@ Skip test on FreeBSD as it generates different output there. -p [ --pool ] arg pool name --image arg image name --journal arg journal name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help journal inspect @@ -706,7 +706,7 @@ Skip test on FreeBSD as it generates different output there. -p [ --pool ] arg pool name --image arg image name --journal arg journal name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help list @@ -721,7 +721,7 @@ Skip test on FreeBSD as it generates different output there. Optional arguments -l [ --long ] long listing format -p [ --pool ] arg pool name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help lock add @@ -754,7 +754,7 @@ Skip test on FreeBSD as it generates different output there. Optional arguments -p [ --pool ] arg pool name --image arg image name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help lock remove @@ -893,7 +893,7 @@ Skip test on FreeBSD as it generates different output there. Optional arguments -p [ --pool ] arg pool name --image arg image name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help mirror pool demote @@ -945,7 +945,7 @@ Skip test on FreeBSD as it generates different output there. Optional arguments -p [ --pool ] arg pool name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help mirror pool peer add @@ -1019,7 +1019,7 @@ Skip test on FreeBSD as it generates different output there. Optional arguments -p [ --pool ] arg pool name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) --verbose be verbose @@ -1165,7 +1165,7 @@ Skip test on FreeBSD as it generates different output there. Show the rbd images mapped by the kernel. Optional arguments - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help snap create @@ -1227,7 +1227,7 @@ Skip test on FreeBSD as it generates different output there. -p [ --pool ] arg pool name --image arg image name --image-id arg image id - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help snap protect @@ -1351,7 +1351,7 @@ Skip test on FreeBSD as it generates different output there. Optional arguments -p [ --pool ] arg pool name --image arg image name - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help trash list @@ -1368,7 +1368,7 @@ Skip test on FreeBSD as it generates different output there. -p [ --pool ] arg pool name -a [ --all ] list images from all sources -l [ --long ] long listing format - --format arg output format [plain, json, or xml] + --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) rbd help trash move diff --git a/ceph/src/test/cls_rbd/test_cls_rbd.cc b/ceph/src/test/cls_rbd/test_cls_rbd.cc index 50c59cf05..a13c18329 100644 --- a/ceph/src/test/cls_rbd/test_cls_rbd.cc +++ b/ceph/src/test/cls_rbd/test_cls_rbd.cc @@ -100,7 +100,8 @@ TEST_F(TestClsRbd, get_all_features) uint64_t all_features = 0; ASSERT_EQ(0, get_all_features(&ioctx, oid, &all_features)); - ASSERT_EQ(RBD_FEATURES_ALL, all_features); + ASSERT_EQ(static_cast(RBD_FEATURES_ALL), + static_cast(all_features & RBD_FEATURES_ALL)); ioctx.close(); } diff --git a/ceph/src/test/common/test_lru.cc b/ceph/src/test/common/test_lru.cc index b3630792a..5db18314c 100644 --- a/ceph/src/test/common/test_lru.cc +++ b/ceph/src/test/common/test_lru.cc @@ -23,101 +23,126 @@ class Item : public LRUObject { public: int id; - explicit Item(int v) : id(v) {} + Item() : id(0) {} + Item(int i) : id(i) {} + void set(int i) {id = i;} }; TEST(lru, InsertTop) { - LRU lru = LRU(10); - - lru.lru_set_midpoint(.5); // 50% of 10 elements. - for (int i=0; i<100; i++) { - lru.lru_insert_top(new Item(i)); + LRU lru; + static const int n = 100; + Item items[n]; + + lru.lru_set_midpoint(.5); // 50% of elements. + for (int i=0; i(lru.lru_expire()))->id); } TEST(lru, InsertMid) { - LRU lru = LRU(10); - - for (int i=0; i<100; i++) { - lru.lru_insert_mid(new Item(i)); + LRU lru; + static const int n = 102; + Item items[n]; + + lru.lru_set_midpoint(.7); // 70% of elements. + for (int i=0; i(lru.lru_expire()))->id); } TEST(lru, InsertBot) { - LRU lru = LRU(10); - - for (int i=0; i<100; i++) { - lru.lru_insert_bot(new Item(i)); + LRU lru; + static const int n = 100; + Item items[n]; + + lru.lru_set_midpoint(.7); // 70% of elements. + for (int i=0; i(lru.lru_expire()))->id); } TEST(lru, Adjust) { - LRU lru = LRU(10); - - lru.lru_set_midpoint(.6); // 60% of 10 elements. - for (int i=0; i<100; i++) { - lru.lru_touch(new Item(i)); + LRU lru; + static const int n = 100; + Item items[n]; + + lru.lru_set_midpoint(.6); // 60% of elements. + for (int i=0; i(lru.lru_expire()))->id); + ASSERT_EQ(1U, lru.lru_get_pintail()); + ASSERT_EQ(47U, lru.lru_get_top()); /* 60% of unpinned */ + ASSERT_EQ(51U, lru.lru_get_bot()); + ASSERT_EQ(99U, lru.lru_get_size()); + ASSERT_EQ(2, (static_cast(lru.lru_expire()))->id); + ASSERT_EQ(1U, lru.lru_get_pintail()); + ASSERT_EQ(46U, lru.lru_get_top()); /* 60% of unpinned */ + ASSERT_EQ(51U, lru.lru_get_bot()); + ASSERT_EQ(98U, lru.lru_get_size()); + ASSERT_EQ(3, (static_cast(lru.lru_expire()))->id); + ASSERT_EQ(4, (static_cast(lru.lru_expire()))->id); + ASSERT_EQ(6, (static_cast(lru.lru_expire()))->id); + ASSERT_EQ(2U, lru.lru_get_pintail()); + ASSERT_EQ(45U, lru.lru_get_top()); /* 60% of unpinned */ + ASSERT_EQ(48U, lru.lru_get_bot()); + ASSERT_EQ(95U, lru.lru_get_size()); } TEST(lru, Pinning) { - LRU lru = LRU(); + LRU lru; - Item *ob0 = new Item(0); - Item *ob1 = new Item(1); + Item ob0(0), ob1(1); // test before ob1 are in a LRU - ob1->lru_pin(); - ASSERT_FALSE(ob1->lru_is_expireable()); + ob1.lru_pin(); + ASSERT_FALSE(ob1.lru_is_expireable()); - ob1->lru_unpin(); - ASSERT_TRUE(ob1->lru_is_expireable()); + ob1.lru_unpin(); + ASSERT_TRUE(ob1.lru_is_expireable()); // test when ob1 are in a LRU - lru.lru_touch(ob0); - lru.lru_touch(ob1); + lru.lru_insert_top(&ob0); + lru.lru_insert_top(&ob1); - ob1->lru_pin(); - ob1->lru_pin(); // Verify that, one incr. + ob1.lru_pin(); + ob1.lru_pin(); // Verify that, one incr. ASSERT_EQ(1U, lru.lru_get_num_pinned()); - ASSERT_FALSE(ob1->lru_is_expireable()); + ASSERT_FALSE(ob1.lru_is_expireable()); - ob1->lru_unpin(); - ob1->lru_unpin(); // Verify that, one decr. + ob1.lru_unpin(); + ob1.lru_unpin(); // Verify that, one decr. ASSERT_EQ(0U, lru.lru_get_num_pinned()); - ASSERT_TRUE(ob1->lru_is_expireable()); + ASSERT_TRUE(ob1.lru_is_expireable()); ASSERT_EQ(0, (static_cast(lru.lru_expire()))->id); - ob0->lru_pin(); + ob0.lru_pin(); ASSERT_EQ(1, (static_cast(lru.lru_expire()))->id); } diff --git a/ceph/src/test/libcephfs/test.cc b/ceph/src/test/libcephfs/test.cc index 53fcb694e..e492708fb 100644 --- a/ceph/src/test/libcephfs/test.cc +++ b/ceph/src/test/libcephfs/test.cc @@ -1739,8 +1739,8 @@ TEST(LibCephFS, ClearSetuid) { Fh *fh; Inode *in; struct ceph_statx stx; - const mode_t after_mode = S_IRWXU | S_IRWXG; - const mode_t before_mode = S_IRWXU | S_IRWXG | S_ISUID | S_ISGID; + const mode_t after_mode = S_IRWXU; + const mode_t before_mode = S_IRWXU | S_ISUID | S_ISGID; const unsigned want = CEPH_STATX_UID|CEPH_STATX_GID|CEPH_STATX_MODE; UserPerm *usercred = ceph_mount_perms(cmount); @@ -1788,6 +1788,35 @@ TEST(LibCephFS, ClearSetuid) { ASSERT_TRUE(stx.stx_mask & CEPH_STATX_MODE); ASSERT_EQ(stx.stx_mode & (mode_t)ALLPERMS, after_mode); + /* test chown with supplementary groups, and chown with/without exe bit */ + uid_t u = 65534; + gid_t g = 65534; + gid_t gids[] = {65533,65532}; + UserPerm *altcred = ceph_userperm_new(u, g, sizeof gids / sizeof gids[0], gids); + stx.stx_uid = u; + stx.stx_gid = g; + mode_t m = S_ISGID|S_ISUID|S_IRUSR|S_IWUSR; + stx.stx_mode = m; + ASSERT_EQ(ceph_ll_setattr(cmount, in, &stx, CEPH_STATX_MODE|CEPH_SETATTR_UID|CEPH_SETATTR_GID, rootcred), 0); + ASSERT_EQ(ceph_ll_getattr(cmount, in, &stx, CEPH_STATX_MODE, 0, altcred), 0); + ASSERT_EQ(stx.stx_mode&(mode_t)ALLPERMS, m); + /* not dropped without exe bit */ + stx.stx_gid = gids[0]; + ASSERT_EQ(ceph_ll_setattr(cmount, in, &stx, CEPH_SETATTR_GID, altcred), 0); + ASSERT_EQ(ceph_ll_getattr(cmount, in, &stx, CEPH_STATX_MODE, 0, altcred), 0); + ASSERT_EQ(stx.stx_mode&(mode_t)ALLPERMS, m); + /* now check dropped with exe bit */ + m = S_ISGID|S_ISUID|S_IRWXU; + stx.stx_mode = m; + ASSERT_EQ(ceph_ll_setattr(cmount, in, &stx, CEPH_STATX_MODE, altcred), 0); + ASSERT_EQ(ceph_ll_getattr(cmount, in, &stx, CEPH_STATX_MODE, 0, altcred), 0); + ASSERT_EQ(stx.stx_mode&(mode_t)ALLPERMS, m); + stx.stx_gid = gids[1]; + ASSERT_EQ(ceph_ll_setattr(cmount, in, &stx, CEPH_SETATTR_GID, altcred), 0); + ASSERT_EQ(ceph_ll_getattr(cmount, in, &stx, CEPH_STATX_MODE, 0, altcred), 0); + ASSERT_EQ(stx.stx_mode&(mode_t)ALLPERMS, m&(S_IRWXU|S_IRWXG|S_IRWXO)); + ceph_userperm_destroy(altcred); + ASSERT_EQ(ceph_ll_close(cmount, fh), 0); ceph_shutdown(cmount); } diff --git a/ceph/src/test/librbd/journal/test_Entries.cc b/ceph/src/test/librbd/journal/test_Entries.cc index 33e162a0f..54be1487f 100644 --- a/ceph/src/test/librbd/journal/test_Entries.cc +++ b/ceph/src/test/librbd/journal/test_Entries.cc @@ -164,7 +164,7 @@ TEST_F(TestJournalEntries, AioDiscard) { REQUIRE_FEATURE(RBD_FEATURE_JOURNALING); CephContext* cct = reinterpret_cast(_rados.cct()); - REQUIRE(!cct->_conf->rbd_skip_partial_discard); + REQUIRE(!cct->_conf->get_val("rbd_skip_partial_discard")); librbd::ImageCtx *ictx; ASSERT_EQ(0, open_image(m_image_name, &ictx)); @@ -175,7 +175,7 @@ TEST_F(TestJournalEntries, AioDiscard) { C_SaferCond cond_ctx; auto c = librbd::io::AioCompletion::create(&cond_ctx); c->get(); - ictx->io_work_queue->aio_discard(c, 123, 234, cct->_conf->rbd_skip_partial_discard); + ictx->io_work_queue->aio_discard(c, 123, 234, ictx->skip_partial_discard); ASSERT_EQ(0, c->wait_for_complete()); c->put(); diff --git a/ceph/src/test/librbd/journal/test_Replay.cc b/ceph/src/test/librbd/journal/test_Replay.cc index 7c735695b..d8c651858 100644 --- a/ceph/src/test/librbd/journal/test_Replay.cc +++ b/ceph/src/test/librbd/journal/test_Replay.cc @@ -143,7 +143,8 @@ TEST_F(TestJournalReplay, AioDiscardEvent) { // inject a discard operation into the journal inject_into_journal(ictx, - librbd::journal::AioDiscardEvent(0, payload.size(), ictx->skip_partial_discard)); + librbd::journal::AioDiscardEvent(0, payload.size(), + ictx->skip_partial_discard)); close_image(ictx); // re-open the journal so that it replays the new entry @@ -155,7 +156,7 @@ TEST_F(TestJournalReplay, AioDiscardEvent) { librbd::io::ReadResult{read_result}, 0); ASSERT_EQ(0, aio_comp->wait_for_complete()); aio_comp->release(); - if (ictx->cct->_conf->rbd_skip_partial_discard) { + if (ictx->skip_partial_discard) { ASSERT_EQ(payload, read_payload); } else { ASSERT_EQ(std::string(read_payload.size(), '\0'), read_payload); @@ -170,9 +171,11 @@ TEST_F(TestJournalReplay, AioDiscardEvent) { // replay several envents and check the commit position inject_into_journal(ictx, - librbd::journal::AioDiscardEvent(0, payload.size(), ictx->cct->_conf->rbd_skip_partial_discard)); + librbd::journal::AioDiscardEvent(0, payload.size(), + ictx->skip_partial_discard)); inject_into_journal(ictx, - librbd::journal::AioDiscardEvent(0, payload.size(), ictx->cct->_conf->rbd_skip_partial_discard)); + librbd::journal::AioDiscardEvent(0, payload.size(), + ictx->skip_partial_discard)); close_image(ictx); ASSERT_EQ(0, open_image(m_image_name, &ictx)); @@ -183,7 +186,8 @@ TEST_F(TestJournalReplay, AioDiscardEvent) { // verify lock ordering constraints aio_comp = new librbd::io::AioCompletion(); - ictx->io_work_queue->aio_discard(aio_comp, 0, read_payload.size(), ictx->cct->_conf->rbd_skip_partial_discard); + ictx->io_work_queue->aio_discard(aio_comp, 0, read_payload.size(), + ictx->skip_partial_discard); ASSERT_EQ(0, aio_comp->wait_for_complete()); aio_comp->release(); } diff --git a/ceph/src/test/librbd/managed_lock/test_mock_AcquireRequest.cc b/ceph/src/test/librbd/managed_lock/test_mock_AcquireRequest.cc index 174e97be4..8f2f5f6ef 100644 --- a/ceph/src/test/librbd/managed_lock/test_mock_AcquireRequest.cc +++ b/ceph/src/test/librbd/managed_lock/test_mock_AcquireRequest.cc @@ -34,8 +34,9 @@ struct BreakRequest { uint32_t blacklist_expire_seconds, bool force_break_lock, Context *on_finish) { CephContext *cct = reinterpret_cast(ioctx.cct()); - EXPECT_EQ(cct->_conf->rbd_blacklist_on_break_lock, blacklist_locker); - EXPECT_EQ(cct->_conf->rbd_blacklist_expire_seconds, + EXPECT_EQ(cct->_conf->get_val("rbd_blacklist_on_break_lock"), + blacklist_locker); + EXPECT_EQ(cct->_conf->get_val("rbd_blacklist_expire_seconds"), (int)blacklist_expire_seconds); EXPECT_FALSE(force_break_lock); assert(s_instance != nullptr); diff --git a/ceph/src/test/librbd/mock/MockImageCtx.h b/ceph/src/test/librbd/mock/MockImageCtx.h index 483b063e5..be439b985 100644 --- a/ceph/src/test/librbd/mock/MockImageCtx.h +++ b/ceph/src/test/librbd/mock/MockImageCtx.h @@ -105,7 +105,8 @@ struct MockImageCtx { mirroring_resync_after_disconnect( image_ctx.mirroring_resync_after_disconnect), mirroring_replay_delay(image_ctx.mirroring_replay_delay), - non_blocking_aio(image_ctx.non_blocking_aio) + non_blocking_aio(image_ctx.non_blocking_aio), + blkin_trace_all(image_ctx.blkin_trace_all) { md_ctx.dup(image_ctx.md_ctx); data_ctx.dup(image_ctx.data_ctx); @@ -297,6 +298,7 @@ struct MockImageCtx { bool mirroring_resync_after_disconnect; int mirroring_replay_delay; bool non_blocking_aio; + bool blkin_trace_all; }; } // namespace librbd diff --git a/ceph/src/test/librbd/test_MirroringWatcher.cc b/ceph/src/test/librbd/test_MirroringWatcher.cc index f29ff933f..7b49b71a8 100644 --- a/ceph/src/test/librbd/test_MirroringWatcher.cc +++ b/ceph/src/test/librbd/test_MirroringWatcher.cc @@ -32,6 +32,7 @@ struct MockMirroringWatcher : public MirroringWatcher<> { } // anonymous namespace using ::testing::_; +using ::testing::AtLeast; using ::testing::Invoke; using ::testing::StrEq; using ::testing::WithArg; @@ -72,10 +73,13 @@ public: }; TEST_F(TestMirroringWatcher, ModeUpdated) { - EXPECT_CALL(*m_image_watcher, handle_mode_updated(cls::rbd::MIRROR_MODE_DISABLED)); + EXPECT_CALL(*m_image_watcher, + handle_mode_updated(cls::rbd::MIRROR_MODE_DISABLED)) + .Times(AtLeast(1)); C_SaferCond ctx; - MockMirroringWatcher::notify_mode_updated(m_ioctx, cls::rbd::MIRROR_MODE_DISABLED, &ctx); + MockMirroringWatcher::notify_mode_updated( + m_ioctx, cls::rbd::MIRROR_MODE_DISABLED, &ctx); ASSERT_EQ(0, ctx.wait()); } @@ -83,12 +87,13 @@ TEST_F(TestMirroringWatcher, ImageStatusUpdated) { EXPECT_CALL(*m_image_watcher, handle_image_updated(cls::rbd::MIRROR_IMAGE_STATE_ENABLED, StrEq("image id"), - StrEq("global image id"))); + StrEq("global image id"))) + .Times(AtLeast(1)); C_SaferCond ctx; - MockMirroringWatcher::notify_image_updated(m_ioctx, - cls::rbd::MIRROR_IMAGE_STATE_ENABLED, - "image id", "global image id", &ctx); + MockMirroringWatcher::notify_image_updated( + m_ioctx, cls::rbd::MIRROR_IMAGE_STATE_ENABLED, "image id", + "global image id", &ctx); ASSERT_EQ(0, ctx.wait()); } diff --git a/ceph/src/test/librbd/test_internal.cc b/ceph/src/test/librbd/test_internal.cc index dd8d5a8cb..7cc6e12ca 100644 --- a/ceph/src/test/librbd/test_internal.cc +++ b/ceph/src/test/librbd/test_internal.cc @@ -718,7 +718,7 @@ TEST_F(TestInternal, DiscardCopyup) REQUIRE_FEATURE(RBD_FEATURE_LAYERING); CephContext* cct = reinterpret_cast(_rados.cct()); - REQUIRE(!cct->_conf->rbd_skip_partial_discard); + REQUIRE(!cct->_conf->get_val("rbd_skip_partial_discard")); m_image_name = get_temp_image_name(); m_image_size = 1 << 14; diff --git a/ceph/src/test/mon/PGMap.cc b/ceph/src/test/mon/PGMap.cc index 60de6b7dd..d7e8a18fe 100644 --- a/ceph/src/test/mon/PGMap.cc +++ b/ceph/src/test/mon/PGMap.cc @@ -180,7 +180,7 @@ TEST(pgmap, dump_object_stat_sum_0) unsigned col = 0; ASSERT_EQ(stringify(si_t(sum.num_bytes)), tbl.get(0, col++)); ASSERT_EQ(percentify(used_percent), tbl.get(0, col++)); - ASSERT_EQ(stringify(si_t(avail)), tbl.get(0, col++)); + ASSERT_EQ(stringify(si_t(avail/pool.size)), tbl.get(0, col++)); ASSERT_EQ(stringify(sum.num_objects), tbl.get(0, col++)); ASSERT_EQ(stringify(si_t(sum.num_objects_dirty)), tbl.get(0, col++)); ASSERT_EQ(stringify(si_t(sum.num_rd)), tbl.get(0, col++)); @@ -210,7 +210,7 @@ TEST(pgmap, dump_object_stat_sum_1) unsigned col = 0; ASSERT_EQ(stringify(si_t(0)), tbl.get(0, col++)); ASSERT_EQ(percentify(0), tbl.get(0, col++)); - ASSERT_EQ(stringify(si_t(avail)), tbl.get(0, col++)); + ASSERT_EQ(stringify(si_t(avail/pool.size)), tbl.get(0, col++)); ASSERT_EQ(stringify(0), tbl.get(0, col++)); ASSERT_EQ(stringify(si_t(0)), tbl.get(0, col++)); ASSERT_EQ(stringify(si_t(0)), tbl.get(0, col++)); @@ -239,6 +239,6 @@ TEST(pgmap, dump_object_stat_sum_2) unsigned col = 0; ASSERT_EQ(stringify(si_t(0)), tbl.get(0, col++)); ASSERT_EQ(percentify(0), tbl.get(0, col++)); - ASSERT_EQ(stringify(si_t(avail)), tbl.get(0, col++)); + ASSERT_EQ(stringify(si_t(avail/pool.size)), tbl.get(0, col++)); ASSERT_EQ(stringify(0), tbl.get(0, col++)); } diff --git a/ceph/src/test/osd/TestPGLog.cc b/ceph/src/test/osd/TestPGLog.cc index bf29f87c4..91d78f0aa 100644 --- a/ceph/src/test/osd/TestPGLog.cc +++ b/ceph/src/test/osd/TestPGLog.cc @@ -2392,16 +2392,25 @@ TEST_F(PGLogTestRebuildMissing, MissingNotInLog) { } -class PGLogMergeDupsTest : public ::testing::Test, protected PGLog { +class PGLogMergeDupsTest : protected PGLog, public StoreTestFixture { public: - PGLogMergeDupsTest() : PGLog(g_ceph_context) { } + PGLogMergeDupsTest() : PGLog(g_ceph_context), StoreTestFixture("memstore") { } - void SetUp() override { } + void SetUp() override { + StoreTestFixture::SetUp(); + ObjectStore::Sequencer osr(__func__); + ObjectStore::Transaction t; + test_coll = coll_t(spg_t(pg_t(1, 1))); + t.create_collection(test_coll, 0); + store->apply_transaction(&osr, std::move(t)); + } void TearDown() override { + test_disk_roundtrip(); clear(); + StoreTestFixture::TearDown(); } static pg_log_dup_t create_dup_entry(uint a, uint b) { @@ -2437,11 +2446,13 @@ public: void add_dups(uint a, uint b) { log.dups.push_back(create_dup_entry(a, b)); + write_from_dups = MIN(write_from_dups, log.dups.back().version); } void add_dups(const std::vector& l) { for (auto& i : l) { log.dups.push_back(i); + write_from_dups = MIN(write_from_dups, log.dups.back().version); } } @@ -2466,6 +2477,36 @@ public: EXPECT_EQ(1u, log.dup_index.count(i.reqid)); } } + + void test_disk_roundtrip() { + ObjectStore::Sequencer osr(__func__); + ObjectStore::Transaction t; + hobject_t hoid; + hoid.pool = 1; + hoid.oid = "log"; + ghobject_t log_oid(hoid); + map km; + write_log_and_missing(t, &km, test_coll, log_oid, false); + if (!km.empty()) { + t.omap_setkeys(test_coll, log_oid, km); + } + ASSERT_EQ(0u, store->apply_transaction(&osr, std::move(t))); + + auto orig_dups = log.dups; + clear(); + ostringstream err; + read_log_and_missing(store.get(), test_coll, test_coll, log_oid, + pg_info_t(), false, err, false); + ASSERT_EQ(orig_dups.size(), log.dups.size()); + ASSERT_EQ(orig_dups, log.dups); + auto dups_it = log.dups.begin(); + for (auto orig_dup : orig_dups) { + ASSERT_EQ(orig_dup, *dups_it); + ++dups_it; + } + } + + coll_t test_coll; }; TEST_F(PGLogMergeDupsTest, OtherEmpty) { @@ -2657,14 +2698,7 @@ struct PGLogTrimTest : public PGLogTestBase, public PGLog::IndexedLog { - std::list test_hobjects; - CephContext *cct; - - void SetUp() override { - cct = (new CephContext(CEPH_ENTITY_TYPE_OSD))->get(); - - hobject_t::generate_test_instances(test_hobjects); - } + CephContext *cct = g_ceph_context; void SetUp(unsigned min_entries, unsigned max_entries, unsigned dup_track) { constexpr size_t size = 10; @@ -2680,35 +2714,10 @@ struct PGLogTrimTest : cct->_conf->set_val_or_die("osd_min_pg_log_entries", min_entries_s); cct->_conf->set_val_or_die("osd_max_pg_log_entries", max_entries_s); cct->_conf->set_val_or_die("osd_pg_log_dups_tracked", dup_track_s); -} - - void TearDown() override { - while (!test_hobjects.empty()) { - delete test_hobjects.front(); - test_hobjects.pop_front(); - } - - cct->put(); } }; // struct PGLogTrimTest -# if 0 -TEST_F(PGLogTest, Trim1) { - TestCase t; - - t.auth.push_back(mk_ple_mod(mk_obj(1), mk_evt(10, 100), mk_evt(8, 70))); - t.auth.push_back(mk_ple_mod(mk_obj(1), mk_evt(15, 150), mk_evt(10, 100))); - t.auth.push_back(mk_ple_mod(mk_obj(1), mk_evt(15, 155), mk_evt(15, 150))); - t.auth.push_back(mk_ple_mod(mk_obj(1), mk_evt(20, 160), mk_evt(25, 152))); - t.auth.push_back(mk_ple_mod(mk_obj(1), mk_evt(21, 165), mk_evt(26, 160))); - t.auth.push_back(mk_ple_mod(mk_obj(1), mk_evt(21, 165), mk_evt(31, 171))); - - t.setup(); -} -#endif - - TEST_F(PGLogTrimTest, TestMakingCephContext) { SetUp(1, 2, 5); @@ -2736,11 +2745,11 @@ TEST_F(PGLogTrimTest, TestPartialTrim) std::set trimmed; std::set trimmed_dups; - bool dirty_dups = false; + eversion_t write_from_dups = eversion_t::max(); - log.trim(cct, mk_evt(19, 157), &trimmed, &trimmed_dups, &dirty_dups); + log.trim(cct, mk_evt(19, 157), &trimmed, &trimmed_dups, &write_from_dups); - EXPECT_EQ(true, dirty_dups); + EXPECT_EQ(eversion_t(15, 150), write_from_dups); EXPECT_EQ(3u, log.log.size()); EXPECT_EQ(3u, trimmed.size()); EXPECT_EQ(2u, log.dups.size()); @@ -2750,11 +2759,11 @@ TEST_F(PGLogTrimTest, TestPartialTrim) std::set trimmed2; std::set trimmed_dups2; - bool dirty_dups2 = false; - - log.trim(cct, mk_evt(20, 164), &trimmed2, &trimmed_dups2, &dirty_dups2); + eversion_t write_from_dups2 = eversion_t::max(); - EXPECT_EQ(true, dirty_dups2); + log.trim(cct, mk_evt(20, 164), &trimmed2, &trimmed_dups2, &write_from_dups2); + + EXPECT_EQ(eversion_t(19, 160), write_from_dups2); EXPECT_EQ(2u, log.log.size()); EXPECT_EQ(1u, trimmed2.size()); EXPECT_EQ(2u, log.dups.size()); @@ -2776,11 +2785,11 @@ TEST_F(PGLogTrimTest, TestTrimNoTrimmed) { log.add(mk_ple_mod(mk_obj(4), mk_evt(21, 165), mk_evt(26, 160))); log.add(mk_ple_dt_rb(mk_obj(5), mk_evt(21, 167), mk_evt(31, 166))); - bool dirty_dups = false; + eversion_t write_from_dups = eversion_t::max(); - log.trim(cct, mk_evt(19, 157), nullptr, nullptr, &dirty_dups); + log.trim(cct, mk_evt(19, 157), nullptr, nullptr, &write_from_dups); - EXPECT_EQ(true, dirty_dups); + EXPECT_EQ(eversion_t(15, 150), write_from_dups); EXPECT_EQ(3u, log.log.size()); EXPECT_EQ(2u, log.dups.size()); } @@ -2803,11 +2812,11 @@ TEST_F(PGLogTrimTest, TestTrimNoDups) std::set trimmed; std::set trimmed_dups; - bool dirty_dups = false; + eversion_t write_from_dups = eversion_t::max(); - log.trim(cct, mk_evt(19, 157), &trimmed, &trimmed_dups, &dirty_dups); + log.trim(cct, mk_evt(19, 157), &trimmed, &trimmed_dups, &write_from_dups); - EXPECT_FALSE(dirty_dups); + EXPECT_EQ(eversion_t::max(), write_from_dups); EXPECT_EQ(3u, log.log.size()); EXPECT_EQ(3u, trimmed.size()); EXPECT_EQ(0u, log.dups.size()); @@ -2831,11 +2840,11 @@ TEST_F(PGLogTrimTest, TestNoTrim) std::set trimmed; std::set trimmed_dups; - bool dirty_dups = false; + eversion_t write_from_dups = eversion_t::max(); - log.trim(cct, mk_evt(9, 99), &trimmed, &trimmed_dups, &dirty_dups); + log.trim(cct, mk_evt(9, 99), &trimmed, &trimmed_dups, &write_from_dups); - EXPECT_FALSE(dirty_dups); + EXPECT_EQ(eversion_t::max(), write_from_dups); EXPECT_EQ(6u, log.log.size()); EXPECT_EQ(0u, trimmed.size()); EXPECT_EQ(0u, log.dups.size()); @@ -2859,11 +2868,11 @@ TEST_F(PGLogTrimTest, TestTrimAll) std::set trimmed; std::set trimmed_dups; - bool dirty_dups = false; + eversion_t write_from_dups = eversion_t::max(); - log.trim(cct, mk_evt(22, 180), &trimmed, &trimmed_dups, &dirty_dups); + log.trim(cct, mk_evt(22, 180), &trimmed, &trimmed_dups, &write_from_dups); - EXPECT_EQ(true, dirty_dups); + EXPECT_EQ(eversion_t(15, 150), write_from_dups); EXPECT_EQ(0u, log.log.size()); EXPECT_EQ(6u, trimmed.size()); EXPECT_EQ(5u, log.dups.size()); @@ -2893,11 +2902,11 @@ TEST_F(PGLogTrimTest, TestGetRequest) { log.add(mk_ple_dt_rb(mk_obj(5), mk_evt(21, 167), mk_evt(31, 166), osd_reqid_t(client, 8, 6))); - bool dirty_dups = false; + eversion_t write_from_dups = eversion_t::max(); - log.trim(cct, mk_evt(19, 157), nullptr, nullptr, &dirty_dups); + log.trim(cct, mk_evt(19, 157), nullptr, nullptr, &write_from_dups); - EXPECT_EQ(true, dirty_dups); + EXPECT_EQ(eversion_t(15, 150), write_from_dups); EXPECT_EQ(3u, log.log.size()); EXPECT_EQ(2u, log.dups.size()); @@ -2980,6 +2989,7 @@ TEST_F(PGLogTest, _merge_object_divergent_entries) { } } + // Local Variables: // compile-command: "cd ../.. ; make unittest_pglog ; ./unittest_pglog --log-to-stderr=true --debug-osd=20 # --gtest_filter=*.* " // End: diff --git a/ceph/src/test/rbd_mirror/test_mock_LeaderWatcher.cc b/ceph/src/test/rbd_mirror/test_mock_LeaderWatcher.cc index 2f458e6ad..2141a00f7 100644 --- a/ceph/src/test/rbd_mirror/test_mock_LeaderWatcher.cc +++ b/ceph/src/test/rbd_mirror/test_mock_LeaderWatcher.cc @@ -623,8 +623,8 @@ TEST_F(TestMockLeaderWatcher, Break) { EXPECT_EQ(0, _rados->conf_set("rbd_mirror_leader_max_missed_heartbeats", "1")); CephContext *cct = reinterpret_cast(m_local_io_ctx.cct()); - int max_acquire_attempts = - cct->_conf->rbd_mirror_leader_max_acquire_attempts_before_break; + int max_acquire_attempts = cct->_conf->get_val( + "rbd_mirror_leader_max_acquire_attempts_before_break"); MockManagedLock mock_managed_lock; MockMirrorStatusWatcher mock_mirror_status_watcher; diff --git a/ceph/src/test/rgw/rgw_multi/tests.py b/ceph/src/test/rgw/rgw_multi/tests.py index 721b5c5cb..0109a0213 100644 --- a/ceph/src/test/rgw/rgw_multi/tests.py +++ b/ceph/src/test/rgw/rgw_multi/tests.py @@ -930,3 +930,45 @@ def test_bucket_sync_disable_enable(): for bucket_name in buckets: zonegroup_bucket_checkpoint(zonegroup_conns, bucket_name) + +def test_encrypted_object_sync(): + zonegroup = realm.master_zonegroup() + zonegroup_conns = ZonegroupConns(zonegroup) + + (zone1, zone2) = zonegroup_conns.rw_zones[0:2] + + # create a bucket on the first zone + bucket_name = gen_bucket_name() + log.info('create bucket zone=%s name=%s', zone1.name, bucket_name) + bucket = zone1.conn.create_bucket(bucket_name) + + # upload an object with sse-c encryption + sse_c_headers = { + 'x-amz-server-side-encryption-customer-algorithm': 'AES256', + 'x-amz-server-side-encryption-customer-key': 'pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=', + 'x-amz-server-side-encryption-customer-key-md5': 'DWygnHRtgiJ77HCm+1rvHw==' + } + key = bucket.new_key('testobj-sse-c') + data = 'A'*512 + key.set_contents_from_string(data, headers=sse_c_headers) + + # upload an object with sse-kms encryption + sse_kms_headers = { + 'x-amz-server-side-encryption': 'aws:kms', + # testkey-1 must be present in 'rgw crypt s3 kms encryption keys' (vstart.sh adds this) + 'x-amz-server-side-encryption-aws-kms-key-id': 'testkey-1', + } + key = bucket.new_key('testobj-sse-kms') + key.set_contents_from_string(data, headers=sse_kms_headers) + + # wait for the bucket metadata and data to sync + zonegroup_meta_checkpoint(zonegroup) + zone_bucket_checkpoint(zone2.zone, zone1.zone, bucket_name) + + # read the encrypted objects from the second zone + bucket2 = get_bucket(zone2, bucket_name) + key = bucket2.get_key('testobj-sse-c', headers=sse_c_headers) + eq(data, key.get_contents_as_string(headers=sse_c_headers)) + + key = bucket2.get_key('testobj-sse-kms') + eq(data, key.get_contents_as_string()) diff --git a/ceph/src/tools/ceph_objectstore_tool.cc b/ceph/src/tools/ceph_objectstore_tool.cc index 13224f759..397303dea 100644 --- a/ceph/src/tools/ceph_objectstore_tool.cc +++ b/ceph/src/tools/ceph_objectstore_tool.cc @@ -479,12 +479,12 @@ int write_pg(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info, if (!divergent.empty()) { assert(missing.get_items().empty()); PGLog::write_log_and_missing_wo_missing( - t, &km, log, coll, info.pgid.make_pgmeta_oid(), divergent, true, true); + t, &km, log, coll, info.pgid.make_pgmeta_oid(), divergent, true); } else { pg_missing_tracker_t tmissing(missing); bool rebuilt_missing_set_with_deletes = missing.may_include_deletes; PGLog::write_log_and_missing( - t, &km, log, coll, info.pgid.make_pgmeta_oid(), tmissing, true, true, + t, &km, log, coll, info.pgid.make_pgmeta_oid(), tmissing, true, &rebuilt_missing_set_with_deletes); } t.omap_setkeys(coll, info.pgid.make_pgmeta_oid(), km); @@ -2286,9 +2286,13 @@ int dup(string srcpath, ObjectStore *src, string dstpath, ObjectStore *dst) ObjectStore::Transaction t; int bits = src->collection_bits(cid); if (bits < 0) { - cerr << "cannot get bit count for collection " << cid << ": " - << cpp_strerror(bits) << std::endl; - goto out; + if (src->get_type() == "filestore" && cid.is_meta()) { + bits = 0; + } else { + cerr << "cannot get bit count for collection " << cid << ": " + << cpp_strerror(bits) << std::endl; + goto out; + } } t.create_collection(cid, bits); dst->apply_transaction(&osr, std::move(t)); diff --git a/ceph/src/tools/rbd/ArgumentTypes.cc b/ceph/src/tools/rbd/ArgumentTypes.cc index c6c9264fd..42b42a6fb 100644 --- a/ceph/src/tools/rbd/ArgumentTypes.cc +++ b/ceph/src/tools/rbd/ArgumentTypes.cc @@ -332,7 +332,7 @@ void add_no_progress_option(boost::program_options::options_description *opt) { void add_format_options(boost::program_options::options_description *opt) { opt->add_options() - (FORMAT.c_str(), po::value(), "output format [plain, json, or xml]") + (FORMAT.c_str(), po::value(), "output format (plain, json, or xml) [default: plain]") (PRETTY_FORMAT.c_str(), po::bool_switch(), "pretty formatting (json and xml)"); } diff --git a/ceph/src/tools/rbd/Utils.cc b/ceph/src/tools/rbd/Utils.cc index db248e34a..549cf9dd8 100644 --- a/ceph/src/tools/rbd/Utils.cc +++ b/ceph/src/tools/rbd/Utils.cc @@ -84,7 +84,7 @@ int read_string(int fd, unsigned max, std::string *out) { int extract_spec(const std::string &spec, std::string *pool_name, std::string *image_name, std::string *snap_name, SpecValidation spec_validation) { - if (!g_ceph_context->_conf->rbd_validate_names) { + if (!g_ceph_context->_conf->get_val("rbd_validate_names")) { spec_validation = SPEC_VALIDATION_NONE; } @@ -184,7 +184,7 @@ std::string get_positional_argument(const po::variables_map &vm, size_t index) { } std::string get_default_pool_name() { - return g_ceph_context->_conf->rbd_default_pool; + return g_ceph_context->_conf->get_val("rbd_default_pool"); } std::string get_pool_name(const po::variables_map &vm, size_t *arg_index) { @@ -831,7 +831,13 @@ int get_formatter(const po::variables_map &vm, std::cerr << "rbd: --pretty-format only works when --format " << "is json or xml" << std::endl; return -EINVAL; + } else if (*formatter != nullptr && !pretty) { + formatter->get()->enable_line_break(); } + } else if (vm[at::PRETTY_FORMAT].as()) { + std::cerr << "rbd: --pretty-format only works when --format " + << "is json or xml" << std::endl; + return -EINVAL; } return 0; } diff --git a/ceph/src/tools/rbd/action/DiskUsage.cc b/ceph/src/tools/rbd/action/DiskUsage.cc index 3a38a052f..9934e81dd 100644 --- a/ceph/src/tools/rbd/action/DiskUsage.cc +++ b/ceph/src/tools/rbd/action/DiskUsage.cc @@ -283,7 +283,7 @@ int execute(const po::variables_map &vm) { from_snap_name.empty() ? nullptr : from_snap_name.c_str(), formatter.get()); if (r < 0) { - std::cerr << "du failed: " << cpp_strerror(r) << std::endl; + std::cerr << "rbd: du failed: " << cpp_strerror(r) << std::endl; return r; } return 0; diff --git a/ceph/src/tools/rbd/action/Export.cc b/ceph/src/tools/rbd/action/Export.cc index 708663a43..bfda69805 100644 --- a/ceph/src/tools/rbd/action/Export.cc +++ b/ceph/src/tools/rbd/action/Export.cc @@ -177,8 +177,8 @@ int do_export_diff_fd(librbd::Image& image, const char *fromsnapname, } } ExportDiffContext edc(&image, fd, info.size, - g_conf->rbd_concurrent_management_ops, no_progress, - export_format); + g_conf->get_val("rbd_concurrent_management_ops"), + no_progress, export_format); r = image.diff_iterate2(fromsnapname, 0, info.size, true, whole_object, &C_ExportDiff::export_diff_cb, (void *)&edc); if (r < 0) { @@ -509,7 +509,7 @@ static int do_export(librbd::Image& image, const char *path, bool no_progress, i fd = STDOUT_FILENO; max_concurrent_ops = 1; } else { - max_concurrent_ops = g_conf->rbd_concurrent_management_ops; + max_concurrent_ops = g_conf->get_val("rbd_concurrent_management_ops"); fd = open(path, O_WRONLY | O_CREAT | O_EXCL, 0644); if (fd < 0) { return -errno; diff --git a/ceph/src/tools/rbd/action/ImageMeta.cc b/ceph/src/tools/rbd/action/ImageMeta.cc index d6dec85f6..c0ae0b8ef 100644 --- a/ceph/src/tools/rbd/action/ImageMeta.cc +++ b/ceph/src/tools/rbd/action/ImageMeta.cc @@ -33,52 +33,66 @@ int get_key(const po::variables_map &vm, std::string *key) { return 0; } +const uint32_t MAX_KEYS = 64; + } // anonymous namespace static int do_metadata_list(librbd::Image& image, Formatter *f) { - std::map pairs; int r; TextTable tbl; - r = image.metadata_list("", 0, &pairs); - if (r < 0) { - std::cerr << "failed to list metadata of image : " << cpp_strerror(r) - << std::endl; - return r; - } - - if (f) { - f->open_object_section("metadatas"); - } else { - tbl.define_column("Key", TextTable::LEFT, TextTable::LEFT); - tbl.define_column("Value", TextTable::LEFT, TextTable::LEFT); - } + size_t count = 0; + std::string last_key; + bool more_results = true; + while (more_results) { + std::map pairs; + r = image.metadata_list(last_key, MAX_KEYS, &pairs); + if (r < 0) { + std::cerr << "failed to list metadata of image : " << cpp_strerror(r) + << std::endl; + return r; + } - if (!pairs.empty()) { - bool one = (pairs.size() == 1); + more_results = (pairs.size() == MAX_KEYS); + if (!pairs.empty()) { + if (count == 0) { + if (f) { + f->open_object_section("metadatas"); + } else { + tbl.define_column("Key", TextTable::LEFT, TextTable::LEFT); + tbl.define_column("Value", TextTable::LEFT, TextTable::LEFT); + } + } - if (!f) { - std::cout << "There " << (one ? "is " : "are ") << pairs.size() - << " metadata" << (one ? "" : "s") << " on this image.\n"; - } + last_key = pairs.rbegin()->first; + count += pairs.size(); - for (std::map::iterator it = pairs.begin(); - it != pairs.end(); ++it) { - std::string val(it->second.c_str(), it->second.length()); - if (f) { - f->dump_string(it->first.c_str(), val.c_str()); - } else { - tbl << it->first << val.c_str() << TextTable::endrow; + for (auto kv : pairs) { + std::string val(kv.second.c_str(), kv.second.length()); + if (f) { + f->dump_string(kv.first.c_str(), val.c_str()); + } else { + tbl << kv.first << val << TextTable::endrow; + } } } - if (!f) - std::cout << tbl; } - if (f) { - f->close_section(); - f->flush(std::cout); + if (f == nullptr) { + bool single = (count == 1); + std::cout << "There " << (single ? "is" : "are") << " " << count << " " + << (single ? "metadatum" : "metadata") << " on this image" + << (count == 0 ? "." : ":") << std::endl; + } + + if (count > 0) { + if (f) { + f->close_section(); + f->flush(std::cout); + } else { + std::cout << std::endl << tbl; + } } return 0; } diff --git a/ceph/src/tools/rbd/action/Import.cc b/ceph/src/tools/rbd/action/Import.cc index 0f31d8103..3c7178552 100644 --- a/ceph/src/tools/rbd/action/Import.cc +++ b/ceph/src/tools/rbd/action/Import.cc @@ -37,7 +37,9 @@ struct ImportDiffContext { ImportDiffContext(librbd::Image *image, int fd, size_t size, bool no_progress) : image(image), fd(fd), size(size), pc("Importing image diff", no_progress), throttle((fd == STDIN_FILENO) ? 1 : - g_conf->rbd_concurrent_management_ops, false), last_offset(0) { + g_conf->get_val("rbd_concurrent_management_ops"), + false), + last_offset(0) { } void update_size(size_t new_size) @@ -653,7 +655,7 @@ static int do_import_v1(int fd, librbd::Image &image, uint64_t size, throttle.reset(new SimpleThrottle(1, false)); } else { throttle.reset(new SimpleThrottle( - g_conf->rbd_concurrent_management_ops, false)); + g_conf->get_val("rbd_concurrent_management_ops"), false)); } reqlen = min(reqlen, size); @@ -746,7 +748,7 @@ static int do_import(librados::Rados &rados, librbd::RBD &rbd, uint64_t order; if (opts.get(RBD_IMAGE_OPTION_ORDER, &order) != 0) { - order = g_conf->rbd_default_order; + order = g_conf->get_val("rbd_default_order"); } // try to fill whole imgblklen blocks for sparsification diff --git a/ceph/src/tools/rbd/action/Kernel.cc b/ceph/src/tools/rbd/action/Kernel.cc index 1f1951fc8..4f58cc27d 100644 --- a/ceph/src/tools/rbd/action/Kernel.cc +++ b/ceph/src/tools/rbd/action/Kernel.cc @@ -414,7 +414,8 @@ int execute_map(const po::variables_map &vm) { } // parse default options first so they can be overwritten by cli options - char *default_map_options = strdup(g_conf->rbd_default_map_options.c_str()); + char *default_map_options = strdup(g_conf->get_val( + "rbd_default_map_options").c_str()); BOOST_SCOPE_EXIT( (default_map_options) ) { free(default_map_options); } BOOST_SCOPE_EXIT_END; diff --git a/ceph/src/tools/rbd/action/List.cc b/ceph/src/tools/rbd/action/List.cc index 4c4babe99..fbac3e106 100644 --- a/ceph/src/tools/rbd/action/List.cc +++ b/ceph/src/tools/rbd/action/List.cc @@ -290,7 +290,9 @@ int execute(const po::variables_map &vm) { return r; } - r = do_list(pool_name, vm["long"].as(), g_conf->rbd_concurrent_management_ops, formatter.get()); + r = do_list(pool_name, vm["long"].as(), + g_conf->get_val("rbd_concurrent_management_ops"), + formatter.get()); if (r < 0) { std::cerr << "rbd: list: " << cpp_strerror(r) << std::endl; return r; diff --git a/ceph/src/tools/rbd/action/MirrorPool.cc b/ceph/src/tools/rbd/action/MirrorPool.cc index 0090a4206..4314b1ed6 100644 --- a/ceph/src/tools/rbd/action/MirrorPool.cc +++ b/ceph/src/tools/rbd/action/MirrorPool.cc @@ -459,7 +459,8 @@ public: m_factory(std::bind(ImageRequestAllocator(), std::ref(m_io_ctx), std::ref(m_throttle), std::placeholders::_1, std::forward(args)...)), - m_throttle(g_conf->rbd_concurrent_management_ops, true) { + m_throttle(g_conf->get_val("rbd_concurrent_management_ops"), + true) { } int execute() { diff --git a/ceph/src/tools/rbd_mirror/ImageDeleter.cc b/ceph/src/tools/rbd_mirror/ImageDeleter.cc index 07de6e93c..333d11e06 100644 --- a/ceph/src/tools/rbd_mirror/ImageDeleter.cc +++ b/ceph/src/tools/rbd_mirror/ImageDeleter.cc @@ -147,7 +147,8 @@ ImageDeleter::ImageDeleter(ContextWQ *work_queue, SafeTimer *timer, m_failed_timer_lock(timer_lock), m_asok_hook(new ImageDeleterAdminSocketHook(g_ceph_context, this)) { - set_failed_timer_interval(g_ceph_context->_conf->rbd_mirror_delete_retry_interval); + set_failed_timer_interval(g_ceph_context->_conf->get_val( + "rbd_mirror_delete_retry_interval")); m_image_deleter_thread.create("image_deleter"); } diff --git a/ceph/src/tools/rbd_mirror/ImageReplayer.cc b/ceph/src/tools/rbd_mirror/ImageReplayer.cc index a84199968..2bb31b4b1 100644 --- a/ceph/src/tools/rbd_mirror/ImageReplayer.cc +++ b/ceph/src/tools/rbd_mirror/ImageReplayer.cc @@ -526,8 +526,10 @@ void ImageReplayer::bootstrap() { CephContext *cct = static_cast(m_local->cct()); journal::Settings settings; - settings.commit_interval = cct->_conf->rbd_mirror_journal_commit_age; - settings.max_fetch_bytes = cct->_conf->rbd_mirror_journal_max_fetch_bytes; + settings.commit_interval = cct->_conf->get_val( + "rbd_mirror_journal_commit_age"); + settings.max_fetch_bytes = cct->_conf->get_val( + "rbd_mirror_journal_max_fetch_bytes"); m_remote_journaler = new Journaler(m_threads->work_queue, m_threads->timer, @@ -717,7 +719,8 @@ void ImageReplayer::handle_start_replay(int r) { { CephContext *cct = static_cast(m_local->cct()); - double poll_seconds = cct->_conf->rbd_mirror_journal_poll_age; + double poll_seconds = cct->_conf->get_val( + "rbd_mirror_journal_poll_age"); Mutex::Locker locker(m_lock); m_replay_handler = new ReplayHandler(this); diff --git a/ceph/src/tools/rbd_mirror/ImageSyncThrottler.cc b/ceph/src/tools/rbd_mirror/ImageSyncThrottler.cc index e5d08cea5..dfa96ed4d 100644 --- a/ceph/src/tools/rbd_mirror/ImageSyncThrottler.cc +++ b/ceph/src/tools/rbd_mirror/ImageSyncThrottler.cc @@ -31,8 +31,8 @@ template ImageSyncThrottler::ImageSyncThrottler() : m_lock(librbd::util::unique_lock_name("rbd::mirror::ImageSyncThrottler", this)), - m_max_concurrent_syncs( - g_ceph_context->_conf->rbd_mirror_concurrent_image_syncs) { + m_max_concurrent_syncs(g_ceph_context->_conf->get_val( + "rbd_mirror_concurrent_image_syncs")) { dout(20) << "max_concurrent_syncs=" << m_max_concurrent_syncs << dendl; g_ceph_context->_conf->add_observer(this); } @@ -205,7 +205,7 @@ template void ImageSyncThrottler::handle_conf_change(const struct md_config_t *conf, const set &changed) { if (changed.count("rbd_mirror_concurrent_image_syncs")) { - set_max_concurrent_syncs(conf->rbd_mirror_concurrent_image_syncs); + set_max_concurrent_syncs(conf->get_val("rbd_mirror_concurrent_image_syncs")); } } diff --git a/ceph/src/tools/rbd_mirror/InstanceReplayer.cc b/ceph/src/tools/rbd_mirror/InstanceReplayer.cc index 52e60605c..8b7fca17a 100644 --- a/ceph/src/tools/rbd_mirror/InstanceReplayer.cc +++ b/ceph/src/tools/rbd_mirror/InstanceReplayer.cc @@ -483,7 +483,8 @@ void InstanceReplayer::schedule_image_state_check_task() { queue_start_image_replayers(); }); - int after = g_ceph_context->_conf->rbd_mirror_image_state_check_interval; + int after = g_ceph_context->_conf->get_val( + "rbd_mirror_image_state_check_interval"); dout(20) << "scheduling image state check after " << after << " sec (task " << m_image_state_check_task << ")" << dendl; diff --git a/ceph/src/tools/rbd_mirror/InstanceWatcher.cc b/ceph/src/tools/rbd_mirror/InstanceWatcher.cc index 0c82c3007..7f94976ea 100644 --- a/ceph/src/tools/rbd_mirror/InstanceWatcher.cc +++ b/ceph/src/tools/rbd_mirror/InstanceWatcher.cc @@ -326,7 +326,7 @@ InstanceWatcher::InstanceWatcher(librados::IoCtx &io_ctx, m_lock(unique_lock_name("rbd::mirror::InstanceWatcher::m_lock", this)), m_instance_lock(librbd::ManagedLock::create( m_ioctx, m_work_queue, m_oid, this, librbd::managed_lock::EXCLUSIVE, true, - m_cct->_conf->rbd_blacklist_expire_seconds)) { + m_cct->_conf->get_val("rbd_blacklist_expire_seconds"))) { } template diff --git a/ceph/src/tools/rbd_mirror/Instances.cc b/ceph/src/tools/rbd_mirror/Instances.cc index 302700e51..56feb760a 100644 --- a/ceph/src/tools/rbd_mirror/Instances.cc +++ b/ceph/src/tools/rbd_mirror/Instances.cc @@ -228,9 +228,9 @@ void Instances::schedule_remove_task(Instance &instance) { cancel_remove_task(instance); - int after = m_cct->_conf->rbd_mirror_leader_heartbeat_interval * - (1 + m_cct->_conf->rbd_mirror_leader_max_missed_heartbeats + - m_cct->_conf->rbd_mirror_leader_max_acquire_attempts_before_break); + int after = m_cct->_conf->get_val("rbd_mirror_leader_heartbeat_interval") * + (1 + m_cct->_conf->get_val("rbd_mirror_leader_max_missed_heartbeats") + + m_cct->_conf->get_val("rbd_mirror_leader_max_acquire_attempts_before_break")); instance.timer_task = new FunctionContext( [this, &instance](int r) { diff --git a/ceph/src/tools/rbd_mirror/LeaderWatcher.cc b/ceph/src/tools/rbd_mirror/LeaderWatcher.cc index 9e99d6b6f..46f555252 100644 --- a/ceph/src/tools/rbd_mirror/LeaderWatcher.cc +++ b/ceph/src/tools/rbd_mirror/LeaderWatcher.cc @@ -33,7 +33,8 @@ LeaderWatcher::LeaderWatcher(Threads *threads, librados::IoCtx &io_ctx, m_lock("rbd::mirror::LeaderWatcher " + io_ctx.get_pool_name()), m_notifier_id(librados::Rados(io_ctx).get_instance_id()), m_leader_lock(new LeaderLock(m_ioctx, m_work_queue, m_oid, this, true, - m_cct->_conf->rbd_blacklist_expire_seconds)) { + m_cct->_conf->get_val( + "rbd_blacklist_expire_seconds"))) { } template @@ -370,7 +371,8 @@ void LeaderWatcher::schedule_timer_task(const std::string &name, m_timer_gate->timer_callback = timer_callback; }); - int after = delay_factor * m_cct->_conf->rbd_mirror_leader_heartbeat_interval; + int after = delay_factor * m_cct->_conf->get_val( + "rbd_mirror_leader_heartbeat_interval"); dout(20) << "scheduling " << name << " after " << after << " sec (task " << m_timer_task << ")" << dendl; @@ -567,8 +569,8 @@ void LeaderWatcher::handle_get_locker(int r, } } - if (m_acquire_attempts >= - m_cct->_conf->rbd_mirror_leader_max_acquire_attempts_before_break) { + if (m_acquire_attempts >= m_cct->_conf->get_val( + "rbd_mirror_leader_max_acquire_attempts_before_break")) { dout(0) << "breaking leader lock after " << m_acquire_attempts << " " << "failed attempts to acquire" << dendl; break_leader_lock(); @@ -604,7 +606,7 @@ void LeaderWatcher::schedule_acquire_leader_lock(uint32_t delay_factor) { schedule_timer_task("acquire leader lock", delay_factor * - m_cct->_conf->rbd_mirror_leader_max_missed_heartbeats, + m_cct->_conf->get_val("rbd_mirror_leader_max_missed_heartbeats"), false, &LeaderWatcher::acquire_leader_lock, false); } diff --git a/ceph/src/tools/rbd_mirror/Mirror.cc b/ceph/src/tools/rbd_mirror/Mirror.cc index b4509d5c4..61dc9bf2d 100644 --- a/ceph/src/tools/rbd_mirror/Mirror.cc +++ b/ceph/src/tools/rbd_mirror/Mirror.cc @@ -264,7 +264,7 @@ void Mirror::run() } m_cond.WaitInterval( m_lock, - utime_t(m_cct->_conf->rbd_mirror_pool_replayers_refresh_interval, 0)); + utime_t(m_cct->_conf->get_val("rbd_mirror_pool_replayers_refresh_interval"), 0)); } // stop all pool replayers in parallel diff --git a/ceph/src/tools/rbd_mirror/PoolReplayer.cc b/ceph/src/tools/rbd_mirror/PoolReplayer.cc index 6c3b228dd..8d03e878f 100644 --- a/ceph/src/tools/rbd_mirror/PoolReplayer.cc +++ b/ceph/src/tools/rbd_mirror/PoolReplayer.cc @@ -513,10 +513,10 @@ void PoolReplayer::print_status(Formatter *f, stringstream *ss) f->dump_string("local_cluster_admin_socket", reinterpret_cast(m_local_io_ctx.cct())->_conf-> - admin_socket); + get_val("admin_socket")); f->dump_string("remote_cluster_admin_socket", reinterpret_cast(m_remote_io_ctx.cct())->_conf-> - admin_socket); + get_val("admin_socket")); f->open_object_section("sync_throttler"); m_instance_watcher->print_sync_status(f, ss); diff --git a/ceph/src/tools/rbd_mirror/Threads.cc b/ceph/src/tools/rbd_mirror/Threads.cc index 8c22440a0..45a6fddd6 100644 --- a/ceph/src/tools/rbd_mirror/Threads.cc +++ b/ceph/src/tools/rbd_mirror/Threads.cc @@ -12,11 +12,13 @@ namespace mirror { template Threads::Threads(CephContext *cct) : timer_lock("Threads::timer_lock") { thread_pool = new ThreadPool(cct, "Journaler::thread_pool", "tp_journal", - cct->_conf->rbd_op_threads, "rbd_op_threads"); + cct->_conf->get_val("rbd_op_threads"), + "rbd_op_threads"); thread_pool->start(); work_queue = new ContextWQ("Journaler::work_queue", - cct->_conf->rbd_op_thread_timeout, thread_pool); + cct->_conf->get_val("rbd_op_thread_timeout"), + thread_pool); timer = new SafeTimer(cct, timer_lock, true); timer->init(); diff --git a/ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.cc b/ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.cc index dbc2560ac..6278d0101 100644 --- a/ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.cc +++ b/ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.cc @@ -39,7 +39,8 @@ ImageCopyRequest::ImageCopyRequest(I *local_image_ctx, I *remote_image_ctx, m_progress_ctx(progress_ctx), m_lock(unique_lock_name("ImageCopyRequest::m_lock", this)), m_updating_sync_point(false), m_update_sync_ctx(nullptr), - m_update_sync_point_interval(m_local_image_ctx->cct->_conf->rbd_mirror_sync_point_update_age), + m_update_sync_point_interval(m_local_image_ctx->cct->_conf->template get_val( + "rbd_mirror_sync_point_update_age")), m_client_meta_copy(*client_meta) { assert(!m_client_meta_copy.sync_points.empty()); } @@ -142,7 +143,7 @@ void ImageCopyRequest::send_object_copies() { bool complete; { Mutex::Locker locker(m_lock); - for (int i = 0; i < cct->_conf->rbd_concurrent_management_ops; ++i) { + for (int i = 0; i < cct->_conf->get_val("rbd_concurrent_management_ops"); ++i) { send_next_object_copy(); if (m_ret_val < 0 && m_current_ops == 0) { break; diff --git a/ceph/src/tools/rbd_nbd/rbd-nbd.cc b/ceph/src/tools/rbd_nbd/rbd-nbd.cc index a3d357731..bf7477f4d 100644 --- a/ceph/src/tools/rbd_nbd/rbd-nbd.cc +++ b/ceph/src/tools/rbd_nbd/rbd-nbd.cc @@ -233,7 +233,7 @@ private: if (ret == -EINVAL) { // if shrinking an image, a pagecache writeback might reference // extents outside of the range of the new image extents - dout(5) << __func__ << ": masking IO out-of-bounds error" << dendl; + dout(0) << __func__ << ": masking IO out-of-bounds error" << dendl; ctx->data.clear(); ret = 0; } @@ -924,14 +924,26 @@ static int do_list_mapped_devices() static int parse_args(vector& args, std::ostream *err_msg, Config *cfg) { - std::vector::iterator i; - std::ostringstream err; + std::string conf_file_list; + std::string cluster; + CephInitParameters iparams = ceph_argparse_early_args( + args, CEPH_ENTITY_TYPE_CLIENT, &cluster, &conf_file_list); md_config_t config; - config.parse_config_files(nullptr, nullptr, 0); + config.name = iparams.name; + config.cluster = cluster; + + if (!conf_file_list.empty()) { + config.parse_config_files(conf_file_list.c_str(), nullptr, 0); + } else { + config.parse_config_files(nullptr, nullptr, 0); + } config.parse_env(); config.parse_argv(args); - cfg->poolname = config.rbd_default_pool; + cfg->poolname = config.get_val("rbd_default_pool"); + + std::vector::iterator i; + std::ostringstream err; for (i = args.begin(); i != args.end(); ) { if (ceph_argparse_flag(args, i, "-h", "--help", (char*)NULL)) { -- 2.39.2