]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
memory leaks
authorsage <sage@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 14 Jun 2005 17:23:21 +0000 (17:23 +0000)
committersage <sage@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 14 Jun 2005 17:23:21 +0000 (17:23 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@312 29311d96-e01e-0410-9327-a35deaab8ce9

17 files changed:
ceph/client/Client.cc
ceph/client/Client.h
ceph/client/SyntheticClient.cc
ceph/common/Timer.cc
ceph/common/Timer.h
ceph/fakesyn.cc
ceph/mds/MDCache.cc
ceph/mds/MDCache.h
ceph/mds/MDS.cc
ceph/mds/MDStore.cc
ceph/msg/CheesySerializer.cc
ceph/msg/FakeMessenger.cc
ceph/msg/HostMonitor.cc
ceph/msg/HostMonitor.h
ceph/msg/MPIMessenger.cc
ceph/osd/FakeStore.cc
ceph/osd/OSD.cc

index c67d7b8f2a0c7dceba5cbb9912f39b80ac030c08..6d9f076d1e81489db781af6773d49a9219831a63 100644 (file)
@@ -54,6 +54,35 @@ Client::~Client()
   if (messenger) { delete messenger; messenger = 0; }
   if (filer) { delete filer; filer = 0; }
   if (osdcluster) { delete osdcluster; osdcluster = 0; }
+
+  tear_down_cache();
+}
+
+void Client::tear_down_cache()
+{
+  // fh's
+  for (map<fileh_t, Fh*>::iterator it = fh_map.begin();
+          it != fh_map.end();
+          it++) {
+       Fh *fh = it->second;
+       put_inode(fh->inode);
+       delete fh;
+  }
+  fh_map.clear();
+
+  // empty lru
+  lru.lru_set_max(0);
+  trim_cache();
+
+  // close root ino
+  assert(inode_map.size() <= 1);
+  if (root && inode_map.size() == 1) {
+       delete root;
+       root = 0;
+       inode_map.clear();
+  }
+
+  assert(inode_map.empty());
 }
 
 
