Пример #1
0
  protected void handleViewChange(View v) {
    Address old_coord;
    List<Address> new_members = v.getMembers();
    boolean send_up_exception = false;

    this.view = v;
    synchronized (members) {
      old_coord = (!members.isEmpty() ? members.get(0) : null);
      members.clear();
      members.addAll(new_members);

      // this handles the case where a coord dies during a state transfer; prevents clients from
      // hanging forever
      // Note this only takes a coordinator crash into account, a getState(target, timeout), where
      // target is not
      // null is not handled ! (Usually we get the state from the coordinator)
      // http://jira.jboss.com/jira/browse/JGRP-148
      if (waiting_for_state_response && old_coord != null && !members.contains(old_coord))
        send_up_exception = true;
    }

    if (send_up_exception) {
      log.warn("%s: discovered that the state provider (%s) left", local_addr, old_coord);
      waiting_for_state_response = false;
      Exception ex = new EOFException("state provider " + old_coord + " left");
      up_prot.up(new Event(Event.GET_STATE_OK, new StateTransferResult(ex)));
      openBarrierAndResumeStable();
    }

    // remove non members from list of members requesting state
    state_requesters.retainAll(new_members);
  }
Пример #2
0
  public Object up(Event evt) {
    switch (evt.getType()) {
      case Event.MSG:
        Message msg = (Message) evt.getArg();
        StateHeader hdr = (StateHeader) msg.getHeader(this.id);
        if (hdr == null) break;

        switch (hdr.type) {
          case StateHeader.STATE_REQ:
            state_requesters.add(msg.getSrc());
            break;
          case StateHeader.STATE_RSP:
            handleStateRsp(hdr.getDigest(), msg.getSrc(), msg.getBuffer());
            break;
          case StateHeader.STATE_EX:
            closeHoleFor(msg.getSrc());
            handleException((Throwable) msg.getObject());
            break;
          default:
            log.error("%s: type %s not known in StateHeader", local_addr, hdr.type);
            break;
        }
        return null;

      case Event.TMP_VIEW:
      case Event.VIEW_CHANGE:
        handleViewChange((View) evt.getArg());
        break;

      case Event.CONFIG:
        Map<String, Object> config = (Map<String, Object>) evt.getArg();
        if (config != null && config.containsKey("state_transfer"))
          log.error(
              Util.getMessage(
                  "ProtocolStackCannotContainTwoStateTransferProtocolsRemoveEitherOneOfThem"));
        break;
    }
    return up_prot.up(evt);
  }