From f058399e04c2f1cf14527deaa8d1a116e6adeacb Mon Sep 17 00:00:00 2001 From: adash Date: Tue, 10 Apr 2007 14:57:59 +0000 Subject: [PATCH] added new testcases added new files ip.c ip.h for IPaddr translation to unsigned int(for testing) --- .../src/Runtime/DSTM/interface/dstmserver.c | 5 + Robust/src/Runtime/DSTM/interface/ip.c | 38 ++++ Robust/src/Runtime/DSTM/interface/ip.h | 14 ++ .../src/Runtime/DSTM/interface/testclient.c | 182 +++++++++++++++++- .../src/Runtime/DSTM/interface/testserver.c | 20 +- Robust/src/Runtime/DSTM/interface/trans.c | 38 ++-- 6 files changed, 276 insertions(+), 21 deletions(-) create mode 100644 Robust/src/Runtime/DSTM/interface/ip.c create mode 100644 Robust/src/Runtime/DSTM/interface/ip.h diff --git a/Robust/src/Runtime/DSTM/interface/dstmserver.c b/Robust/src/Runtime/DSTM/interface/dstmserver.c index e4fb95f9..5b791c35 100644 --- a/Robust/src/Runtime/DSTM/interface/dstmserver.c +++ b/Robust/src/Runtime/DSTM/interface/dstmserver.c @@ -303,6 +303,7 @@ int readClientReq(int acceptfd, trans_commit_data_t *transinfo) { break; default: printf("No response to TRANS_AGREE OR DISAGREE protocol\n"); + //TODO Use fixed.trans_id TID since Client may have died break; } @@ -330,6 +331,8 @@ char handleTransReq(int acceptfd, fixed_data_t *fixed, trans_commit_data_t *tran //Process each object present in the pile ptr = modptr; + printf("DEBUG -> Total objs involved in trans is %d\n",fixed->nummod + fixed->numread); + fflush(stdout); //Process each oid in the machine pile/ group for (i = 0; i < fixed->numread + fixed->nummod; i++) { if (i < fixed->numread) {//Object is read @@ -368,6 +371,7 @@ char handleTransReq(int acceptfd, fixed_data_t *fixed, trans_commit_data_t *tran ((objheader_t *)mobj)->status |= LOCK; //Save all object oids that are locked on this machine during this transaction request call oidlocked[objlocked] = ((objheader_t *)mobj)->oid; + printf("DEBUG-> Object to be locked is %d\n", ((objheader_t *)mobj)->oid); objlocked++; if (version == ((objheader_t *)mobj)->version) { //If versions match v_matchnolock++; @@ -473,3 +477,4 @@ int transCommitProcess(trans_commit_data_t *transinfo, int acceptfd) { return 0; } + diff --git a/Robust/src/Runtime/DSTM/interface/ip.c b/Robust/src/Runtime/DSTM/interface/ip.c new file mode 100644 index 00000000..bf1cee58 --- /dev/null +++ b/Robust/src/Runtime/DSTM/interface/ip.c @@ -0,0 +1,38 @@ +#include +#include +#include "ip.h" + +unsigned int iptoMid(char *addr) { + ip_t i; + unsigned int mid; + + sscanf(addr, "%d.%d.%d.%d", &i.a, &i.b, &i.c, &i.d); + mid = (i.a << 24) | (i.b << 16) | (i.c << 8) | i.d; + return mid; +} + +void midtoIP(unsigned int mid, char *ptr) { + ip_t i; + + i.a = (mid & 0xff000000) >> 24; + i.b = (mid & 0x00ff0000) >> 16; + i.c = (mid & 0x0000ff00) >> 8; + i.d = mid & 0x000000ff; + sprintf(ptr, "%d.%d.%d.%d", i.a, i.b, i.c, i.d); + return; +} + +/* +main() { + unsigned int mid; + ip_t i; + char ip[16]; + + memset(ip, 0, 16); + mid = iptoMid("192.10.0.1"); + printf("mid = %x\n", mid); + midtoIP(mid, ip); + ip[15] = '\0'; + printf("%s\n",ip); +} +*/ diff --git a/Robust/src/Runtime/DSTM/interface/ip.h b/Robust/src/Runtime/DSTM/interface/ip.h new file mode 100644 index 00000000..3d9237b0 --- /dev/null +++ b/Robust/src/Runtime/DSTM/interface/ip.h @@ -0,0 +1,14 @@ +#ifndef _ip_h_ +#define _ip_h_ + +typedef struct ip { + short a; + short b; + short c; + short d; +}ip_t; + +unsigned int iptoMid(char *); +void midtoIP(unsigned int, char *); + +#endif diff --git a/Robust/src/Runtime/DSTM/interface/testclient.c b/Robust/src/Runtime/DSTM/interface/testclient.c index 0df85e25..14c573b5 100644 --- a/Robust/src/Runtime/DSTM/interface/testclient.c +++ b/Robust/src/Runtime/DSTM/interface/testclient.c @@ -1,15 +1,93 @@ #include #include "dstm.h" #include "llookup.h" +#include "ip.h" +#include +#include +#include + +extern objstr_t *mainobjstore; +//extern lhashtable_t llookup; //Global Hash table +//extern mhashtable_t mlookup; //Global Hash table int classsize[]={sizeof(int),sizeof(char),sizeof(short), sizeof(void *)}; int test1(void); int test2(void); +unsigned int createObjects(transrecord_t *record) { + objheader_t *header, *tmp; + struct sockaddr_in antelope; + unsigned int size, mid; + int i = 0; + for(i = 20 ; i< 23; i++) { + size = sizeof(objheader_t) + classsize[i-20] ; + tmp = (objheader_t *)objstrAlloc(record->cache, size); + tmp->oid = i; + tmp->type = (i-20); + tmp->version = 1; + tmp->rcount = 0; //? not sure how to handle this yet + tmp->status = 0; + tmp->status |= NEW; + chashInsert(record->lookupTable, tmp->oid, tmp); + header = (objheader_t *) objstrAlloc(mainobjstore, size); + memcpy(header, tmp, size); + mhashInsert(header->oid, header); + //inet_aton("127.0.0.1", &antelope.sin_addr); // store IP in antelope + //mid = iptoMid(inet_ntoa(antelope.sin_addr)); + mid = iptoMid("127.0.0.1"); + lhashInsert(header->oid, mid); + // lhashInsert(header->oid, 1); + } + // printf("Insert oid = %d at address %x\n",tmp->oid, tmp); + size = sizeof(objheader_t) + classsize[0] ; + header = (objheader_t *) objstrAlloc(mainobjstore, size); + header->oid = 30; + header->type = 0; + header->version = 1; + header->rcount = 0; //? not sure how to handle this yet + header->status = 0; + header->status |= NEW; + mhashInsert(header->oid, header); + //inet_aton("127.0.0.1", &antelope.sin_addr); // store IP in antelope + //mid = iptoMid(inet_ntoa(antelope.sin_addr)); + mid = iptoMid("127.0.0.1"); + lhashInsert(header->oid, mid); + size = sizeof(objheader_t) + classsize[1] ; + header = (objheader_t *) objstrAlloc(mainobjstore, size); + header->oid = 28; + header->type = 1; + header->version = 1; + header->rcount = 0; //? not sure how to handle this yet + header->status = 0; + header->status |= LOCK; + mhashInsert(header->oid, header); + //inet_aton("127.0.0.1", &antelope.sin_addr); // store IP in antelope + //mid = iptoMid(inet_ntoa(antelope.sin_addr)); + mid = iptoMid("127.0.0.1"); + lhashInsert(header->oid, mid); + size = sizeof(objheader_t) + classsize[2] ; + header = (objheader_t *) objstrAlloc(mainobjstore, size); + header->oid = 29; + header->type = 2; + header->version = 1; + header->rcount = 0; //? not sure how to handle this yet + header->status = 0; + header->status |= LOCK; + mhashInsert(header->oid, header); + //inet_aton("127.0.0.1", &antelope.sin_addr); // store IP in antelope + //mid = iptoMid(inet_ntoa(antelope.sin_addr)); + mid = iptoMid("127.0.0.1"); + lhashInsert(header->oid, mid); + return 0; +} + int main() { - test2(); +// test2(); +// test3(); +// test4(); + test5(); } int test1(void) { @@ -44,6 +122,13 @@ int test2(void) { dstmInit(); record = transStart(); + + lhashInsert(1,1); + lhashInsert(2,1); + lhashInsert(3,1); + lhashInsert(4,1); + lhashInsert(5,1); + lhashInsert(6,1); printf("DEBUG -> Init done\n"); h1 = transRead(record, 1); lhashInsert(h1->oid, 1); @@ -53,16 +138,105 @@ int test2(void) { lhashInsert(h3->oid, 1); h4 = transRead(record, 4); lhashInsert(h4->oid, 1); - h4->status |= DIRTY; +// h4->status |= DIRTY; h5 = transRead(record, 5); lhashInsert(h5->oid, 1); h6 = transRead(record, 6); lhashInsert(h6->oid, 1); - h6->status |= DIRTY; +// h6->status |= DIRTY; + transCommit(record); - + return 0; +} +//Test Read objects when objects are not found in any participant +int test3(void){ + transrecord_t *record; + objheader_t *h1,*h2; + + dstmInit(); + record = transStart(); + printf("DEBUG -> Init done\n"); + //read object 11 + if((h1 = transRead(record, 11)) == NULL){ + printf("Object not found\n"); + } + //read object 12 + if((h2 = transRead(record, 12)) == NULL) { + printf("Object not found\n"); + } transCommit(record); + + return 0; +} + +//Test Read objects when some objects are found and other objects not found in any participant +int test4(void) { + transrecord_t *record; + objheader_t *h1,*h2, *h3, *h4; + + dstmInit(); + record = transStart(); + printf("DEBUG -> Init done\n"); + //read object 1 + if((h1 = transRead(record, 1)) == NULL){ + printf("Object not found\n"); + } + //read object 2 + if((h2 = transRead(record, 2)) == NULL) { + printf("Object not found\n"); + } + //read object 11 + if((h3 = transRead(record, 11)) == NULL) { + printf("Object not found\n"); + } + //read object 13 + if((h4 = transRead(record, 13)) == NULL) { + printf("Object not found\n"); + } + if((h1 != NULL) && (h2 != NULL) && (h3 != NULL) && h4 !=NULL) { + transCommit(record); + }else { + printf("Cannot complete this transaction\n"); + } + + return 0; } +//Test for transaction objects when the objs are part of the Coordinator machine starting the +//trans commit +int test5(void) { + transrecord_t *record; + unsigned int mid; + objheader_t *h1,*h2, *h3, *h4; + dstmInit(); + record = transStart(); + printf("DEBUG -> Init done\n"); + mid = iptoMid("127.0.0.1"); + lhashInsert(1,mid); + lhashInsert(2,mid); + lhashInsert(3,mid); + lhashInsert(4,mid); + lhashInsert(5,mid); + lhashInsert(6,mid); + createObjects(record); + //read object 1 + if((h1 = transRead(record, 1)) == NULL){ + printf("Object not found\n"); + } + //read object 5 + if((h2 = transRead(record, 5)) == NULL) { + printf("Object not found\n"); + } + //read object 20(present in local machine) + if((h3 = transRead(record, 20)) == NULL) { + printf("Object not found\n"); + } + //read object 21(present in local machine) + if((h4 = transRead(record, 21)) == NULL) { + printf("Object not found\n"); + } + + transCommit(record); +} diff --git a/Robust/src/Runtime/DSTM/interface/testserver.c b/Robust/src/Runtime/DSTM/interface/testserver.c index f7bf58cc..bf1d57f5 100644 --- a/Robust/src/Runtime/DSTM/interface/testserver.c +++ b/Robust/src/Runtime/DSTM/interface/testserver.c @@ -1,5 +1,8 @@ #include #include "dstm.h" +#include +#include +#include extern objstr_t *mainobjstore; int classsize[]={sizeof(int),sizeof(char),sizeof(short), sizeof(void *)}; @@ -9,14 +12,15 @@ int test2(void); unsigned int createObjects(transrecord_t *record, unsigned short type) { objheader_t *header, *tmp; - unsigned int size; + struct sockaddr_in antelope; + unsigned int size, mid; size = sizeof(objheader_t) + classsize[type] ; header = transCreateObj(record, type); tmp = (objheader_t *) objstrAlloc(mainobjstore, size); memcpy(tmp, header, size); -// printf("Insert oid = %d at address %x\n",tmp->oid, tmp); mhashInsert(tmp->oid, tmp); - lhashInsert(tmp->oid, 1); + mid = iptoMid("127.0.0.1"); + lhashInsert(tmp->oid, mid); //Lock oid 3 object // if(tmp->oid == 3) // tmp->status |= LOCK; @@ -70,11 +74,19 @@ int test1() int test2() { - unsigned int val; + unsigned int val, mid; transrecord_t *myTrans; pthread_t thread_Listen; dstmInit(); + mid = iptoMid("127.0.0.1"); + lhashInsert(20, mid); + lhashInsert(21, mid); + lhashInsert(22, mid); + lhashInsert(23, mid); + lhashInsert(30, mid); + lhashInsert(28, mid); + lhashInsert(29, mid); pthread_create(&thread_Listen, NULL, dstmListen, NULL); // Start Transaction myTrans = transStart(); diff --git a/Robust/src/Runtime/DSTM/interface/trans.c b/Robust/src/Runtime/DSTM/interface/trans.c index cdb7fbd1..d4d9bb17 100644 --- a/Robust/src/Runtime/DSTM/interface/trans.c +++ b/Robust/src/Runtime/DSTM/interface/trans.c @@ -1,4 +1,5 @@ #include "dstm.h" +#include "ip.h" #include "clookup.h" #include "mlookup.h" #include "llookup.h" @@ -25,6 +26,7 @@ transrecord_t *transStart() objheader_t *transRead(transrecord_t *record, unsigned int oid) { + printf("Enter TRANS_READ\n"); unsigned int machinenumber; objheader_t *tmp, *objheader; void *objcopy; @@ -32,6 +34,7 @@ objheader_t *transRead(transrecord_t *record, unsigned int oid) void *buf; //check cache if((objheader =(objheader_t *)chashSearch(record->lookupTable, oid)) != NULL){ + printf("DEBUG -> transRead oid %d found local\n", oid); return(objheader); } else if ((objheader = (objheader_t *) mhashSearch(oid)) != NULL) { //Look up in Machine lookup table and found @@ -47,11 +50,16 @@ objheader_t *transRead(transrecord_t *record, unsigned int oid) } else { //Get the object from the remote location //printf("oid not found in local machine lookup\n"); + printf("machinenumber = %d\n",machinenumber); + printf("oid = %d\n",oid); machinenumber = lhashSearch(oid); + printf("machinenumber = %d\n",machinenumber); objcopy = getRemoteObj(record, machinenumber, oid); - if(objcopy == NULL) + if(objcopy == NULL) { //If object is not found in Remote location printf("Object not found in Machine %d\n", machinenumber); + return NULL; + } else return(objcopy); } @@ -189,6 +197,7 @@ void *transRequest(void *threadarg) { objheader_t *headeraddr; //unsigned int *oidnotfound; char buffer[RECEIVE_BUFFER_SIZE], control, recvcontrol; + char machineip[16]; tdata = (thread_data_array_t *) threadarg; printf("DEBUG -> New thread id %d\n", tdata->thread_id); @@ -200,7 +209,10 @@ void *transRequest(void *threadarg) { bzero((char*) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(LISTEN_PORT); - serv_addr.sin_addr.s_addr = inet_addr(MACHINE_IP); + //serv_addr.sin_addr.s_addr = inet_addr(MACHINE_IP); + midtoIP(tdata->mid,machineip); + machineip[15] = '\0'; + serv_addr.sin_addr.s_addr = inet_addr(machineip); //serv_addr.sin_addr.s_addr = inet_addr(tdata->mid); if (connect(sd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) < 0) { @@ -294,14 +306,14 @@ int transCommit(transrecord_t *record) { } next = curr->next; //Get machine location for object id - /* + if ((machinenum = lhashSearch(curr->key)) == 0) { printf("Error: No such machine\n"); return 1; - } - */ + } + //TODO only for debug - machinenum = 1; + //machinenum = 1; if ((headeraddr = chashSearch(record->lookupTable, curr->key)) == NULL) { printf("Error: No such oid\n"); return 1; @@ -407,6 +419,7 @@ void *getRemoteObj(transrecord_t *record, unsigned int mnum, unsigned int oid) { struct sockaddr_in serv_addr; struct hostent *server; char control; + char machineip[16]; objheader_t *h; void *objcopy; @@ -417,19 +430,18 @@ void *getRemoteObj(transrecord_t *record, unsigned int mnum, unsigned int oid) { bzero((char*) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(LISTEN_PORT); - serv_addr.sin_addr.s_addr = inet_addr(MACHINE_IP); + //serv_addr.sin_addr.s_addr = inet_addr(MACHINE_IP); + midtoIP(mnum,machineip); + machineip[15] = '\0'; + serv_addr.sin_addr.s_addr = inet_addr(machineip); if (connect(sd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) < 0) { perror("Error in connect"); return NULL; } -// bzero((char *)buffer,sizeof(buffer)); char readrequest[sizeof(char)+sizeof(unsigned int)]; readrequest[0] = READ_REQUEST; *((unsigned int *)(&readrequest[1])) = oid; - //buffer[0] = READ_REQUEST; - //memcpy(buffer+1, &oid, sizeof(int)); - //if (write(sd, buffer, sizeof(int) + sizeof(char)) < 0) { if (write(sd, &readrequest, sizeof(readrequest)) < 0) { perror("Error sending message"); return NULL; @@ -448,12 +460,12 @@ void *getRemoteObj(transrecord_t *record, unsigned int mnum, unsigned int oid) { read(sd, &size, sizeof(int)); objcopy = objstrAlloc(record->cache, size); read(sd, objcopy, size); + //Insert into cache's lookup table + chashInsert(record->lookupTable, oid, objcopy); break; default: printf("Error in recv request from participant on a READ_REQUEST\n"); return NULL; } - //Insert into cache's lookup table - chashInsert(record->lookupTable, oid, objcopy); return objcopy; } -- 2.34.1