/**
   * Release the tryClaim of the coordinate. It means that nobody owns the coordinate anymore.
   * Requires that that this instance owns the tryClaim to the coordinate.
   */
  public void releaseClaim() throws CloudnameException {
    scheduler.shutdown();
    zkClient.deregisterListener(this);

    while (true) {
      final TrackedConfig config;
      synchronized (trackedConfigList) {
        if (trackedConfigList.isEmpty()) {
          break;
        }
        config = trackedConfigList.remove(0);
      }
      config.stop();
    }

    sendEventToCoordinateListener(
        CoordinateListener.Event.NOT_OWNER, "Released claim of coordinate");

    synchronized (lastStatusVersionMonitor) {
      try {
        zkClient.getZookeeper().delete(path, lastStatusVersion);
      } catch (InterruptedException e) {
        throw new CloudnameException(e);
      } catch (KeeperException e) {
        throw new CloudnameException(e);
      }
    }
  }
 /** Callbacks from zkClient */
 @Override
 public void connectionDown() {
   List<CoordinateListener> coordinateListenerListCopy = new ArrayList<CoordinateListener>();
   synchronized (coordinateListenerList) {
     coordinateListenerListCopy.addAll(coordinateListenerList);
   }
   for (CoordinateListener coordinateListener : coordinateListenerListCopy) {
     coordinateListener.onCoordinateEvent(
         CoordinateListener.Event.NO_CONNECTION_TO_STORAGE, "down");
   }
   isSynchronizedWithZooKeeper.set(false);
 }
 /**
  * Sends an event too all coordinate listeners. Note that the event is sent from this thread so if
  * the callback code does the wrong calls, deadlocks might occur.
  *
  * @param event
  * @param message
  */
 private void sendEventToCoordinateListener(
     final CoordinateListener.Event event, final String message) {
   synchronized (callbacksMonitor) {
     LOG.fine("Event " + event.name() + " " + message);
     List<CoordinateListener> coordinateListenerListCopy = new ArrayList<CoordinateListener>();
     synchronized (coordinateListenerList) {
       coordinateListenerListCopy.addAll(coordinateListenerList);
     }
     for (CoordinateListener listener : coordinateListenerListCopy) {
       listener.onCoordinateEvent(event, message);
     }
   }
 }
  /**
   * Registers a coordinatelistener that will receive events when there are changes to the status
   * node. Don't do any heavy lifting in the callback and don't call cloudname from the callback as
   * this might create a deadlock.
   *
   * @param coordinateListener
   */
  public void registerCoordinateListener(final CoordinateListener coordinateListener) {

    String message = "New listener added, resending current state.";
    synchronized (callbacksMonitor) {
      coordinateListenerList.add(coordinateListener);
      if (isSynchronizedWithZooKeeper.get()) {
        coordinateListener.onCoordinateEvent(CoordinateListener.Event.COORDINATE_OK, message);
      }
    }
  }
 /**
  * Registers a configlistener that will receive events when there are changes to the config node.
  * Don't do any heavy lifting in the callback and don't call cloudname from the callback as this
  * might create a deadlock.
  *
  * @param trackedConfig
  */
 public void registerTrackedConfig(final TrackedConfig trackedConfig) {
   trackedConfigList.add(trackedConfig);
 }
 public void deregisterCoordinateListener(final CoordinateListener coordinateListener) {
   coordinateListenerList.remove(coordinateListener);
 }