class _ObjectFetcher(_ObjectProcessor): '''A context for loading object data from the dataretriever.''' def __init__(self, state): _ObjectProcessor.__init__(self) self._state = state self._loader = ObjectLoader(state.config, state.blob_cache) def __str__(self): return 'fetcher' def _get_cache_digest(self): return 'dataretriever' def evaluate(self, obj): try: self._loader.load(obj) except ObjectLoadError, e: _log.warning('Failed to load %s: %s', obj, e) self._state.stats.update('objs_unloadable') raise _DropObject() result = _FilterResult() for key in obj: result.output_attrs[key] = obj.get_signature(key) return result
def __init__(self, state): _ObjectProcessor.__init__(self) self._state = state self._loader = ObjectLoader(state.config, state.blob_cache)
self._filters.optimize() _log.info( "Optimized filter stack [%d]: %s" % (len(self._filters), ','.join([f.name for f in self._filters]))) if not self._state.context: self._state.context = ResourceContext(params.object_id, self._state.config, lock=threading.Lock(), catalog=dict()) runner = self._filters.bind( self._state, None ) # no need for queue as we'll call evaluate(obj) directly, not run() obj = Object(self._server_id, params.object_id) loader = ObjectLoader(self._state.config, self._state.blob_cache) if not loader.source_available(obj): raise DiamondRPCFCacheMiss() drop = not runner.evaluate(obj) return protocol.XDR_attribute_list( obj.xdr_attributes(output_attrs, for_drop=drop)) @RPCHandlers.handler(29, reply_class=protocol.XDR_search_stats) @running(True) def request_stats(self): '''Return current search statistics.''' filter_stats = [f.stats for f in self._filters] return self._state.stats.xdr(self._scope.get_count(), filter_stats) @RPCHandlers.handler(18, reply_class=protocol.XDR_session_vars)
_log.info('Starting search %s', params.search_id) self._filters.start_threads(self._state, self._state.config.threads) @RPCHandlers.handler(30, protocol.XDR_reexecute, protocol.XDR_attribute_list) def reexecute_filters(self, params): '''Reexecute the search on the specified object.''' try: self._check_runnable() except RPCError, e: _log.warning('Cannot reexecute filters: %s', str(e)) raise _log.info('Reexecuting on object %s', params.object_id) runner = self._filters.bind(self._state) obj = Object(self._server_id, params.object_id) loader = ObjectLoader(self._state.config, self._state.blob_cache) if not loader.source_available(obj): raise DiamondRPCFCacheMiss() drop = not runner.evaluate(obj) if params.attrs is not None: output_attrs = set(params.attrs) else: # If no output attributes were specified, encode everything output_attrs = None return protocol.XDR_attribute_list(obj.xdr_attributes(output_attrs, for_drop=drop)) @RPCHandlers.handler(29, reply_class=protocol.XDR_search_stats) @running(True) def request_stats(self): '''Return current search statistics.'''