Commit 5aad7393 authored by Bhavesh Yadav's avatar Bhavesh Yadav

Added server join and init

parent dec41427
...@@ -23,6 +23,6 @@ kvstore.o: kvstore.c kvstore.h ...@@ -23,6 +23,6 @@ kvstore.o: kvstore.c kvstore.h
gcc -c kvstore.c gcc -c kvstore.c
run: kvserver run: kvserver
./kvserver -port=8080 -threadPoolSize=5 -numSetsInCache=4 -sizeOfSet=2 ./kvserver -port=8081 -threadPoolSize=5 -numSetsInCache=4 -sizeOfSet=2
clean: clean:
rm -f *.o kvserver kvclient *.csv *.xml batchResp*.txt rm -f *.o kvserver kvclient *.csv *.xml batchResp*.txt
\ No newline at end of file
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "utils.h" #include "utils.h"
#include <math.h> #include <math.h>
#include "chord.h" #include "chord.h"
#include <pthread.h>
#define MAXLOCATIONS 32 #define MAXLOCATIONS 32
#define MAXIDVALUE 65536 #define MAXIDVALUE 65536
...@@ -109,8 +110,17 @@ void sortNodes(Node a[], int n) ...@@ -109,8 +110,17 @@ void sortNodes(Node a[], int n)
{ {
qsort(a,n,sizeof(Node), compareTwoNodes); qsort(a,n,sizeof(Node), compareTwoNodes);
} }
Node getSuccessor(int id, Node allNodes[],int size) {
void setSuccessor(Node allNodes[],int size) { int i;
for(i = size-1; i >=0; i--) {
if(allNodes[i].nodeId<id)
break;
}
if(i==size-1)
return allNodes[0];
return allNodes[i+1];
}
void setSuccessorAndPredecessor(Node allNodes[],int size) {
int i = 0; int i = 0;
for(i = 0; i<size; i++) { for(i = 0; i<size; i++) {
if(chord.node.nodeId==allNodes[i].nodeId) if(chord.node.nodeId==allNodes[i].nodeId)
...@@ -128,23 +138,53 @@ void setSuccessor(Node allNodes[],int size) { ...@@ -128,23 +138,53 @@ void setSuccessor(Node allNodes[],int size) {
} }
} }
void *periodicStabilize(void *arg) {
while(1) {
stablize();
sleep(5);
}
}
void stablize() {
FILE *configFile = fopen(".chordConfig","r");
Node currNodes[100];
char ip[16];
int port,id;
int i = 0;
while(fscanf(configFile,"%s %d %d\n",ip,&port,&id)!=EOF){
createNodeStruct(&currNodes[i],ip,port,id);
i++;
}
fclose(configFile);
sortNodes(currNodes,i);
setSuccessorAndPredecessor(currNodes,i);
printf("successor: %d, pred: %d\n",chord.successor.nodeId,chord.predecessor.nodeId);
fixFingers(currNodes,i);
printFingerTable();
}
void initChordServer(sockaddr_t serverAddr) { void initChordServer(sockaddr_t serverAddr) {
FILE *configFile = fopen("chordConfig","a"); FILE *configFile = fopen(".chordConfig","a");
chord.node.socketAddr = serverAddr; chord.node.socketAddr = serverAddr;
chord.node.nodeId = nodeToId(&chord.node.socketAddr); chord.node.nodeId = nodeToId(&chord.node.socketAddr);
int id = nodeToId(&serverAddr); int id = nodeToId(&serverAddr);
fprintf(configFile,"%s %d %d\n",inet_ntoa(serverAddr.sin_addr),ntohs(serverAddr.sin_port),id);
fclose(configFile); fclose(configFile);
char ip[16]; char ip[16];
int port; int port;
configFile = fopen("chordConfig","r"); configFile = fopen(".chordConfig","r");
Node currNodes[100]; Node currNodes[100];
int i = 0; int i = 0;
while(fscanf(configFile,"%s %d %d\n",ip,&port,&id)!=EOF){ while(fscanf(configFile,"%s %d %d\n",ip,&port,&id)!=EOF){
createNodeStruct(&currNodes[i],ip,port,id); createNodeStruct(&currNodes[i],ip,port,id);
i++; i++;
} }
fclose(configFile);
sortNodes(currNodes,i); sortNodes(currNodes,i);
setSuccessor(currNodes,i); setSuccessorAndPredecessor(currNodes,i);
printf("successor: %d, pred: %d\n",chord.successor.nodeId,chord.predecessor.nodeId);
fixFingers(currNodes,i);
printFingerTable();
} }
void createNodeStruct(Node *givenNode,char ip[16],int port,int id) { void createNodeStruct(Node *givenNode,char ip[16],int port,int id) {
...@@ -171,7 +211,7 @@ void initChordStructure(struct sockaddr_in *joinNode,sockaddr_t socketAddrServer ...@@ -171,7 +211,7 @@ void initChordStructure(struct sockaddr_in *joinNode,sockaddr_t socketAddrServer
// Listen for reply // Listen for reply
// update successor // update successor
} }
fixFingers(); // fixFingers();
printFingerTable(); printFingerTable();
} }
...@@ -211,7 +251,7 @@ Node findSuccessor(int id, bool fixFinger){ ...@@ -211,7 +251,7 @@ Node findSuccessor(int id, bool fixFinger){
char *msg ,buffer[1000]; char *msg ,buffer[1000];
char idString[4]; char idString[4];
sprintf(idString,"%d",id); sprintf(idString,"%d",id);
msg = toXML("find_successor",idString,NULL); // msg = toXML("find_successor",idString,NULL);
puts(msg); puts(msg);
//make_packet and send //make_packet and send
sendUDPToNode(msg,preceedingNode,true,buffer); sendUDPToNode(msg,preceedingNode,true,buffer);
...@@ -235,13 +275,15 @@ Node findSuccessor(int id, bool fixFinger){ ...@@ -235,13 +275,15 @@ Node findSuccessor(int id, bool fixFinger){
// sendUDP(msg,chord.successorIp,chord.successorPort,true,buffer); // sendUDP(msg,chord.successorIp,chord.successorPort,true,buffer);
// } // }
void fixFingers(){ void fixFingers(Node allNodes[],int size){
for(int i = 0; i<16; i++) {
for(int i = 0; i<3; i++) { if(chord.fingerTable[i]==NULL)
Node *newNode = (Node *)malloc(sizeof(Node)); chord.fingerTable[i] = malloc(sizeof(Node));
getSocketFromIpAndPort("127.0.0.1",1230+i,&newNode->socketAddr); Node newNode = getSuccessor((chord.node.nodeId + (int)pow(2,i)) % MAXIDVALUE,allNodes,size);
newNode->nodeId = nodeToId(&newNode->socketAddr); chord.fingerTable[i]->socketAddr = newNode.socketAddr;
chord.fingerTable[i] = newNode; chord.fingerTable[i]->nodeId = newNode.nodeId;
strcpy(chord.fingerTable[i]->ip,newNode.ip);
chord.fingerTable[i]->port = newNode.port;
} }
} }
...@@ -258,4 +300,4 @@ void printFingerTable() { ...@@ -258,4 +300,4 @@ void printFingerTable() {
// int main() { // int main() {
// initChordStructure(NULL); // initChordStructure(NULL);
// findSuccessor(123,true); // findSuccessor(123,true);
// } // }
\ No newline at end of file
...@@ -276,7 +276,7 @@ void decodeRequestAndProcess(char* buffer) { ...@@ -276,7 +276,7 @@ void decodeRequestAndProcess(char* buffer) {
else if(!strcmp(request->operation,"getreq")){ else if(!strcmp(request->operation,"getreq")){
puts("getreq"); puts("getreq");
if(searchKey(request->key,request->val)) if(searchKey(request->key,request->val))
strcpy(buffer,toXML("resp",request->key,request->val)); strcpy(buffer,toXML("resp",request->key,request->val,request->ipAddr,request->port));
else else
strcpy(buffer,toRespXML("Does not exist")); strcpy(buffer,toRespXML("Does not exist"));
// puts("buffer"); // puts("buffer");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment