code: @Override
    public void update(final GroupCommunicationMessage msg) {
      if (msg.hasSrcVersion()) {
        final String srcId = msg.getSrcid();
        final int srcVersion = msg.getSrcVersion();
        LOG.finest(getQualifiedName() + "Updating " + msg.getType() + " msg from " + srcId);
        LOG.finest(getQualifiedName() + "Before update: parent=" + ((parent != null) ? parent.getId() : "NULL"));
        LOG.finest(getQualifiedName() + "Before update: children=" + children);
        switch (msg.getType()) {
        case ParentAdd:
          updateParentAdd(srcId, srcVersion);
          break;
        case ParentDead:
          updateParentDead(srcId, srcVersion);
          break;
        case ChildAdd:
          updateChildAdd(srcId, srcVersion);
          break;
        case ChildDead:
          updateChildDead(srcId, srcVersion);
          break;
        default:
          throw new RuntimeException("Received a non control message in update");
        }
        LOG.finest(getQualifiedName() + "After update: parent=" + ((parent != null) ? parent.getId() : "NULL"));
        LOG.finest(getQualifiedName() + "After update: children=" + children);
      } else {
        throw new RuntimeException(getQualifiedName() + "can only deal with msgs that have src version set");
      }
    }
docs: Updates the topology structure with the received
  message. Does not make assumptions about msg order
  Tries to handle OOS msgs
  <p>
  Expects only control messages