- globals=gras_userdata_new(node_data_t);
-
- globals->id=atoi(argv[1]);
- globals->port=atoi(argv[2]);
- globals->fingers=0;
- globals->finger=NULL;
- globals->pre_host[0]=0;
- globals->pre_port=-1;
-
- snprintf(globals->host,1024,gras_os_myname());
-
- if(argc==3){
- create=1;
- }else{
- asprintf(&other_host,"%s",argv[3]);
- other_port=atoi(argv[4]);
- }
-
- globals->sock=gras_socket_server(globals->port);
- gras_os_sleep(1.0);
-
- register_messages();
- register_messages();
-
- globals->finger=(finger_elem*)calloc(1,sizeof(finger_elem));
- INFO2("Launching node %s:%d",globals->host,globals->port);
- if(create){
- INFO0("→Creating ring");
- globals->finger[0].id=globals->id;
- snprintf(globals->finger[0].host,1024,globals->host);
- globals->finger[0].port=globals->port;
- }else{
- INFO2("→Known node %s:%d",other_host,other_port);
- INFO0("→Contacting to determine successor");
- TRY{
- temp_sock=gras_socket_client(other_host,other_port);
- }CATCH(e){
- 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!: %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){
- 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);
- globals->finger[0].port=rep_suc_msg.port;
- INFO3("→Got successor : %d-%s:%d",globals->finger[0].id,globals->finger[0].host,globals->finger[0].port);
- gras_socket_close(temp_sock);
- }
-
- gras_cb_register(gras_msgtype_by_name("chord_get_suc"),&node_cb_get_suc_handler);
-// gras_cb_register(gras_msgtype_by_name("chord_ping"),&node_cb_ping_handler);
-
- gras_msg_handle(60.0);
-
- gras_socket_close(globals->sock);
- free(globals);
- gras_exit();
- INFO0("Done");
- return(0);
+ globals=gras_userdata_new(node_data_t);
+
+ globals->id=atoi(argv[1]);
+ globals->port=atoi(argv[2]);
+ globals->fingers=0;
+ globals->finger=NULL;
+ globals->pre_id=-1;
+ globals->pre_host[0]=0;
+ globals->pre_port=-1;
+
+ snprintf(globals->host,1024,gras_os_myname());
+
+ if(argc==3){
+ create=1;
+ }else{
+ asprintf(&other_host,"%s",argv[3]);
+ other_port=atoi(argv[4]);
+ }
+
+ globals->sock=gras_socket_server(globals->port);
+ gras_os_sleep(1.0);
+
+ register_messages();
+
+ globals->finger=(finger_elem*)calloc(1,sizeof(finger_elem));
+ INFO2("Launching node %s:%d",globals->host,globals->port);
+ if(create){
+ INFO0("→Creating ring");
+ globals->finger[0].id=globals->id;
+ snprintf(globals->finger[0].host,1024,globals->host);
+ globals->finger[0].port=globals->port;
+ }else{
+ INFO2("→Known node %s:%d",other_host,other_port);
+ INFO0("→Contacting to determine successor");
+ TRY{
+ temp_sock=gras_socket_client(other_host,other_port);
+ }CATCH(e){
+ RETHROW0("Unable to contact known host: %s");
+ }
+
+ get_suc_msg.id=globals->id;
+ TRY{
+ gras_msg_send(temp_sock,"chord_get_suc", &get_suc_msg);
+ }CATCH(e){
+ gras_socket_close(temp_sock);
+ RETHROW0("Unable to contact known host to get successor!: %s");
+ }
+
+ TRY{
+ INFO0("Waiting for reply!");
+ gras_msg_wait(10.,"chord_rep_suc",&temp_sock2, &rep_suc_msg);
+ }CATCH(e){
+ 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);
+ globals->finger[0].port=rep_suc_msg.port;
+ INFO3("→Got successor : %d-%s:%d",globals->finger[0].id,
+ globals->finger[0].host,globals->finger[0].port);
+ gras_socket_close(temp_sock);
+ TRY{
+ temp_sock=gras_socket_client(globals->finger[0].host,
+ globals->finger[0].port);
+ }CATCH(e){
+ RETHROW0("Unable to contact successor: %s");
+ }
+
+ notify_msg.id=globals->id;
+ snprintf(notify_msg.host,1024,globals->host);
+ notify_msg.port=globals->port;
+ TRY{
+ gras_msg_send(temp_sock,"chord_notify",¬ify_msg);
+ }CATCH(e){
+ RETHROW0("Unable to notify successor! %s");
+ }
+ }
+
+ gras_cb_register("chord_get_suc", &node_cb_get_suc_handler);
+ gras_cb_register("chord_notify", &node_cb_notify_handler);
+ /*gras_cb_register("chord_ping",&node_cb_ping_handler);*/
+ /* gras_timer_repeat(600.,fix_fingers);*/
+ /*while(1){*/
+
+ for(l=0;l<50;l++){
+ TRY{
+ gras_msg_handle(6000000.0);
+ }CATCH(e){
+ }
+ }
+ /*}*/
+
+ gras_socket_close(globals->sock);
+ free(globals);
+ gras_exit();
+ INFO0("Done");
+ return(0);