Esempio n. 1
0
  def test_client_handles_connection_recovery_gracefully(self):
    sync_log('test_client_handles_connection_recovery_gracefully')

    zk = ZooKeeper(self._server.ensemble, logger=sync_log)

    sync_log('Creating serverset.')
    service = ServerSet(zk, SERVICE_PATH)
    sync_log('  done')
    sync_log('Registering instance...')
    service.register(INSTANCE1)
    sync_log('  done')

    client = ServerSetClient(SERVICE_PATH, zk=zk)
    assert list(client) == [INSTANCE1]

    # Restart the server after delay
    threading.Timer(3.0, lambda: self._server.start()).start()
    self._server.shutdown()
    time.sleep(1.0)

    # This will block until the server returns, or the retry attempts fail (in
    # which cause it will throw an exception and the test will fail)
    assert list(client) == [INSTANCE1]
    sync_log('success.')

    zk.close()
Esempio n. 2
0
 def test_client_iteration(self):
   sync_log('test_client_iteration')
   zk = ZooKeeper(self._server.ensemble, timeout_secs=10, logger=sync_log)
   service = ServerSet(zk, SERVICE_PATH)
   client = ServerSetClient(SERVICE_PATH, zk=zk)
   assert list(client) == []
   service.register(INSTANCE1)
   assert list(client) == [INSTANCE1]
   service.register(INSTANCE2)
   assert list(client) == [INSTANCE1, INSTANCE2]
   sync_log('Test over, killing client.')
   zk.close()
Esempio n. 3
0
  def test_client_watcher(self):
    sync_log('test_client_watcher')

    updated = threading.Event()
    old_endpoints = ['init']
    new_endpoints = ['init']

    def watcher(service_path, old, new):
      old_endpoints[:] = old
      new_endpoints[:] = new
      updated.set()

    zk = ZooKeeper(self._server.ensemble, timeout_secs=10, logger=sync_log)
    service = ServerSet(zk, SERVICE_PATH)
    client = ServerSetClient(SERVICE_PATH, zk=zk, watcher=watcher)

    updated.wait(2.0)
    assert updated.is_set()
    assert old_endpoints == []
    assert new_endpoints == []
    updated.clear()

    instance1 = service.register(INSTANCE1)
    updated.wait(2.0)
    assert updated.is_set()
    assert old_endpoints == []
    assert new_endpoints == [INSTANCE1]
    updated.clear()

    service.register(INSTANCE2)
    updated.wait(2.0)
    assert updated.is_set()
    assert old_endpoints == [INSTANCE1]
    assert new_endpoints == [INSTANCE1, INSTANCE2]
    updated.clear()

    service.unregister(instance1)
    updated.wait(2.0)
    assert updated.is_set()
    assert old_endpoints == [INSTANCE1, INSTANCE2]
    assert new_endpoints == [INSTANCE2]
    updated.clear()

    zk.close()
Esempio n. 4
0
 def __init__(self, endpoint, zk=None, watcher=None, retries=None):
   self._error = None
   self._endpoint = endpoint
   self._watcher = watcher
   self._lock = threading.Lock()
   self._endpoints = set()
   options = app.get_options()
   self._retries = options.serverset_retries if retries is None else retries
   self._zk = zk or ZooKeeper()
   self._start()