def cmd_syncto(self, socket=None, args=None): if self.fresh_content: f, fname = mkstemp() os.close(f) # Lock feeds to make sure nothing's in flight wlock_all() # Sync the shelf so it's all on disk self.backend.shelf.sync() shutil.copyfile(self.backend.feed_path, fname) # Let everything else continue wunlock_all() call_hook("daemon_syncto", ["db", fname]) # Cleanup temp file os.unlink(fname) self.fresh_content = False self.sent_content = True if self.fresh_config: f, fname = mkstemp() os.close(f) config_lock.acquire_read() shutil.copyfile(self.backend.conf_path, fname) config_lock.release_read() call_hook("daemon_syncto", ["conf", fname]) os.unlink(fname) self.fresh_config = False self.sent_config = True
def cmd_syncto(self, socket = None, args = None): if self.fresh_content: f, fname = mkstemp() os.close(f) # Lock feeds to make sure nothing's in flight wlock_all() # Sync the shelf so it's all on disk self.backend.shelf.sync() shutil.copyfile(self.backend.feed_path, fname) # Let everything else continue wunlock_all() call_hook("daemon_syncto", [ "db", fname ]) # Cleanup temp file os.unlink(fname) self.fresh_content = False self.sent_content = True if self.fresh_config: f, fname = mkstemp() os.close(f) config_lock.acquire_read() shutil.copyfile(self.backend.conf_path, fname) config_lock.release_read() call_hook("daemon_syncto", [ "conf", fname ]) os.unlink(fname) self.fresh_config = False self.sent_config = True
def cmd_sync(self, socket=None, args=None): needs_syncto = False if not self.sent_config: f, fname = mkstemp() os.close(f) call_hook("daemon_syncfrom", ["conf", fname]) conf_stat = os.stat(self.backend.conf_path) sync_stat = os.stat(fname) log.debug('conf: %s sync: %s' % (conf_stat.st_mtime, sync_stat.st_mtime)) diff = sync_stat.st_mtime - conf_stat.st_mtime # Will be empty tempfile if syncfrom failed. if sync_stat.st_size != 0: if diff > 0: log.debug("conf: We are older") parse_locks() shutil.move(fname, self.backend.conf_path) config.parse() parse_unlocks() # Echo these changes to all connected sockets that care for socket in self.backend.watches["config"]: self.backend.in_configs({}, socket) elif diff == 0: log.debug("conf: We are equal") os.unlink(fname) else: log.debug("conf: We are newer") os.unlink(fname) self.fresh_config = True needs_syncto = True else: os.unlink(fname) if not self.sent_content: f, fname = mkstemp() os.close(f) call_hook("daemon_syncfrom", ["db", fname]) diff = self.time_diff(fname) if diff > 0: # Lock feeds to make sure nothing's in flight wlock_all() # Close the file so we can replace it. self.backend.shelf.close() shutil.move(fname, self.backend.feed_path) self.backend.shelf.open() # Clear out all of the currently tagged items. Usually on # update, we're able to discard items that we have in old # content, but aren't in new. But since we just replaced all of # our old content with a totally fresh copy, we might not know # they exist. Can't use reset() because we don't want to lose # configuration. alltags.clear_tags() # First half of wunlock_all, release these locks so # fetch threads can get locks for feed in sorted(allfeeds.feeds.keys()): allfeeds.feeds[feed].lock.release_write() # Complete wunlock_all() feed_lock.release_write() # Force feeds to be repopulated from disk, which will handle # communicating changes to connections self.backend.fetch.fetch(True, True) self.backend.fetch.reap(True) # Equal, just clear it up elif diff == 0: os.unlink(fname) # If we're actually newer on a syncfrom then make syncto happen # next time. This can happen on init. else: os.unlink(fname) self.fresh_content = True needs_syncto = True if needs_syncto: self.cmd_syncto() self.reset()
def cmd_sync(self, socket = None, args = None): needs_syncto = False if not self.sent_config: f, fname = mkstemp() os.close(f) call_hook("daemon_syncfrom", [ "conf", fname ]) conf_stat = os.stat(self.backend.conf_path) sync_stat = os.stat(fname) log.debug('conf: %s sync: %s' % (conf_stat.st_mtime, sync_stat.st_mtime)) diff = sync_stat.st_mtime - conf_stat.st_mtime # Will be empty tempfile if syncfrom failed. if sync_stat.st_size != 0: if diff > 0: log.debug("conf: We are older") parse_locks() shutil.move(fname, self.backend.conf_path) config.parse() parse_unlocks() # Echo these changes to all connected sockets that care for socket in self.backend.watches["config"]: self.backend.in_configs({}, socket) elif diff == 0: log.debug("conf: We are equal") os.unlink(fname) else: log.debug("conf: We are newer") os.unlink(fname) self.fresh_config = True needs_syncto = True else: os.unlink(fname) if not self.sent_content: f, fname = mkstemp() os.close(f) call_hook("daemon_syncfrom", [ "db", fname ]) diff = self.time_diff(fname) if diff > 0: # Lock feeds to make sure nothing's in flight wlock_all() # Close the file so we can replace it. self.backend.shelf.close() shutil.move(fname, self.backend.feed_path) self.backend.shelf.open() # First half of wunlock_all, release these locks so # fetch threads can get locks for feed in sorted(allfeeds.feeds.keys()): allfeeds.feeds[feed].lock.release_write() # Force feeds to be repopulated from disk, which will handle # communicating changes to connections self.backend.fetch.fetch(True, True) self.backend.fetch.reap(True) # Complete wunlock_all() feed_lock.release_write() # Equal, just clear it up elif diff == 0: os.unlink(fname) # If we're actually newer on a syncfrom then make syncto happen # next time. This can happen on init. else: os.unlink(fname) self.fresh_content = True needs_syncto = True if needs_syncto: self.cmd_syncto() self.reset()