@@ -72,6 +101,16 @@ void Client::shutdown() {
 // ===================
 // metadata cache stuff
 
+void Client::trim_cache()
+{
+  while (lru.lru_get_size() > lru.lru_get_max()) {
+       Dentry *dn = (Dentry*)lru.lru_expire();
+       if (!dn) break;  // done
+
+       //dout(10) << "unlinking dn " << dn->name << " in dir " << dn->dir->inode->inode.ino << endl;
+       unlink(dn);
+  }
+}
 
 // insert inode info into metadata cache
 
@@ -886,14 +925,16 @@ int Client::open(const char *path, int mode)
   // success?
   if (result > 0) {
        // yay
+       fileh_t fh = reply->get_result();      // FIXME?
        Fh *f = new Fh;
        memset(f, 0, sizeof(*f));
        f->mds = reply->get_source();
        f->inode = inode_map[trace[trace.size()-1]->inode.ino];
        f->caps = reply->get_file_caps();
-       fh_map[reply->get_result()] = f;
+       assert(fh_map.count(fh) == 0);
+       fh_map[fh] = f;
 
-       dout(3) << "open success, fh is " << reply->get_result() << " caps " << f->caps << "  fh size " << f->size << endl;
+       dout(3) << "open success, fh is " << fh << " caps " << f->caps << "  fh size " << f->size << endl;
   }
 
   delete reply;
@@ -927,6 +968,7 @@ int Client::close(fileh_t fh)
   /* mds may ack our close() after reissuing same fh to another open; remove from
         fh_map _before_ sending request. */
   fh_map.erase(fh);
+  delete f;
 
   release_inode_buffers(in);
 
index c1358c53366780b76638dd81f589fddf1401746f..a609fc12c3e7696c9b6548cccc8c6505ea0524b1 100644 (file)
@@ -210,7 +210,7 @@ class Client : public Dispatcher {
        // unlink from inode
        dn->inode = 0;
        in->dn = 0;
-       in->put();
+       put_inode(in);
        
        // unlink from dir
        dn->dir->dentries.erase(dn->name);
@@ -227,14 +227,7 @@ class Client : public Dispatcher {
   void touch_dn(Dentry *dn) { lru.lru_touch(dn); }  
 
   // trim cache.
-  void trim_cache() {
-       while (lru.lru_get_size() > lru.lru_get_max()) {
-         Dentry *dn = (Dentry*)lru.lru_expire();
-         if (!dn) break;  // done
-         
-         unlink(dn);
-       }
-  }
+  void trim_cache();
   
   // find dentry based on filepath
   Dentry *lookup(filepath& path);
@@ -253,6 +246,7 @@ class Client : public Dispatcher {
  public:
   Client(MDCluster *mdc, int id, Messenger *m);
   ~Client();
+  void tear_down_cache();   
 
   int get_nodeid() { return whoami; }
 
index 8e9ad17486679fe0796c40ff6c9ec2ee52d5132e..d514f0248460ebb145c774345f16aaa8a1ed0e5d 100644 (file)
@@ -165,10 +165,11 @@ int SyntheticClient::make_dirs(const char *basedir, int dirs, int files, int dep
 
 
 
-int SyntheticClient::write_file(string& fn, int size, int wrsize)   // size is in MB
+int SyntheticClient::write_file(string& fn, int size, int wrsize)   // size is in MB, wrsize in bytes
 {
   //__uint64_t wrsize = 1024*256;
   char *buf = new char[wrsize];   // 1 MB
+  memset(buf, 1, wrsize);
   __uint64_t chunks = (__uint64_t)size * (__uint64_t)(1024*1024) / (__uint64_t)wrsize;
 
   int fd = client->open(fn.c_str(), O_WRONLY|O_CREAT);
index a50d7f9a5cacd4d7add7d26949970c6f20ae0cc4..c250de9cff15d51bdc0d0299dad6d68089d03c87 100644 (file)
@@ -173,6 +173,7 @@ bool Timer::cancel_event(Context *callback)
   if (!event_times.count(callback)) {
        dout(DBL) << "cancel_event " << callback << " wasn't scheduled?" << endl;
        lock.Unlock();
+       assert(0);
        return false;     // wasn't scheduled.
   }
 
index 32ca93dac9f47d4eddb29e685f8cb19bcc741b86..f0a6b316efe8dfc236c849610a933be7d222d6a3 100644 (file)
@@ -66,11 +66,34 @@ class Timer {
        thread_stop = false;
   }
   ~Timer() { 
-       // cancel any wakeup/thread crap
+       // scheduled
+       for (map< timepair_t, set<Context*> >::iterator it = scheduled.begin();
+                it != scheduled.end();
+                it++) {
+         for (set<Context*>::iterator sit = it->second.begin();
+                  sit != it->second.end();
+                  sit++)
+               delete *sit;
+       }
+       scheduled.clear();
+
+       // pending
+       for (map< timepair_t, set<Context*> >::iterator it = pending.begin();
+                it != pending.end();
+                it++) {
+         for (set<Context*>::iterator sit = it->second.begin();
+                  sit != it->second.end();
+                  sit++)
+               delete *sit;
+       }
+       pending.clear();
+  }
+  
+  void init() {
+       register_timer();
+  }
+  void shutdown() {
        cancel_timer();
-
-       // clean up pending events
-       // ** FIXME **
   }
 
   void set_messenger(Messenger *m);
index 1683192854c80b2b62157cd530ff444aee63a0c9..82bad147db80dce3ab3600aac595118df4717977 100644 (file)
@@ -182,7 +182,9 @@ int main(int oargc, char **oargv) {
        delete client[i];
   }
   delete mdc;
-  
+
+  free(argv);
+  delete[] nargv;
   return 0;
 }
 
index 3cef53b90740739057b59f051447d08bbb130da5..29e87d7795e626eb610fa80069022e8edab4a2d1 100644 (file)
@@ -3176,7 +3176,7 @@ void MDCache::handle_rename_notify(MRenameNotify *m)
 
 int MDCache::issue_file_caps(CInode *in,
                                                         int mode,
-                                                        Context *onwait)
+                                                        MClientRequest *req)
 {
   dout(7) << "issue_file_caps for mode " << mode << " on " << *in << endl;
 
@@ -3222,14 +3222,15 @@ int MDCache::issue_file_caps(CInode *in,
          }
        }
        
-       in->add_waiter(CINODE_WAIT_CAPS, onwait);
+       in->add_waiter(CINODE_WAIT_CAPS, new C_MDS_RetryRequest(mds, req, in));
        return 0;
   }
 
   // we're okay!
   int caps = my_want & allowed;
   dout(7) << " issuing caps " << caps << " (i want " << my_want << ", allowed " << allowed << ")" << endl;
-  assert(caps);
+  assert(caps > 0);
+
   return caps;
 }
 
index 6ec7d1040c8070b30e4111cc248b68020e6fa2c1..367e5e64d29fb071b36fefb2459ac6b1d0960548 100644 (file)
@@ -258,7 +258,7 @@ class MDCache {
 
 
   // -- file i/o --
-  int issue_file_caps(CInode *in, int mode, Context *onwait);
+  int issue_file_caps(CInode *in, int mode, MClientRequest *req);
   void eval_file_caps(CInode *in);
   void handle_client_file_caps(class MClientFileCaps *m);
 
index 7d663ebe32571327110221ea3bba6891243ae3a3..9b3b8bb2f467f5c9a7fa7fa9d71a2a983df815c1 100644 (file)
@@ -2238,8 +2238,7 @@ void MDS::handle_client_open(MClientRequest *req,
 
 
   // can we issue the caps they want?
-  int caps = mdcache->issue_file_caps(cur, mode,
-                                                                         new C_MDS_RetryRequest(this, req, cur));
+  int caps = mdcache->issue_file_caps(cur, mode, req);
   if (!caps) return; // can't issue (yet), so wait!
 
   // create fh
index c725cd27bb13fc2f8757a88cc66aaf1a84b40a02..48e7cdccbbf07e6f18b85e38d480b03f214be471 100644 (file)
@@ -302,8 +302,6 @@ class MDDoCommitDirContext : public Context {
   __uint64_t version;
 
 public:
-  bufferlist bl;
-  
   MDDoCommitDirContext(MDStore *ms, CDir *dir, Context *c, int w) : Context() {
        this->ms = ms;
        this->dir = dir;
@@ -393,32 +391,20 @@ void MDStore::do_commit_dir( CDir *dir,
   dout(14) << "num " << num << endl;
   
   // put count in buffer
+  bufferlist bl;
   size_t size = sizeof(num) + dirdata.length();
-  fin->bl.append((char*)&size, sizeof(size));
-  fin->bl.append((char*)&num, sizeof(num));
-  fin->bl.append(dirdata.c_str(), dirdata.length());
-  assert(fin->bl.length() == size + sizeof(size));
+  bl.append((char*)&size, sizeof(size));
+  bl.append((char*)&num, sizeof(num));
+  bl.append(dirdata.c_str(), dirdata.length());
+  assert(bl.length() == size + sizeof(size));
   
   // pin inode
   dir->auth_pin();
   
   // submit to osd
-  int osd;
-  object_t oid;
-  if (hashcode >= 0) {
-       // hashed
-       osd = mds->mdcluster->get_hashdir_meta_osd(dir->ino(), hashcode);
-       oid = mds->mdcluster->get_hashdir_meta_oid(dir->ino(), hashcode);
-  } else {
-       // normal
-       osd = mds->mdcluster->get_meta_osd(dir->ino());
-       oid = mds->mdcluster->get_meta_oid(dir->ino());
-  }
-  
-
   mds->filer->write( dir->ino(),
-                                        fin->bl.length(), 0,
-                                        fin->bl,
+                                        bl.length(), 0,
+                                        bl,
                                         0, //OSD_OP_FLAGS_TRUNCATE, // truncate file/object after end of this write
                                         fin );
 }
index aa9fbc3b98fad18167cf3449d7951e409081cf7f..a73db49fdcaddccb76d7605dab9e4673455d0c0f 100644 (file)
@@ -121,6 +121,7 @@ int CheesySerializer::shutdown()
   }       
   lock.Unlock();
 
-  // shutdown underlying messenger.
+  // shutdown and delete underlying messenger.
   messenger->shutdown();
+  delete messenger;
 }
index 8a7826d67e02659e93e7e2d83c30eb9a09d8a05a..754dbf28f7bcd20bb71ff89da20e226dd90f9ec0 100644 (file)
@@ -95,6 +95,8 @@ int fakemessenger_do_loop()
   lock.Lock();
   fakemessenger_do_loop_2();
   lock.Unlock();
+
+  g_timer.shutdown();
 }
 
 
@@ -176,6 +178,7 @@ FakeMessenger::FakeMessenger(long me)  : Messenger(me)
 
   cout << "fakemessenger " << whoami << " messenger is " << this << endl;
 
+  /*
   string name;
   name = "m.";
   name += MSG_ADDR_TYPE(whoami);
@@ -185,15 +188,18 @@ FakeMessenger::FakeMessenger(long me)  : Messenger(me)
   if (w >= 10) name += ('0' + ((w/10)%10));
   name += ('0' + ((w/1)%10));
 
-  logger = new Logger(name, (LogType*)&fakemsg_logtype);
-  loggers[ whoami ] = logger;
+  loggers[ whoami ] = new Logger(name, (LogType*)&fakemsg_logtype);
+  */
 }
 
 FakeMessenger::~FakeMessenger()
 {
   shutdown();
 
-  delete logger;
+  if (loggers[whoami]) {
+       delete loggers[whoami];
+       loggers.erase(whoami);
+  }
 }
 
 
index a6ab29921c6afd9e9d3fb8825e486b293d157c4f..7d35712a9717af3f0e14050f0576a37a8b8eb7f9 100644 (file)
@@ -30,6 +30,7 @@ public:
   }
   void finish(int r) {
        //cout << "HEARTBEAT" << endl;
+       hm->pending_events.erase(this);
     hm->initiate_heartbeat();
   }
 };
