⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chord_impl.h

📁 chord 源码 http://pdos.csail.mit.edu/chord/
💻 H
字号:
#ifndef _CHORD_IMPL_H_#define _CHORD_IMPL_H_/* * * Copyright (C) 2000 Frans Kaashoek (kaashoek@lcs.mit.edu) * Copyright (C) 2001 Frans Kaashoek (kaashoek@lcs.mit.edu) and  *                    Frank Dabek (fdabek@lcs.mit.edu). * Copyright (C) 2003 Emil Sit (sit@mit.edu). * *  Permission is hereby granted, free of charge, to any person obtaining *  a copy of this software and associated documentation files (the *  "Software"), to deal in the Software without restriction, including *  without limitation the rights to use, copy, modify, merge, publish, *  distribute, sublicense, and/or sell copies of the Software, and to *  permit persons to whom the Software is furnished to do so, subject to *  the following conditions: * *  The above copyright notice and this permission notice shall be *  included in all copies or substantial portions of the Software. * *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */#include "chord.h"#include "route.h"#include "transport_prot.h"#include "coord.h"extern long outbytes;class stabilize_manager;class succ_list;class pred_list;class rpc_manager;// ================ VIRTUAL NODE ================struct dispatch_record {  unsigned long progno;  cbdispatch_t cb;  ihash_entry<dispatch_record> hlink;  dispatch_record (int p, cbdispatch_t c) : progno (p), cb (c) {};};struct upcall_record {  int progno;  cbupcall_t cb;  ihash_entry<upcall_record> hlink;  upcall_record (int p, cbupcall_t c) : progno (p), cb (c) {};};class vnode_impl : public vnode { protected:  ptr<location> me_;  ptr<rpc_manager> rpcm;  ptr<succ_list> successors;  ptr<pred_list> predecessors;  ptr<stabilize_manager> stabilizer;  virtual void dispatch (user_args *a);    void doroute (user_args *sbp, chord_testandfindarg *fa);  void do_upcall (int upcall_prog, int upcall_proc,		  void *uc_args, int uc_args_len,		  cbupcalldone_t app_cb);  void upcall_done (chord_testandfindarg *fa,		    chord_testandfindres *res,		    user_args *sbp,		    bool stop); private:  int myindex;  int checkdead_int;  ihash<unsigned long,     dispatch_record,     &dispatch_record::progno,     &dispatch_record::hlink > dispatch_table;  ihash<int,     upcall_record,     &upcall_record::progno,     &upcall_record::hlink> upcall_table;  u_long ngetsuccessor;  u_long ngetpredecessor;  u_long ngetsucclist;  u_long nfindsuccessor;  u_long nhops;  u_long nmaxhops;  u_long nfindpredecessor;  u_long nnotify;  u_long nalert;  u_long ndogetsuccessor;  u_long ndogetpredecessor;  u_long ndonotify;  u_long ndoalert;  u_long ndogetsucclist;  u_long ndogetpredlist;  u_long ndogetsucc_ext;  u_long ndogetpred_ext;  vec<ptr<location> > dead_nodes;  void join_getsucc_cb (ptr<location> n, cbjoin_t cb, chord_nodelistres *r, 			clnt_stat err);  void get_successor_cb (chordID n, cbchordID_t cb, chord_noderes *res, 			 clnt_stat err);  void get_predecessor_cb (chordID n, cbchordID_t cb, chord_noderes *res, 			   clnt_stat err);  void find_successor_cb (chordID x, cbroute_t cb,			  vec<chord_node> s, route sp, chordstat status);  void get_succlist_cb (cbchordIDlist_t cb, chord_nodelistres *res,			clnt_stat err);  void find_succlist_hop_cb (cbroute_t cb, route_iterator *ri, u_long m, bool done);  void find_route_hop_cb (cbroute_t cb, route_iterator *ri, bool done);  void find_route (const chordID &x, cbroute_t cb);  void dofindroute_cb (user_args *sbp, chord_findarg *fa, 		       vec<chord_node> s, route r, chordstat err);    void notify_cb (chordID n, chordstat *res, clnt_stat err);  void alert_cb (chordstat *res, clnt_stat err);  void ping_cb (ptr<location> n, cbping_t cb, clnt_stat status);    void doalert_cb (chord_noderes *res, chordID x, clnt_stat err);  void do_upcall_cb (char *a, int upcall_prog, int upcall_proc,		     cbupcalldone_t, bool v);  void doRPC_cb (ptr<location> l, xdrproc_t proc,		 void *out, aclnt_cb cb,		 ref<dorpc_res> res, clnt_stat err);  void update_error (float actual, float expect, float e);  void update_coords (Coord uc, float ud);  void check_dead_node_cb (ptr<location> l, time_t nbackoff, chordstat s);  void check_dead_node (ptr<location> l, time_t backoff);  bool tmo (cbtmo_t cb_tmo, int progno,	    int procno, int args_len, chord_node n, int r);    // The RPCs  void doget_successor (user_args *sbp);  void doget_predecessor (user_args *sbp);  void donotify (user_args *sbp, chord_nodearg *na);  void doalert (user_args *sbp, chord_nodearg *na);  void dogetsucclist (user_args *sbp);  void dogetpredlist (user_args *sbp);  void dogetsucc_ext (user_args *sbp);  void dogetpred_ext (user_args *sbp);  void dofindroute (user_args *sbp, chord_findarg *fa); public:  chordID myID;  ptr<chord> chordnode;  vnode_impl (ref<chord> _chordnode, 	      ref<rpc_manager> _rpcm,	      ref<location> _l);  virtual ~vnode_impl (void);    ref<location> my_location ();  chordID my_ID () const;  ptr<location> my_pred () const;  ptr<location> my_succ () const;  virtual ptr<route_iterator> produce_iterator (chordID xi);  virtual ptr<route_iterator> produce_iterator (chordID xi,						const rpc_program &uc_prog,						int uc_procno,						ptr<void> uc_args);  virtual route_iterator *produce_iterator_ptr (chordID xi);  virtual route_iterator *produce_iterator_ptr (chordID xi,						const rpc_program &uc_prog,						int uc_procno,						ptr<void> uc_args);  // The API  virtual void stabilize (void);  virtual void join (ptr<location> n, cbjoin_t cb);  virtual void get_successor (ptr<location> n, cbchordID_t cb);  virtual void get_predecessor (ptr<location> n, cbchordID_t cb);  virtual void get_succlist (ptr<location> n, cbchordIDlist_t cb);  virtual void get_predlist (ptr<location> n, cbchordIDlist_t cb);  virtual void notify (ptr<location> n, chordID &x);  virtual void alert (ptr<location> n, ptr<location> x);  virtual void ping (ptr<location> n, cbping_t cb);  virtual void find_successor (const chordID &x, cbroute_t cb);  virtual void find_succlist (const chordID &x, u_long m, cbroute_t cb,			      ptr<chordID> guess = NULL);  //upcall  void register_upcall (int progno, cbupcall_t cb);  // For other modules  long doRPC (ref<location> l, const rpc_program &prog, int procno,	      ptr<void> in, void *out, aclnt_cb cb,	      cbtmo_t cb_tmo = NULL, bool stream = false);  long doRPC (const chord_node &ID, const rpc_program &prog, int procno, 	      ptr<void> in, void *out, aclnt_cb cb,	      cbtmo_t cb_tmo = NULL, bool stream = false);  void fill_user_args (user_args *a);  virtual void stats (void) const;  virtual void print (strbuf &outbuf) const;  virtual void stop (void);    vec<ptr<location> > succs ();  vec<ptr<location> > preds ();  virtual ptr<location> closestpred (const chordID &x, const vec<chordID> &f);    //RPC demux  void addHandler (const rpc_program &prog, cbdispatch_t cb);  bool progHandled (int progno);  cbdispatch_t getHandler (unsigned long prog); };class route_chord : public route_iterator {  void make_hop (ptr<location> n);  void make_hop_cb (ptr<bool> del, chord_testandfindres *res, clnt_stat err);  void send_hop_cb (bool done); public:  route_chord (ptr<vnode> vi, chordID xi);  route_chord (ptr<vnode> vi, chordID xi,	       rpc_program uc_prog,	       int uc_procno,	       ptr<void> uc_args);  ~route_chord () {};  virtual void first_hop (cbhop_t cb, ptr<chordID> guess);  void send (ptr<chordID> guess);  void next_hop ();  void on_failure (ptr<location> f);  ptr<location> pop_back ();};#endif /* _CHORD_IMPL_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -