Changeset 24045

Show
Ignore:
Timestamp:
10/04/09 22:03:37 (6 months ago)
Author:
broder
Message:

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.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py

    r24043 r24045  
    5656        self.session_uuid = str(uuid.uuid4()) 
    5757 
    58         proc_conn = connector.Connector() 
    59         make_non_blocking(proc_conn) 
    60         gobject.io_add_watch( 
    61             proc_conn, 
    62             gobject.IO_IN, 
    63             self.run_program, 
    64             ) 
     58        self.proc_conn = connector.Connector() 
     59        make_non_blocking(self.proc_conn) 
     60        self.setup_io_watch() 
    6561 
    6662        dbus.SystemBus().add_signal_receiver( 
     
    7874            ) 
    7975 
     76    def setup_io_watch(self): 
     77        gobject.io_add_watch( 
     78            self.proc_conn, 
     79            gobject.IO_IN, 
     80            self.setup_run_program, 
     81            ) 
     82 
     83    def setup_run_program(self, fd, cond): 
     84        gobject.timeout_add( 
     85            1, 
     86            self.run_program, 
     87            fd, 
     88            cond, 
     89            ) 
     90        return False 
     91 
    8092    def run_program(self, fd, cond): 
    81         while True: 
    82             try: 
    83                 ev = fd.recv_event() 
    84             except IOError, e: 
    85                 if e.errno == errno.EAGAIN: 
    86                     break 
    87                 raise 
     93        try: 
     94            while True: 
     95                try: 
     96                    ev = fd.recv_event() 
     97                except IOError, e: 
     98                    if e.errno == errno.EAGAIN: 
     99                        break 
    88100 
    89             if ev.what == connector.PROC_EVENT_EXEC: 
    90                 try: 
    91                     prog = os.readlink("/proc/%d/exe" % ev.process_pid) 
    92                     self.executed_programs.add(prog) 
    93                 except OSError, e: 
    94                     if e.errno == errno.ENOENT: 
    95                         continue 
    96                     raise 
     101                if ev.what == connector.PROC_EVENT_EXEC: 
     102                    try: 
     103                        prog = os.readlink("/proc/%d/exe" % ev.process_pid) 
     104                        self.executed_programs.add(prog) 
     105                    except OSError, e: 
     106                        if e.errno == errno.ENOENT: 
     107                            continue 
     108        except: 
     109            pass 
    97110 
    98         return True 
     111        self.setup_io_watch() 
     112        return False 
    99113 
    100114    def install_package(self, package):