@wraps(func) def wrapper(self,*args,**kwds): try: result = func(self,*args,**kwds) except RemoteConnectionError: self.connected = False raise except FSError: self.connected = True raise else: self.connected = True return result return wrapper wrap_fs_methods(_ConnectionManagerFS_method_wrapper,ConnectionManagerFS) class CachedInfo(object): """Info objects stored in cache for CacheFS.""" __slots__ = ("timestamp","info","has_full_info","has_full_children") def __init__(self,info={},has_full_info=True,has_full_children=False): self.timestamp = time.time() self.info = info self.has_full_info = has_full_info self.has_full_children = has_full_children def clone(self): new_ci = self.__class__() new_ci.update_from(self) return new_ci def update_from(self,other):
try: result = func(self, *args, **kwds) except RemoteConnectionError: self.connected = False raise except FSError: self.connected = True raise else: self.connected = True return result return wrapper wrap_fs_methods(_ConnectionManagerFS_method_wrapper, ConnectionManagerFS) class CachedInfo(object): """Info objects stored in cache for CacheFS.""" __slots__ = ("timestamp", "info", "has_full_info", "has_full_children") def __init__(self, info={}, has_full_info=True, has_full_children=False): self.timestamp = time.time() self.info = info self.has_full_info = has_full_info self.has_full_children = has_full_children def clone(self): new_ci = self.__class__() new_ci.update_from(self)
self._continue = False if self._bounce_thread is not None: self._bounce_thread.join() self._connected = True super(DisconnectingFS,self).close() def disconnecting_wrapper(func): """Method wrapper to raise RemoteConnectionError if not connected.""" @wraps(func) def wrapper(self,*args,**kwds): if not self._connected: raise RemoteConnectionError("") return func(self,*args,**kwds) return wrapper DisconnectingFS = wrap_fs_methods(disconnecting_wrapper,DisconnectingFS,exclude=["close"]) class DisconnectRecoveryFS(WrapFS): """FS subclass that recovers from RemoteConnectionErrors by waiting.""" pass def recovery_wrapper(func): """Method wrapper to recover from RemoteConnectionErrors by waiting.""" @wraps(func) def wrapper(self,*args,**kwds): while True: try: return func(self,*args,**kwds) except RemoteConnectionError: self.wrapped_fs.wait_for_connection() return wrapper
super(DisconnectingFS, self).close() def disconnecting_wrapper(func): """Method wrapper to raise RemoteConnectionError if not connected.""" @wraps(func) def wrapper(self, *args, **kwds): if not self._connected: raise RemoteConnectionError("") return func(self, *args, **kwds) return wrapper DisconnectingFS = wrap_fs_methods(disconnecting_wrapper, DisconnectingFS, exclude=["close"]) class DisconnectRecoveryFS(WrapFS): """FS subclass that recovers from RemoteConnectionErrors by waiting.""" pass def recovery_wrapper(func): """Method wrapper to recover from RemoteConnectionErrors by waiting.""" @wraps(func) def wrapper(self, *args, **kwds): while True: try: return func(self, *args, **kwds)