Chewbacca Algorithm

CHord Enhanced With Basic Algorithm Corrections and Concurrent Activation

This is the corrected algorithm.


    /**
     * Main Protocol Methods (listed in the Chord paper)
     */
    public ChordNode successor() {
      return finger[1].node;
    }

    public ChordNode find_successor(int id) {
      ChordNode np = find_predecessor(id);
      return np.successor();
    }

    public ChordNode find_predecessor(int id) {
      ChordNode np = this;
      while (!on_range(id, np._id+1, np.successor()._id)) {
        np = np.closest_preceding_finger(id);
      }
      return np;
    }

    public ChordNode closest_preceding_finger(int id) {
      for (int i=_m; i>=1; i--) {
        if (on_range(finger[i].node._id, this._id+1, id-1))
          return finger[i].node;
      }
      return this;
    }

    public void join(ChordNode np) {
      if (np != null) {
        init_finger_table(np);
        update_others();
      } else { // n is the only node in the network
        for (int i=1; i<=_m; i++) {
          finger[i].node = this;
        }       
        predecessor = this;
      }
    }

    public void init_finger_table(ChordNode np) {
      finger[1].node = np.find_successor(finger[1].start());
      predecessor = successor().predecessor;
      successor().predecessor = this;
      for (int i=1; i<=_m-1; i++) {
        if (on_range(finger[i+1].start(), this._id, finger[i].node._id-1)) {
          finger[i+1].node = finger[i].node;
        } else {
          finger[i+1].node = np.find_successor(finger[i+1].start());
          if (!on_range(finger[i+1].node._id,
                       finger[i+1].start(),
                       this._id)) {
			finger[i+1].node = this;
          }
        }
      }
    }

    public void update_others() {
      for (int i=1; i<=_m; i++) {
        ChordNode p = find_predecessor(wrap(this._id-pow2(i-1)+1));
        p.update_finger_table(this, i);
      }
    }

    public void update_finger_table(ChordNode s, int i) {
      if (s._id == this._id) {
        return;
      }
      if (on_range(s._id, this._id+1, finger[i].node._id)) {
        finger[i].node = s;
        ChordNode p = predecessor;
        p.update_finger_table(s, i);
      } 
    }

    public void leave() {
      if (this == successor()) {
	  	return; // it is the last node in the cloud
	  }
	  successor().predecessor = predecessor;
      for (int i=1; i<=_m; i++) {
        ChordNode p = find_predecessor(wrap(this._id-pow2(i-1)+1));
		p.remove_node(this, i, successor());
      }
    }

    public void remove_node(ChordNode n, int i, ChordNode repl) {
	  if (finger[i].node == n) {
	    finger[i].node = repl;
		predecessor.remove_node(n, i, repl);
	  }
	}
	 

$Id$

Last updated Tue Dec 2 07:48:22 EST 2003