* vim:ts=2:sw=2:noexpandtab
*/
-#include "chord.h"
+#include "xbt/sysdep.h"
+#include "gras.h"
+
+static int closest_preceding_node(int id);
+static void check_predecessor(void);
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(chord,"Messages specific to this example");
+
+typedef enum msg_typus{
+ PING,
+ PONG,
+ GET_PRE,
+ REP_PRE,
+ GET_SUC,
+ REP_SUC,
+ STD,
+}msg_typus;
+
+/*GRAS_DEFINE_TYPE(s_pbio,
+ struct s_pbio{
+ msg_typus type;
+ int dest;
+ char msg[1024];
+ };
+);
+typedef struct s_pbio pbio_t;*/
+
+//GRAS_DEFINE_TYPE(s_ping,
+ struct s_ping{
+ int id;
+ };
+//);
+typedef struct s_ping ping_t;
+
+//GRAS_DEFINE_TYPE(s_pong,
+ struct s_pong{
+ int id;
+ int failed;
+ };
+//);
+typedef struct s_pong pong_t;
+
+GRAS_DEFINE_TYPE(s_get_suc,
+ struct s_get_suc{
+ int id;
+ };
+);
+typedef struct s_get_suc get_suc_t;
+
+GRAS_DEFINE_TYPE(s_rep_suc,
+ struct s_rep_suc{
+ int id;
+ char host[1024];
+ int port;
+ };
+);
+typedef struct s_rep_suc rep_suc_t;
+
+typedef struct finger_elem{
+ int id;
+ char host[1024];
+ int port;
+}finger_elem;
+
+
static void register_messages(){
/* gras_msgtype_declare("chord",gras_datadesc_by_symbol(s_pbio));*/
TRY{
temp_sock=gras_socket_client(globals->finger[contact].host,globals->finger[contact].port);
}CATCH(e){
- RETHROW0("Unable to connect!");
+ RETHROW0("Unable to connect!: %s");
}
TRY{
gras_msg_send(temp_sock,gras_msgtype_by_name("chord_get_suc"),&asking);
}CATCH(e){
- RETHROW0("Unable to ask!");
+ RETHROW0("Unable to ask!: %s");
}
gras_msg_wait(10.0,gras_msgtype_by_name("chord_rep_suc"),&temp_sock,&outgoing);
}
gras_msg_send(expeditor,gras_msgtype_by_name("chord_rep_suc"),&outgoing);
INFO0("Successor information sent!");
}CATCH(e){
- RETHROW2("%s:Timeout sending successor information to %s",globals->host,gras_socket_peer_name(expeditor));
+ RETHROW2("%s:Timeout sending successor information to %s: %s",globals->host,gras_socket_peer_name(expeditor));
}
gras_socket_close(expeditor);
return(1);
}
-int closest_preceding_node(int id){
+static int closest_preceding_node(int id){
node_data_t *globals=(node_data_t*)gras_userdata_get();
int i;
for(i=globals->fingers-1;i>=0;i--){
}
-void check_predecessor()
-{
-node_data_t *globals = (node_data_t*)gras_userdata_get();
-gras_socket_t temp_sock;
+static void check_predecessor() {
+ node_data_t *globals = (node_data_t*)gras_userdata_get();
+ gras_socket_t temp_sock;
+ xbt_ex_t e;
if (globals->pre_host[0] == 0)
{
return;
}
ping_t ping_kong;
pong_t king_pong;
-ping_kong->id = 0;
+ping_kong.id = 0;
TRY
{
gras_msg_send( temp_sock, gras_msgtype_by_name("chord_ping"),&ping_kong);
int node(int argc,char **argv){
node_data_t *globals=NULL;
- gras_socket_t temp_sock,temp_sock2;
+ gras_socket_t temp_sock=NULL;
+ gras_socket_t temp_sock2=NULL;
xbt_ex_t e;
int create=0;
- int other_port;
+ int other_port=-1;
char *other_host;
/* 1. Init the GRAS infrastructure and declare my globals */
gras_init(&argc,argv);
+
+ gras_os_sleep((15-gras_os_getpid())*20);
+
globals=gras_userdata_new(node_data_t);
globals->id=atoi(argv[1]);
if(argc==3){
create=1;
}else{
- other_host=strndup(argv[3],1024);
+ asprintf(&other_host,"%s",argv[3]);
other_port=atoi(argv[4]);
}
TRY{
temp_sock=gras_socket_client(other_host,other_port);
}CATCH(e){
- RETHROW0("Unable to contact known host!");
+ RETHROW0("Unable to contact known host!: %s");
}
get_suc_t get_suc_msg;get_suc_msg.id=globals->id;
TRY{
gras_msg_send(temp_sock,gras_msgtype_by_name("chord_get_suc"),&get_suc_msg);
}CATCH(e){
gras_socket_close(temp_sock);
- RETHROW0("Unable to contact known host to get successor!");
+ RETHROW0("Unable to contact known host to get successor!: %s");
}
rep_suc_t rep_suc_msg;
TRY{
INFO0("Waiting for reply!");
gras_msg_wait(6000,gras_msgtype_by_name("chord_rep_suc"),&temp_sock2,&rep_suc_msg);
}CATCH(e){
- RETHROW2("%s: Error waiting for successor:%s",globals->host,e.msg);
+ RETHROW1("%s: Error waiting for successor:%s",globals->host);
}
globals->finger[0].id=rep_suc_msg.id;
snprintf(globals->finger[0].host,1024,rep_suc_msg.host);