Exemplo n.º 1
0
  /**
   * Merges the view states contained in the given list into a single view. <br>
   * The view is the concatenation of the different views, according to the order provided by the
   * list itself. The version is the smallest all the versions.
   *
   * @param l A list conatining the view states to merge
   * @return the merged view state.
   * @throws AppiaGroupException See {@linkplain ViewState#ViewState(String, Group, ViewID,
   *     ViewID[], Endpt[], InetWithPort[])}
   * @throws NullPointerException See {@linkplain ViewState#ViewState(String, Group, ViewID,
   *     ViewID[], Endpt[], InetWithPort[])}
   */
  public static ViewState merge(List l) throws NullPointerException, AppiaGroupException {
    ListIterator iter = l.listIterator(l.size());
    int viewsize = 0;
    int prevsize = 0;
    while (iter.hasPrevious()) {
      ViewState aux = (ViewState) iter.previous();
      viewsize += aux.view.length;
      prevsize += aux.previous.length;
    }

    String v = null;
    Group g = null;
    ViewID vid = null;
    ViewID[] prevs = new ViewID[prevsize];
    Endpt[] endpts = new Endpt[viewsize];
    InetSocketAddress[] addrs = new InetSocketAddress[viewsize];
    int iprevs = 0, iendpts = 0, iaddrs = 0;

    while (iter.hasNext()) {
      ViewState aux = (ViewState) iter.next();
      if ((v == null) || (aux.version.compareTo(v) < 0)) v = aux.version;
      if (g == null) g = aux.group;
      if (vid == null) vid = aux.id;
      else if (aux.id.ltime > vid.ltime) vid.ltime = aux.id.ltime;
      System.arraycopy(aux.previous, 0, prevs, iprevs, aux.previous.length);
      iprevs += aux.previous.length;
      System.arraycopy(aux.view, 0, endpts, iendpts, aux.view.length);
      iendpts += aux.view.length;
      System.arraycopy(aux.addresses, 0, addrs, iaddrs, aux.addresses.length);
      iaddrs += aux.addresses.length;
    }

    return new ViewState(v, g, vid, prevs, endpts, addrs);
  }
Exemplo n.º 2
0
 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
   //		public String version;
   int len = in.readInt();
   byte[] bytes = new byte[len];
   in.read(bytes);
   version = new String(bytes);
   //		public Group group;
   group = new Group();
   group.readExternal(in);
   //		public ViewID id;
   id = new ViewID();
   id.readExternal(in);
   //		public ViewID[] previous;
   len = in.readInt();
   previous = new ViewID[len];
   for (int i = 0; i < len; i++) {
     previous[i] = new ViewID();
     previous[i].readExternal(in);
   }
   //		public Endpt[] view;
   len = in.readInt();
   view = new Endpt[len];
   for (int i = 0; i < len; i++) view[i].readExternal(in);
   //		public InetWithPort[] addresses;
   len = in.readInt();
   int addrLen = 0;
   addresses = new InetSocketAddress[len];
   for (int i = 0; i < len; i++) {
     addrLen = in.readInt();
     bytes = new byte[addrLen];
     in.read(bytes);
     addresses[i] = new InetSocketAddress(InetAddress.getByAddress(bytes), in.readInt());
   }
 }
Exemplo n.º 3
0
  /**
   * Removes the indicated members from the current ViewState. <br>
   * The members whose index is at true in the remove array, are removed from the ViewState.
   *
   * @param remove the members to remove
   */
  public void remove(boolean[] remove) {
    if (remove.length != view.length) throw new IllegalArgumentException("different sizes");

    int i, j, size;

    size = 0;
    for (i = 0; i < remove.length; i++) {
      if (!remove[i]) size++;
    }

    Endpt[] new_view = new Endpt[size];
    InetSocketAddress[] new_addrs = new InetSocketAddress[size];

    j = 0;
    for (i = 0; i < remove.length; i++) {
      if (!remove[i]) {
        new_view[j] = view[i];
        new_addrs[j] = addresses[i];
        j++;
      }
    }

    view = new_view;
    addresses = new_addrs;
    if (new_view.length > 0) id.coord = new_view[0];
  }
Exemplo n.º 4
0
 public static void push(ViewState vs, Message message) {
   ArrayOptimized.pushArrayInetWithPort(vs.addresses, message);
   ArrayOptimized.pushArrayEndpt(vs.view, message);
   ArrayOptimized.pushArrayViewID(vs.previous, message);
   ViewID.push(vs.id, message);
   Group.push(vs.group, message);
   message.pushString(vs.version);
 }
Exemplo n.º 5
0
  /**
   * Creates the next ViewState. <br>
   * The new ViewState mantains the same {@link org.continuent.appia.protocols.group.ViewState#view
   * view} and {@link org.continuent.appia.protocols.group.ViewState#addresses addresses}. <br>
   * The ViewID is generated using the <i>ViewID.next(...)</i> method.
   *
   * @param coord the Endpoint id of the coordinator of the new ViewState
   * @return the next ViewState
   */
  public ViewState next(Endpt coord) throws NullPointerException, AppiaGroupException {
    if (coord == null) throw new NullPointerException("coord");

    ViewID new_id = id.next(coord);
    ViewID[] new_previous = {id};

    return new ViewState(version, group, new_id, new_previous, view, addresses);
  }
Exemplo n.º 6
0
 public static ViewState pop(Message message) {
   try {
     return new ViewState(
         message.popString(),
         Group.pop(message),
         ViewID.pop(message),
         ArrayOptimized.popArrayViewID(message),
         ArrayOptimized.popArrayEndpt(message),
         ArrayOptimized.popArrayInetWithPort(message));
   } catch (AppiaGroupException ex) {
     throw new MessageException("Error poping view state.", ex);
   }
 }
Exemplo n.º 7
0
  /**
   * Creates a {@link java.lang.String String} representation of the <i>view</i>.
   *
   * @return the {@link java.lang.String String} representation
   */
  public String toString() {
    String s = "";
    int i;

    s = "\nversion: " + version + "\ngroup: " + group.toString() + "\nid: " + id.toString();
    s = s + "\nprevious: [";
    for (i = 0; i < previous.length; i++) s = s + previous[i].toString() + ",";
    s = s + "]\nview: [";
    for (i = 0; i < view.length; i++) s = s + view[i].toString() + ",";
    s = s + "]\naddresses: [";
    for (i = 0; i < addresses.length; i++) s = s + addresses[i].toString() + ",";
    s = s + "]\n";

    return s;
  }
Exemplo n.º 8
0
 public static ViewState peek(Message message) {
   try {
     ViewState vs =
         new ViewState(
             message.popString(),
             Group.pop(message),
             ViewID.pop(message),
             ArrayOptimized.popArrayViewID(message),
             ArrayOptimized.popArrayEndpt(message),
             ArrayOptimized.popArrayInetWithPort(message));
     ViewState.push(vs, message);
     return vs;
   } catch (AppiaGroupException ex) {
     throw new MessageException("Error peeking view state from message.", ex);
   }
 }
Exemplo n.º 9
0
  /**
   * Merges the given ViewState to the current ViewState.
   *
   * @param vs the ViewState to merge with the current one
   */
  public void merge(ViewState vs) {
    int size = view.length + vs.view.length;

    Endpt[] new_view = new Endpt[size];
    InetSocketAddress[] new_addrs = new InetSocketAddress[size];

    System.arraycopy(view, 0, new_view, 0, view.length);
    System.arraycopy(addresses, 0, new_addrs, 0, addresses.length);

    System.arraycopy(vs.view, 0, new_view, view.length, vs.view.length);
    System.arraycopy(vs.addresses, 0, new_addrs, addresses.length, vs.addresses.length);

    ViewID[] new_previous = new ViewID[previous.length + vs.previous.length];
    System.arraycopy(previous, 0, new_previous, 0, previous.length);
    System.arraycopy(vs.previous, 0, new_previous, previous.length, vs.previous.length);

    view = new_view;
    addresses = new_addrs;
    previous = new_previous;
    id.ltime = Math.max(id.ltime, vs.id.ltime);
  }
Exemplo n.º 10
0
 public void writeExternal(ObjectOutput out) throws IOException {
   //		public String version;
   byte[] bytes = version.getBytes();
   out.writeInt(bytes.length);
   out.write(bytes);
   //		public Group group;
   group.writeExternal(out);
   //		public ViewID id;
   id.writeExternal(out);
   //		public ViewID[] previous;
   out.writeInt(previous.length);
   for (int i = 0; i < previous.length; i++) previous[i].writeExternal(out);
   //		public Endpt[] view;
   out.writeInt(view.length);
   for (int i = 0; i < view.length; i++) view[i].writeExternal(out);
   //		public InetWithPort[] addresses;
   out.writeInt(addresses.length);
   for (int i = 0; i < addresses.length; i++) {
     bytes = addresses[i].getAddress().getAddress();
     out.writeInt(bytes.length);
     out.write(bytes);
     out.writeInt(addresses[i].getPort());
   }
 }