Skip to content

Commit dfa2348

Browse files
committed
rbd-mirror: add cluster fsid to remote meta cache key
Using just pool id is not enough when mirroring several clusters. Fixes: https://tracker.ceph.com/issues/69492 Signed-off-by: Mykola Golub <[email protected]>
1 parent 4807e02 commit dfa2348

File tree

7 files changed

+84
-54
lines changed

7 files changed

+84
-54
lines changed

src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc

Lines changed: 39 additions & 35 deletions
Large diffs are not rendered by default.

src/test/rbd_mirror/test_ImageReplayer.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,13 @@ class TestImageReplayer : public TestFixture {
144144
cls::rbd::MIRROR_PEER_DIRECTION_RX_TX,
145145
"siteA", "client", m_local_mirror_uuid}));
146146

147+
std::string remote_fsid;
148+
librados::Rados remote_rados(m_remote_ioctx);
149+
EXPECT_EQ(0, remote_rados.cluster_fsid(&remote_fsid));
150+
147151
m_pool_meta_cache.set_remote_pool_meta(
148-
m_remote_ioctx.get_id(), {m_remote_mirror_uuid, remote_peer_uuid});
152+
remote_fsid, m_remote_ioctx.get_id(),
153+
{m_remote_mirror_uuid, remote_peer_uuid});
149154
}
150155

