コード例 #1
0
ファイル: master.py プロジェクト: Cloudxtreme/Trieste
  def getNavelKey (self, url):
    # create a temp client and ask for the key...
    server= NavelClient (url, self)
    key= None
    while not key:
      try:
        key= server.key ()
        server.close ()
      except UmbDead:
        # a connection refused
        sleep (5)
        # should we 'timeout' and create our own ring?

    return key
コード例 #2
0
 def createEmptyClient (self):
   self._client= NavelClient (self._url, self._master)
コード例 #3
0
class StubNavel (Stub):
  """
    This class should represent anything we might need from a navel,
    including if it's our succ or pred
  """
  def __init__ (self, navel, url, key, kind=Normal):
    Stub.__init__ (self, navel, url, key)
    self.debug (1, "StubNavel: %s" % (url))
    self._kind= kind

  def createEmptyClient (self):
    self._client= NavelClient (self._url, self._master)

  def setKind (self, kind=Normal):
    self._kind= kind

  def kind (self):
    return self._kind

  def __repr__ (self):
    return "StubNavel: %s:%s [%d]" % (self.url (), self.key (), self._kind)

#   def isDead (self):
#     # test the socket?
#     return self._dead

  ##############
  # chord's proto
  ##############
  def succ (self):
    what= ['succ']
    (url, key)= self._client.ask (what)[0]

    try:
      return (url, key)
    except ValueError:
      # succ is None,None or some other shit
      return None

  def pred (self):
    what= ['pred']
    (url, key)= self._client.ask (what)[0]

    return (url, key)

  def notify (self, params):
    what= ['notify', params]
    ans= self._client.ask (what)

    self.debug (1, "on notify, got >%s<" % ans[0])
    return ans[0]

  def findSucc (self, reqKey):
    """
      Looks for the succ of key.
      returns: the parameters of such peer (url, key)
    """
    what= ['succ of', reqKey]
    (url, key)= self._client.ask (what)[0]

    return (url, key)

  ############
  # extensions
  ############
  def getData (self, key):
    what= ['value of', key]
    ans= self._client.ask (what)

    return ans

  def addData (self, h):
    if len (h.keys ())>0:
      what= ['add to', h]
      return self._client.ask (what)
    else:
      return [True]

  def delKey (self, key):
    what= ['del key', key]
    return self._client.ask (what)

  def free (self):
    what= ['free']
    ans= self._client.ask (what)

    # self.debug (1, 'free gave me: >%s<' % ret)
    self._master.updatePeers (ans[1], ans[2])
    return ans[0]

  def takeData (self, h):
    if len (h.keys ())>0:
      what= ['take', h]
      return self._client.ask (what)
    else:
      return [True]

  def forgetData (self, keys):
    """
      didn't I told you about my condition...?
    """
    if len (keys)>0:
      keys.sort ()
      keys.reverse ()
      what= ['forget', keys]
      return self._client.ask (what)
    else:
      return [True]

  def backupData (self, h):
    if len (h.keys ())>0:
      # self.debug (1, "giving %s" % h)
      what= ['backup', h]
      return self._client.ask (what)
    else:
      return [True]

  def tellPredToForget (self):
    what= ['tell pred to forget']
    return self._client.ask (what)

  def emp (self):
    what= ['emp']
    return self._client.ask (what)