1212#include " common/ceph_context.h"
1313#include " common/debug.h"
1414#include " common/errno.h"
15+ #include " common/perf_counters.h"
16+ #include " common/perf_counters_key.h"
1517#include " FSMirror.h"
1618#include " PeerReplayer.h"
1719#include " Utils.h"
2628
2729using namespace std ;
2830
31+ // Performance Counters
32+ enum {
33+ l_cephfs_mirror_peer_replayer_first = 6000 ,
34+ l_cephfs_mirror_peer_replayer_snaps_synced,
35+ l_cephfs_mirror_peer_replayer_snaps_deleted,
36+ l_cephfs_mirror_peer_replayer_snaps_renamed,
37+ l_cephfs_mirror_peer_replayer_snap_sync_failures,
38+ l_cephfs_mirror_peer_replayer_avg_sync_time,
39+ l_cephfs_mirror_peer_replayer_sync_bytes,
40+ l_cephfs_mirror_peer_replayer_last,
41+ };
42+
2943namespace cephfs {
3044namespace mirror {
3145
@@ -161,10 +175,39 @@ PeerReplayer::PeerReplayer(CephContext *cct, FSMirror *fs_mirror,
161175 SERVICE_DAEMON_FAILED_DIR_COUNT_KEY, (uint64_t )0 );
162176 m_service_daemon->add_or_update_peer_attribute (m_filesystem.fscid , m_peer,
163177 SERVICE_DAEMON_RECOVERED_DIR_COUNT_KEY, (uint64_t )0 );
178+
179+ std::string labels = ceph::perf_counters::key_create (" cephfs_mirror_peers" ,
180+ {{" source_fscid" , stringify (m_filesystem.fscid )},
181+ {" source_filesystem" , m_filesystem.fs_name },
182+ {" peer_cluster_name" , m_peer.remote .cluster_name },
183+ {" peer_cluster_filesystem" , m_peer.remote .fs_name }});
184+ PerfCountersBuilder plb (m_cct, labels, l_cephfs_mirror_peer_replayer_first,
185+ l_cephfs_mirror_peer_replayer_last);
186+ auto prio = m_cct->_conf .get_val <int64_t >(" cephfs_mirror_perf_stats_prio" );
187+ plb.add_u64_counter (l_cephfs_mirror_peer_replayer_snaps_synced,
188+ " snaps_synced" , " Snapshots Synchronized" , " sync" , prio);
189+ plb.add_u64_counter (l_cephfs_mirror_peer_replayer_snaps_deleted,
190+ " snaps_deleted" , " Snapshots Deleted" , " del" , prio);
191+ plb.add_u64_counter (l_cephfs_mirror_peer_replayer_snaps_renamed,
192+ " snaps_renamed" , " Snapshots Renamed" , " ren" , prio);
193+ plb.add_u64_counter (l_cephfs_mirror_peer_replayer_snap_sync_failures,
194+ " sync_failures" , " Snapshot Sync Failures" , " fail" , prio);
195+ plb.add_time_avg (l_cephfs_mirror_peer_replayer_avg_sync_time,
196+ " avg_sync_time" , " Average Sync Time" , " asyn" , prio);
197+ plb.add_u64_counter (l_cephfs_mirror_peer_replayer_sync_bytes,
198+ " sync_bytes" , " Sync Bytes" , " sbye" , prio);
199+ m_perf_counters = plb.create_perf_counters ();
200+ m_cct->get_perfcounters_collection ()->add (m_perf_counters);
164201}
165202
166203PeerReplayer::~PeerReplayer () {
167204 delete m_asok_hook;
205+ PerfCounters *perf_counters = nullptr ;
206+ std::swap (perf_counters, m_perf_counters);
207+ if (perf_counters != nullptr ) {
208+ m_cct->get_perfcounters_collection ()->remove (perf_counters);
209+ delete perf_counters;
210+ }
168211}
169212
170213int PeerReplayer::init () {
@@ -516,6 +559,9 @@ int PeerReplayer::propagate_snap_deletes(const std::string &dir_root,
516559 return r;
517560 }
518561 inc_deleted_snap (dir_root);
562+ if (m_perf_counters) {
563+ m_perf_counters->inc (l_cephfs_mirror_peer_replayer_snaps_deleted);
564+ }
519565 }
520566
521567 return 0 ;
@@ -539,6 +585,9 @@ int PeerReplayer::propagate_snap_renames(
539585 return r;
540586 }
541587 inc_renamed_snap (dir_root);
588+ if (m_perf_counters) {
589+ m_perf_counters->inc (l_cephfs_mirror_peer_replayer_snaps_renamed);
590+ }
542591 }
543592
544593 return 0 ;
@@ -694,6 +743,9 @@ int PeerReplayer::remote_file_op(const std::string &dir_root, const std::string
694743 derr << " : failed to copy path=" << epath << " : " << cpp_strerror (r) << dendl;
695744 return r;
696745 }
746+ if (m_perf_counters) {
747+ m_perf_counters->inc (l_cephfs_mirror_peer_replayer_sync_bytes, stx.stx_size );
748+ }
697749 } else if (S_ISLNK (stx.stx_mode )) {
698750 // free the remote link before relinking
699751 r = ceph_unlinkat (m_remote_mount, fh.r_fd_dir_root , epath.c_str (), 0 );
@@ -1457,7 +1509,17 @@ int PeerReplayer::do_sync_snaps(const std::string &dir_root) {
14571509 clear_current_syncing_snap (dir_root);
14581510 return r;
14591511 }
1512+ if (m_perf_counters) {
1513+ m_perf_counters->inc (l_cephfs_mirror_peer_replayer_snaps_synced);
1514+ }
14601515 std::chrono::duration<double > duration = clock::now () - start;
1516+
1517+ utime_t d;
1518+ d.set_from_double (duration.count ());
1519+ if (m_perf_counters) {
1520+ m_perf_counters->tinc (l_cephfs_mirror_peer_replayer_avg_sync_time, d);
1521+ }
1522+
14611523 set_last_synced_stat (dir_root, it->first , it->second , duration.count ());
14621524 if (--snaps_per_cycle == 0 ) {
14631525 break ;
@@ -1481,6 +1543,9 @@ void PeerReplayer::sync_snaps(const std::string &dir_root,
14811543 locker.lock ();
14821544 if (r < 0 ) {
14831545 _inc_failed_count (dir_root);
1546+ if (m_perf_counters) {
1547+ m_perf_counters->inc (l_cephfs_mirror_peer_replayer_snap_sync_failures);
1548+ }
14841549 } else {
14851550 _reset_failed_count (dir_root);
14861551 }
0 commit comments