/* ** $Id: chimeratpt.c,v 1.1 2008/02/01 20:14:43 krishnap Exp $ ** Krishna Puttaswamy ** description: This is the instance representing a node in the network constructed by tptdriver.c */ #include #include #include #include #include "chimera.h" #include "cashmere.h" #include "log.h" #include "route.h" #include "key.h" #include "dtime.h" #define USAGE "bighost [ -j bootstrap:port ] port key" #define OPTSTR "j:" #define DEBUG 0 extern char *optarg; extern int optind; #define HELLO_MESSAGE 51 #define SEND_MESSAGE 52 #define EVAL_TYPE 55 ChimeraHost *driver = NULL; ChimeraState *state; Key key; int seq = -1; Key randomKeys[100]; int randomKeysCount = 0; int messageCounter = 0; double chimStartTime = 0; double chimEndTime = 0; void send_handler (Key * key, Message * msg) { // some randome key and message for now if (msg->type == SEND_MESSAGE) { log_message (state->log, LOG_CASHMERE, "calling cashmere_Send in test file\n"); /* int i = 0; log_message(state->log, LOG_CASHMERE, "before The randomKeysCount is %d i is %d\n", randomKeysCount, i); i = getRandomNumber()%randomKeysCount; log_message(state->log, LOG_CASHMERE, "The randomKeysCount is %d i is %d\n", randomKeysCount, i); log_message (state->log, LOG_CASHMERE, "sending message to %s\n", randomKeys[i].keystr); cashmere_send (state, randomKeys[i], msg->size, msg->payload); */ int rndindex = getRandomNumber()%randomKeysCount; int i = 0; char payload[EVAL_MESSAGE_SIZE]; for( i = 0; i < EVAL_MESSAGE_SIZE - 2; i++) payload[i] = 'x'; payload[i] = '\0'; fprintf(stderr, "Sending to %s \n", randomKeys[rndindex].keystr); for(i = 0; i < EVAL_MESSAGE_NUMBER; i++) { chimera_send(state, randomKeys[rndindex], EVAL_TYPE, EVAL_MESSAGE_SIZE, payload); } } else if (msg->type == EVAL_TYPE) { if(messageCounter == 0) { chimStartTime = getTime(); } messageCounter++; if (messageCounter == EVAL_MESSAGE_NUMBER) { chimEndTime = getTime(); fprintf (stderr, "Total packet recvd: %d of size %d in %f secs\n", EVAL_MESSAGE_NUMBER, EVAL_MESSAGE_SIZE, chimEndTime-chimStartTime); messageCounter= 0; } } } void read_hosts_entries(char *filename) { FILE *fp = fopen ("./hosts", "r"); if (fp == NULL) { perror (filename); exit (1); } char hn[200], keyinput[200]; int port; char s[1000]; randomKeysCount = 0; while (fgets (s, 256, fp) != NULL) { randomKeysCount++; if (randomKeysCount == 100) break; sscanf (s, "%s %d %s", hn, &port, keyinput); str_to_key (keyinput, &randomKeys[randomKeysCount]); } fclose (fp); } int main (int argc, char **argv) { int opt; char *hn = NULL; int port, joinport; ChimeraHost *join = NULL; char tmp[256]; int i, j; Message *hello; char *configfile = "./hosts"; while ((opt = getopt (argc, argv, OPTSTR)) != EOF) { switch ((char) opt) { case 'j': for (i = 0; optarg[i] != ':' && i < strlen (optarg); i++); optarg[i] = 0; hn = optarg; sscanf (optarg + (i + 1), "%d", &joinport); break; default: fprintf (stderr, "invalid option %c\n", (char) opt); fprintf (stderr, "usage: %s\n", USAGE); exit (1); } } if ((argc - optind) != 2) { fprintf (stderr, "usage: %s\n", USAGE); exit (1); } port = atoi (argv[optind]); str_to_key (argv[optind + 1], &key); state = chimera_init (port); chimera_setkey (state, key); if (hn != NULL) { join = host_get (state, hn, joinport); } chimera_register (state, HELLO_MESSAGE, 1); chimera_register (state, SEND_MESSAGE, 1); chimera_register (state, EVAL_TYPE, 1); char networkdebug[256], routingdebug[256]; // sprintf(networkdebug, "LOG_NETWORKDEBUG_%s", keyinput.keystr); //sprintf (routingdebug, "LOG_ROUTING_%s", key.keystr); // FILE *networklogfp= fopen(networkdebug, "w"); //FILE *routingfp = fopen (routingdebug, "w"); //log_direct (state->log, LOG_ROUTING, routingfp); // log_direct(state->log, LOG_NETWORKDEBUG, networklogfp); //char cashmeredebug[256]; //sprintf (cashmeredebug, "LOG_CASHMERE%s", key.keystr); //FILE *cashmerefp = fopen (cashmeredebug, "w"); //log_direct (state->log, LOG_CASHMERE, cashmerefp); cashmere_init (state); read_hosts_entries(configfile); // message_handler (state, SEND_MESSAGE, send_handler, 1); chimera_deliver (state, send_handler); //log_direct (state->log, LOG_ERROR, stderr); //log_direct (state->log, LOG_WARN, stderr); // log_direct(state->log, LOG_ROUTING, stderr); if (join != NULL) { chimera_join (state, join); sprintf (tmp, "%d %s joining with %s:%d", port, key.keystr, hn, joinport); } else { sprintf (tmp, "%d %s starting system", port, key.keystr, hn, joinport); } driver = host_get (state, "marrow", 11110); hello = message_create (driver->key, HELLO_MESSAGE, strlen (tmp) + 1, tmp); message_send (state, driver, hello, TRUE); free (hello); //pthread_exit(NULL); while (1) { sleep (1000); } }