@@ -42,6 +43,7 @@ public:
   }
   void finish(int r) {
        //cout << "CHECK" << endl;
+       hm->pending_events.erase(this);
     hm->check_heartbeat();
   }
 };
@@ -72,6 +74,7 @@ void HostMonitor::shutdown()
           it != pending_events.end();
           it++) {
        g_timer.cancel_event(*it);
+       delete *it;
   }
   pending_events.clear();
 }
index b3627e9852c0442a517e34d6e3b5b8cc4c6e56d0..b3e61eecf3bbf27835bcfaae07a8501c8c5f80d7 100644 (file)
@@ -42,8 +42,10 @@ class HostMonitor {
   int   max_heartbeat_misses;  // how many misses before i tell
   float notify_retry_interval; // how often to retry failure notification
 
+ public:
   set<Context*>  pending_events;
 
+ private:
   void schedule_heartbeat();
 
  public:
index 3d1f2b92f1ce363e0901bd200669c7420bd735dd..e755c56f6aa464a25bb80572d23c86ce13d86d46 100644 (file)
@@ -407,6 +407,8 @@ void* mpimessenger_loop(void*)
   dout(5) << "finishing async sends" << endl;
   mpi_finish_sends();
 
+  g_timer.shutdown();
+
   dout(5) << "mpimessenger_loop exiting loop" << endl;
 }
 
index c4f67f0c22c7323322cc20ea9fce2ee4848ec595..921673bb0cf9ce8f8b0ee28ee5c42a8ad80dad16 100644 (file)
@@ -91,7 +91,7 @@ void FakeStore::wipe_dir(string mydir)
 {
   DIR *dir = opendir(mydir.c_str());
   if (dir) {
-       dout(1) << "wiping " << mydir << endl;
+       dout(10) << "wiping " << mydir << endl;
        struct dirent *ent = 0;
        
        while (ent = readdir(dir)) {
@@ -123,7 +123,7 @@ int FakeStore::mkfs()
   // make sure my dir exists
   r = ::stat(mydir.c_str(), &st);
   if (r != 0) {
-       dout(1) << "creating " << mydir << endl;
+       dout(10) << "creating " << mydir << endl;
        mkdir(mydir.c_str(), 0755);
        r = ::stat(mydir.c_str(), &st);
        if (r != 0) {
index 2baa90253b46a0014ec6ace9e77406569d5f05ab..82b9fcc7d3ca0c8d42ab9dcf4b2893dc41ef4cc2 100644 (file)
@@ -82,6 +82,7 @@ OSD::OSD(int id, Messenger *m)
 OSD::~OSD()
 {
   if (osdcluster) { delete osdcluster; osdcluster = 0; }
+  if (monitor) { delete monitor; monitor = 0; }
   if (messenger) { delete messenger; messenger = 0; }
   if (logger) { delete logger; logger = 0; }
   if (store) { delete store; store = 0; }