151156
EXPECT_EQ(0, librbd::api::Mirror<>::uuid_get(m_remote_ioctx,

src/tools/rbd_mirror/PoolMetaCache.cc

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ void PoolMetaCache::remove_local_pool_meta(int64_t pool_id) {
4848
}
4949

5050
int PoolMetaCache::get_remote_pool_meta(
51-
int64_t pool_id,
51+
const std::string& fsid, int64_t pool_id,
5252
RemotePoolMeta* remote_pool_meta) const {
53-
dout(15) << "pool_id=" << pool_id << dendl;
53+
dout(15) << "fsid=" << fsid << ", pool_id=" << pool_id << dendl;
5454

5555
std::shared_lock locker{m_lock};
56-
auto it = m_remote_pool_metas.find(pool_id);
56+
auto it = m_remote_pool_metas.find({fsid, pool_id});
5757
if (it == m_remote_pool_metas.end()) {
5858
return -ENOENT;
5959
}
@@ -63,20 +63,21 @@ int PoolMetaCache::get_remote_pool_meta(
6363
}
6464

6565
void PoolMetaCache::set_remote_pool_meta(
66-
int64_t pool_id,
66+
const std::string& fsid, int64_t pool_id,
6767
const RemotePoolMeta& remote_pool_meta) {
68-
dout(15) << "pool_id=" << pool_id << ", "
69-
<< "remote_pool_meta=" << remote_pool_meta << dendl;
68+
dout(15) << "fsid=" << fsid << ", pool_id=" << pool_id
69+
<< ", remote_pool_meta=" << remote_pool_meta << dendl;
7070

7171
std::unique_lock locker(m_lock);
72-
m_remote_pool_metas[pool_id] = remote_pool_meta;
72+
m_remote_pool_metas[{fsid, pool_id}] = remote_pool_meta;
7373
}
7474

75-
void PoolMetaCache::remove_remote_pool_meta(int64_t pool_id) {
76-
dout(15) << "pool_id=" << pool_id << dendl;
75+
void PoolMetaCache::remove_remote_pool_meta(
76+
const std::string& fsid, int64_t pool_id) {
77+
dout(15) << "fsid=" << fsid << ", pool_id=" << pool_id << dendl;
7778

7879
std::unique_lock locker(m_lock);
79-
m_remote_pool_metas.erase(pool_id);
80+
m_remote_pool_metas.erase({fsid, pool_id});
8081
}
8182

8283
} // namespace mirror

src/tools/rbd_mirror/PoolMetaCache.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,19 @@ class PoolMetaCache {
2626
const LocalPoolMeta& local_pool_meta);
2727
void remove_local_pool_meta(int64_t pool_id);
2828

29-
int get_remote_pool_meta(int64_t pool_id,
29+
int get_remote_pool_meta(const std::string& fsid, int64_t pool_id,
3030
RemotePoolMeta* remote_pool_meta) const;
31-
void set_remote_pool_meta(int64_t pool_id,
31+
void set_remote_pool_meta(const std::string& fsid, int64_t pool_id,
3232
const RemotePoolMeta& remote_pool_meta);
33-
void remove_remote_pool_meta(int64_t pool_id);
33+
void remove_remote_pool_meta(const std::string& fsid, int64_t pool_id);
3434

3535
private:
3636
CephContext* m_cct;
3737

3838
mutable ceph::shared_mutex m_lock =
3939
ceph::make_shared_mutex("rbd::mirror::PoolMetaCache::m_lock");
4040
std::map<int64_t, LocalPoolMeta> m_local_pool_metas;
41-
std::map<int64_t, RemotePoolMeta> m_remote_pool_metas;
41+
std::map<std::pair<std::string, int64_t>, RemotePoolMeta> m_remote_pool_metas;
4242
};
4343

4444
} // namespace mirror

src/tools/rbd_mirror/PoolReplayer.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,13 @@ void PoolReplayer<I>::init(const std::string& site_name) {
326326
return;
327327
}
328328

329+
r = m_remote_rados->cluster_fsid(&m_remote_fsid);
330+
if (r < 0) {
331+
derr << "failed to retrieve remote cluster fsid: " << cpp_strerror(r)
332+
<< dendl;
333+
return;
334+
}
335+
329336
r = m_remote_rados->ioctx_create(m_local_io_ctx.get_pool_name().c_str(),
330337
m_remote_io_ctx);
331338
if (r < 0) {
@@ -362,9 +369,10 @@ void PoolReplayer<I>::init(const std::string& site_name) {
362369
m_remote_pool_poller.reset();
363370
return;
364371
}
372+
365373
ceph_assert(!m_remote_pool_meta.mirror_uuid.empty());
366374
m_pool_meta_cache->set_remote_pool_meta(
367-
m_remote_io_ctx.get_id(), m_remote_pool_meta);
375+
m_remote_fsid, m_remote_io_ctx.get_id(), m_remote_pool_meta);
368376
m_pool_meta_cache->set_local_pool_meta(
369377
m_local_io_ctx.get_id(), {m_local_mirror_uuid});
370378

@@ -414,7 +422,8 @@ void PoolReplayer<I>::shut_down() {
414422
m_remote_pool_poller->shut_down(&ctx);
415423
ctx.wait();
416424

417-
m_pool_meta_cache->remove_remote_pool_meta(m_remote_io_ctx.get_id());
425+
m_pool_meta_cache->remove_remote_pool_meta(m_remote_fsid,
426+
m_remote_io_ctx.get_id());
418427
m_pool_meta_cache->remove_local_pool_meta(m_local_io_ctx.get_id());
419428
}
420429
m_remote_pool_poller.reset();

src/tools/rbd_mirror/PoolReplayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ class PoolReplayer {
214214
librados::IoCtx m_remote_io_ctx;
215215

216216
std::string m_local_mirror_uuid;
217+
std::string m_remote_fsid;
217218

218219
RemotePoolMeta m_remote_pool_meta;
219220
std::unique_ptr<remote_pool_poller::Listener> m_remote_pool_poller_listener;

src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,19 @@ void Replayer<I>::init(Context* on_finish) {
150150

151151
ceph_assert(m_state == STATE_INIT);
152152

153+
std::string remote_fsid;
154+
librados::Rados remote_rados(m_state_builder->remote_image_ctx->md_ctx);
155+
int r = remote_rados.cluster_fsid(&remote_fsid);
156+
if (r < 0) {
157+
derr << "failed to retrieve remote cluster fsid: " << cpp_strerror(r)
158+
<< dendl;
159+
return;
160+
}
161+
153162
RemotePoolMeta remote_pool_meta;
154-
int r = m_pool_meta_cache->get_remote_pool_meta(
155-
m_state_builder->remote_image_ctx->md_ctx.get_id(), &remote_pool_meta);
163+
r = m_pool_meta_cache->get_remote_pool_meta(
164+
remote_fsid, m_state_builder->remote_image_ctx->md_ctx.get_id(),
165+
&remote_pool_meta);
156166
if (r < 0 || remote_pool_meta.mirror_peer_uuid.empty()) {
157167
derr << "failed to retrieve mirror peer uuid from remote pool" << dendl;
158168
m_state = STATE_COMPLETE;

0 commit comments

Comments
 (0)