From: Patrick Donnelly Date: Wed, 22 Feb 2017 02:44:42 +0000 (-0500) Subject: mds: automate MDS object count tracking X-Git-Tag: v12.0.1~237^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=16e22a7e00782cb1508dbe1185749b0c7539c6fd;p=ceph.git mds: automate MDS object count tracking Signed-off-by: Patrick Donnelly --- diff --git a/src/include/counter.h b/src/include/counter.h new file mode 100644 index 000000000000..d161c0b7dac6 --- /dev/null +++ b/src/include/counter.h @@ -0,0 +1,54 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2017 Red Hat, Inc. + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#ifndef CEPH_COUNTER_H +#define CEPH_COUNTER_H + +template +class Counter { +public: + Counter() { + _count()++; + _increments()++; + } + Counter(const Counter &rhs) { + _count()++; + _increments()++; + } + Counter(Counter &&rhs) {} + ~Counter() { + _count()--; + } + static unsigned long count() { + return _count(); + } + static unsigned long increments() { + return _increments(); + } + static unsigned long decrements() { + return increments()-count(); + } + +private: + static unsigned long &_count() { + static unsigned long c; + return c; + } + static unsigned long &_increments() { + static unsigned long i; + return i; + } +}; + +#endif diff --git a/src/mds/CDentry.h b/src/mds/CDentry.h index d280eece5d5c..f5f9510f89a4 100644 --- a/src/mds/CDentry.h +++ b/src/mds/CDentry.h @@ -20,6 +20,7 @@ #include #include +#include "include/counter.h" #include "include/types.h" #include "include/buffer_fwd.h" #include "include/lru.h" @@ -46,7 +47,7 @@ class Session; bool operator<(const CDentry& l, const CDentry& r); // dentry -class CDentry : public MDSCacheObject, public LRUObject { +class CDentry : public MDSCacheObject, public LRUObject, public Counter { public: friend class CDir; @@ -106,8 +107,6 @@ public: versionlock(this, &versionlock_type), dir(0), version(0), projected_version(0) { - g_num_dn++; - g_num_dna++; } CDentry(const std::string& n, __u32 h, inodeno_t ino, unsigned char dt, snapid_t f, snapid_t l) : @@ -118,16 +117,9 @@ public: versionlock(this, &versionlock_type), dir(0), version(0), projected_version(0) { - g_num_dn++; - g_num_dna++; linkage.remote_ino = ino; linkage.remote_d_type = dt; } - ~CDentry() { - g_num_dn--; - g_num_dns++; - } - static void *operator new(size_t num_bytes) { void *n = pool.malloc(); diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 1faa02e4e937..a69a267779f5 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -198,9 +198,6 @@ CDir::CDir(CInode *in, frag_t fg, MDCache *mdcache, bool auth) : num_dentries_auth_subtree_nested(0), dir_auth(CDIR_AUTH_DEFAULT) { - g_num_dir++; - g_num_dira++; - state = STATE_INITIAL; memset(&fnode, 0, sizeof(fnode)); diff --git a/src/mds/CDir.h b/src/mds/CDir.h index 8eb2cbc27e8c..06ae9a487b66 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -17,6 +17,7 @@ #ifndef CEPH_CDIR_H #define CEPH_CDIR_H +#include "include/counter.h" #include "include/types.h" #include "include/buffer_fwd.h" #include "common/bloom_filter.hpp" @@ -41,7 +42,7 @@ class MDCache; struct ObjectOperation; ostream& operator<<(ostream& out, const class CDir& dir); -class CDir : public MDSCacheObject { +class CDir : public MDSCacheObject, public Counter { friend ostream& operator<<(ostream& out, const class CDir& dir); /* @@ -404,10 +405,6 @@ protected: public: CDir(CInode *in, frag_t fg, MDCache *mdcache, bool auth); - ~CDir() { - g_num_dir--; - g_num_dirs++; - } const scrub_info_t *scrub_info() const { if (!scrub_infop) { diff --git a/src/mds/CInode.h b/src/mds/CInode.h index b8bd8206fd17..484aed549e07 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -18,6 +18,7 @@ #define CEPH_CINODE_H #include "common/config.h" +#include "include/counter.h" #include "include/elist.h" #include "include/types.h" #include "include/lru.h" @@ -127,7 +128,7 @@ public: WRITE_CLASS_ENCODER_FEATURES(InodeStore) // cached inode wrapper -class CInode : public MDSCacheObject, public InodeStoreBase { +class CInode : public MDSCacheObject, public InodeStoreBase, public Counter { /* * This class uses a boost::pool to handle allocation. This is *not* * thread-safe, so don't do allocations from multiple threads! @@ -681,14 +682,10 @@ public: policylock(this, &policylock_type), loner_cap(-1), want_loner_cap(-1) { - g_num_ino++; - g_num_inoa++; state = 0; if (auth) state_set(STATE_AUTH); } ~CInode() { - g_num_ino--; - g_num_inos++; close_dirfrags(); close_snaprealm(); clear_file_locks(); diff --git a/src/mds/Capability.h b/src/mds/Capability.h index b8ea0a1e732b..e66f8c7e426c 100644 --- a/src/mds/Capability.h +++ b/src/mds/Capability.h @@ -16,6 +16,7 @@ #ifndef CEPH_CAPABILITY_H #define CEPH_CAPABILITY_H +#include "include/counter.h" #include "include/buffer_fwd.h" #include "include/xlist.h" @@ -63,7 +64,7 @@ namespace ceph { class Formatter; } -class Capability { +class Capability : public Counter { public: struct Export { int64_t cap_id; @@ -123,14 +124,8 @@ public: last_issue(0), mseq(0), suppress(0), state(0) { - g_num_cap++; - g_num_capa++; } Capability(const Capability& other); // no copying - ~Capability() { - g_num_cap--; - g_num_caps++; - } static void *operator new(size_t num_bytes) { diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index e5773dd30e82..7d6343fef680 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -111,21 +111,6 @@ static ostream& _prefix(std::ostream *_dout, MDSRank *mds) { return *_dout << "mds." << mds->get_nodeid() << ".cache "; } -long g_num_ino = 0; -long g_num_dir = 0; -long g_num_dn = 0; -long g_num_cap = 0; - -long g_num_inoa = 0; -long g_num_dira = 0; -long g_num_dna = 0; -long g_num_capa = 0; - -long g_num_inos = 0; -long g_num_dirs = 0; -long g_num_dns = 0; -long g_num_caps = 0; - set SimpleLock::empty_gather_set; diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 0264ae412e04..58a196985eb0 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -546,19 +546,19 @@ bool MDSRank::_dispatch(Message *m, bool new_msg) */ if (mlogger) { - mlogger->set(l_mdm_ino, g_num_ino); - mlogger->set(l_mdm_dir, g_num_dir); - mlogger->set(l_mdm_dn, g_num_dn); - mlogger->set(l_mdm_cap, g_num_cap); - - mlogger->inc(l_mdm_inoa, g_num_inoa); g_num_inoa = 0; - mlogger->inc(l_mdm_inos, g_num_inos); g_num_inos = 0; - mlogger->inc(l_mdm_dira, g_num_dira); g_num_dira = 0; - mlogger->inc(l_mdm_dirs, g_num_dirs); g_num_dirs = 0; - mlogger->inc(l_mdm_dna, g_num_dna); g_num_dna = 0; - mlogger->inc(l_mdm_dns, g_num_dns); g_num_dns = 0; - mlogger->inc(l_mdm_capa, g_num_capa); g_num_capa = 0; - mlogger->inc(l_mdm_caps, g_num_caps); g_num_caps = 0; + mlogger->set(l_mdm_ino, CInode::count()); + mlogger->set(l_mdm_dir, CDir::count()); + mlogger->set(l_mdm_dn, CDentry::count()); + mlogger->set(l_mdm_cap, Capability::count()); + + mlogger->set(l_mdm_inoa, CInode::increments()); + mlogger->set(l_mdm_inos, CInode::decrements()); + mlogger->set(l_mdm_dira, CDir::increments()); + mlogger->set(l_mdm_dirs, CDir::decrements()); + mlogger->set(l_mdm_dna, CDentry::increments()); + mlogger->set(l_mdm_dns, CDentry::decrements()); + mlogger->set(l_mdm_capa, Capability::increments()); + mlogger->set(l_mdm_caps, Capability::decrements()); mlogger->set(l_mdm_buf, buffer::get_total_alloc()); } diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 961fbf8d3780..9a6779307d68 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -113,11 +113,6 @@ class mds_role_t std::ostream& operator<<(std::ostream &out, const mds_role_t &role); -extern long g_num_ino, g_num_dir, g_num_dn, g_num_cap; -extern long g_num_inoa, g_num_dira, g_num_dna, g_num_capa; -extern long g_num_inos, g_num_dirs, g_num_dns, g_num_caps; - - // CAPS inline string gcap_string(int cap)