Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
ceph
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
certo
ceph
Commits
bf36b5f4
Commit
bf36b5f4
authored
Oct 06, 2024
by
Vladimir Bashkirtsev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated ceph to 16.2.4
parent
62e18750
Changes
15
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
248 additions
and
3285 deletions
+248
-3285
Makefile
Makefile
+18
-20
ceph-15.2.17-arm32_fix.patch
ceph-15.2.17-arm32_fix.patch
+0
-214
ceph-15.2.17-arm32_fix_tests.patch
ceph-15.2.17-arm32_fix_tests.patch
+0
-2839
ceph-15.2.17-fix_ErasureCodeShec.patch
ceph-15.2.17-fix_ErasureCodeShec.patch
+0
-33
ceph-15.2.17-fix_ceph-volume_systemd_unit.patch
ceph-15.2.17-fix_ceph-volume_systemd_unit.patch
+0
-16
ceph-15.2.17-fix_cpu_detection.patch
ceph-15.2.17-fix_cpu_detection.patch
+0
-12
ceph-15.2.17-fix_librbd_duplicate.patch
ceph-15.2.17-fix_librbd_duplicate.patch
+0
-12
ceph-15.2.17-fix_pip.patch
ceph-15.2.17-fix_pip.patch
+0
-38
ceph-15.2.17-no_git.patch
ceph-15.2.17-no_git.patch
+0
-14
ceph-15.2.17-skip_promtool_tests.patch
ceph-15.2.17-skip_promtool_tests.patch
+0
-28
ceph-16.2.4-fix_pytest.patch
ceph-16.2.4-fix_pytest.patch
+186
-0
ceph-16.2.4-fix_tests.patch
ceph-16.2.4-fix_tests.patch
+41
-56
ceph-16.2.4-fix_v2_frame.patch
ceph-16.2.4-fix_v2_frame.patch
+3
-3
ceph-16.2.4.tar.gz
ceph-16.2.4.tar.gz
+0
-0
ceph-object-corpus.tar.xz
ceph-object-corpus.tar.xz
+0
-0
No files found.
Makefile
View file @
bf36b5f4
...
...
@@ -31,26 +31,24 @@ all: ceph-config ceph-sudoer
mkdir
ceph-home
ln
-s
/lib
/lib64
tar
xf
ceph-15.2.17.tar.gz
patch
-Np1
-d
ceph-15.2.17
<
ceph-15.2.17-fix_v2_frame.patch
patch
-Np1
-d
ceph-15.2.17
<
ceph-15.2.17-fix_cpu_detection.patch
patch
-Np1
-d
ceph-15.2.17
<
ceph-15.2.17-fix_tests.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-no_git.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_ErasureCodeShec.patch
patch
-Np1
-d
ceph-15.2.17
<
ceph-15.2.17-fix_pip.patch
if
[
`uname
-m`
=
'armv7l'
]
;
then
\
patch
-Np1
-d
ceph-15.2.17
<
ceph-15.2.17-arm32_fix.patch
;
\
patch
-Np1
-d
ceph-15.2.17
<
ceph-15.2.17-arm32_fix_tests.patch
;
\
fi
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"
tar
xf
ceph-16.2.4.tar.gz
patch
-Np1
-d
ceph-16.2.4
<
ceph-16.2.4-fix_v2_frame.patch
patch
-Np1
-d
ceph-16.2.4
<
ceph-16.2.4-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_pip.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_mypy_with_python3.9.patch
# if [ `uname -m` = 'armv7l' ] ; then \
# patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-arm32_fix.patch ; \
# patch -Np1 -d ceph-15.2.17 < ceph-15.2.17-arm32_fix_tests.patch ; \
# fi
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
$(MAKE)
-C
ceph-16.2.4/build
npm_config_cache
=
/build/.npm
NODE_OPTIONS
=
"--max-old-space-size=3072"
hostname
localhost
cd
ceph-1
5.2.17
&&
tar
xf
../ceph-object-corpus.tar.xz
cd
ceph-1
5.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-1
6.2.4
&&
tar
xf
../ceph-object-corpus.tar.xz
cd
ceph-1
6.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-1
5.2.17
/build
install
$(MAKE)
-C
ceph-1
6.2.4
/build
install
rm
/usr/bin/ceph_test*
find
/
-name
*.pyc
-exec
rm
-f
'{}'
';'
find
/
-name
*.js.map
-exec
rm
-f
'{}'
';'
...
...
@@ -78,7 +76,7 @@ all: ceph-config ceph-sudoer
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
/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
install
-v
-Dm755
ceph
/usr/share/easycwmp/functions
...
...
@@ -99,7 +97,7 @@ all: ceph-config ceph-sudoer
swapoff
swap
rm
-rf
swap
rm
-rf
ceph-1
5.2.17
rm
-rf
ceph-1
6.2.4
ceph-config
:
define
CEPH_CONFIG
...
...
ceph-15.2.17-arm32_fix.patch
deleted
100644 → 0
View file @
62e18750
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)));
ceph-15.2.17-arm32_fix_tests.patch
deleted
100644 → 0
View file @
62e18750
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++) {
ceph-15.2.17-fix_ErasureCodeShec.patch
deleted
100644 → 0
View file @
62e18750
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;
}
ceph-15.2.17-fix_ceph-volume_systemd_unit.patch
deleted
100644 → 0
View file @
62e18750
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}
ceph-15.2.17-fix_cpu_detection.patch
deleted
100644 → 0
View file @
62e18750
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;
ceph-15.2.17-fix_librbd_duplicate.patch
deleted
100644 → 0
View file @
62e18750
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"
ceph-15.2.17-fix_pip.patch
deleted
100644 → 0
View file @
62e18750
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
ceph-15.2.17-no_git.patch
deleted
100644 → 0
View file @
62e18750
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:=..}
ceph-15.2.17-skip_promtool_tests.patch
deleted
100644 → 0
View file @
62e18750
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})
ceph-16.2.4-fix_pytest.patch
0 → 100644
View file @
bf36b5f4
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
ceph-1
5.2.17
-fix_tests.patch
→
ceph-1
6.2.4
-fix_tests.patch
View file @
bf36b5f4
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
--- ceph-15.2.17/src/test/cli/ceph-conf/env-vs-args.t 2022-08-10 02:37:01.000000000 +0930
+++ ceph-15.2.17-fix_tests/src/test/cli/ceph-conf/env-vs-args.t 2023-02-09 16:39:02.455326846 +1030
@@ -2,9 +2,9 @@
$ 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 @@
diff -uNr ceph-16.2.4/src/test/CMakeLists.txt ceph-16.2.4-fix_tests/src/test/CMakeLists.txt
--- ceph-16.2.4/src/test/CMakeLists.txt 2021-05-14 03:20:27.000000000 +1000
+++ ceph-16.2.4-fix_tests/src/test/CMakeLists.txt 2024-09-06 21:32:31.213057915 +1000
@@ -569,11 +569,17 @@
# Run rbd-unit-tests separate so they an run in parallel
# 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)
...
...
@@ -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)
add_ceph_test(rbd-ggate.sh ${CMAKE_CURRENT_SOURCE_DIR}/rbd-ggate.sh)
endif(FREEBSD)
@@ -5
30,6 +53
6,7 @@
@@ -5
90,6 +59
6,7 @@
#add_ceph_test(test_pidfile.sh ${CMAKE_CURRENT_SOURCE_DIR}/test_pidfile.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
find_program(PROMTOOL_EXECUTABLE promtool)
if(PROMTOOL_EXECUTABLE)
diff -uNr ceph-1
5.2.17/src/test/common/Throttle.cc ceph-15.2.17
-fix_tests/src/test/common/Throttle.cc
--- ceph-1
5.2.17/src/test/common/Throttle.cc 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/common/Throttle.cc 2023-02-09 16:39:02.455326846 +103
0
diff -uNr ceph-1
6.2.4/src/test/common/Throttle.cc ceph-16.2.4
-fix_tests/src/test/common/Throttle.cc
--- ceph-1
6.2.4/src/test/common/Throttle.cc 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/common/Throttle.cc 2024-09-06 21:32:31.215057877 +100
0
@@ -332,7 +332,7 @@
3,
6);
...
...
@@ -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_GT(results.second.count(), 0.00005);
}
diff -uNr ceph-1
5.2.17/src/test/encoding/CMakeLists.txt ceph-15.2.17
-fix_tests/src/test/encoding/CMakeLists.txt
--- ceph-1
5.2.17/src/test/encoding/CMakeLists.txt 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/encoding/CMakeLists.txt 2023-02-09 16:39:02.456326849 +103
0
diff -uNr ceph-1
6.2.4/src/test/encoding/CMakeLists.txt ceph-16.2.4
-fix_tests/src/test/encoding/CMakeLists.txt
--- ceph-1
6.2.4/src/test/encoding/CMakeLists.txt 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/encoding/CMakeLists.txt 2024-09-06 21:32:31.217057840 +100
0
@@ -1,3 +1,5 @@
# scripts
add_ceph_test(check-generated.sh ${CMAKE_CURRENT_SOURCE_DIR}/check-generated.sh)
+set_tests_properties(check-generated.sh PROPERTIES TIMEOUT 18000)
add_ceph_test(readable.sh ${CMAKE_CURRENT_SOURCE_DIR}/readable.sh)
+set_tests_properties(readable.sh PROPERTIES TIMEOUT 36000)
diff -uNr ceph-1
5.2.17/src/test/mgr/CMakeLists.txt ceph-15.2.17
-fix_tests/src/test/mgr/CMakeLists.txt
--- ceph-1
5.2.17/src/test/mgr/CMakeLists.txt 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/mgr/CMakeLists.txt 2023-02-09 16:39:02.456326849 +103
0
diff -uNr ceph-1
6.2.4/src/test/mgr/CMakeLists.txt ceph-16.2.4
-fix_tests/src/test/mgr/CMakeLists.txt
--- ceph-1
6.2.4/src/test/mgr/CMakeLists.txt 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/mgr/CMakeLists.txt 2024-09-06 21:32:31.217057840 +100
0
@@ -9,6 +9,7 @@
if(WITH_MGR_DASHBOARD_FRONTEND)
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
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)
diff -uNr ceph-1
5.2.17/src/test/objectstore/CMakeLists.txt ceph-15.2.17
-fix_tests/src/test/objectstore/CMakeLists.txt
--- ceph-1
5.2.17/src/test/objectstore/CMakeLists.txt 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/objectstore/CMakeLists.txt 2023-02-09 16:39:02.456326849 +103
0
diff -uNr ceph-1
6.2.4/src/test/objectstore/CMakeLists.txt ceph-16.2.4
-fix_tests/src/test/objectstore/CMakeLists.txt
--- ceph-1
6.2.4/src/test/objectstore/CMakeLists.txt 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/objectstore/CMakeLists.txt 2024-09-06 21:32:31.218057821 +100
0
@@ -131,6 +131,7 @@
test_bluefs.cc
)
...
...
@@ -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)
endif(WITH_BLUESTORE)
diff -uNr ceph-1
5.2.17/src/test/objectstore/test_bluefs.cc ceph-15.2.17
-fix_tests/src/test/objectstore/test_bluefs.cc
--- ceph-1
5.2.17/src/test/objectstore/test_bluefs.cc 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/objectstore/test_bluefs.cc 2023-02-09 16:39:02.456326849 +103
0
@@ -
263,13 +263
,13 @@
diff -uNr ceph-1
6.2.4/src/test/objectstore/test_bluefs.cc ceph-16.2.4
-fix_tests/src/test/objectstore/test_bluefs.cc
--- ceph-1
6.2.4/src/test/objectstore/test_bluefs.cc 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/objectstore/test_bluefs.cc 2024-09-06 21:32:31.219057803 +100
0
@@ -
195,13 +195
,13 @@
for (unsigned i = 0; i < 3*1024*1048576ull / sizeof(buf); ++i) {
h->append(buf, 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
fs.close_writer(h);
}
{
diff -uNr ceph-1
5.2.17/src/test/osd/CMakeLists.txt ceph-15.2.17
-fix_tests/src/test/osd/CMakeLists.txt
--- ceph-1
5.2.17/src/test/osd/CMakeLists.txt 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/osd/CMakeLists.txt 2023-02-09 16:39:02.456326849 +103
0
diff -uNr ceph-1
6.2.4/src/test/osd/CMakeLists.txt ceph-16.2.4
-fix_tests/src/test/osd/CMakeLists.txt
--- ceph-1
6.2.4/src/test/osd/CMakeLists.txt 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/osd/CMakeLists.txt 2024-09-06 21:32:31.220057784 +100
0
@@ -35,6 +35,7 @@
# scripts
...
...
@@ -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
add_executable(unittest_osdmap
diff -uNr ceph-1
5.2.17/src/test/osd/TestOSDScrub.cc ceph-15.2.17
-fix_tests/src/test/osd/TestOSDScrub.cc
--- ceph-1
5.2.17/src/test/osd/TestOSDScrub.cc 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/osd/TestOSDScrub.cc 2023-02-09 16:39:02.456326849 +103
0
@@ -
70,7 +70
,7 @@
diff -uNr ceph-1
6.2.4/src/test/osd/TestOSDScrub.cc ceph-16.2.4
-fix_tests/src/test/osd/TestOSDScrub.cc
--- ceph-1
6.2.4/src/test/osd/TestOSDScrub.cc 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/osd/TestOSDScrub.cc 2024-09-06 21:32:31.221057765 +100
0
@@ -
91,7 +91
,7 @@
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);
- tm tm;
+ tm tm = {0};
tm.tm_isdst = -1;
strptime("2015-01-16 12:05:13", "%Y-%m-%d %H:%M:%S", &tm);
utime_t now = utime_t(mktime(&tm), 0);
diff -uNr ceph-1
5.2.17/src/test/smoke.sh ceph-15.2.17
-fix_tests/src/test/smoke.sh
--- ceph-1
5.2.17/src/test/smoke.sh 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/smoke.sh 2023-02-09 16:39:02.456326849 +103
0
diff -uNr ceph-1
6.2.4/src/test/smoke.sh ceph-16.2.4
-fix_tests/src/test/smoke.sh
--- ceph-1
6.2.4/src/test/smoke.sh 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/smoke.sh 2024-09-06 21:32:31.222057746 +100
0
@@ -53,7 +53,7 @@
ceph osd out 0
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
wait_for_clean
ceph osd in 0
diff -uNr ceph-1
5.2.17/src/test/test_ipaddr.cc ceph-15.2.17
-fix_tests/src/test/test_ipaddr.cc
--- ceph-1
5.2.17/src/test/test_ipaddr.cc 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_tests/src/test/test_ipaddr.cc 2023-02-09 16:39:02.457326852 +103
0
@@ -1
86,6 +186
,7 @@
struct sockaddr_in a_three
;
diff -uNr ceph-1
6.2.4/src/test/test_ipaddr.cc ceph-16.2.4
-fix_tests/src/test/test_ipaddr.cc
--- ceph-1
6.2.4/src/test/test_ipaddr.cc 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_tests/src/test/test_ipaddr.cc 2024-09-06 21:33:55.936470467 +100
0
@@ -1
98,6 +198
,7 @@
memset(&net, 0, sizeof(net))
;
one.ifa_next = &two;
+ one.ifa_flags &= ~IFF_UP;
one.ifa_addr = (struct sockaddr*)&a_one;
one.ifa_name = lo;
@@ -3
17,6 +318
,7 @@
struct sockaddr_in6 a_three
;
@@ -3
26,6 +327
,7 @@
memset(&net, 0, sizeof(net))
;
one.ifa_next = &two;
+ one.ifa_flags &= ~IFF_UP;
ipv6(&a_one, "::1");
one.ifa_addr = (struct sockaddr*)&a_one;
one.ifa_name = lo;
ceph-1
5.2.17
-fix_v2_frame.patch
→
ceph-1
6.2.4
-fix_v2_frame.patch
View file @
bf36b5f4
diff -uNr ceph-1
5.2.17/src/msg/async/frames_v2.h ceph-15.2.17
-fix_v2_frame/src/msg/async/frames_v2.h
--- ceph-1
5.2.17/src/msg/async/frames_v2.h 2022-08-10 02:37:01.000000000 +093
0
+++ ceph-1
5.2.17-fix_v2_frame/src/msg/async/frames_v2.h 2023-02-09 16:54:21.975120094 +103
0
diff -uNr ceph-1
6.2.4/src/msg/async/frames_v2.h ceph-16.2.4
-fix_v2_frame/src/msg/async/frames_v2.h
--- ceph-1
6.2.4/src/msg/async/frames_v2.h 2021-05-14 03:20:27.000000000 +100
0
+++ ceph-1
6.2.4-fix_v2_frame/src/msg/async/frames_v2.h 2024-09-06 21:37:42.973891799 +100
0
@@ -63,7 +63,7 @@
// We need them because of the rx_buffers zero-copy optimization.
static constexpr __u16 PAGE_SIZE_ALIGNMENT = 4096;
...
...
ceph-1
5.2.17
.tar.gz
→
ceph-1
6.2.4
.tar.gz
View file @
bf36b5f4
No preview for this file type
ceph-object-corpus.tar.xz
View file @
bf36b5f4
No preview for this file type
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment