[24454] in Source-Commits

home help back first fref pref prev next nref lref last post

/svn/athena r24045 - trunk/debathena/debathena/metrics/debathena/metrics

daemon@ATHENA.MIT.EDU (Evan Broder)
Sun Oct 4 22:03:49 2009

Date: Sun, 4 Oct 2009 22:03:37 -0400
From: Evan Broder <broder@MIT.EDU>
Message-Id: <200910050203.n9523bG6002961@drugstore.mit.edu>
To: source-commits@mit.edu
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Author: broder
Date: 2009-10-04 22:03:37 -0400 (Sun, 04 Oct 2009)
New Revision: 24045

Modified:
   trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py
Log:
Add logic to metrics code to wait for 1ms before actually reading
events from the connector.

This batches a bunch of quick successive events together, rather than
continually waking up the gatherer, which minimizes the performance
impact to the rest of the system.



Modified: trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py
===================================================================
--- trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py	2009-10-05 01:37:00 UTC (rev 24044)
+++ trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py	2009-10-05 02:03:37 UTC (rev 24045)
@@ -55,13 +55,9 @@
         self.start_time = time.time()
         self.session_uuid = str(uuid.uuid4())
 
-        proc_conn = connector.Connector()
-        make_non_blocking(proc_conn)
-        gobject.io_add_watch(
-            proc_conn,
-            gobject.IO_IN,
-            self.run_program,
-            )
+        self.proc_conn = connector.Connector()
+        make_non_blocking(self.proc_conn)
+        self.setup_io_watch()
 
         dbus.SystemBus().add_signal_receiver(
             self.install_package,
@@ -77,26 +73,44 @@
             path=DBUS_OBJECT,
             )
 
+    def setup_io_watch(self):
+        gobject.io_add_watch(
+            self.proc_conn,
+            gobject.IO_IN,
+            self.setup_run_program,
+            )
+
+    def setup_run_program(self, fd, cond):
+        gobject.timeout_add(
+            1,
+            self.run_program,
+            fd,
+            cond,
+            )
+        return False
+
     def run_program(self, fd, cond):
-        while True:
-            try:
-                ev = fd.recv_event()
-            except IOError, e:
-                if e.errno == errno.EAGAIN:
-                    break
-                raise
-
-            if ev.what == connector.PROC_EVENT_EXEC:
+        try:
+            while True:
                 try:
-                    prog = os.readlink("/proc/%d/exe" % ev.process_pid)
-                    self.executed_programs.add(prog)
-                except OSError, e:
-                    if e.errno == errno.ENOENT:
-                        continue
-                    raise
+                    ev = fd.recv_event()
+                except IOError, e:
+                    if e.errno == errno.EAGAIN:
+                        break
 
-        return True
+                if ev.what == connector.PROC_EVENT_EXEC:
+                    try:
+                        prog = os.readlink("/proc/%d/exe" % ev.process_pid)
+                        self.executed_programs.add(prog)
+                    except OSError, e:
+                        if e.errno == errno.ENOENT:
+                            continue
+        except:
+            pass
 
+        self.setup_io_watch()
+        return False
+
     def install_package(self, package):
         self.installed_packages.add(str(package))
 


home help back first fref pref prev next nref lref last post