void handle_write(char *objid , char *path) { HS_DEBUG("objid=%s,path=%s\n",objid,path); struct DataAddrList addr_list; if(0 == get_addr_list(&addr_list)){ /* connect to the first datanode and send data*/ int first_datanode_fd; struct sockaddr_in datanode_addr; first_datanode_fd = i_socket(AF_INET,SOCK_STREAM,0); bzero(&datanode_addr,sizeof(datanode_addr)); datanode_addr.sin_family=AF_INET; datanode_addr.sin_port = htons(addr_list.addr_list[0].write_port); datanode_addr.sin_addr.s_addr = inet_addr(addr_list.addr_list[0].address); i_connect(first_datanode_fd,(struct sockaddr*)&datanode_addr,sizeof(datanode_addr)); /* read data from path */ int filefd = open(path,O_RDONLY); if(filefd == -1){ HS_ERROR("open %s failed!\n",path); exit(1); } struct stat filestat; if(stat(path,&filestat) == -1){ HS_ERROR("stat failed!\b"); exit(1); } uint32_t objsize = (uint32_t)filestat.st_size; if(objsize > DATALENGTH){ HS_ERROR("Notice:the data you want to write is too large!\n"); } char *databuf = (char*)malloc(objsize*sizeof(char)); int nbytes; if((nbytes = read(filefd,databuf,objsize)) == -1){ HS_ERROR("read data failed!path=%s\n",path); exit(1); } struct DataMsg msg; msg.command = COMMAND_DATANODE_WRITE; msg.data_list = addr_list; strncpy(msg.objid,objid,OBJIDLENGTH); strncpy(msg.data,databuf,objsize); msg.objsize = objsize; i_send(first_datanode_fd,(void*)&msg,sizeof(msg)); /* reveive the write response */ struct ResponseMsg rmsg; i_recv(first_datanode_fd,(void*)&rmsg,sizeof(rmsg)); if(rmsg.command == COMMAND_DATANODE_WRITE && rmsg.flag == 0){ HS_DEBUG("write sucess!\n"); }else{ HS_ERROR("write failed!objid=%s,command=%d,flag=%d\n",objid,rmsg.command,rmsg.flag); } }else{ HS_ERROR("get addr list failed!\n"); } }
int main() { int sockfd, clientfd; struct addrinfo *serv_info; struct sockaddr_storage client_addr; socklen_t sin_size; struct sigaction sa; int yes = 1; kv_node *arrkeys[ARRAYLEN] = {NULL}; keys = &arrkeys[0]; if(pthread_mutex_init(&kv_lock, NULL) != 0) { fprintf(stderr, "Mutex initialization failed.\n"); exit(EXIT_FAILURE); } serv_info = get_addr_list(PORT); if((sockfd = prep_socket(serv_info, yes)) == -1) { exit(EXIT_FAILURE); } if(listen(sockfd, 1) == -1) { perror("kvserver: listen"); exit(EXIT_FAILURE); } sa.sa_handler = sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if(sigaction(SIGCHLD, &sa, NULL) == -1) { perror("kvserver: sigaction"); exit(EXIT_FAILURE); } printf("kvserver: Ready for connections...\n"); while(1) { sin_size = sizeof(client_addr); clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &sin_size); if(clientfd == -1) { perror("kvserver: accept"); continue; } kv_new_thread(handle_request, &clientfd); } close(sockfd); return 0; }