Commit bf36b5f4 authored by Vladimir Bashkirtsev's avatar Vladimir Bashkirtsev

Updated ceph to 16.2.4

parent 62e18750
...@@ -31,26 +31,24 @@ all: ceph-config ceph-sudoer ...@@ -31,26 +31,24 @@ all: ceph-config ceph-sudoer
mkdir ceph-home mkdir ceph-home
ln -s /lib /lib64 ln -s /lib /lib64
tar xf ceph-15.2.17.tar.gz tar xf ceph-16.2.4.tar.gz
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_v2_frame.patch patch -Np1 -d ceph-16.2.4 < ceph-16.2.4-fix_v2_frame.patch
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_cpu_detection.patch patch -Np1 -d ceph-16.2.4 < ceph-16.2.4-fix_tests.patch
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_tests.patch patch -Np1 -d ceph-16.2.4 < ceph-16.2.4-fix_pytest.patch
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_ceph-volume_systemd_unit.patch # patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_pip.patch
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-no_git.patch # patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-Cython_fix.patch
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_librbd_duplicate.patch # patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_mypy_with_python3.9.patch
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_ErasureCodeShec.patch # if [ `uname -m` = 'armv7l' ] ; then \
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-fix_pip.patch # patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-arm32_fix.patch ; \
if [ `uname -m` = 'armv7l' ] ; then \ # patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-arm32_fix_tests.patch ; \
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-arm32_fix.patch ; \ # fi
patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-arm32_fix_tests.patch ; \ cd ceph-16.2.4 && HOME=$(CURDIR)/ceph-home ./do_cmake.sh -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_LIBEXECDIR=/lib -DWITH_SPDK=OFF -DWITH_RDMA=OFF -DWITH_RADOSGW_AMQP_ENDPOINT=OFF -DALLOCATOR=tcmalloc_minimal
fi $(MAKE) -C ceph-16.2.4/build npm_config_cache=/build/.npm NODE_OPTIONS="--max-old-space-size=3072"
cd ceph-15.2.17 && HOME=$(CURDIR)/ceph-home ./do_cmake.sh -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_LIBEXECDIR=/lib -DWITH_SPDK=OFF -DWITH_RDMA=OFF -DWITH_RADOSGW_AMQP_ENDPOINT=OFF -DWITH_PYTHON2=OFF -DWITH_PYTHON3=ON -DALLOCATOR=tcmalloc_minimal
$(MAKE) -C ceph-15.2.17/build npm_config_cache=/build/.npm NODE_OPTIONS="--max-old-space-size=3072"
hostname localhost hostname localhost
cd ceph-15.2.17 && tar xf ../ceph-object-corpus.tar.xz cd ceph-16.2.4 && tar xf ../ceph-object-corpus.tar.xz
cd ceph-15.2.17/build && HOME=$(CURDIR)/ceph-home CTEST_OUTPUT_ON_FAILURE=1 NODE_OPTIONS="--max-old-space-size=3072" VIRTUALENV_SYSTEM_SITE_PACKAGES=True SETUPTOOLS_USE_DISTUTILS=stdlib make check cd ceph-16.2.4/build && HOME=$(CURDIR)/ceph-home CTEST_OUTPUT_ON_FAILURE=1 NODE_OPTIONS="--max-old-space-size=3072" VIRTUALENV_SYSTEM_SITE_PACKAGES=True SETUPTOOLS_USE_DISTUTILS=stdlib make check
$(MAKE) -C ceph-15.2.17/build install $(MAKE) -C ceph-16.2.4/build install
rm /usr/bin/ceph_test* rm /usr/bin/ceph_test*
find / -name *.pyc -exec rm -f '{}' ';' find / -name *.pyc -exec rm -f '{}' ';'
find / -name *.js.map -exec rm -f '{}' ';' find / -name *.js.map -exec rm -f '{}' ';'
...@@ -78,7 +76,7 @@ all: ceph-config ceph-sudoer ...@@ -78,7 +76,7 @@ all: ceph-config ceph-sudoer
install -v -Dm755 ceph-mon-bootstrap /usr/sbin/ceph-mon-bootstrap install -v -Dm755 ceph-mon-bootstrap /usr/sbin/ceph-mon-bootstrap
ln -s ../dist /usr/share/ceph/mgr/dashboard/frontend/dist/en-US ln -s ../dist /usr/share/ceph/mgr/dashboard/frontend/dist/en-US
ln -s /usr/lib/python3.8/site-packages/ceph-1.0.0-py3.8.egg/ceph /usr/lib/python3.8/site-packages/ceph ln -s /usr/lib/python3.9/site-packages/ceph-1.0.0-py3.9.egg/ceph /usr/lib/python3.9/site-packages/ceph
@echo "$$CEPH_CONFIG" > /etc/config/ceph @echo "$$CEPH_CONFIG" > /etc/config/ceph
install -v -Dm755 ceph /usr/share/easycwmp/functions install -v -Dm755 ceph /usr/share/easycwmp/functions
...@@ -99,7 +97,7 @@ all: ceph-config ceph-sudoer ...@@ -99,7 +97,7 @@ all: ceph-config ceph-sudoer
swapoff swap swapoff swap
rm -rf swap rm -rf swap
rm -rf ceph-15.2.17 rm -rf ceph-16.2.4
ceph-config: ceph-config:
define CEPH_CONFIG define CEPH_CONFIG
......
diff -uNr ceph-15.2.17/src/client/Client.cc ceph-15.2.17-arm32_fix/src/client/Client.cc
--- ceph-15.2.17/src/client/Client.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/client/Client.cc 2023-03-08 16:31:26.123393869 +1030
@@ -11067,7 +11067,7 @@
ldout(cct, 20) << __func__ << " " << in << " " << in->ino << " -> " << in->ll_ref << dendl;
}
-int Client::_ll_put(Inode *in, uint64_t num)
+int Client::_ll_put(Inode *in, size_t num)
{
in->ll_put(num);
ldout(cct, 20) << __func__ << " " << in << " " << in->ino << " " << num << " -> " << in->ll_ref << dendl;
@@ -11108,7 +11108,7 @@
}
}
-bool Client::_ll_forget(Inode *in, uint64_t count)
+bool Client::_ll_forget(Inode *in, size_t count)
{
inodeno_t ino = in->ino;
@@ -11137,7 +11137,7 @@
return last;
}
-bool Client::ll_forget(Inode *in, uint64_t count)
+bool Client::ll_forget(Inode *in, size_t count)
{
std::lock_guard lock(client_lock);
return _ll_forget(in, count);
diff -uNr ceph-15.2.17/src/client/Client.h ceph-15.2.17-arm32_fix/src/client/Client.h
--- ceph-15.2.17/src/client/Client.h 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/client/Client.h 2023-03-08 16:31:26.124393871 +1030
@@ -484,7 +484,7 @@
int ll_lookupx(Inode *parent, const char *name, Inode **out,
struct ceph_statx *stx, unsigned want, unsigned flags,
const UserPerm& perms);
- bool ll_forget(Inode *in, uint64_t count);
+ bool ll_forget(Inode *in, size_t count);
bool ll_put(Inode *in);
int ll_get_snap_ref(snapid_t snap);
@@ -1032,7 +1032,7 @@
void _fragmap_remove_stopped_mds(Inode *in, mds_rank_t mds);
void _ll_get(Inode *in);
- int _ll_put(Inode *in, uint64_t num);
+ int _ll_put(Inode *in, size_t num);
void _ll_drop_pins();
Fh *_create_fh(Inode *in, int flags, int cmode, const UserPerm& perms);
@@ -1186,7 +1186,7 @@
int _lookup_parent(Inode *in, const UserPerm& perms, Inode **parent=NULL);
int _lookup_name(Inode *in, Inode *parent, const UserPerm& perms);
int _lookup_vino(vinodeno_t ino, const UserPerm& perms, Inode **inode=NULL);
- bool _ll_forget(Inode *in, uint64_t count);
+ bool _ll_forget(Inode *in, size_t count);
uint32_t deleg_timeout = 0;
diff -uNr ceph-15.2.17/src/client/fuse_ll.cc ceph-15.2.17-arm32_fix/src/client/fuse_ll.cc
--- ceph-15.2.17/src/client/fuse_ll.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/client/fuse_ll.cc 2023-03-08 16:31:26.125393874 +1030
@@ -192,7 +192,7 @@
}
static void fuse_ll_forget(fuse_req_t req, fuse_ino_t ino,
- long unsigned nlookup)
+ uint64_t nlookup)
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
cfuse->client->ll_forget(cfuse->iget(ino), nlookup+1);
diff -uNr ceph-15.2.17/src/common/options.h ceph-15.2.17-arm32_fix/src/common/options.h
--- ceph-15.2.17/src/common/options.h 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/common/options.h 2023-03-08 16:31:26.126393877 +1030
@@ -35,7 +35,7 @@
case TYPE_ADDR: return "entity_addr_t";
case TYPE_ADDRVEC: return "entity_addrvec_t";
case TYPE_UUID: return "uuid_d";
- case TYPE_SIZE: return "size_t";
+ case TYPE_SIZE: return "uint64_t";
case TYPE_SECS: return "secs";
default: return "unknown";
}
@@ -121,7 +121,7 @@
};
struct size_t {
- std::size_t value;
+ std::uint64_t value;
operator uint64_t() const {
return static_cast<uint64_t>(value);
}
@@ -262,7 +262,7 @@
case TYPE_BOOL:
v = bool(new_value); break;
case TYPE_SIZE:
- v = size_t{static_cast<std::size_t>(new_value)}; break;
+ v = size_t{static_cast<std::uint64_t>(new_value)}; break;
case TYPE_SECS:
v = std::chrono::seconds{new_value}; break;
default:
diff -uNr ceph-15.2.17/src/librbd/object_map/DiffRequest.cc ceph-15.2.17-arm32_fix/src/librbd/object_map/DiffRequest.cc
--- ceph-15.2.17/src/librbd/object_map/DiffRequest.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/librbd/object_map/DiffRequest.cc 2023-03-08 16:31:26.126393877 +1030
@@ -175,7 +175,7 @@
m_object_map.resize(num_objs);
}
- size_t prev_object_diff_state_size = m_object_diff_state->size();
+ uint64_t prev_object_diff_state_size = m_object_diff_state->size();
if (prev_object_diff_state_size < num_objs) {
// the diff state should be the largest of all snapshots in the set
m_object_diff_state->resize(num_objs);
diff -uNr ceph-15.2.17/src/mds/PurgeQueue.h ceph-15.2.17-arm32_fix/src/mds/PurgeQueue.h
--- ceph-15.2.17/src/mds/PurgeQueue.h 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/mds/PurgeQueue.h 2023-03-08 16:31:26.126393877 +1030
@@ -219,6 +219,6 @@
size_t purge_item_journal_size;
uint64_t ops_high_water = 0;
- uint64_t files_high_water = 0;
+ size_t files_high_water = 0;
};
#endif
diff -uNr ceph-15.2.17/src/pybind/mgr/cephadm/module.py ceph-15.2.17-arm32_fix/src/pybind/mgr/cephadm/module.py
--- ceph-15.2.17/src/pybind/mgr/cephadm/module.py 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/pybind/mgr/cephadm/module.py 2023-03-08 16:31:26.127393879 +1030
@@ -342,7 +342,7 @@
raise RuntimeError("unable to read cephadm at '%s': %s" % (
path, str(e)))
- self._worker_pool = multiprocessing.pool.ThreadPool(10)
+ self._worker_pool = multiprocessing.pool.ThreadPool(3)
self._reconfig_ssh()
diff -uNr ceph-15.2.17/src/pybind/mgr/dashboard/frontend/package.json ceph-15.2.17-arm32_fix/src/pybind/mgr/dashboard/frontend/package.json
--- ceph-15.2.17/src/pybind/mgr/dashboard/frontend/package.json 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/pybind/mgr/dashboard/frontend/package.json 2023-03-08 16:32:29.560561162 +1030
@@ -121,7 +121,6 @@
"@types/node": "12.12.34",
"@types/simplebar": "5.1.1",
"codelyzer": "5.2.2",
- "cypress": "9.0.0",
"html-linter": "1.1.1",
"htmllint-cli": "0.0.7",
"jest": "25.5.4",
diff -uNr ceph-15.2.17/src/test/common/test_json_formattable.cc ceph-15.2.17-arm32_fix/src/test/common/test_json_formattable.cc
--- ceph-15.2.17/src/test/common/test_json_formattable.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/test/common/test_json_formattable.cc 2023-03-08 16:31:26.127393879 +1030
@@ -371,7 +371,7 @@
struct2() {
void *p = (void *)this;
- long i = (long)p;
+ unsigned long i = (unsigned long)p;
v.resize((i >> 16) % 16 + 1);
}
diff -uNr ceph-15.2.17/src/test/libcephfs/ceph_pthread_self.h ceph-15.2.17-arm32_fix/src/test/libcephfs/ceph_pthread_self.h
--- ceph-15.2.17/src/test/libcephfs/ceph_pthread_self.h 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/test/libcephfs/ceph_pthread_self.h 2023-03-08 16:31:26.127393879 +1030
@@ -25,7 +25,7 @@
static_assert(std::is_convertible_v<decltype(me), uint64_t> ||
std::is_pointer_v<decltype(me)>,
"we need to use pthread_self() for the owner parameter");
- return reinterpret_cast<uint64_t>(me);
+ return reinterpret_cast<uint64_t>((uint64_t) me);
}
#endif
diff -uNr ceph-15.2.17/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc ceph-15.2.17-arm32_fix/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc
--- ceph-15.2.17/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc 2023-03-08 16:31:26.128393882 +1030
@@ -162,7 +162,7 @@
int r) {
bufferlist bl;
encode(last_image_id, bl);
- encode(static_cast<size_t>(1024), bl);
+ encode(static_cast<uint64_t>(1024), bl);
bufferlist out_bl;
encode(images, out_bl);
diff -uNr ceph-15.2.17/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc ceph-15.2.17-arm32_fix/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc
--- ceph-15.2.17/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc 2023-03-08 16:31:26.128393882 +1030
@@ -253,7 +253,7 @@
json_spirit::mObject root_obj;
root_obj["replay_state"] = replay_state;
- root_obj["remote_snapshot_timestamp"] = remote_snap_info->timestamp.sec();
+ root_obj["remote_snapshot_timestamp"] = (uint64_t) remote_snap_info->timestamp.sec();
auto matching_remote_snap_id = util::compute_remote_snap_id(
m_state_builder->local_image_ctx->image_lock,
@@ -268,7 +268,7 @@
// the local snapshot would just be the time the snapshot was
// synced and not the consistency point in time.
root_obj["local_snapshot_timestamp"] =
- matching_remote_snap_it->second.timestamp.sec();
+ (uint64_t) matching_remote_snap_it->second.timestamp.sec();
}
matching_remote_snap_it = m_state_builder->remote_image_ctx->snap_info.find(
@@ -276,7 +276,7 @@
if (m_remote_snap_id_end != CEPH_NOSNAP &&
matching_remote_snap_it !=
m_state_builder->remote_image_ctx->snap_info.end()) {
- root_obj["syncing_snapshot_timestamp"] = remote_snap_info->timestamp.sec();
+ root_obj["syncing_snapshot_timestamp"] = (uint64_t) remote_snap_info->timestamp.sec();
root_obj["syncing_percent"] = static_cast<uint64_t>(
100 * m_local_mirror_snap_ns.last_copied_object_number /
static_cast<float>(std::max<uint64_t>(1U, m_local_object_count)));
diff -uNr ceph-15.2.17/src/test/librados_test_stub/TestIoCtxImpl.h ceph-15.2.17-arm32_fix_tests/src/test/librados_test_stub/TestIoCtxImpl.h
--- ceph-15.2.17/src/test/librados_test_stub/TestIoCtxImpl.h 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librados_test_stub/TestIoCtxImpl.h 2023-02-09 16:51:19.876567322 +1030
@@ -197,6 +197,9 @@
};
TestRadosClient *m_client;
+#ifdef __arm__
+ int64_t spacer = 0;
+#endif
int64_t m_pool_id = 0;
std::string m_pool_name;
std::string m_namespace_name;
diff -uNr ceph-15.2.17/src/test/librbd/CMakeLists.txt ceph-15.2.17-arm32_fix_tests/src/test/librbd/CMakeLists.txt
--- ceph-15.2.17/src/test/librbd/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/CMakeLists.txt 2023-02-09 16:51:19.876567322 +1030
@@ -15,6 +15,10 @@
test_DeepCopy.cc
test_Groups.cc
test_Migration.cc
+ test_MigrationAbort.cc
+ test_MigrationClone.cc
+ test_MigrationSnaps.cc
+ test_MigrationStress.cc
test_MirroringWatcher.cc
test_ObjectMap.cc
test_Operations.cc
diff -uNr ceph-15.2.17/src/test/librbd/test_DeepCopy.cc ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_DeepCopy.cc
--- ceph-15.2.17/src/test/librbd/test_DeepCopy.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_DeepCopy.cc 2023-02-09 16:51:19.877567325 +1030
@@ -362,14 +362,14 @@
size = initial_size = m_src_ictx->get_image_size(CEPH_NOSNAP);
}
- int nsnaps = 4;
+ int nsnaps = 2;
const char *c = getenv("TEST_RBD_DEEPCOPY_STRESS_NSNAPS");
if (c != NULL) {
std::stringstream ss(c);
ASSERT_TRUE(ss >> nsnaps);
}
- int nwrites = 4;
+ int nwrites = 2;
c = getenv("TEST_RBD_DEEPCOPY_STRESS_NWRITES");
if (c != NULL) {
std::stringstream ss(c);
diff -uNr ceph-15.2.17/src/test/librbd/test_main.cc ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_main.cc
--- ceph-15.2.17/src/test/librbd/test_main.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_main.cc 2023-02-09 16:51:19.877567325 +1030
@@ -18,6 +18,7 @@
extern void register_test_journal_entries();
extern void register_test_journal_replay();
extern void register_test_migration();
+extern void register_test_migration_stress();
extern void register_test_mirroring();
extern void register_test_mirroring_watcher();
extern void register_test_object_map();
@@ -38,6 +39,7 @@
register_test_journal_entries();
register_test_journal_replay();
register_test_migration();
+ register_test_migration_stress();
register_test_mirroring();
register_test_mirroring_watcher();
register_test_object_map();
diff -uNr ceph-15.2.17/src/test/librbd/test_MigrationAbort.cc ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationAbort.cc
--- ceph-15.2.17/src/test/librbd/test_MigrationAbort.cc 1970-01-01 09:30:00.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationAbort.cc 2023-02-09 16:51:19.877567325 +1030
@@ -0,0 +1,472 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "test/librados/test.h"
+#include "test/librbd/test_fixture.h"
+#include "test/librbd/test_support.h"
+#include "librbd/ImageState.h"
+#include "librbd/Operations.h"
+#include "librbd/api/Group.h"
+#include "librbd/api/Image.h"
+#include "librbd/api/Migration.h"
+#include "librbd/api/Mirror.h"
+#include "librbd/api/Namespace.h"
+#include "librbd/api/Snapshot.h"
+#include "librbd/image/AttachChildRequest.h"
+#include "librbd/image/AttachParentRequest.h"
+#include "librbd/internal.h"
+#include "librbd/io/ImageRequestWQ.h"
+#include "librbd/io/ReadResult.h"
+#include "common/Cond.h"
+#include <boost/scope_exit.hpp>
+
+void register_test_migration() {
+}
+
+struct TestMigration : public TestFixture {
+ static void SetUpTestCase() {
+ TestFixture::SetUpTestCase();
+
+ _other_pool_name = get_temp_pool_name("test-librbd-");
+ ASSERT_EQ(0, _rados.pool_create(_other_pool_name.c_str()));
+ }
+
+ static void TearDownTestCase() {
+ ASSERT_EQ(0, _rados.pool_delete(_other_pool_name.c_str()));
+
+ TestFixture::TearDownTestCase();
+ }
+
+ void SetUp() override {
+ TestFixture::SetUp();
+
+ ASSERT_EQ(0, _rados.ioctx_create(_other_pool_name.c_str(),
+ _other_pool_ioctx));
+
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ m_image_id = m_ictx->id;
+
+ std::string ref_image_name = get_temp_image_name();
+ ASSERT_EQ(0, create_image_pp(m_rbd, m_ioctx, ref_image_name, m_ictx->size));
+ EXPECT_EQ(0, _rados.ioctx_create2(m_ioctx.get_id(), m_ref_ioctx));
+ open_image(m_ref_ioctx, ref_image_name, &m_ref_ictx);
+
+ resize(20 * (1 << 22));
+ }
+
+ void TearDown() override {
+ if (m_ref_ictx != nullptr) {
+ close_image(m_ref_ictx);
+ }
+ if (m_ictx != nullptr) {
+ close_image(m_ictx);
+ }
+
+ _other_pool_ioctx.close();
+
+ TestFixture::TearDown();
+ }
+
+ void compare(const std::string &description = "") {
+ vector<librbd::snap_info_t> src_snaps, dst_snaps;
+
+ EXPECT_EQ(m_ref_ictx->size, m_ictx->size);
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ref_ictx, src_snaps));
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ictx, dst_snaps));
+ EXPECT_EQ(src_snaps.size(), dst_snaps.size());
+ for (size_t i = 0; i <= src_snaps.size(); i++) {
+ const char *src_snap_name = nullptr;
+ const char *dst_snap_name = nullptr;
+ if (i < src_snaps.size()) {
+ EXPECT_EQ(src_snaps[i].name, dst_snaps[i].name);
+ src_snap_name = src_snaps[i].name.c_str();
+ dst_snap_name = dst_snaps[i].name.c_str();
+ }
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ref_ictx, cls::rbd::UserSnapshotNamespace(),
+ src_snap_name));
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ictx, cls::rbd::UserSnapshotNamespace(),
+ dst_snap_name));
+ compare_snaps(
+ description + " snap: " + (src_snap_name ? src_snap_name : "null"),
+ m_ref_ictx, m_ictx);
+ }
+ }
+
+ void compare_snaps(const std::string &description, librbd::ImageCtx *src_ictx,
+ librbd::ImageCtx *dst_ictx) {
+ uint64_t src_size, dst_size;
+ {
+ std::shared_lock src_locker{src_ictx->image_lock};
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ src_size = src_ictx->get_image_size(src_ictx->snap_id);
+ dst_size = dst_ictx->get_image_size(dst_ictx->snap_id);
+ }
+ if (src_size != dst_size) {
+ std::cout << description << ": size differs" << std::endl;
+ EXPECT_EQ(src_size, dst_size);
+ }
+
+ if (dst_ictx->test_features(RBD_FEATURE_LAYERING)) {
+ bool flags_set;
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ EXPECT_EQ(0, dst_ictx->test_flags(dst_ictx->snap_id,
+ RBD_FLAG_OBJECT_MAP_INVALID,
+ dst_ictx->image_lock, &flags_set));
+ EXPECT_FALSE(flags_set);
+ }
+
+ ssize_t read_size = 1 << src_ictx->order;
+ uint64_t offset = 0;
+ while (offset < src_size) {
+ read_size = std::min(read_size, static_cast<ssize_t>(src_size - offset));
+
+ bufferptr src_ptr(read_size);
+ bufferlist src_bl;
+ src_bl.push_back(src_ptr);
+ librbd::io::ReadResult src_result{&src_bl};
+ EXPECT_EQ(read_size, src_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{src_result}, 0));
+
+ bufferptr dst_ptr(read_size);
+ bufferlist dst_bl;
+ dst_bl.push_back(dst_ptr);
+ librbd::io::ReadResult dst_result{&dst_bl};
+ EXPECT_EQ(read_size, dst_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{dst_result}, 0));
+
+ if (!src_bl.contents_equal(dst_bl)) {
+ std::cout << description
+ << ", block " << offset << "~" << read_size << " differs"
+ << std::endl;
+ std::cout << "src block: " << src_ictx->id << ": " << std::endl; src_bl.hexdump(std::cout);
+ std::cout << "dst block: " << dst_ictx->id << ": " << std::endl; dst_bl.hexdump(std::cout);
+ }
+ EXPECT_TRUE(src_bl.contents_equal(dst_bl));
+ offset += read_size;
+ }
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ const std::string &id, bool read_only, int flags,
+ librbd::ImageCtx **ictx) {
+ *ictx = new librbd::ImageCtx(name, id, nullptr, io_ctx, read_only);
+ m_ictxs.insert(*ictx);
+
+ ASSERT_EQ(0, (*ictx)->state->open(flags));
+ (*ictx)->discard_granularity_bytes = 0;
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ librbd::ImageCtx **ictx) {
+ open_image(io_ctx, name, "", false, 0, ictx);
+ }
+
+ void migration_prepare(librados::IoCtx& dst_io_ctx,
+ const std::string &dst_name, int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ EXPECT_EQ(r, librbd::api::Migration<>::prepare(m_ioctx, m_image_name,
+ dst_io_ctx, dst_name,
+ m_opts));
+ if (r == 0) {
+ open_image(dst_io_ctx, dst_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ }
+ compare("after prepare");
+ }
+
+ void migration_execute(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::execute(io_ctx, name, no_op));
+ }
+
+ void migration_abort(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ std::string dst_name = m_ictx->name;
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::abort(io_ctx, name, no_op));
+
+ if (r == 0) {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, dst_name, &m_ictx);
+ }
+
+ compare("after abort");
+ }
+
+ void migration_commit(librados::IoCtx& io_ctx, const std::string &name) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(0, librbd::api::Migration<>::commit(io_ctx, name, no_op));
+
+ compare("after commit");
+ }
+
+ void migration_status(librbd::image_migration_state_t state) {
+ librbd::image_migration_status_t status;
+ EXPECT_EQ(0, librbd::api::Migration<>::status(m_ioctx, m_image_name,
+ &status));
+ EXPECT_EQ(status.source_pool_id, m_ioctx.get_id());
+ EXPECT_EQ(status.source_pool_namespace, m_ioctx.get_namespace());
+ EXPECT_EQ(status.source_image_name, m_image_name);
+ EXPECT_EQ(status.source_image_id, m_image_id);
+ EXPECT_EQ(status.dest_pool_id, m_ictx->md_ctx.get_id());
+ EXPECT_EQ(status.dest_pool_namespace, m_ictx->md_ctx.get_namespace());
+ EXPECT_EQ(status.dest_image_name, m_ictx->name);
+ EXPECT_EQ(status.dest_image_id, m_ictx->id);
+ EXPECT_EQ(status.state, state);
+ }
+
+ void migrate(librados::IoCtx& dst_io_ctx, const std::string &dst_name) {
+ migration_prepare(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+ migration_execute(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(dst_io_ctx, dst_name);
+ }
+
+ void write(uint64_t off, uint64_t len, char c) {
+ std::cout << "write: " << c << " " << off << "~" << len << std::endl;
+
+ bufferlist ref_bl;
+ ref_bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->write(off, len, std::move(ref_bl), 0));
+ bufferlist bl;
+ bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->write(off, len, std::move(bl), 0));
+ }
+
+ void discard(uint64_t off, uint64_t len) {
+ std::cout << "discard: " << off << "~" << len << std::endl;
+
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->discard(off, len, false));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->discard(off, len, false));
+ }
+
+ void flush() {
+ ASSERT_EQ(0, m_ref_ictx->io_work_queue->flush());
+ ASSERT_EQ(0, m_ictx->io_work_queue->flush());
+ }
+
+ void snap_create(const std::string &snap_name) {
+ std::cout << "snap_create: " << snap_name << std::endl;
+
+ flush();
+
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ictx, snap_name));
+ }
+
+ void snap_protect(const std::string &snap_name) {
+ std::cout << "snap_protect: " << snap_name << std::endl;
+
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ictx, snap_name));
+ }
+
+ void clone(const std::string &snap_name) {
+ snap_protect(snap_name);
+
+ int order = m_ref_ictx->order;
+ uint64_t features;
+ ASSERT_EQ(0, librbd::get_features(m_ref_ictx, &features));
+
+ std::string ref_clone_name = get_temp_image_name();
+ std::string clone_name = get_temp_image_name();
+
+ std::cout << "clone " << m_ictx->name << " -> " << clone_name
+ << std::endl;
+
+ ASSERT_EQ(0, librbd::clone(m_ref_ictx->md_ctx, m_ref_ictx->name.c_str(),
+ snap_name.c_str(), m_ref_ioctx,
+ ref_clone_name.c_str(), features, &order,
+ m_ref_ictx->stripe_unit,
+ m_ref_ictx->stripe_count));
+
+ ASSERT_EQ(0, librbd::clone(m_ictx->md_ctx, m_ictx->name.c_str(),
+ snap_name.c_str(), m_ioctx,
+ clone_name.c_str(), features, &order,
+ m_ictx->stripe_unit,
+ m_ictx->stripe_count));
+
+ close_image(m_ref_ictx);
+ open_image(m_ref_ioctx, ref_clone_name, &m_ref_ictx);
+
+ close_image(m_ictx);
+ open_image(m_ioctx, clone_name, &m_ictx);
+ m_image_name = m_ictx->name;
+ m_image_id = m_ictx->id;
+ }
+
+ void resize(uint64_t size) {
+ std::cout << "resize: " << size << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ ASSERT_EQ(0, m_ref_ictx->operations->resize(size, true, no_op));
+ ASSERT_EQ(0, m_ictx->operations->resize(size, true, no_op));
+ }
+
+ void test_no_snaps() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, '1');
+ write(2 * len, len, '1');
+ flush();
+ }
+
+ void test_snaps() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, '1');
+ snap_create("snap1");
+ write(1 * len, len, '1');
+
+ write(0 * len, 1000, 'X');
+ discard(1000 + 10, 1000);
+
+ snap_create("snap2");
+
+ write(1 * len, 1000, 'X');
+ discard(2 * len + 10, 1000);
+
+ uint64_t size = m_ictx->size;
+
+ resize(size << 1);
+
+ write(size - 1, len, '2');
+
+ snap_create("snap3");
+
+ resize(size);
+
+ discard(size - 1, 1);
+
+ flush();
+ }
+
+ void test_clone() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, 'X');
+ write(2 * len, len, 'X');
+
+ snap_create("snap");
+ clone("snap");
+
+ write(0, 1000, 'X');
+ discard(1010, 1000);
+
+ snap_create("snap");
+ clone("snap");
+
+ write(1000, 1000, 'X');
+ discard(2010, 1000);
+
+ flush();
+ }
+
+ template <typename L>
+ void test_migrate_parent(uint32_t clone_format, L&& test) {
+ REQUIRE_FEATURE(RBD_FEATURE_LAYERING);
+
+ std::string prev_clone_format;
+ ASSERT_EQ(0, _rados.conf_get("rbd_default_clone_format",
+ prev_clone_format));
+ ASSERT_EQ(0, _rados.conf_set("rbd_default_clone_format",
+ stringify(clone_format).c_str()));
+ BOOST_SCOPE_EXIT_TPL(&prev_clone_format) {
+ _rados.conf_set("rbd_default_clone_format", prev_clone_format.c_str());
+ } BOOST_SCOPE_EXIT_END;
+
+ write(0, 10, 'A');
+ snap_create("snap1");
+ snap_protect("snap1");
+
+ int order = m_ictx->order;
+ uint64_t features;
+ ASSERT_EQ(0, librbd::get_features(m_ictx, &features));
+
+ std::string clone_name = get_temp_image_name();
+ ASSERT_EQ(0, librbd::clone(m_ictx->md_ctx, m_ictx->name.c_str(), "snap1",
+ m_ioctx, clone_name.c_str(), features, &order,
+ m_ictx->stripe_unit, m_ictx->stripe_count));
+
+ librbd::ImageCtx *child_ictx;
+ open_image(m_ioctx, clone_name, &child_ictx);
+
+ test(child_ictx);
+
+ ASSERT_EQ(0, child_ictx->state->refresh());
+
+ bufferlist bl;
+ bufferptr ptr(10);
+ bl.push_back(ptr);
+ librbd::io::ReadResult result{&bl};
+ ASSERT_EQ(10, child_ictx->io_work_queue->read(
+ 0, 10, librbd::io::ReadResult{result}, 0));
+ bufferlist ref_bl;
+ ref_bl.append(std::string(10, 'A'));
+ ASSERT_TRUE(ref_bl.contents_equal(bl));
+ close_image(child_ictx);
+ }
+
+ static std::string _other_pool_name;
+ static librados::IoCtx _other_pool_ioctx;
+
+ std::string m_image_id;
+ librbd::ImageCtx *m_ictx = nullptr;
+ librados::IoCtx m_ref_ioctx;
+ librbd::ImageCtx *m_ref_ictx = nullptr;
+ librbd::ImageOptions m_opts;
+};
+
+std::string TestMigration::_other_pool_name;
+librados::IoCtx TestMigration::_other_pool_ioctx;
+
+TEST_F(TestMigration, AbortInUseImage) {
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(-EBUSY, librbd::api::Migration<>::abort(m_ioctx, m_ictx->name,
+ no_op));
+}
+
+TEST_F(TestMigration, AbortWithoutSnapshots) {
+ test_no_snaps();
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+ test_no_snaps();
+ migration_abort(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, AbortWithSnapshots) {
+ test_snaps();
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ test_no_snaps();
+ flush();
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ictx, "dst-only-snap"));
+
+ test_no_snaps();
+
+ migration_abort(m_ioctx, m_image_name);
+}
diff -uNr ceph-15.2.17/src/test/librbd/test_Migration.cc ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_Migration.cc
--- ceph-15.2.17/src/test/librbd/test_Migration.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_Migration.cc 2023-02-09 16:51:19.877567325 +1030
@@ -427,94 +427,6 @@
close_image(child_ictx);
}
- void test_stress(const std::string &snap_name_prefix = "snap",
- char start_char = 'A') {
- uint64_t initial_size = m_ictx->size;
-
- int nsnaps = 4;
- const char *c = getenv("TEST_RBD_MIGRATION_STRESS_NSNAPS");
- if (c != NULL) {
- std::stringstream ss(c);
- ASSERT_TRUE(ss >> nsnaps);
- }
-
- int nwrites = 4;
- c = getenv("TEST_RBD_MIGRATION_STRESS_NWRITES");
- if (c != NULL) {
- std::stringstream ss(c);
- ASSERT_TRUE(ss >> nwrites);
- }
-
- for (int i = 0; i < nsnaps; i++) {
- for (int j = 0; j < nwrites; j++) {
- size_t len = rand() % ((1 << m_ictx->order) * 2);
- ASSERT_GT(m_ictx->size, len);
- uint64_t off = std::min(static_cast<uint64_t>(rand() % m_ictx->size),
- static_cast<uint64_t>(m_ictx->size - len));
- write(off, len, start_char + i);
-
- len = rand() % ((1 << m_ictx->order) * 2);
- ASSERT_GT(m_ictx->size, len);
- off = std::min(static_cast<uint64_t>(rand() % m_ictx->size),
- static_cast<uint64_t>(m_ictx->size - len));
- discard(off, len);
- }
-
- std::string snap_name = snap_name_prefix + stringify(i);
- snap_create(snap_name);
-
- if (m_ictx->test_features(RBD_FEATURE_LAYERING) &&
- !m_ictx->test_features(RBD_FEATURE_MIGRATING) &&
- rand() % 4) {
- clone(snap_name);
- }
-
- if (rand() % 2) {
- librbd::NoOpProgressContext no_op;
- uint64_t new_size = initial_size + rand() % m_ictx->size;
- resize(new_size);
- ASSERT_EQ(new_size, m_ictx->size);
- }
- }
- flush();
- }
-
- void test_stress2(bool concurrent) {
- test_stress();
-
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- thread user([this]() {
- test_stress("user", 'a');
- for (int i = 0; i < 5; i++) {
- uint64_t off = (i + 1) * m_ictx->size / 10;
- uint64_t len = m_ictx->size / 40;
- write(off, len, '1' + i);
-
- off += len / 4;
- len /= 2;
- discard(off, len);
- }
- flush();
- });
-
- if (concurrent) {
- librados::IoCtx io_ctx;
- EXPECT_EQ(0, _rados.ioctx_create2(m_ioctx.get_id(), io_ctx));
- migration_execute(io_ctx, m_image_name);
- io_ctx.close();
- user.join();
- } else {
- user.join();
- compare("before execute");
- migration_execute(m_ioctx, m_image_name);
- }
-
- migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
- migration_commit(m_ioctx, m_image_name);
- }
-
static std::string _other_pool_name;
static librados::IoCtx _other_pool_ioctx;
@@ -861,149 +773,6 @@
migration_commit(m_ioctx, m_image_name);
}
-TEST_F(TestMigration, Snaps)
-{
- test_snaps();
- migrate(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, SnapsOtherPool)
-{
- test_snaps();
-
- test_no_snaps();
- migrate(_other_pool_ioctx, m_image_name);
-
- EXPECT_EQ(_other_pool_ioctx.get_id(), m_ictx->md_ctx.get_id());
-}
-
-TEST_F(TestMigration, SnapsDataPool)
-{
- test_snaps();
-
- ASSERT_EQ(0, m_opts.set(RBD_IMAGE_OPTION_DATA_POOL,
- _other_pool_ioctx.get_pool_name().c_str()));
- migrate(m_ioctx, m_image_name);
-
- EXPECT_EQ(_other_pool_ioctx.get_id(), m_ictx->data_ctx.get_id());
-}
-
-TEST_F(TestMigration, SnapsShrinkAfterPrepare)
-{
- test_snaps();
-
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- resize(m_ictx->size >> 1);
-
- migration_execute(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
- migration_commit(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, SnapsShrinkToZeroBeforePrepare)
-{
- test_snaps();
- resize(0);
-
- migrate(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, SnapsShrinkToZeroAfterPrepare)
-{
- test_snaps();
-
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- resize(0);
-
- migration_execute(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
- migration_commit(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, SnapsExpandAfterPrepare)
-{
- test_snaps();
-
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- auto size = m_ictx->size;
- resize(size << 1);
- write(size, 1000, '*');
-
- migration_execute(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
- migration_commit(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, SnapsExpandAfterPrepare2)
-{
- auto size = m_ictx->size;
-
- write(size >> 1, 10, 'X');
- snap_create("snap1");
- resize(size >> 1);
-
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- resize(size);
- write(size >> 1, 5, 'Y');
-
- compare("before execute");
-
- migration_execute(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
- migration_commit(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, SnapsSnapAfterPrepare)
-{
- test_snaps();
-
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- auto ictx = new librbd::ImageCtx(m_ictx->name.c_str(), "", "snap3", m_ioctx,
- false);
- ASSERT_EQ(0, ictx->state->open(0));
- EXPECT_EQ(0, librbd::api::Image<>::snap_set(
- m_ref_ictx, cls::rbd::UserSnapshotNamespace(), "snap3"));
- compare_snaps("opened after prepare snap3", m_ref_ictx, ictx);
- EXPECT_EQ(0, librbd::api::Image<>::snap_set(
- m_ref_ictx, cls::rbd::UserSnapshotNamespace(), nullptr));
- EXPECT_EQ(0, ictx->state->close());
-
- snap_create("after_prepare_snap");
- resize(m_ictx->size >> 1);
- write(0, 1000, '*');
-
- migration_execute(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
- migration_commit(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, SnapsSnapExpandAfterPrepare)
-{
- test_snaps();
-
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- snap_create("after_prepare_snap");
- auto size = m_ictx->size;
- resize(size << 1);
- write(size, 1000, '*');
-
- migration_execute(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
- migration_commit(m_ioctx, m_image_name);
-}
-
TEST_F(TestMigration, Clone)
{
REQUIRE_FEATURE(RBD_FEATURE_LAYERING);
@@ -1101,252 +870,3 @@
migration_execute(m_ioctx, m_image_name);
migration_commit(m_ioctx, m_image_name);
}
-
-TEST_F(TestMigration, AbortInUseImage) {
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- librbd::NoOpProgressContext no_op;
- EXPECT_EQ(-EBUSY, librbd::api::Migration<>::abort(m_ioctx, m_ictx->name,
- no_op));
-}
-
-TEST_F(TestMigration, AbortWithoutSnapshots) {
- test_no_snaps();
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
- test_no_snaps();
- migration_abort(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, AbortWithSnapshots) {
- test_snaps();
- migration_prepare(m_ioctx, m_image_name);
- migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
-
- test_no_snaps();
- flush();
- ASSERT_EQ(0, TestFixture::snap_create(*m_ictx, "dst-only-snap"));
-
- test_no_snaps();
-
- migration_abort(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, CloneV1Parent)
-{
- const uint32_t CLONE_FORMAT = 1;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *) {
- migrate(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV2Parent)
-{
- const uint32_t CLONE_FORMAT = 2;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *) {
- migrate(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV1ParentAbort)
-{
- const uint32_t CLONE_FORMAT = 1;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *) {
- migration_prepare(m_ioctx, m_image_name);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV2ParentAbort)
-{
- const uint32_t CLONE_FORMAT = 2;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *) {
- migration_prepare(m_ioctx, m_image_name);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV1ParentAbortFixIncompleteChildReattach)
-{
- const uint32_t CLONE_FORMAT = 1;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
- auto src_image_id = m_ictx->id;
- migration_prepare(m_ioctx, m_image_name);
- // Attach the child to both source and destination
- // to emulate a crash when re-attaching the child
- librbd::ImageCtx *src_ictx;
- open_image(m_ioctx, "", src_image_id, false,
- librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
- C_SaferCond cond;
- auto req = librbd::image::AttachChildRequest<>::create(
- child_ictx, src_ictx, src_ictx->snaps[0], nullptr, 0,
- CLONE_FORMAT, &cond);
- req->send();
- ASSERT_EQ(0, cond.wait());
- close_image(src_ictx);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV1ParentAbortFixParentReattach)
-{
- const uint32_t CLONE_FORMAT = 1;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
- auto src_image_id = m_ictx->id;
- migration_prepare(m_ioctx, m_image_name);
- // Re-attach the child back to the source to emulate a crash
- // after the parent reattach but before the child reattach
- librbd::ImageCtx *src_ictx;
- open_image(m_ioctx, "", src_image_id, false,
- librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
- C_SaferCond cond;
- auto req = librbd::image::AttachChildRequest<>::create(
- child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
- m_ictx->snaps[0], CLONE_FORMAT, &cond);
- req->send();
- ASSERT_EQ(0, cond.wait());
- close_image(src_ictx);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV1ParentAbortRelinkNotNeeded)
-{
- const uint32_t CLONE_FORMAT = 1;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
- auto src_image_id = m_ictx->id;
- auto parent_spec = child_ictx->parent_md.spec;
- parent_spec.image_id = m_ictx->id;
- parent_spec.snap_id = m_ictx->snaps[0];
- auto parent_overlap = child_ictx->parent_md.overlap;
- migration_prepare(m_ioctx, m_image_name);
- // Relink the child back to emulate a crash
- // before relinking the child
- C_SaferCond cond;
- auto req = librbd::image::AttachParentRequest<>::create(
- *child_ictx, parent_spec, parent_overlap, true, &cond);
- req->send();
- ASSERT_EQ(0, cond.wait());
- librbd::ImageCtx *src_ictx;
- open_image(m_ioctx, "", src_image_id, false,
- librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
- C_SaferCond cond1;
- auto req1 = librbd::image::AttachChildRequest<>::create(
- child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
- m_ictx->snaps[0], CLONE_FORMAT, &cond1);
- req1->send();
- ASSERT_EQ(0, cond1.wait());
- close_image(src_ictx);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV2ParentAbortFixIncompleteChildReattach)
-{
- const uint32_t CLONE_FORMAT = 2;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
- auto src_image_id = m_ictx->id;
- migration_prepare(m_ioctx, m_image_name);
- // Attach the child to both source and destination
- // to emulate a crash when re-attaching the child
- librbd::ImageCtx *src_ictx;
- open_image(m_ioctx, "", src_image_id, false,
- librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
- C_SaferCond cond;
- auto req = librbd::image::AttachChildRequest<>::create(
- child_ictx, src_ictx, src_ictx->snaps[0], nullptr, 0,
- CLONE_FORMAT, &cond);
- req->send();
- ASSERT_EQ(0, cond.wait());
- close_image(src_ictx);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV2ParentAbortFixParentReattach)
-{
- const uint32_t CLONE_FORMAT = 2;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
- auto src_image_id = m_ictx->id;
- migration_prepare(m_ioctx, m_image_name);
- // Re-attach the child back to the source to emulate a crash
- // after the parent reattach but before the child reattach
- librbd::ImageCtx *src_ictx;
- open_image(m_ioctx, "", src_image_id, false,
- librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
- C_SaferCond cond;
- auto req = librbd::image::AttachChildRequest<>::create(
- child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
- m_ictx->snaps[0], CLONE_FORMAT, &cond);
- req->send();
- ASSERT_EQ(0, cond.wait());
- close_image(src_ictx);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, CloneV2ParentAbortRelinkNotNeeded)
-{
- const uint32_t CLONE_FORMAT = 2;
- test_migrate_parent(
- CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
- auto src_image_id = m_ictx->id;
- auto parent_spec = child_ictx->parent_md.spec;
- parent_spec.image_id = m_ictx->id;
- parent_spec.snap_id = m_ictx->snaps[0];
- auto parent_overlap = child_ictx->parent_md.overlap;
- migration_prepare(m_ioctx, m_image_name);
- // Relink the child back to emulate a crash
- // before relinking the child
- C_SaferCond cond;
- auto req = librbd::image::AttachParentRequest<>::create(
- *child_ictx, parent_spec, parent_overlap, true, &cond);
- req->send();
- ASSERT_EQ(0, cond.wait());
- librbd::ImageCtx *src_ictx;
- open_image(m_ioctx, "", src_image_id, false,
- librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
- C_SaferCond cond1;
- auto req1 = librbd::image::AttachChildRequest<>::create(
- child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
- m_ictx->snaps[0], CLONE_FORMAT, &cond1);
- req1->send();
- ASSERT_EQ(0, cond1.wait());
- close_image(src_ictx);
- migration_abort(m_ioctx, m_image_name);
- });
-}
-
-TEST_F(TestMigration, StressNoMigrate)
-{
- test_stress();
-
- compare();
-}
-
-TEST_F(TestMigration, Stress)
-{
- test_stress();
-
- migrate(m_ioctx, m_image_name);
-}
-
-TEST_F(TestMigration, Stress2)
-{
- test_stress2(false);
-}
-
-TEST_F(TestMigration, StressLive)
-{
- test_stress2(true);
-}
diff -uNr ceph-15.2.17/src/test/librbd/test_MigrationClone.cc ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationClone.cc
--- ceph-15.2.17/src/test/librbd/test_MigrationClone.cc 1970-01-01 09:30:00.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationClone.cc 2023-02-09 16:51:19.877567325 +1030
@@ -0,0 +1,635 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "test/librados/test.h"
+#include "test/librbd/test_fixture.h"
+#include "test/librbd/test_support.h"
+#include "librbd/ImageState.h"
+#include "librbd/Operations.h"
+#include "librbd/api/Group.h"
+#include "librbd/api/Image.h"
+#include "librbd/api/Migration.h"
+#include "librbd/api/Mirror.h"
+#include "librbd/api/Namespace.h"
+#include "librbd/api/Snapshot.h"
+#include "librbd/image/AttachChildRequest.h"
+#include "librbd/image/AttachParentRequest.h"
+#include "librbd/internal.h"
+#include "librbd/io/ImageRequestWQ.h"
+#include "librbd/io/ReadResult.h"
+#include "common/Cond.h"
+#include <boost/scope_exit.hpp>
+
+void register_test_migration() {
+}
+
+struct TestMigration : public TestFixture {
+ static void SetUpTestCase() {
+ TestFixture::SetUpTestCase();
+
+ _other_pool_name = get_temp_pool_name("test-librbd-");
+ ASSERT_EQ(0, _rados.pool_create(_other_pool_name.c_str()));
+ }
+
+ static void TearDownTestCase() {
+ ASSERT_EQ(0, _rados.pool_delete(_other_pool_name.c_str()));
+
+ TestFixture::TearDownTestCase();
+ }
+
+ void SetUp() override {
+ TestFixture::SetUp();
+
+ ASSERT_EQ(0, _rados.ioctx_create(_other_pool_name.c_str(),
+ _other_pool_ioctx));
+
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ m_image_id = m_ictx->id;
+
+ std::string ref_image_name = get_temp_image_name();
+ ASSERT_EQ(0, create_image_pp(m_rbd, m_ioctx, ref_image_name, m_ictx->size));
+ EXPECT_EQ(0, _rados.ioctx_create2(m_ioctx.get_id(), m_ref_ioctx));
+ open_image(m_ref_ioctx, ref_image_name, &m_ref_ictx);
+
+ resize(20 * (1 << 22));
+ }
+
+ void TearDown() override {
+ if (m_ref_ictx != nullptr) {
+ close_image(m_ref_ictx);
+ }
+ if (m_ictx != nullptr) {
+ close_image(m_ictx);
+ }
+
+ _other_pool_ioctx.close();
+
+ TestFixture::TearDown();
+ }
+
+ void compare(const std::string &description = "") {
+ vector<librbd::snap_info_t> src_snaps, dst_snaps;
+
+ EXPECT_EQ(m_ref_ictx->size, m_ictx->size);
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ref_ictx, src_snaps));
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ictx, dst_snaps));
+ EXPECT_EQ(src_snaps.size(), dst_snaps.size());
+ for (size_t i = 0; i <= src_snaps.size(); i++) {
+ const char *src_snap_name = nullptr;
+ const char *dst_snap_name = nullptr;
+ if (i < src_snaps.size()) {
+ EXPECT_EQ(src_snaps[i].name, dst_snaps[i].name);
+ src_snap_name = src_snaps[i].name.c_str();
+ dst_snap_name = dst_snaps[i].name.c_str();
+ }
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ref_ictx, cls::rbd::UserSnapshotNamespace(),
+ src_snap_name));
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ictx, cls::rbd::UserSnapshotNamespace(),
+ dst_snap_name));
+ compare_snaps(
+ description + " snap: " + (src_snap_name ? src_snap_name : "null"),
+ m_ref_ictx, m_ictx);
+ }
+ }
+
+ void compare_snaps(const std::string &description, librbd::ImageCtx *src_ictx,
+ librbd::ImageCtx *dst_ictx) {
+ uint64_t src_size, dst_size;
+ {
+ std::shared_lock src_locker{src_ictx->image_lock};
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ src_size = src_ictx->get_image_size(src_ictx->snap_id);
+ dst_size = dst_ictx->get_image_size(dst_ictx->snap_id);
+ }
+ if (src_size != dst_size) {
+ std::cout << description << ": size differs" << std::endl;
+ EXPECT_EQ(src_size, dst_size);
+ }
+
+ if (dst_ictx->test_features(RBD_FEATURE_LAYERING)) {
+ bool flags_set;
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ EXPECT_EQ(0, dst_ictx->test_flags(dst_ictx->snap_id,
+ RBD_FLAG_OBJECT_MAP_INVALID,
+ dst_ictx->image_lock, &flags_set));
+ EXPECT_FALSE(flags_set);
+ }
+
+ ssize_t read_size = 1 << src_ictx->order;
+ uint64_t offset = 0;
+ while (offset < src_size) {
+ read_size = std::min(read_size, static_cast<ssize_t>(src_size - offset));
+
+ bufferptr src_ptr(read_size);
+ bufferlist src_bl;
+ src_bl.push_back(src_ptr);
+ librbd::io::ReadResult src_result{&src_bl};
+ EXPECT_EQ(read_size, src_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{src_result}, 0));
+
+ bufferptr dst_ptr(read_size);
+ bufferlist dst_bl;
+ dst_bl.push_back(dst_ptr);
+ librbd::io::ReadResult dst_result{&dst_bl};
+ EXPECT_EQ(read_size, dst_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{dst_result}, 0));
+
+ if (!src_bl.contents_equal(dst_bl)) {
+ std::cout << description
+ << ", block " << offset << "~" << read_size << " differs"
+ << std::endl;
+ std::cout << "src block: " << src_ictx->id << ": " << std::endl; src_bl.hexdump(std::cout);
+ std::cout << "dst block: " << dst_ictx->id << ": " << std::endl; dst_bl.hexdump(std::cout);
+ }
+ EXPECT_TRUE(src_bl.contents_equal(dst_bl));
+ offset += read_size;
+ }
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ const std::string &id, bool read_only, int flags,
+ librbd::ImageCtx **ictx) {
+ *ictx = new librbd::ImageCtx(name, id, nullptr, io_ctx, read_only);
+ m_ictxs.insert(*ictx);
+
+ ASSERT_EQ(0, (*ictx)->state->open(flags));
+ (*ictx)->discard_granularity_bytes = 0;
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ librbd::ImageCtx **ictx) {
+ open_image(io_ctx, name, "", false, 0, ictx);
+ }
+
+ void migration_prepare(librados::IoCtx& dst_io_ctx,
+ const std::string &dst_name, int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ EXPECT_EQ(r, librbd::api::Migration<>::prepare(m_ioctx, m_image_name,
+ dst_io_ctx, dst_name,
+ m_opts));
+ if (r == 0) {
+ open_image(dst_io_ctx, dst_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ }
+ compare("after prepare");
+ }
+
+ void migration_execute(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::execute(io_ctx, name, no_op));
+ }
+
+ void migration_abort(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ std::string dst_name = m_ictx->name;
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::abort(io_ctx, name, no_op));
+
+ if (r == 0) {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, dst_name, &m_ictx);
+ }
+
+ compare("after abort");
+ }
+
+ void migration_commit(librados::IoCtx& io_ctx, const std::string &name) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(0, librbd::api::Migration<>::commit(io_ctx, name, no_op));
+
+ compare("after commit");
+ }
+
+ void migration_status(librbd::image_migration_state_t state) {
+ librbd::image_migration_status_t status;
+ EXPECT_EQ(0, librbd::api::Migration<>::status(m_ioctx, m_image_name,
+ &status));
+ EXPECT_EQ(status.source_pool_id, m_ioctx.get_id());
+ EXPECT_EQ(status.source_pool_namespace, m_ioctx.get_namespace());
+ EXPECT_EQ(status.source_image_name, m_image_name);
+ EXPECT_EQ(status.source_image_id, m_image_id);
+ EXPECT_EQ(status.dest_pool_id, m_ictx->md_ctx.get_id());
+ EXPECT_EQ(status.dest_pool_namespace, m_ictx->md_ctx.get_namespace());
+ EXPECT_EQ(status.dest_image_name, m_ictx->name);
+ EXPECT_EQ(status.dest_image_id, m_ictx->id);
+ EXPECT_EQ(status.state, state);
+ }
+
+ void migrate(librados::IoCtx& dst_io_ctx, const std::string &dst_name) {
+ migration_prepare(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+ migration_execute(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(dst_io_ctx, dst_name);
+ }
+
+ void write(uint64_t off, uint64_t len, char c) {
+ std::cout << "write: " << c << " " << off << "~" << len << std::endl;
+
+ bufferlist ref_bl;
+ ref_bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->write(off, len, std::move(ref_bl), 0));
+ bufferlist bl;
+ bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->write(off, len, std::move(bl), 0));
+ }
+
+ void discard(uint64_t off, uint64_t len) {
+ std::cout << "discard: " << off << "~" << len << std::endl;
+
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->discard(off, len, false));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->discard(off, len, false));
+ }
+
+ void flush() {
+ ASSERT_EQ(0, m_ref_ictx->io_work_queue->flush());
+ ASSERT_EQ(0, m_ictx->io_work_queue->flush());
+ }
+
+ void snap_create(const std::string &snap_name) {
+ std::cout << "snap_create: " << snap_name << std::endl;
+
+ flush();
+
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ictx, snap_name));
+ }
+
+ void snap_protect(const std::string &snap_name) {
+ std::cout << "snap_protect: " << snap_name << std::endl;
+
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ictx, snap_name));
+ }
+
+ void clone(const std::string &snap_name) {
+ snap_protect(snap_name);
+
+ int order = m_ref_ictx->order;
+ uint64_t features;
+ ASSERT_EQ(0, librbd::get_features(m_ref_ictx, &features));
+
+ std::string ref_clone_name = get_temp_image_name();
+ std::string clone_name = get_temp_image_name();
+
+ std::cout << "clone " << m_ictx->name << " -> " << clone_name
+ << std::endl;
+
+ ASSERT_EQ(0, librbd::clone(m_ref_ictx->md_ctx, m_ref_ictx->name.c_str(),
+ snap_name.c_str(), m_ref_ioctx,
+ ref_clone_name.c_str(), features, &order,
+ m_ref_ictx->stripe_unit,
+ m_ref_ictx->stripe_count));
+
+ ASSERT_EQ(0, librbd::clone(m_ictx->md_ctx, m_ictx->name.c_str(),
+ snap_name.c_str(), m_ioctx,
+ clone_name.c_str(), features, &order,
+ m_ictx->stripe_unit,
+ m_ictx->stripe_count));
+
+ close_image(m_ref_ictx);
+ open_image(m_ref_ioctx, ref_clone_name, &m_ref_ictx);
+
+ close_image(m_ictx);
+ open_image(m_ioctx, clone_name, &m_ictx);
+ m_image_name = m_ictx->name;
+ m_image_id = m_ictx->id;
+ }
+
+ void resize(uint64_t size) {
+ std::cout << "resize: " << size << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ ASSERT_EQ(0, m_ref_ictx->operations->resize(size, true, no_op));
+ ASSERT_EQ(0, m_ictx->operations->resize(size, true, no_op));
+ }
+
+ void test_no_snaps() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, '1');
+ write(2 * len, len, '1');
+ flush();
+ }
+
+ void test_snaps() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, '1');
+ snap_create("snap1");
+ write(1 * len, len, '1');
+
+ write(0 * len, 1000, 'X');
+ discard(1000 + 10, 1000);
+
+ snap_create("snap2");
+
+ write(1 * len, 1000, 'X');
+ discard(2 * len + 10, 1000);
+
+ uint64_t size = m_ictx->size;
+
+ resize(size << 1);
+
+ write(size - 1, len, '2');
+
+ snap_create("snap3");
+
+ resize(size);
+
+ discard(size - 1, 1);
+
+ flush();
+ }
+
+ void test_clone() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, 'X');
+ write(2 * len, len, 'X');
+
+ snap_create("snap");
+ clone("snap");
+
+ write(0, 1000, 'X');
+ discard(1010, 1000);
+
+ snap_create("snap");
+ clone("snap");
+
+ write(1000, 1000, 'X');
+ discard(2010, 1000);
+
+ flush();
+ }
+
+ template <typename L>
+ void test_migrate_parent(uint32_t clone_format, L&& test) {
+ REQUIRE_FEATURE(RBD_FEATURE_LAYERING);
+
+ std::string prev_clone_format;
+ ASSERT_EQ(0, _rados.conf_get("rbd_default_clone_format",
+ prev_clone_format));
+ ASSERT_EQ(0, _rados.conf_set("rbd_default_clone_format",
+ stringify(clone_format).c_str()));
+ BOOST_SCOPE_EXIT_TPL(&prev_clone_format) {
+ _rados.conf_set("rbd_default_clone_format", prev_clone_format.c_str());
+ } BOOST_SCOPE_EXIT_END;
+
+ write(0, 10, 'A');
+ snap_create("snap1");
+ snap_protect("snap1");
+
+ int order = m_ictx->order;
+ uint64_t features;
+ ASSERT_EQ(0, librbd::get_features(m_ictx, &features));
+
+ std::string clone_name = get_temp_image_name();
+ ASSERT_EQ(0, librbd::clone(m_ictx->md_ctx, m_ictx->name.c_str(), "snap1",
+ m_ioctx, clone_name.c_str(), features, &order,
+ m_ictx->stripe_unit, m_ictx->stripe_count));
+
+ librbd::ImageCtx *child_ictx;
+ open_image(m_ioctx, clone_name, &child_ictx);
+
+ test(child_ictx);
+
+ ASSERT_EQ(0, child_ictx->state->refresh());
+
+ bufferlist bl;
+ bufferptr ptr(10);
+ bl.push_back(ptr);
+ librbd::io::ReadResult result{&bl};
+ ASSERT_EQ(10, child_ictx->io_work_queue->read(
+ 0, 10, librbd::io::ReadResult{result}, 0));
+ bufferlist ref_bl;
+ ref_bl.append(std::string(10, 'A'));
+ ASSERT_TRUE(ref_bl.contents_equal(bl));
+ close_image(child_ictx);
+ }
+
+ static std::string _other_pool_name;
+ static librados::IoCtx _other_pool_ioctx;
+
+ std::string m_image_id;
+ librbd::ImageCtx *m_ictx = nullptr;
+ librados::IoCtx m_ref_ioctx;
+ librbd::ImageCtx *m_ref_ictx = nullptr;
+ librbd::ImageOptions m_opts;
+};
+
+std::string TestMigration::_other_pool_name;
+librados::IoCtx TestMigration::_other_pool_ioctx;
+
+TEST_F(TestMigration, CloneV1Parent)
+{
+ const uint32_t CLONE_FORMAT = 1;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *) {
+ migrate(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV2Parent)
+{
+ const uint32_t CLONE_FORMAT = 2;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *) {
+ migrate(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV1ParentAbort)
+{
+ const uint32_t CLONE_FORMAT = 1;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *) {
+ migration_prepare(m_ioctx, m_image_name);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV2ParentAbort)
+{
+ const uint32_t CLONE_FORMAT = 2;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *) {
+ migration_prepare(m_ioctx, m_image_name);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV1ParentAbortFixIncompleteChildReattach)
+{
+ const uint32_t CLONE_FORMAT = 1;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
+ auto src_image_id = m_ictx->id;
+ migration_prepare(m_ioctx, m_image_name);
+ // Attach the child to both source and destination
+ // to emulate a crash when re-attaching the child
+ librbd::ImageCtx *src_ictx;
+ open_image(m_ioctx, "", src_image_id, false,
+ librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
+ C_SaferCond cond;
+ auto req = librbd::image::AttachChildRequest<>::create(
+ child_ictx, src_ictx, src_ictx->snaps[0], nullptr, 0,
+ CLONE_FORMAT, &cond);
+ req->send();
+ ASSERT_EQ(0, cond.wait());
+ close_image(src_ictx);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV1ParentAbortFixParentReattach)
+{
+ const uint32_t CLONE_FORMAT = 1;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
+ auto src_image_id = m_ictx->id;
+ migration_prepare(m_ioctx, m_image_name);
+ // Re-attach the child back to the source to emulate a crash
+ // after the parent reattach but before the child reattach
+ librbd::ImageCtx *src_ictx;
+ open_image(m_ioctx, "", src_image_id, false,
+ librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
+ C_SaferCond cond;
+ auto req = librbd::image::AttachChildRequest<>::create(
+ child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
+ m_ictx->snaps[0], CLONE_FORMAT, &cond);
+ req->send();
+ ASSERT_EQ(0, cond.wait());
+ close_image(src_ictx);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV1ParentAbortRelinkNotNeeded)
+{
+ const uint32_t CLONE_FORMAT = 1;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
+ auto src_image_id = m_ictx->id;
+ auto parent_spec = child_ictx->parent_md.spec;
+ parent_spec.image_id = m_ictx->id;
+ parent_spec.snap_id = m_ictx->snaps[0];
+ auto parent_overlap = child_ictx->parent_md.overlap;
+ migration_prepare(m_ioctx, m_image_name);
+ // Relink the child back to emulate a crash
+ // before relinking the child
+ C_SaferCond cond;
+ auto req = librbd::image::AttachParentRequest<>::create(
+ *child_ictx, parent_spec, parent_overlap, true, &cond);
+ req->send();
+ ASSERT_EQ(0, cond.wait());
+ librbd::ImageCtx *src_ictx;
+ open_image(m_ioctx, "", src_image_id, false,
+ librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
+ C_SaferCond cond1;
+ auto req1 = librbd::image::AttachChildRequest<>::create(
+ child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
+ m_ictx->snaps[0], CLONE_FORMAT, &cond1);
+ req1->send();
+ ASSERT_EQ(0, cond1.wait());
+ close_image(src_ictx);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV2ParentAbortFixIncompleteChildReattach)
+{
+ const uint32_t CLONE_FORMAT = 2;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
+ auto src_image_id = m_ictx->id;
+ migration_prepare(m_ioctx, m_image_name);
+ // Attach the child to both source and destination
+ // to emulate a crash when re-attaching the child
+ librbd::ImageCtx *src_ictx;
+ open_image(m_ioctx, "", src_image_id, false,
+ librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
+ C_SaferCond cond;
+ auto req = librbd::image::AttachChildRequest<>::create(
+ child_ictx, src_ictx, src_ictx->snaps[0], nullptr, 0,
+ CLONE_FORMAT, &cond);
+ req->send();
+ ASSERT_EQ(0, cond.wait());
+ close_image(src_ictx);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV2ParentAbortFixParentReattach)
+{
+ const uint32_t CLONE_FORMAT = 2;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
+ auto src_image_id = m_ictx->id;
+ migration_prepare(m_ioctx, m_image_name);
+ // Re-attach the child back to the source to emulate a crash
+ // after the parent reattach but before the child reattach
+ librbd::ImageCtx *src_ictx;
+ open_image(m_ioctx, "", src_image_id, false,
+ librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
+ C_SaferCond cond;
+ auto req = librbd::image::AttachChildRequest<>::create(
+ child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
+ m_ictx->snaps[0], CLONE_FORMAT, &cond);
+ req->send();
+ ASSERT_EQ(0, cond.wait());
+ close_image(src_ictx);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
+
+TEST_F(TestMigration, CloneV2ParentAbortRelinkNotNeeded)
+{
+ const uint32_t CLONE_FORMAT = 2;
+ test_migrate_parent(
+ CLONE_FORMAT, [this](librbd::ImageCtx *child_ictx) {
+ auto src_image_id = m_ictx->id;
+ auto parent_spec = child_ictx->parent_md.spec;
+ parent_spec.image_id = m_ictx->id;
+ parent_spec.snap_id = m_ictx->snaps[0];
+ auto parent_overlap = child_ictx->parent_md.overlap;
+ migration_prepare(m_ioctx, m_image_name);
+ // Relink the child back to emulate a crash
+ // before relinking the child
+ C_SaferCond cond;
+ auto req = librbd::image::AttachParentRequest<>::create(
+ *child_ictx, parent_spec, parent_overlap, true, &cond);
+ req->send();
+ ASSERT_EQ(0, cond.wait());
+ librbd::ImageCtx *src_ictx;
+ open_image(m_ioctx, "", src_image_id, false,
+ librbd::OPEN_FLAG_IGNORE_MIGRATING, &src_ictx);
+ C_SaferCond cond1;
+ auto req1 = librbd::image::AttachChildRequest<>::create(
+ child_ictx, src_ictx, src_ictx->snaps[0], m_ictx,
+ m_ictx->snaps[0], CLONE_FORMAT, &cond1);
+ req1->send();
+ ASSERT_EQ(0, cond1.wait());
+ close_image(src_ictx);
+ migration_abort(m_ioctx, m_image_name);
+ });
+}
diff -uNr ceph-15.2.17/src/test/librbd/test_MigrationSnaps.cc ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationSnaps.cc
--- ceph-15.2.17/src/test/librbd/test_MigrationSnaps.cc 1970-01-01 09:30:00.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationSnaps.cc 2023-02-09 16:51:19.878567328 +1030
@@ -0,0 +1,584 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "test/librados/test.h"
+#include "test/librbd/test_fixture.h"
+#include "test/librbd/test_support.h"
+#include "librbd/ImageState.h"
+#include "librbd/Operations.h"
+#include "librbd/api/Group.h"
+#include "librbd/api/Image.h"
+#include "librbd/api/Migration.h"
+#include "librbd/api/Mirror.h"
+#include "librbd/api/Namespace.h"
+#include "librbd/api/Snapshot.h"
+#include "librbd/image/AttachChildRequest.h"
+#include "librbd/image/AttachParentRequest.h"
+#include "librbd/internal.h"
+#include "librbd/io/ImageRequestWQ.h"
+#include "librbd/io/ReadResult.h"
+#include "common/Cond.h"
+#include <boost/scope_exit.hpp>
+
+void register_test_migration() {
+}
+
+struct TestMigration : public TestFixture {
+ static void SetUpTestCase() {
+ TestFixture::SetUpTestCase();
+
+ _other_pool_name = get_temp_pool_name("test-librbd-");
+ ASSERT_EQ(0, _rados.pool_create(_other_pool_name.c_str()));
+ }
+
+ static void TearDownTestCase() {
+ ASSERT_EQ(0, _rados.pool_delete(_other_pool_name.c_str()));
+
+ TestFixture::TearDownTestCase();
+ }
+
+ void SetUp() override {
+ TestFixture::SetUp();
+
+ ASSERT_EQ(0, _rados.ioctx_create(_other_pool_name.c_str(),
+ _other_pool_ioctx));
+
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ m_image_id = m_ictx->id;
+
+ std::string ref_image_name = get_temp_image_name();
+ ASSERT_EQ(0, create_image_pp(m_rbd, m_ioctx, ref_image_name, m_ictx->size));
+ EXPECT_EQ(0, _rados.ioctx_create2(m_ioctx.get_id(), m_ref_ioctx));
+ open_image(m_ref_ioctx, ref_image_name, &m_ref_ictx);
+
+ resize(20 * (1 << 22));
+ }
+
+ void TearDown() override {
+ if (m_ref_ictx != nullptr) {
+ close_image(m_ref_ictx);
+ }
+ if (m_ictx != nullptr) {
+ close_image(m_ictx);
+ }
+
+ _other_pool_ioctx.close();
+
+ TestFixture::TearDown();
+ }
+
+ void compare(const std::string &description = "") {
+ vector<librbd::snap_info_t> src_snaps, dst_snaps;
+
+ EXPECT_EQ(m_ref_ictx->size, m_ictx->size);
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ref_ictx, src_snaps));
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ictx, dst_snaps));
+ EXPECT_EQ(src_snaps.size(), dst_snaps.size());
+ for (size_t i = 0; i <= src_snaps.size(); i++) {
+ const char *src_snap_name = nullptr;
+ const char *dst_snap_name = nullptr;
+ if (i < src_snaps.size()) {
+ EXPECT_EQ(src_snaps[i].name, dst_snaps[i].name);
+ src_snap_name = src_snaps[i].name.c_str();
+ dst_snap_name = dst_snaps[i].name.c_str();
+ }
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ref_ictx, cls::rbd::UserSnapshotNamespace(),
+ src_snap_name));
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ictx, cls::rbd::UserSnapshotNamespace(),
+ dst_snap_name));
+ compare_snaps(
+ description + " snap: " + (src_snap_name ? src_snap_name : "null"),
+ m_ref_ictx, m_ictx);
+ }
+ }
+
+ void compare_snaps(const std::string &description, librbd::ImageCtx *src_ictx,
+ librbd::ImageCtx *dst_ictx) {
+ uint64_t src_size, dst_size;
+ {
+ std::shared_lock src_locker{src_ictx->image_lock};
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ src_size = src_ictx->get_image_size(src_ictx->snap_id);
+ dst_size = dst_ictx->get_image_size(dst_ictx->snap_id);
+ }
+ if (src_size != dst_size) {
+ std::cout << description << ": size differs" << std::endl;
+ EXPECT_EQ(src_size, dst_size);
+ }
+
+ if (dst_ictx->test_features(RBD_FEATURE_LAYERING)) {
+ bool flags_set;
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ EXPECT_EQ(0, dst_ictx->test_flags(dst_ictx->snap_id,
+ RBD_FLAG_OBJECT_MAP_INVALID,
+ dst_ictx->image_lock, &flags_set));
+ EXPECT_FALSE(flags_set);
+ }
+
+ ssize_t read_size = 1 << src_ictx->order;
+ uint64_t offset = 0;
+ while (offset < src_size) {
+ read_size = std::min(read_size, static_cast<ssize_t>(src_size - offset));
+
+ bufferptr src_ptr(read_size);
+ bufferlist src_bl;
+ src_bl.push_back(src_ptr);
+ librbd::io::ReadResult src_result{&src_bl};
+ EXPECT_EQ(read_size, src_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{src_result}, 0));
+
+ bufferptr dst_ptr(read_size);
+ bufferlist dst_bl;
+ dst_bl.push_back(dst_ptr);
+ librbd::io::ReadResult dst_result{&dst_bl};
+ EXPECT_EQ(read_size, dst_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{dst_result}, 0));
+
+ if (!src_bl.contents_equal(dst_bl)) {
+ std::cout << description
+ << ", block " << offset << "~" << read_size << " differs"
+ << std::endl;
+ std::cout << "src block: " << src_ictx->id << ": " << std::endl; src_bl.hexdump(std::cout);
+ std::cout << "dst block: " << dst_ictx->id << ": " << std::endl; dst_bl.hexdump(std::cout);
+ }
+ EXPECT_TRUE(src_bl.contents_equal(dst_bl));
+ offset += read_size;
+ }
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ const std::string &id, bool read_only, int flags,
+ librbd::ImageCtx **ictx) {
+ *ictx = new librbd::ImageCtx(name, id, nullptr, io_ctx, read_only);
+ m_ictxs.insert(*ictx);
+
+ ASSERT_EQ(0, (*ictx)->state->open(flags));
+ (*ictx)->discard_granularity_bytes = 0;
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ librbd::ImageCtx **ictx) {
+ open_image(io_ctx, name, "", false, 0, ictx);
+ }
+
+ void migration_prepare(librados::IoCtx& dst_io_ctx,
+ const std::string &dst_name, int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ EXPECT_EQ(r, librbd::api::Migration<>::prepare(m_ioctx, m_image_name,
+ dst_io_ctx, dst_name,
+ m_opts));
+ if (r == 0) {
+ open_image(dst_io_ctx, dst_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ }
+ compare("after prepare");
+ }
+
+ void migration_execute(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::execute(io_ctx, name, no_op));
+ }
+
+ void migration_abort(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ std::string dst_name = m_ictx->name;
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::abort(io_ctx, name, no_op));
+
+ if (r == 0) {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, dst_name, &m_ictx);
+ }
+
+ compare("after abort");
+ }
+
+ void migration_commit(librados::IoCtx& io_ctx, const std::string &name) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(0, librbd::api::Migration<>::commit(io_ctx, name, no_op));
+
+ compare("after commit");
+ }
+
+ void migration_status(librbd::image_migration_state_t state) {
+ librbd::image_migration_status_t status;
+ EXPECT_EQ(0, librbd::api::Migration<>::status(m_ioctx, m_image_name,
+ &status));
+ EXPECT_EQ(status.source_pool_id, m_ioctx.get_id());
+ EXPECT_EQ(status.source_pool_namespace, m_ioctx.get_namespace());
+ EXPECT_EQ(status.source_image_name, m_image_name);
+ EXPECT_EQ(status.source_image_id, m_image_id);
+ EXPECT_EQ(status.dest_pool_id, m_ictx->md_ctx.get_id());
+ EXPECT_EQ(status.dest_pool_namespace, m_ictx->md_ctx.get_namespace());
+ EXPECT_EQ(status.dest_image_name, m_ictx->name);
+ EXPECT_EQ(status.dest_image_id, m_ictx->id);
+ EXPECT_EQ(status.state, state);
+ }
+
+ void migrate(librados::IoCtx& dst_io_ctx, const std::string &dst_name) {
+ migration_prepare(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+ migration_execute(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(dst_io_ctx, dst_name);
+ }
+
+ void write(uint64_t off, uint64_t len, char c) {
+ std::cout << "write: " << c << " " << off << "~" << len << std::endl;
+
+ bufferlist ref_bl;
+ ref_bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->write(off, len, std::move(ref_bl), 0));
+ bufferlist bl;
+ bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->write(off, len, std::move(bl), 0));
+ }
+
+ void discard(uint64_t off, uint64_t len) {
+ std::cout << "discard: " << off << "~" << len << std::endl;
+
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->discard(off, len, false));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->discard(off, len, false));
+ }
+
+ void flush() {
+ ASSERT_EQ(0, m_ref_ictx->io_work_queue->flush());
+ ASSERT_EQ(0, m_ictx->io_work_queue->flush());
+ }
+
+ void snap_create(const std::string &snap_name) {
+ std::cout << "snap_create: " << snap_name << std::endl;
+
+ flush();
+
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ictx, snap_name));
+ }
+
+ void snap_protect(const std::string &snap_name) {
+ std::cout << "snap_protect: " << snap_name << std::endl;
+
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ictx, snap_name));
+ }
+
+ void clone(const std::string &snap_name) {
+ snap_protect(snap_name);
+
+ int order = m_ref_ictx->order;
+ uint64_t features;
+ ASSERT_EQ(0, librbd::get_features(m_ref_ictx, &features));
+
+ std::string ref_clone_name = get_temp_image_name();
+ std::string clone_name = get_temp_image_name();
+
+ std::cout << "clone " << m_ictx->name << " -> " << clone_name
+ << std::endl;
+
+ ASSERT_EQ(0, librbd::clone(m_ref_ictx->md_ctx, m_ref_ictx->name.c_str(),
+ snap_name.c_str(), m_ref_ioctx,
+ ref_clone_name.c_str(), features, &order,
+ m_ref_ictx->stripe_unit,
+ m_ref_ictx->stripe_count));
+
+ ASSERT_EQ(0, librbd::clone(m_ictx->md_ctx, m_ictx->name.c_str(),
+ snap_name.c_str(), m_ioctx,
+ clone_name.c_str(), features, &order,
+ m_ictx->stripe_unit,
+ m_ictx->stripe_count));
+
+ close_image(m_ref_ictx);
+ open_image(m_ref_ioctx, ref_clone_name, &m_ref_ictx);
+
+ close_image(m_ictx);
+ open_image(m_ioctx, clone_name, &m_ictx);
+ m_image_name = m_ictx->name;
+ m_image_id = m_ictx->id;
+ }
+
+ void resize(uint64_t size) {
+ std::cout << "resize: " << size << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ ASSERT_EQ(0, m_ref_ictx->operations->resize(size, true, no_op));
+ ASSERT_EQ(0, m_ictx->operations->resize(size, true, no_op));
+ }
+
+ void test_no_snaps() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, '1');
+ write(2 * len, len, '1');
+ flush();
+ }
+
+ void test_snaps() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, '1');
+ snap_create("snap1");
+ write(1 * len, len, '1');
+
+ write(0 * len, 1000, 'X');
+ discard(1000 + 10, 1000);
+
+ snap_create("snap2");
+
+ write(1 * len, 1000, 'X');
+ discard(2 * len + 10, 1000);
+
+ uint64_t size = m_ictx->size;
+
+ resize(size << 1);
+
+ write(size - 1, len, '2');
+
+ snap_create("snap3");
+
+ resize(size);
+
+ discard(size - 1, 1);
+
+ flush();
+ }
+
+ void test_clone() {
+ uint64_t len = (1 << m_ictx->order) * 2 + 1;
+ write(0 * len, len, 'X');
+ write(2 * len, len, 'X');
+
+ snap_create("snap");
+ clone("snap");
+
+ write(0, 1000, 'X');
+ discard(1010, 1000);
+
+ snap_create("snap");
+ clone("snap");
+
+ write(1000, 1000, 'X');
+ discard(2010, 1000);
+
+ flush();
+ }
+
+ template <typename L>
+ void test_migrate_parent(uint32_t clone_format, L&& test) {
+ REQUIRE_FEATURE(RBD_FEATURE_LAYERING);
+
+ std::string prev_clone_format;
+ ASSERT_EQ(0, _rados.conf_get("rbd_default_clone_format",
+ prev_clone_format));
+ ASSERT_EQ(0, _rados.conf_set("rbd_default_clone_format",
+ stringify(clone_format).c_str()));
+ BOOST_SCOPE_EXIT_TPL(&prev_clone_format) {
+ _rados.conf_set("rbd_default_clone_format", prev_clone_format.c_str());
+ } BOOST_SCOPE_EXIT_END;
+
+ write(0, 10, 'A');
+ snap_create("snap1");
+ snap_protect("snap1");
+
+ int order = m_ictx->order;
+ uint64_t features;
+ ASSERT_EQ(0, librbd::get_features(m_ictx, &features));
+
+ std::string clone_name = get_temp_image_name();
+ ASSERT_EQ(0, librbd::clone(m_ictx->md_ctx, m_ictx->name.c_str(), "snap1",
+ m_ioctx, clone_name.c_str(), features, &order,
+ m_ictx->stripe_unit, m_ictx->stripe_count));
+
+ librbd::ImageCtx *child_ictx;
+ open_image(m_ioctx, clone_name, &child_ictx);
+
+ test(child_ictx);
+
+ ASSERT_EQ(0, child_ictx->state->refresh());
+
+ bufferlist bl;
+ bufferptr ptr(10);
+ bl.push_back(ptr);
+ librbd::io::ReadResult result{&bl};
+ ASSERT_EQ(10, child_ictx->io_work_queue->read(
+ 0, 10, librbd::io::ReadResult{result}, 0));
+ bufferlist ref_bl;
+ ref_bl.append(std::string(10, 'A'));
+ ASSERT_TRUE(ref_bl.contents_equal(bl));
+ close_image(child_ictx);
+ }
+
+ static std::string _other_pool_name;
+ static librados::IoCtx _other_pool_ioctx;
+
+ std::string m_image_id;
+ librbd::ImageCtx *m_ictx = nullptr;
+ librados::IoCtx m_ref_ioctx;
+ librbd::ImageCtx *m_ref_ictx = nullptr;
+ librbd::ImageOptions m_opts;
+};
+
+std::string TestMigration::_other_pool_name;
+librados::IoCtx TestMigration::_other_pool_ioctx;
+
+TEST_F(TestMigration, Snaps)
+{
+ test_snaps();
+ migrate(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, SnapsOtherPool)
+{
+ test_snaps();
+
+ test_no_snaps();
+ migrate(_other_pool_ioctx, m_image_name);
+
+ EXPECT_EQ(_other_pool_ioctx.get_id(), m_ictx->md_ctx.get_id());
+}
+
+TEST_F(TestMigration, SnapsDataPool)
+{
+ test_snaps();
+
+ ASSERT_EQ(0, m_opts.set(RBD_IMAGE_OPTION_DATA_POOL,
+ _other_pool_ioctx.get_pool_name().c_str()));
+ migrate(m_ioctx, m_image_name);
+
+ EXPECT_EQ(_other_pool_ioctx.get_id(), m_ictx->data_ctx.get_id());
+}
+
+TEST_F(TestMigration, SnapsShrinkAfterPrepare)
+{
+ test_snaps();
+
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ resize(m_ictx->size >> 1);
+
+ migration_execute(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, SnapsShrinkToZeroBeforePrepare)
+{
+ test_snaps();
+ resize(0);
+
+ migrate(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, SnapsShrinkToZeroAfterPrepare)
+{
+ test_snaps();
+
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ resize(0);
+
+ migration_execute(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, SnapsExpandAfterPrepare)
+{
+ test_snaps();
+
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ auto size = m_ictx->size;
+ resize(size << 1);
+ write(size, 1000, '*');
+
+ migration_execute(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, SnapsExpandAfterPrepare2)
+{
+ auto size = m_ictx->size;
+
+ write(size >> 1, 10, 'X');
+ snap_create("snap1");
+ resize(size >> 1);
+
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ resize(size);
+ write(size >> 1, 5, 'Y');
+
+ compare("before execute");
+
+ migration_execute(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, SnapsSnapAfterPrepare)
+{
+ test_snaps();
+
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ auto ictx = new librbd::ImageCtx(m_ictx->name.c_str(), "", "snap3", m_ioctx,
+ false);
+ ASSERT_EQ(0, ictx->state->open(0));
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ref_ictx, cls::rbd::UserSnapshotNamespace(), "snap3"));
+ compare_snaps("opened after prepare snap3", m_ref_ictx, ictx);
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ref_ictx, cls::rbd::UserSnapshotNamespace(), nullptr));
+ EXPECT_EQ(0, ictx->state->close());
+
+ snap_create("after_prepare_snap");
+ resize(m_ictx->size >> 1);
+ write(0, 1000, '*');
+
+ migration_execute(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigration, SnapsSnapExpandAfterPrepare)
+{
+ test_snaps();
+
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ snap_create("after_prepare_snap");
+ auto size = m_ictx->size;
+ resize(size << 1);
+ write(size, 1000, '*');
+
+ migration_execute(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(m_ioctx, m_image_name);
+}
diff -uNr ceph-15.2.17/src/test/librbd/test_MigrationStress.cc ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationStress.cc
--- ceph-15.2.17/src/test/librbd/test_MigrationStress.cc 1970-01-01 09:30:00.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/librbd/test_MigrationStress.cc 2023-02-09 16:51:19.878567328 +1030
@@ -0,0 +1,456 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "test/librados/test.h"
+#include "test/librbd/test_fixture.h"
+#include "test/librbd/test_support.h"
+#include "librbd/ImageState.h"
+#include "librbd/Operations.h"
+#include "librbd/api/Group.h"
+#include "librbd/api/Image.h"
+#include "librbd/api/Migration.h"
+#include "librbd/api/Mirror.h"
+#include "librbd/api/Namespace.h"
+#include "librbd/api/Snapshot.h"
+#include "librbd/image/AttachChildRequest.h"
+#include "librbd/image/AttachParentRequest.h"
+#include "librbd/internal.h"
+#include "librbd/io/ImageRequestWQ.h"
+#include "librbd/io/ReadResult.h"
+#include "common/Cond.h"
+#include <boost/scope_exit.hpp>
+
+void register_test_migration_stress() {
+}
+
+struct TestMigrationStress : public TestFixture {
+ static void SetUpTestCase() {
+ TestFixture::SetUpTestCase();
+
+ _other_pool_name = get_temp_pool_name("test-librbd-");
+ ASSERT_EQ(0, _rados.pool_create(_other_pool_name.c_str()));
+ }
+
+ static void TearDownTestCase() {
+ ASSERT_EQ(0, _rados.pool_delete(_other_pool_name.c_str()));
+
+ TestFixture::TearDownTestCase();
+ }
+
+ void SetUp() override {
+ TestFixture::SetUp();
+
+ ASSERT_EQ(0, _rados.ioctx_create(_other_pool_name.c_str(),
+ _other_pool_ioctx));
+
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ m_image_id = m_ictx->id;
+
+ std::string ref_image_name = get_temp_image_name();
+ ASSERT_EQ(0, create_image_pp(m_rbd, m_ioctx, ref_image_name, m_ictx->size));
+ EXPECT_EQ(0, _rados.ioctx_create2(m_ioctx.get_id(), m_ref_ioctx));
+ open_image(m_ref_ioctx, ref_image_name, &m_ref_ictx);
+
+ resize(20 * (1 << 22));
+ }
+
+ void TearDown() override {
+ if (m_ref_ictx != nullptr) {
+ close_image(m_ref_ictx);
+ }
+ if (m_ictx != nullptr) {
+ close_image(m_ictx);
+ }
+
+ _other_pool_ioctx.close();
+
+ TestFixture::TearDown();
+ }
+
+ void compare(const std::string &description = "") {
+ vector<librbd::snap_info_t> src_snaps, dst_snaps;
+
+ EXPECT_EQ(m_ref_ictx->size, m_ictx->size);
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ref_ictx, src_snaps));
+ EXPECT_EQ(0, librbd::api::Snapshot<>::list(m_ictx, dst_snaps));
+ EXPECT_EQ(src_snaps.size(), dst_snaps.size());
+ for (size_t i = 0; i <= src_snaps.size(); i++) {
+ const char *src_snap_name = nullptr;
+ const char *dst_snap_name = nullptr;
+ if (i < src_snaps.size()) {
+ EXPECT_EQ(src_snaps[i].name, dst_snaps[i].name);
+ src_snap_name = src_snaps[i].name.c_str();
+ dst_snap_name = dst_snaps[i].name.c_str();
+ }
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ref_ictx, cls::rbd::UserSnapshotNamespace(),
+ src_snap_name));
+ EXPECT_EQ(0, librbd::api::Image<>::snap_set(
+ m_ictx, cls::rbd::UserSnapshotNamespace(),
+ dst_snap_name));
+ compare_snaps(
+ description + " snap: " + (src_snap_name ? src_snap_name : "null"),
+ m_ref_ictx, m_ictx);
+ }
+ }
+
+ void compare_snaps(const std::string &description, librbd::ImageCtx *src_ictx,
+ librbd::ImageCtx *dst_ictx) {
+ uint64_t src_size, dst_size;
+ {
+ std::shared_lock src_locker{src_ictx->image_lock};
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ src_size = src_ictx->get_image_size(src_ictx->snap_id);
+ dst_size = dst_ictx->get_image_size(dst_ictx->snap_id);
+ }
+ if (src_size != dst_size) {
+ std::cout << description << ": size differs" << std::endl;
+ EXPECT_EQ(src_size, dst_size);
+ }
+
+ if (dst_ictx->test_features(RBD_FEATURE_LAYERING)) {
+ bool flags_set;
+ std::shared_lock dst_locker{dst_ictx->image_lock};
+ EXPECT_EQ(0, dst_ictx->test_flags(dst_ictx->snap_id,
+ RBD_FLAG_OBJECT_MAP_INVALID,
+ dst_ictx->image_lock, &flags_set));
+ EXPECT_FALSE(flags_set);
+ }
+
+ ssize_t read_size = 1 << src_ictx->order;
+ uint64_t offset = 0;
+ while (offset < src_size) {
+ read_size = std::min(read_size, static_cast<ssize_t>(src_size - offset));
+
+ bufferptr src_ptr(read_size);
+ bufferlist src_bl;
+ src_bl.push_back(src_ptr);
+ librbd::io::ReadResult src_result{&src_bl};
+ EXPECT_EQ(read_size, src_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{src_result}, 0));
+
+ bufferptr dst_ptr(read_size);
+ bufferlist dst_bl;
+ dst_bl.push_back(dst_ptr);
+ librbd::io::ReadResult dst_result{&dst_bl};
+ EXPECT_EQ(read_size, dst_ictx->io_work_queue->read(
+ offset, read_size, librbd::io::ReadResult{dst_result}, 0));
+
+ if (!src_bl.contents_equal(dst_bl)) {
+ std::cout << description
+ << ", block " << offset << "~" << read_size << " differs"
+ << std::endl;
+ char *c = getenv("TEST_RBD_MIGRATION_VERBOSE");
+ if (c != NULL && *c != '\0') {
+ std::cout << "src block: " << src_ictx->id << ": " << std::endl; src_bl.hexdump(std::cout);
+ std::cout << "dst block: " << dst_ictx->id << ": " << std::endl; dst_bl.hexdump(std::cout);
+ }
+ }
+ EXPECT_TRUE(src_bl.contents_equal(dst_bl));
+ offset += read_size;
+ }
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ const std::string &id, bool read_only, int flags,
+ librbd::ImageCtx **ictx) {
+ *ictx = new librbd::ImageCtx(name, id, nullptr, io_ctx, read_only);
+ m_ictxs.insert(*ictx);
+
+ ASSERT_EQ(0, (*ictx)->state->open(flags));
+ (*ictx)->discard_granularity_bytes = 0;
+ }
+
+ void open_image(librados::IoCtx& io_ctx, const std::string &name,
+ librbd::ImageCtx **ictx) {
+ open_image(io_ctx, name, "", false, 0, ictx);
+ }
+
+ void migration_prepare(librados::IoCtx& dst_io_ctx,
+ const std::string &dst_name, int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ EXPECT_EQ(r, librbd::api::Migration<>::prepare(m_ioctx, m_image_name,
+ dst_io_ctx, dst_name,
+ m_opts));
+ if (r == 0) {
+ open_image(dst_io_ctx, dst_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ }
+ compare("after prepare");
+ }
+
+ void migration_execute(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::execute(io_ctx, name, no_op));
+ }
+
+ void migration_abort(librados::IoCtx& io_ctx, const std::string &name,
+ int r = 0) {
+ std::cout << __func__ << std::endl;
+
+ std::string dst_name = m_ictx->name;
+ close_image(m_ictx);
+ m_ictx = nullptr;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(r, librbd::api::Migration<>::abort(io_ctx, name, no_op));
+
+ if (r == 0) {
+ open_image(m_ioctx, m_image_name, &m_ictx);
+ } else {
+ open_image(m_ioctx, dst_name, &m_ictx);
+ }
+
+ compare("after abort");
+ }
+
+ void migration_commit(librados::IoCtx& io_ctx, const std::string &name) {
+ std::cout << __func__ << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ EXPECT_EQ(0, librbd::api::Migration<>::commit(io_ctx, name, no_op));
+
+ compare("after commit");
+ }
+
+ void migration_status(librbd::image_migration_state_t state) {
+ librbd::image_migration_status_t status;
+ EXPECT_EQ(0, librbd::api::Migration<>::status(m_ioctx, m_image_name,
+ &status));
+ EXPECT_EQ(status.source_pool_id, m_ioctx.get_id());
+ EXPECT_EQ(status.source_pool_namespace, m_ioctx.get_namespace());
+ EXPECT_EQ(status.source_image_name, m_image_name);
+ EXPECT_EQ(status.source_image_id, m_image_id);
+ EXPECT_EQ(status.dest_pool_id, m_ictx->md_ctx.get_id());
+ EXPECT_EQ(status.dest_pool_namespace, m_ictx->md_ctx.get_namespace());
+ EXPECT_EQ(status.dest_image_name, m_ictx->name);
+ EXPECT_EQ(status.dest_image_id, m_ictx->id);
+ EXPECT_EQ(status.state, state);
+ }
+
+ void migrate(librados::IoCtx& dst_io_ctx, const std::string &dst_name) {
+ migration_prepare(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+ migration_execute(dst_io_ctx, dst_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(dst_io_ctx, dst_name);
+ }
+
+ void write(uint64_t off, uint64_t len, char c) {
+ std::cout << "write: " << c << " " << off << "~" << len << std::endl;
+
+ bufferlist ref_bl;
+ ref_bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->write(off, len, std::move(ref_bl), 0));
+ bufferlist bl;
+ bl.append(std::string(len, c));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->write(off, len, std::move(bl), 0));
+ }
+
+ void discard(uint64_t off, uint64_t len) {
+ std::cout << "discard: " << off << "~" << len << std::endl;
+
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ref_ictx->io_work_queue->discard(off, len, false));
+ ASSERT_EQ(static_cast<ssize_t>(len),
+ m_ictx->io_work_queue->discard(off, len, false));
+ }
+
+ void flush() {
+ ASSERT_EQ(0, m_ref_ictx->io_work_queue->flush());
+ ASSERT_EQ(0, m_ictx->io_work_queue->flush());
+ }
+
+ void snap_create(const std::string &snap_name) {
+ std::cout << "snap_create: " << snap_name << std::endl;
+
+ flush();
+
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_create(*m_ictx, snap_name));
+ }
+
+ void snap_protect(const std::string &snap_name) {
+ std::cout << "snap_protect: " << snap_name << std::endl;
+
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ref_ictx, snap_name));
+ ASSERT_EQ(0, TestFixture::snap_protect(*m_ictx, snap_name));
+ }
+
+ void clone(const std::string &snap_name) {
+ snap_protect(snap_name);
+
+ int order = m_ref_ictx->order;
+ uint64_t features;
+ ASSERT_EQ(0, librbd::get_features(m_ref_ictx, &features));
+ features &= ~RBD_FEATURES_IMPLICIT_ENABLE;
+
+ std::string ref_clone_name = get_temp_image_name();
+ std::string clone_name = get_temp_image_name();
+
+ std::cout << "clone " << m_ictx->name << " -> " << clone_name
+ << std::endl;
+
+ ASSERT_EQ(0, librbd::clone(m_ref_ictx->md_ctx, m_ref_ictx->name.c_str(),
+ snap_name.c_str(), m_ref_ioctx,
+ ref_clone_name.c_str(), features, &order,
+ m_ref_ictx->stripe_unit,
+ m_ref_ictx->stripe_count));
+
+ ASSERT_EQ(0, librbd::clone(m_ictx->md_ctx, m_ictx->name.c_str(),
+ snap_name.c_str(), m_ioctx,
+ clone_name.c_str(), features, &order,
+ m_ictx->stripe_unit,
+ m_ictx->stripe_count));
+
+ close_image(m_ref_ictx);
+ open_image(m_ref_ioctx, ref_clone_name, &m_ref_ictx);
+
+ close_image(m_ictx);
+ open_image(m_ioctx, clone_name, &m_ictx);
+ m_image_name = m_ictx->name;
+ m_image_id = m_ictx->id;
+ }
+
+ void resize(uint64_t size) {
+ std::cout << "resize: " << size << std::endl;
+
+ librbd::NoOpProgressContext no_op;
+ ASSERT_EQ(0, m_ref_ictx->operations->resize(size, true, no_op));
+ ASSERT_EQ(0, m_ictx->operations->resize(size, true, no_op));
+ }
+
+ void test_stress(const std::string &snap_name_prefix = "snap",
+ char start_char = 'A') {
+ uint64_t initial_size = m_ictx->size;
+
+ int nsnaps = 2;
+ const char *c = getenv("TEST_RBD_MIGRATION_STRESS_NSNAPS");
+ if (c != NULL) {
+ std::stringstream ss(c);
+ ASSERT_TRUE(ss >> nsnaps);
+ }
+
+ int nwrites = 2;
+ c = getenv("TEST_RBD_MIGRATION_STRESS_NWRITES");
+ if (c != NULL) {
+ std::stringstream ss(c);
+ ASSERT_TRUE(ss >> nwrites);
+ }
+
+ for (int i = 0; i < nsnaps; i++) {
+ for (int j = 0; j < nwrites; j++) {
+ size_t len = rand() % ((1 << m_ictx->order) * 2);
+ ASSERT_GT(m_ictx->size, len);
+ uint64_t off = std::min(static_cast<uint64_t>(rand() % m_ictx->size),
+ static_cast<uint64_t>(m_ictx->size - len));
+ write(off, len, start_char + i);
+
+ len = rand() % ((1 << m_ictx->order) * 2);
+ ASSERT_GT(m_ictx->size, len);
+ off = std::min(static_cast<uint64_t>(rand() % m_ictx->size),
+ static_cast<uint64_t>(m_ictx->size - len));
+ discard(off, len);
+ }
+
+ std::string snap_name = snap_name_prefix + stringify(i);
+ snap_create(snap_name);
+
+ if (m_ictx->test_features(RBD_FEATURE_LAYERING) &&
+ !m_ictx->test_features(RBD_FEATURE_MIGRATING) &&
+ rand() % 4) {
+ clone(snap_name);
+ }
+
+ if (rand() % 2) {
+ librbd::NoOpProgressContext no_op;
+ uint64_t new_size = initial_size + rand() % m_ictx->size;
+ resize(new_size);
+ ASSERT_EQ(new_size, m_ictx->size);
+ }
+ }
+ flush();
+ }
+
+ void test_stress2(bool concurrent) {
+ test_stress();
+
+ migration_prepare(m_ioctx, m_image_name);
+ migration_status(RBD_IMAGE_MIGRATION_STATE_PREPARED);
+
+ thread user([this]() {
+ test_stress("user", 'a');
+ for (int i = 0; i < 5; i++) {
+ uint64_t off = (i + 1) * m_ictx->size / 10;
+ uint64_t len = m_ictx->size / 40;
+ write(off, len, '1' + i);
+
+ off += len / 4;
+ len /= 2;
+ discard(off, len);
+ }
+ flush();
+ });
+
+ if (concurrent) {
+ librados::IoCtx io_ctx;
+ EXPECT_EQ(0, _rados.ioctx_create2(m_ioctx.get_id(), io_ctx));
+ migration_execute(io_ctx, m_image_name);
+ io_ctx.close();
+ user.join();
+ } else {
+ user.join();
+ compare("before execute");
+ migration_execute(m_ioctx, m_image_name);
+ }
+
+ migration_status(RBD_IMAGE_MIGRATION_STATE_EXECUTED);
+ migration_commit(m_ioctx, m_image_name);
+ }
+
+ static std::string _other_pool_name;
+ static librados::IoCtx _other_pool_ioctx;
+
+ std::string m_image_id;
+ librbd::ImageCtx *m_ictx = nullptr;
+ librados::IoCtx m_ref_ioctx;
+ librbd::ImageCtx *m_ref_ictx = nullptr;
+ librbd::ImageOptions m_opts;
+};
+
+std::string TestMigrationStress::_other_pool_name;
+librados::IoCtx TestMigrationStress::_other_pool_ioctx;
+
+TEST_F(TestMigrationStress, StressNoMigrate)
+{
+ test_stress();
+
+ compare();
+}
+
+TEST_F(TestMigrationStress, Stress)
+{
+ test_stress();
+
+ migrate(m_ioctx, m_image_name);
+}
+
+TEST_F(TestMigrationStress, Stress2)
+{
+ test_stress2(false);
+}
+
+TEST_F(TestMigrationStress, StressLive)
+{
+ test_stress2(true);
+}
diff -uNr ceph-15.2.17/src/test/objectstore/Allocator_test.cc ceph-15.2.17-arm32_fix_tests/src/test/objectstore/Allocator_test.cc
--- ceph-15.2.17/src/test/objectstore/Allocator_test.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/objectstore/Allocator_test.cc 2023-02-09 16:51:19.878567328 +1030
@@ -543,7 +543,7 @@
init_alloc(size, block);
- for (size_t i = 0; i < 0x10000; i += 2) {
+ for (size_t i = 0; i < 0x1000; i += 2) {
alloc->init_add_free(i * 0x100000, 0x100000);
}
diff -uNr ceph-15.2.17/src/test/objectstore/test_bdev.cc ceph-15.2.17-arm32_fix_tests/src/test/objectstore/test_bdev.cc
--- ceph-15.2.17/src/test/objectstore/test_bdev.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/objectstore/test_bdev.cc 2023-02-09 16:51:19.878567328 +1030
@@ -54,8 +54,8 @@
BlockDevice::create(g_ceph_context, bdev.path, NULL, NULL,
[](void* handle, void* aio) {}, NULL));
bufferlist bl;
- // writing a bit less than 4GB
- for (auto i = 0; i < 4000; i++) {
+ // writing a bit less than 1GB
+ for (auto i = 0; i < 1000; i++) {
string s(1048576, 'a' + (i % 28));
bl.append(s);
}
diff -uNr ceph-15.2.17/src/test/objectstore/test_bluefs.cc ceph-15.2.17-arm32_fix_tests/src/test/objectstore/test_bluefs.cc
--- ceph-15.2.17/src/test/objectstore/test_bluefs.cc 2023-02-09 16:50:56.499496361 +1030
+++ ceph-15.2.17-arm32_fix_tests/src/test/objectstore/test_bluefs.cc 2023-02-09 16:51:19.878567328 +1030
@@ -237,8 +237,8 @@
}
TEST(BlueFS, very_large_write) {
- // we'll write a ~5G file, so allocate more than that for the whole fs
- uint64_t size = 1048576 * 1024 * 6ull;
+ // we'll write a ~1G file, so allocate more than that for the whole fs
+ uint64_t size = 1048576 * 1024 * 1ull;
TempBdev bdev{size};
BlueFS fs(g_ceph_context);
@@ -260,12 +260,12 @@
BlueFS::FileWriter *h;
ASSERT_EQ(0, fs.mkdir("dir"));
ASSERT_EQ(0, fs.open_for_write("dir", "bigfile", &h, false));
- for (unsigned i = 0; i < 3*1024*1048576ull / sizeof(buf); ++i) {
+ for (unsigned i = 0; i < 1*512*1048576ull / sizeof(buf); ++i) {
h->append(buf, sizeof(buf));
total_written += sizeof(buf);
fs.fsync(h);
}
- for (unsigned i = 0; i < 2*1024*1048576ull / sizeof(buf); ++i) {
+ for (unsigned i = 0; i < 1*256*1048576ull / sizeof(buf); ++i) {
h->append(buf, sizeof(buf));
total_written += sizeof(buf);
fs.fsync(h);
@@ -278,7 +278,7 @@
bufferlist bl;
BlueFS::FileReaderBuffer readbuf(10485760);
ASSERT_EQ(h->file->fnode.size, total_written);
- for (unsigned i = 0; i < 3*1024*1048576ull / sizeof(buf); ++i) {
+ for (unsigned i = 0; i < 1*512*1048576ull / sizeof(buf); ++i) {
bl.clear();
fs.read(h, &readbuf, i * sizeof(buf), sizeof(buf), &bl, NULL);
int r = memcmp(buf, bl.c_str(), sizeof(buf));
@@ -288,7 +288,7 @@
}
ASSERT_EQ(0, r);
}
- for (unsigned i = 0; i < 2*1024*1048576ull / sizeof(buf); ++i) {
+ for (unsigned i = 0; i < 1*256*1048576ull / sizeof(buf); ++i) {
bl.clear();
fs.read(h, &readbuf, i * sizeof(buf), sizeof(buf), &bl, NULL);
int r = memcmp(buf, bl.c_str(), sizeof(buf));
@@ -313,9 +313,9 @@
}
TEST(BlueFS, very_large_write2) {
- // we'll write a ~5G file, so allocate more than that for the whole fs
- uint64_t size_full = 1048576 * 1024 * 6ull;
- uint64_t size = 1048576 * 1024 * 5ull;
+ // we'll write a ~1G file, so allocate more than that for the whole fs
+ uint64_t size_full = 1048576 * 1024 * 1ull + 1048576 * 256 * 1ull;
+ uint64_t size = 1048576 * 1024 * 1ull;
TempBdev bdev{ size_full };
BlueFS fs(g_ceph_context);
diff -uNr ceph-15.2.17/src/test/rgw/CMakeLists.txt ceph-15.2.17-arm32_fix_tests/src/test/rgw/CMakeLists.txt
--- ceph-15.2.17/src/test/rgw/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/rgw/CMakeLists.txt 2023-02-09 16:51:19.878567328 +1030
@@ -27,6 +27,7 @@
test_rgw_compression.cc
$<TARGET_OBJECTS:unit-main>)
add_ceph_unittest(unittest_rgw_compression)
+set_tests_properties(unittest_rgw_compression PROPERTIES TIMEOUT 14400)
target_link_libraries(unittest_rgw_compression ${rgw_libs})
# unitttest_http_manager
diff -uNr ceph-15.2.17/src/test/test_mempool.cc ceph-15.2.17-arm32_fix_tests/src/test/test_mempool.cc
--- ceph-15.2.17/src/test/test_mempool.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-arm32_fix_tests/src/test/test_mempool.cc 2023-02-09 16:51:19.878567328 +1030
@@ -405,7 +405,7 @@
TEST(mempool, check_shard_select)
{
- const size_t samples = mempool::num_shards * 100;
+ const size_t samples = mempool::num_shards * 10;
std::atomic_int shards[mempool::num_shards] = {0};
std::vector<std::thread> workers;
for (size_t i = 0; i < samples; i++) {
diff -uNr ceph-15.2.17/src/erasure-code/shec/ErasureCodeShec.cc ceph-15.2.17-fix_ErasureCodeShec/src/erasure-code/shec/ErasureCodeShec.cc
--- ceph-15.2.17/src/erasure-code/shec/ErasureCodeShec.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_ErasureCodeShec/src/erasure-code/shec/ErasureCodeShec.cc 2023-02-09 13:56:36.584666287 +1030
@@ -179,6 +179,10 @@
if (!decoded || !decoded->empty()){
return -EINVAL;
}
+ if (!want_to_read.empty() && chunks.empty()) {
+ // i need to get the blocksize from the first element of chunks
+ return -1;
+ }
have.reserve(chunks.size());
for (map<int, bufferlist>::const_iterator i = chunks.begin();
diff -uNr ceph-15.2.17/src/test/erasure-code/TestErasureCodeShec_arguments.cc ceph-15.2.17-fix_ErasureCodeShec/src/test/erasure-code/TestErasureCodeShec_arguments.cc
--- ceph-15.2.17/src/test/erasure-code/TestErasureCodeShec_arguments.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_ErasureCodeShec/src/test/erasure-code/TestErasureCodeShec_arguments.cc 2023-02-09 13:56:36.584666287 +1030
@@ -323,7 +323,6 @@
EXPECT_EQ(-EIO, result);
EXPECT_EQ(0u, minimum_chunks.size());
EXPECT_EQ(-1, dresult);
- EXPECT_EQ(shec->get_chunk_count(), decoded.size());
if (result != -EIO || dresult != -1) {
++unexpected_count;
}
@@ -359,7 +358,6 @@
EXPECT_EQ(-EIO, result);
EXPECT_EQ(0u, minimum_chunks.size());
EXPECT_EQ(-1, dresult);
- EXPECT_EQ(shec->get_chunk_count(), decoded.size());
if (result != -EIO || dresult != -1) {
++unexpected_count;
}
diff -uNr ceph-15.2.17/cmake/modules/Distutils.cmake ceph-15.2.17-fix_ceph-volume_systemd_unit/cmake/modules/Distutils.cmake
--- ceph-15.2.17/cmake/modules/Distutils.cmake 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_ceph-volume_systemd_unit/cmake/modules/Distutils.cmake 2023-02-09 14:00:05.956304924 +1030
@@ -25,9 +25,9 @@
list(APPEND options
--root=\$ENV{DESTDIR}
--single-version-externally-managed)
- if(NOT \"${DU_INSTALL_SCRIPT}\" STREQUAL \"\")
- list(APPEND options --install-script=${DU_INSTALL_SCRIPT})
- endif()
+ endif()
+ if(NOT \"${DU_INSTALL_SCRIPT}\" STREQUAL \"\")
+ list(APPEND options --install-script=${DU_INSTALL_SCRIPT})
endif()
execute_process(
COMMAND ${Python3_EXECUTABLE}
diff -uNr ceph-15.2.17/src/test/test_arch.cc ceph-15.2.17-fix_cpu_detection/src/test/test_arch.cc
--- ceph-15.2.17/src/test/test_arch.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_cpu_detection/src/test/test_arch.cc 2023-02-09 14:02:28.419739481 +1030
@@ -69,7 +69,7 @@
expected = strstr(flags, " sse4_1 ") ? 1 : 0;
EXPECT_EQ(expected, ceph_arch_intel_sse41);
- expected = (strstr(flags, " sse3 ") || strstr(flags, " ssse3 ")) ? 1 : 0;
+ expected = (strstr(flags, " sse3 ") || strstr(flags, " ssse3 ") || strstr(flags, " pni ")) ? 1 : 0;
EXPECT_EQ(expected, ceph_arch_intel_sse3);
expected = strstr(flags, " ssse3 ") ? 1 : 0;
diff -uNr ceph-15.2.17/src/librbd/image/OpenRequest.cc ceph-15.2.17-fix_librbd_duplicate/src/librbd/image/OpenRequest.cc
--- ceph-15.2.17/src/librbd/image/OpenRequest.cc 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_librbd_duplicate/src/librbd/image/OpenRequest.cc 2023-02-09 15:00:51.932398445 +1030
@@ -10,7 +10,7 @@
#include "librbd/Utils.h"
#include "librbd/cache/ObjectCacherObjectDispatch.h"
#include "librbd/cache/WriteAroundObjectDispatch.h"
-#include "librbd/cache/ParentCacheObjectDispatch.cc"
+#include "librbd/cache/ParentCacheObjectDispatch.h"
#include "librbd/image/CloseRequest.h"
#include "librbd/image/RefreshRequest.h"
#include "librbd/image/SetSnapRequest.h"
diff -uNr ceph-15.2.17/src/tools/setup-virtualenv.sh ceph-15.2.17-fix_pip/src/tools/setup-virtualenv.sh
--- ceph-15.2.17/src/tools/setup-virtualenv.sh 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_pip/src/tools/setup-virtualenv.sh 2023-02-09 16:30:01.085679996 +1030
@@ -66,17 +66,10 @@
DISABLE_PIP_VERSION_CHECK=
fi
-if pip --help | grep -q use-feature; then
- USE_FEATURE=--use-feature=2020-resolver
-else
- USE_FEATURE=
-fi
-
# older versions of pip will not install wrap_console scripts
# when using wheel packages
pip $DISABLE_PIP_VERSION_CHECK --log $DIR/log.txt install \
- $USE_FEATURE \
- --upgrade 'pip >= 6.1'
+ --upgrade 'pip >= 6.1'
if pip --help | grep -q disable-pip-version-check; then
DISABLE_PIP_VERSION_CHECK=--disable-pip-version-check
@@ -89,7 +82,6 @@
fi
pip $DISABLE_PIP_VERSION_CHECK --log $DIR/log.txt install \
- $USE_FEATURE \
$NO_INDEX \
--find-links=file://$(pwd)/wheelhouse 'tox >=2.9.1'
@@ -103,7 +95,6 @@
NO_INDEX=''
fi
pip --exists-action i $DISABLE_PIP_VERSION_CHECK --log $DIR/log.txt install \
- $USE_FEATURE \
$NO_INDEX \
--find-links=file://$(pwd)/wheelhouse $require $constraint
fi
diff -uNr ceph-15.2.17/do_cmake.sh ceph-15.2.17-no_git/do_cmake.sh
--- ceph-15.2.17/do_cmake.sh 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-no_git/do_cmake.sh 2023-02-09 16:58:21.280846524 +1030
@@ -1,7 +1,9 @@
#!/usr/bin/env bash
set -ex
-git submodule update --init --recursive
+if [ -d .git ]; then
+ git submodule update --init --recursive
+fi
: ${BUILD_DIR:=build}
: ${CEPH_GIT_DIR:=..}
diff -uNr ceph-15.2.17/src/test/CMakeLists.txt ceph-15.2.17-skip_promtool_tests/src/test/CMakeLists.txt
--- ceph-15.2.17/src/test/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-skip_promtool_tests/src/test/CMakeLists.txt 2023-02-09 17:00:53.027307163 +1030
@@ -531,24 +531,6 @@
add_ceph_test(smoke.sh ${CMAKE_CURRENT_SOURCE_DIR}/smoke.sh)
-find_program(PROMTOOL_EXECUTABLE promtool)
-if(PROMTOOL_EXECUTABLE)
- execute_process(
- COMMAND ${PROMTOOL_EXECUTABLE} test rules /dev/null
- RESULT_VARIABLE rc
- OUTPUT_QUIET)
- if(NOT rc)
- add_ceph_test(run-promtool-unittests
- ${PROMTOOL_EXECUTABLE} test rules ${CMAKE_SOURCE_DIR}/monitoring/prometheus/alerts/test_alerts.yml)
- else()
- message(WARNING "'${PROMTOOL_EXECUTABLE} test rules' does not work, "
- "please use a newer prometheus")
- endif()
-else()
- add_ceph_test(run-promtool-unittests
- {CMAKE_CURRENT_SOURCE_DIR}/run-promtool-unittests.sh)
-endif()
-
set_property(
TEST ${tox_tests}
PROPERTY ENVIRONMENT ${env_vars_for_tox_tests})
diff -uNr ceph-16.2.4/qa/tox.ini ceph-16.2.4-fix_pytest/qa/tox.ini
--- ceph-16.2.4/qa/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/qa/tox.ini 2024-09-24 13:59:41.362487944 +1000
@@ -5,7 +5,7 @@
[testenv:flake8]
basepython = python3
deps=
- flake8
+ flake8==3.9.0
commands=flake8 --select=F,E9 --exclude=venv,.tox
[testenv:mypy]
diff -uNr ceph-16.2.4/src/cephadm/tox.ini ceph-16.2.4-fix_pytest/src/cephadm/tox.ini
--- ceph-16.2.4/src/cephadm/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/cephadm/tox.ini 2024-09-24 13:59:41.364487903 +1000
@@ -20,7 +20,7 @@
[testenv]
skip_install=true
deps =
- pytest
+ pytest<6
mock
commands=pytest {posargs}
@@ -32,7 +32,7 @@
[testenv:flake8]
basepython = python3
deps =
- flake8
+ flake8==3.9.0
flake8-quotes
commands =
flake8 --config=tox.ini {posargs:cephadm}
diff -uNr ceph-16.2.4/src/ceph-volume/plugin/zfs/tox.ini ceph-16.2.4-fix_pytest/src/ceph-volume/plugin/zfs/tox.ini
--- ceph-16.2.4/src/ceph-volume/plugin/zfs/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/ceph-volume/plugin/zfs/tox.ini 2024-09-24 13:59:41.365487883 +1000
@@ -10,7 +10,7 @@
[testenv:flake8]
basepython = python
-deps = flake8
+deps = flake8==3.9.0
commands = flake8
[testenv]
diff -uNr ceph-16.2.4/src/ceph-volume/tox.ini ceph-16.2.4-fix_pytest/src/ceph-volume/tox.ini
--- ceph-16.2.4/src/ceph-volume/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/ceph-volume/tox.ini 2024-09-24 13:59:41.365487883 +1000
@@ -4,13 +4,13 @@
[testenv]
deps=
- pytest
+ pytest<6
mock
install_command=./tox_install_command.sh {opts} {packages}
commands=py.test -v {posargs:ceph_volume/tests} --ignore=ceph_volume/tests/functional
[testenv:py3-flake8]
-deps=flake8
+deps=flake8==3.9.0
commands=flake8 {posargs:ceph_volume}
[tool:pytest]
diff -uNr ceph-16.2.4/src/pybind/mgr/dashboard/requirements-lint.txt ceph-16.2.4-fix_pytest/src/pybind/mgr/dashboard/requirements-lint.txt
--- ceph-16.2.4/src/pybind/mgr/dashboard/requirements-lint.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/dashboard/requirements-lint.txt 2024-09-24 13:59:41.366487862 +1000
@@ -8,4 +8,4 @@
autopep8
pyfakefs
isort==5.5.3
-pytest
+pytest >=2.1.3,<6
diff -uNr ceph-16.2.4/src/pybind/mgr/dashboard/requirements-test.txt ceph-16.2.4-fix_pytest/src/pybind/mgr/dashboard/requirements-test.txt
--- ceph-16.2.4/src/pybind/mgr/dashboard/requirements-test.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/dashboard/requirements-test.txt 2024-09-24 13:59:41.366487862 +1000
@@ -1,4 +1,4 @@
-pytest
+pytest >=2.1.3,<6
pytest-cov
pytest-instafail
pyfakefs
diff -uNr ceph-16.2.4/src/pybind/mgr/mgr_util.py ceph-16.2.4-fix_pytest/src/pybind/mgr/mgr_util.py
--- ceph-16.2.4/src/pybind/mgr/mgr_util.py 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/mgr_util.py 2024-09-24 14:00:12.341854849 +1000
@@ -467,7 +467,7 @@
# type: (str) -> None
from OpenSSL import crypto
try:
- x509 = crypto.load_certificate(crypto.FILETYPE_PEM, crt)
+ x509 = crypto.load_certificate(crypto.FILETYPE_PEM, crt.encode("utf-8"))
if x509.has_expired():
logger.warning('Certificate has expired: {}'.format(crt))
except (ValueError, crypto.Error) as e:
@@ -504,7 +504,7 @@
raise ServerConfigException(
'Invalid private key: {}'.format(str(e)))
try:
- _crt = crypto.load_certificate(crypto.FILETYPE_PEM, crt)
+ _crt = crypto.load_certificate(crypto.FILETYPE_PEM, crt.encode("utf-8"))
except ValueError as e:
raise ServerConfigException(
'Invalid certificate key: {}'.format(str(e))
diff -uNr ceph-16.2.4/src/pybind/mgr/requirements.txt ceph-16.2.4-fix_pytest/src/pybind/mgr/requirements.txt
--- ceph-16.2.4/src/pybind/mgr/requirements.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/requirements.txt 2024-09-24 13:31:37.284033134 +1000
@@ -9,3 +9,4 @@
remoto
Jinja2
pyfakefs
+pytest<6
diff -uNr ceph-16.2.4/src/pybind/mgr/rook/rook-client-python/requirements.txt ceph-16.2.4-fix_pytest/src/pybind/mgr/rook/rook-client-python/requirements.txt
--- ceph-16.2.4/src/pybind/mgr/rook/rook-client-python/requirements.txt 2020-02-12 01:40:28.000000000 +1100
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/rook/rook-client-python/requirements.txt 2024-09-24 13:59:41.367487842 +1000
@@ -1,4 +1,4 @@
-pytest
+pytest >=2.1.3,<6
requests
pyyaml
markdown
diff -uNr ceph-16.2.4/src/pybind/mgr/snap_schedule/requirements.txt ceph-16.2.4-fix_pytest/src/pybind/mgr/snap_schedule/requirements.txt
--- ceph-16.2.4/src/pybind/mgr/snap_schedule/requirements.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/snap_schedule/requirements.txt 2024-09-24 13:59:41.367487842 +1000
@@ -1 +1 @@
-pytest
+pytest >=2.1.3,<6
diff -uNr ceph-16.2.4/src/pybind/mgr/snap_schedule/tox.ini ceph-16.2.4-fix_pytest/src/pybind/mgr/snap_schedule/tox.ini
--- ceph-16.2.4/src/pybind/mgr/snap_schedule/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/snap_schedule/tox.ini 2024-09-24 13:59:41.368487821 +1000
@@ -12,7 +12,7 @@
py3: PYTHONPATH = {toxinidir}/../../../../build/lib/cython_modules/lib.3:{toxinidir}
SNAP_SCHED_UNITTEST = true
deps =
- pytest
+ pytest<6
mock
py27: pathlib
commands=
diff -uNr ceph-16.2.4/src/pybind/mgr/tox.ini ceph-16.2.4-fix_pytest/src/pybind/mgr/tox.ini
--- ceph-16.2.4/src/pybind/mgr/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/pybind/mgr/tox.ini 2024-09-24 14:22:16.007390285 +1000
@@ -94,11 +94,6 @@
[testenv:flake8]
basepython = python3
deps =
- flake8
-modules =
- cephadm
- orchestrator
- prometheus
+ flake8==3.9.0
commands =
- flake8 --config=tox.ini {posargs} \
- {posargs:{[testenv:flake8]modules}}
+ flake8 --config=tox.ini cephadm/ orchestrator/ prometheus/
diff -uNr ceph-16.2.4/src/python-common/requirements.txt ceph-16.2.4-fix_pytest/src/python-common/requirements.txt
--- ceph-16.2.4/src/python-common/requirements.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/python-common/requirements.txt 2024-09-24 13:59:41.369487801 +1000
@@ -2,6 +2,6 @@
mock; python_version < '3.3'
mypy==0.790; python_version >= '3'
pytest-mypy; python_version >= '3'
-pytest >= 2.1.3; python_version >= '3'
+pytest >=2.1.3,<6; python_version >= '3'
pyyaml
typing-extensions; python_version < '3.8'
diff -uNr ceph-16.2.4/src/tools/cephfs/top/tox.ini ceph-16.2.4-fix_pytest/src/tools/cephfs/top/tox.ini
--- ceph-16.2.4/src/tools/cephfs/top/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/tools/cephfs/top/tox.ini 2024-09-24 13:59:41.369487801 +1000
@@ -3,5 +3,5 @@
skipsdist = true
[testenv:py3]
-deps = flake8
+deps = flake8==3.9.0
commands = flake8 --ignore=W503 --max-line-length=100 cephfs-top
diff -uNr ceph-16.2.4/src/tools/cephfs/tox.ini ceph-16.2.4-fix_pytest/src/tools/cephfs/tox.ini
--- ceph-16.2.4/src/tools/cephfs/tox.ini 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_pytest/src/tools/cephfs/tox.ini 2024-09-24 13:59:41.370487781 +1000
@@ -3,5 +3,5 @@
skipsdist = true
[testenv:py3]
-deps = flake8
+deps = flake8=3.9.0
commands = flake8 --ignore=W503 --max-line-length=100 cephfs-shell
diff -uNr ceph-15.2.17/src/test/cli/ceph-conf/env-vs-args.t ceph-15.2.17-fix_tests/src/test/cli/ceph-conf/env-vs-args.t diff -uNr ceph-16.2.4/src/test/CMakeLists.txt ceph-16.2.4-fix_tests/src/test/CMakeLists.txt
--- ceph-15.2.17/src/test/cli/ceph-conf/env-vs-args.t 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/CMakeLists.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/cli/ceph-conf/env-vs-args.t 2023-02-09 16:39:02.455326846 +1030 +++ ceph-16.2.4-fix_tests/src/test/CMakeLists.txt 2024-09-06 21:32:31.213057915 +1000
@@ -2,9 +2,9 @@ @@ -569,11 +569,17 @@
$ env CEPH_CONF=from-env ceph-conf -s foo bar
did not load config file, using default settings.
.* \-1 Errors while parsing config file! (re)
- .* \-1 parse_file: filesystem error: .* file.size: (No such file or directory )?\[from-env\] (re)
+ .* \-1 parse_file: filesystem error: .* file.size:? (No such file or directory )?\[from-env\] (re)
.* \-1 Errors while parsing config file! (re)
- .* \-1 parse_file: filesystem error: .* file.size: (No such file or directory )?\[from-env\] (re)
+ .* \-1 parse_file: filesystem error: .* file.size:? (No such file or directory )?\[from-env\] (re)
[1]
# command-line arguments should override environment
diff -uNr ceph-15.2.17/src/test/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/CMakeLists.txt
--- ceph-15.2.17/src/test/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_tests/src/test/CMakeLists.txt 2023-02-09 16:39:02.455326846 +1030
@@ -512,11 +512,17 @@
# Run rbd-unit-tests separate so they an run in parallel # Run rbd-unit-tests separate so they an run in parallel
# For values see: src/include/rbd/features.h # For values see: src/include/rbd/features.h
add_ceph_test(run-rbd-unit-tests-N.sh ${CMAKE_CURRENT_SOURCE_DIR}/run-rbd-unit-tests.sh N) add_ceph_test(run-rbd-unit-tests-N.sh ${CMAKE_CURRENT_SOURCE_DIR}/run-rbd-unit-tests.sh N)
...@@ -34,7 +19,7 @@ diff -uNr ceph-15.2.17/src/test/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/C ...@@ -34,7 +19,7 @@ diff -uNr ceph-15.2.17/src/test/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/C
if(FREEBSD) if(FREEBSD)
add_ceph_test(rbd-ggate.sh ${CMAKE_CURRENT_SOURCE_DIR}/rbd-ggate.sh) add_ceph_test(rbd-ggate.sh ${CMAKE_CURRENT_SOURCE_DIR}/rbd-ggate.sh)
endif(FREEBSD) endif(FREEBSD)
@@ -530,6 +536,7 @@ @@ -590,6 +596,7 @@
#add_ceph_test(test_pidfile.sh ${CMAKE_CURRENT_SOURCE_DIR}/test_pidfile.sh) #add_ceph_test(test_pidfile.sh ${CMAKE_CURRENT_SOURCE_DIR}/test_pidfile.sh)
add_ceph_test(smoke.sh ${CMAKE_CURRENT_SOURCE_DIR}/smoke.sh) add_ceph_test(smoke.sh ${CMAKE_CURRENT_SOURCE_DIR}/smoke.sh)
...@@ -42,9 +27,9 @@ diff -uNr ceph-15.2.17/src/test/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/C ...@@ -42,9 +27,9 @@ diff -uNr ceph-15.2.17/src/test/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/C
find_program(PROMTOOL_EXECUTABLE promtool) find_program(PROMTOOL_EXECUTABLE promtool)
if(PROMTOOL_EXECUTABLE) if(PROMTOOL_EXECUTABLE)
diff -uNr ceph-15.2.17/src/test/common/Throttle.cc ceph-15.2.17-fix_tests/src/test/common/Throttle.cc diff -uNr ceph-16.2.4/src/test/common/Throttle.cc ceph-16.2.4-fix_tests/src/test/common/Throttle.cc
--- ceph-15.2.17/src/test/common/Throttle.cc 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/common/Throttle.cc 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/common/Throttle.cc 2023-02-09 16:39:02.455326846 +1030 +++ ceph-16.2.4-fix_tests/src/test/common/Throttle.cc 2024-09-06 21:32:31.215057877 +1000
@@ -332,7 +332,7 @@ @@ -332,7 +332,7 @@
3, 3,
6); 6);
...@@ -54,18 +39,18 @@ diff -uNr ceph-15.2.17/src/test/common/Throttle.cc ceph-15.2.17-fix_tests/src/te ...@@ -54,18 +39,18 @@ diff -uNr ceph-15.2.17/src/test/common/Throttle.cc ceph-15.2.17-fix_tests/src/te
ASSERT_LT(results.second.count(), 0.0002); ASSERT_LT(results.second.count(), 0.0002);
ASSERT_GT(results.second.count(), 0.00005); ASSERT_GT(results.second.count(), 0.00005);
} }
diff -uNr ceph-15.2.17/src/test/encoding/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/encoding/CMakeLists.txt diff -uNr ceph-16.2.4/src/test/encoding/CMakeLists.txt ceph-16.2.4-fix_tests/src/test/encoding/CMakeLists.txt
--- ceph-15.2.17/src/test/encoding/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/encoding/CMakeLists.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/encoding/CMakeLists.txt 2023-02-09 16:39:02.456326849 +1030 +++ ceph-16.2.4-fix_tests/src/test/encoding/CMakeLists.txt 2024-09-06 21:32:31.217057840 +1000
@@ -1,3 +1,5 @@ @@ -1,3 +1,5 @@
# scripts # scripts
add_ceph_test(check-generated.sh ${CMAKE_CURRENT_SOURCE_DIR}/check-generated.sh) add_ceph_test(check-generated.sh ${CMAKE_CURRENT_SOURCE_DIR}/check-generated.sh)
+set_tests_properties(check-generated.sh PROPERTIES TIMEOUT 18000) +set_tests_properties(check-generated.sh PROPERTIES TIMEOUT 18000)
add_ceph_test(readable.sh ${CMAKE_CURRENT_SOURCE_DIR}/readable.sh) add_ceph_test(readable.sh ${CMAKE_CURRENT_SOURCE_DIR}/readable.sh)
+set_tests_properties(readable.sh PROPERTIES TIMEOUT 36000) +set_tests_properties(readable.sh PROPERTIES TIMEOUT 36000)
diff -uNr ceph-15.2.17/src/test/mgr/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/mgr/CMakeLists.txt diff -uNr ceph-16.2.4/src/test/mgr/CMakeLists.txt ceph-16.2.4-fix_tests/src/test/mgr/CMakeLists.txt
--- ceph-15.2.17/src/test/mgr/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/mgr/CMakeLists.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/mgr/CMakeLists.txt 2023-02-09 16:39:02.456326849 +1030 +++ ceph-16.2.4-fix_tests/src/test/mgr/CMakeLists.txt 2024-09-06 21:32:31.217057840 +1000
@@ -9,6 +9,7 @@ @@ -9,6 +9,7 @@
if(WITH_MGR_DASHBOARD_FRONTEND) if(WITH_MGR_DASHBOARD_FRONTEND)
if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64|arm|ARM") if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64|arm|ARM")
...@@ -74,9 +59,9 @@ diff -uNr ceph-15.2.17/src/test/mgr/CMakeLists.txt ceph-15.2.17-fix_tests/src/te ...@@ -74,9 +59,9 @@ diff -uNr ceph-15.2.17/src/test/mgr/CMakeLists.txt ceph-15.2.17-fix_tests/src/te
endif(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64|arm|ARM") endif(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64|arm|ARM")
add_ceph_test(mgr-dashboard-smoke.sh ${CMAKE_CURRENT_SOURCE_DIR}/mgr-dashboard-smoke.sh) add_ceph_test(mgr-dashboard-smoke.sh ${CMAKE_CURRENT_SOURCE_DIR}/mgr-dashboard-smoke.sh)
diff -uNr ceph-15.2.17/src/test/objectstore/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/objectstore/CMakeLists.txt diff -uNr ceph-16.2.4/src/test/objectstore/CMakeLists.txt ceph-16.2.4-fix_tests/src/test/objectstore/CMakeLists.txt
--- ceph-15.2.17/src/test/objectstore/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/objectstore/CMakeLists.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/objectstore/CMakeLists.txt 2023-02-09 16:39:02.456326849 +1030 +++ ceph-16.2.4-fix_tests/src/test/objectstore/CMakeLists.txt 2024-09-06 21:32:31.218057821 +1000
@@ -131,6 +131,7 @@ @@ -131,6 +131,7 @@
test_bluefs.cc test_bluefs.cc
) )
...@@ -93,10 +78,10 @@ diff -uNr ceph-15.2.17/src/test/objectstore/CMakeLists.txt ceph-15.2.17-fix_test ...@@ -93,10 +78,10 @@ diff -uNr ceph-15.2.17/src/test/objectstore/CMakeLists.txt ceph-15.2.17-fix_test
target_link_libraries(unittest_bdev os global) target_link_libraries(unittest_bdev os global)
endif(WITH_BLUESTORE) endif(WITH_BLUESTORE)
diff -uNr ceph-15.2.17/src/test/objectstore/test_bluefs.cc ceph-15.2.17-fix_tests/src/test/objectstore/test_bluefs.cc diff -uNr ceph-16.2.4/src/test/objectstore/test_bluefs.cc ceph-16.2.4-fix_tests/src/test/objectstore/test_bluefs.cc
--- ceph-15.2.17/src/test/objectstore/test_bluefs.cc 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/objectstore/test_bluefs.cc 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/objectstore/test_bluefs.cc 2023-02-09 16:39:02.456326849 +1030 +++ ceph-16.2.4-fix_tests/src/test/objectstore/test_bluefs.cc 2024-09-06 21:32:31.219057803 +1000
@@ -263,13 +263,13 @@ @@ -195,13 +195,13 @@
for (unsigned i = 0; i < 3*1024*1048576ull / sizeof(buf); ++i) { for (unsigned i = 0; i < 3*1024*1048576ull / sizeof(buf); ++i) {
h->append(buf, sizeof(buf)); h->append(buf, sizeof(buf));
total_written += sizeof(buf); total_written += sizeof(buf);
...@@ -112,9 +97,9 @@ diff -uNr ceph-15.2.17/src/test/objectstore/test_bluefs.cc ceph-15.2.17-fix_test ...@@ -112,9 +97,9 @@ diff -uNr ceph-15.2.17/src/test/objectstore/test_bluefs.cc ceph-15.2.17-fix_test
fs.close_writer(h); fs.close_writer(h);
} }
{ {
diff -uNr ceph-15.2.17/src/test/osd/CMakeLists.txt ceph-15.2.17-fix_tests/src/test/osd/CMakeLists.txt diff -uNr ceph-16.2.4/src/test/osd/CMakeLists.txt ceph-16.2.4-fix_tests/src/test/osd/CMakeLists.txt
--- ceph-15.2.17/src/test/osd/CMakeLists.txt 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/osd/CMakeLists.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/osd/CMakeLists.txt 2023-02-09 16:39:02.456326849 +1030 +++ ceph-16.2.4-fix_tests/src/test/osd/CMakeLists.txt 2024-09-06 21:32:31.220057784 +1000
@@ -35,6 +35,7 @@ @@ -35,6 +35,7 @@
# scripts # scripts
...@@ -123,46 +108,46 @@ diff -uNr ceph-15.2.17/src/test/osd/CMakeLists.txt ceph-15.2.17-fix_tests/src/te ...@@ -123,46 +108,46 @@ diff -uNr ceph-15.2.17/src/test/osd/CMakeLists.txt ceph-15.2.17-fix_tests/src/te
# unittest_osdmap # unittest_osdmap
add_executable(unittest_osdmap add_executable(unittest_osdmap
diff -uNr ceph-15.2.17/src/test/osd/TestOSDScrub.cc ceph-15.2.17-fix_tests/src/test/osd/TestOSDScrub.cc diff -uNr ceph-16.2.4/src/test/osd/TestOSDScrub.cc ceph-16.2.4-fix_tests/src/test/osd/TestOSDScrub.cc
--- ceph-15.2.17/src/test/osd/TestOSDScrub.cc 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/osd/TestOSDScrub.cc 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/osd/TestOSDScrub.cc 2023-02-09 16:39:02.456326849 +1030 +++ ceph-16.2.4-fix_tests/src/test/osd/TestOSDScrub.cc 2024-09-06 21:32:31.221057765 +1000
@@ -70,7 +70,7 @@ @@ -91,7 +91,7 @@
g_ceph_context->_conf.set_val("osd_scrub_begin_hour", "0"); g_ceph_context->_conf.set_val("osd_scrub_begin_hour", "0");
g_ceph_context->_conf.set_val("osd_scrub_end_hour", "24"); g_ceph_context->_conf.set_val("osd_scrub_end_hour", "0");
g_ceph_context->_conf.apply_changes(nullptr); g_ceph_context->_conf.apply_changes(nullptr);
- tm tm; - tm tm;
+ tm tm = {0}; + tm tm = {0};
tm.tm_isdst = -1; tm.tm_isdst = -1;
strptime("2015-01-16 12:05:13", "%Y-%m-%d %H:%M:%S", &tm); strptime("2015-01-16 12:05:13", "%Y-%m-%d %H:%M:%S", &tm);
utime_t now = utime_t(mktime(&tm), 0); utime_t now = utime_t(mktime(&tm), 0);
diff -uNr ceph-15.2.17/src/test/smoke.sh ceph-15.2.17-fix_tests/src/test/smoke.sh diff -uNr ceph-16.2.4/src/test/smoke.sh ceph-16.2.4-fix_tests/src/test/smoke.sh
--- ceph-15.2.17/src/test/smoke.sh 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/smoke.sh 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/smoke.sh 2023-02-09 16:39:02.456326849 +1030 +++ ceph-16.2.4-fix_tests/src/test/smoke.sh 2024-09-06 21:32:31.222057746 +1000
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
ceph osd out 0 ceph osd out 0
wait_for_clean wait_for_clean
- timeout 8 rados -p foo bench 4 write -b 4096 --no-cleanup || return 1 - timeout 20 rados -p foo bench 4 write -b 4096 --no-cleanup || return 1
+ timeout 80 rados -p foo bench 4 write -b 4096 --no-cleanup || return 1 + timeout 80 rados -p foo bench 4 write -b 4096 --no-cleanup || return 1
wait_for_clean wait_for_clean
ceph osd in 0 ceph osd in 0
diff -uNr ceph-15.2.17/src/test/test_ipaddr.cc ceph-15.2.17-fix_tests/src/test/test_ipaddr.cc diff -uNr ceph-16.2.4/src/test/test_ipaddr.cc ceph-16.2.4-fix_tests/src/test/test_ipaddr.cc
--- ceph-15.2.17/src/test/test_ipaddr.cc 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/test/test_ipaddr.cc 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_tests/src/test/test_ipaddr.cc 2023-02-09 16:39:02.457326852 +1030 +++ ceph-16.2.4-fix_tests/src/test/test_ipaddr.cc 2024-09-06 21:33:55.936470467 +1000
@@ -186,6 +186,7 @@ @@ -198,6 +198,7 @@
struct sockaddr_in a_three; memset(&net, 0, sizeof(net));
one.ifa_next = &two; one.ifa_next = &two;
+ one.ifa_flags &= ~IFF_UP; + one.ifa_flags &= ~IFF_UP;
one.ifa_addr = (struct sockaddr*)&a_one; one.ifa_addr = (struct sockaddr*)&a_one;
one.ifa_name = lo; one.ifa_name = lo;
@@ -317,6 +318,7 @@ @@ -326,6 +327,7 @@
struct sockaddr_in6 a_three; memset(&net, 0, sizeof(net));
one.ifa_next = &two; one.ifa_next = &two;
+ one.ifa_flags &= ~IFF_UP; + one.ifa_flags &= ~IFF_UP;
ipv6(&a_one, "::1");
one.ifa_addr = (struct sockaddr*)&a_one; one.ifa_addr = (struct sockaddr*)&a_one;
one.ifa_name = lo; one.ifa_name = lo;
diff -uNr ceph-15.2.17/src/msg/async/frames_v2.h ceph-15.2.17-fix_v2_frame/src/msg/async/frames_v2.h diff -uNr ceph-16.2.4/src/msg/async/frames_v2.h ceph-16.2.4-fix_v2_frame/src/msg/async/frames_v2.h
--- ceph-15.2.17/src/msg/async/frames_v2.h 2022-08-10 02:37:01.000000000 +0930 --- ceph-16.2.4/src/msg/async/frames_v2.h 2021-05-14 03:20:27.000000000 +1000
+++ ceph-15.2.17-fix_v2_frame/src/msg/async/frames_v2.h 2023-02-09 16:54:21.975120094 +1030 +++ ceph-16.2.4-fix_v2_frame/src/msg/async/frames_v2.h 2024-09-06 21:37:42.973891799 +1000
@@ -63,7 +63,7 @@ @@ -63,7 +63,7 @@
// We need them because of the rx_buffers zero-copy optimization. // We need them because of the rx_buffers zero-copy optimization.
static constexpr __u16 PAGE_SIZE_ALIGNMENT = 4096; static constexpr __u16 PAGE_SIZE_ALIGNMENT = 4096;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment