Example #1
0
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");
	}
}
Example #2
0
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;
}