code: def lookup(self, key):
          
          try:
              result = self.lookup_in_database(key)
          except KeyError:
              pass
          else:
              return result
  
          while True:
              fut = self._lookup_cache[key]
              try:
                  result = yield from fut
              except ValueError:
                  continue
              else:
                  return result
docs: Look up the given `node` URL using the given `hash_` first in the
          database and then by waiting on the futures created with
          :meth:`create_query_future` for that node URL and hash.
  
          If the hash is not in the database, :meth:`lookup` iterates as long as
          there are pending futures for the given `hash_` and `node`. If there
          are no pending futures, :class:`KeyError` is raised. If a future raises
          a :class:`ValueError`, it is ignored. If the future returns a value, it
          is used as the result.