def sync(self): self.log.debug('sync') sync = threading.Event() self.evq.put((cmsg_event(self.target, sync), )) sync.wait()
def receiver(self): # # The source thread routine -- get events from the # channel and forward them into the common event queue # # The routine exists on an event with error code == 104 # stop = False while not stop: with self.lock: if self.shutdown.is_set(): break if self.nl is not None: try: self.nl.close(code=0) except Exception as e: self.log.warning('source restart: %s' % e) try: self.state.set('connecting') if isinstance(self.nl_prime, type): spec = {} spec.update(self.nl_kwarg) if self.kind in ('nsmanager', ): spec['libc'] = self.ndb.libc self.nl = self.nl_prime(**spec) else: raise TypeError('source channel not supported') self.state.set('loading') # self.nl.bind(async_cache=True, clone_socket=True) # # Initial load -- enqueue the data # self.ndb.schema.allow_read(False) try: self.ndb.schema.flush(self.target) self.evq.put(self.nl.dump()) finally: self.ndb.schema.allow_read(True) self.started.set() self.shutdown.clear() self.state.set('running') if self.event is not None: self.evq.put((cmsg_event(self.target, self.event), )) else: self.evq.put((cmsg_sstart(self.target), )) except Exception as e: self.started.set() self.state.set('failed') self.log.error('source error: %s %s' % (type(e), e)) try: self.evq.put((cmsg_failed(self.target), )) except ShutdownException: stop = True break if self.persistent: self.log.debug('sleeping before restart') self.shutdown.wait(SOURCE_FAIL_PAUSE) if self.shutdown.is_set(): self.log.debug('source shutdown') stop = True break else: self.event.set() return continue while not stop: try: msg = tuple(self.nl.get()) except Exception as e: self.log.error('source error: %s %s' % (type(e), e)) msg = None if not self.persistent: stop = True break code = 0 if msg and msg[0]['header']['error']: code = msg[0]['header']['error'].code if msg is None or code == errno.ECONNRESET: stop = True break self.ndb.schema._allow_write.wait() try: self.evq.put(msg) except ShutdownException: stop = True break # thus we make sure that all the events from # this source are consumed by the main loop # in __dbm__() routine try: self.sync() self.log.debug('flush DB for the target') self.ndb.schema.flush(self.target) except ShutdownException: self.log.debug('shutdown handled by the main thread') pass self.state.set('stopped')