Ejemplo n.º 1
0
//2013.1.15
// not deduplication 
// zhou peng ju
static bool check_data(char hash[20],char* buf,int buflen){
    uint8_t tmphash[20];
    SHA_CTX ctx;
    SHA1_Init(&ctx);
    SHA1_Update(&ctx, buf, buflen);
    SHA1_Final(tmphash,&ctx);
    if(memcmp(tmphash, hash, 20)!=0){
        err_msg1("data has been corrupted!");
        return false;
    }
    return true;
}
Ejemplo n.º 2
0
/*main function*/
int main(int argc, char **argv)
{
    int opt;
    enum OPER_TYPE type;
    char path[FILE_NAME_LEN] = {0};
	char output_path[FILE_NAME_LEN] = {0};
    int delete_job;
    Client *c= NULL;
	
    if(argc<2)
  	    return -1;
	struct option long_options[] = {
		{"Simulate", 1, NULL, 'S'},
    	{"quit", 0, NULL, 'q'},
    	{"backup", 1, NULL, 'b'},
    	{"delete", 1, NULL, 'd'},
    	{"restore", 1, NULL, 'r'},
    	{"list", 0, NULL, 'l'},
    	{"pipeline", 0, NULL, 'p'},
    	{"output", 1, NULL, 'o'},
    	{"cloud", 0, NULL, 'c'},
    	
    	{"rewrite", 1, NULL, 'R'},
    	/*CFL*/
    	{"CFL", 1, NULL, 'C'},
    	{"seg_reuse", 1, NULL, 's'},
    	/*capping*/
    	{"cap_size", 1, NULL, 'a'},
    	{"cap_count", 1, NULL, 'e'},
    	/*perferect rewrite*/
    	{"ref_threshold", 1, NULL, 'u'},
    	
		{"overhead", 1, NULL, 'O'},
    	{"test", 1, NULL, 't'},
    	{"server", 1, NULL, 'H'},
    	{"help", 0, NULL, 'h'},
    	{NULL, 0, NULL, 0}
	};
	
    while((opt=getopt_long(argc, argv, "S:qb:d:r:lpo:cR:C:s:a:e:u:O:t:H:h", long_options, NULL))!=-1){
        switch(opt){
			case 'S':
				type=type_simulate;
				SIMULATE = true;
				strncpy(path, optarg, strlen(optarg));
				break;
            case 'q':
		        type=type_quit;
		        break;
            case 'b':
	  	        type=type_backup;
		        strncpy(path,optarg,strlen(optarg));
		        break;
            case 'd':
               	type=type_delete;
		        sscanf(optarg, "%d", &delete_job); 
		        break;
            case 'r':
              	type=type_restore;
		        strncpy(path,optarg,strlen(optarg));
		        break;
			case 'R':
				if (strcmp(optarg, "CFL") == 0)
					REWRITE = CFL_REWRITE;
				else if (strcmp(optarg, "CAP") == 0)
					REWRITE = CAPPING_REWRITE;
				else if (strcmp(optarg, "PER") == 0)
					REWRITE = PERFECT_REWRITE;
				break;
				
			case 'C':
				sscanf(optarg, "%f", &LWM);
				break;
			case 's':
				sscanf(optarg, "%f", &default_container_reuse);
				break;
			case 'a':
				sscanf(optarg, "%lld", &buffer_capacity);
				break;
			case 'e':
				sscanf(optarg, "%d", &max_refer_count);
				break;
			case 'u':
				sscanf(optarg, "%f", &segment_usage_threshold);
				break;
			case 'O':
				OVERHEAD = true;
				sscanf(optarg, "%f", &bandwidth);
				break;
	        case 't':
	  	        type=type_test;
		        strncpy(path,optarg,strlen(optarg));
		        break;
	        case 'h':
	   	        type=type_help;
		        break;
	            break;
            case 'H':
	  	        memset(SERVER_IP,0,30);
	  	        strncpy(SERVER_IP,optarg,strlen(optarg));
	  	        break;
			case 'l':
				type=type_list;
				break;
			case 'p':
				G_PIPELINE = true;
				break;
			case 'o':
				OUTPUT_RESULT = true;
				strncpy(output_path, optarg, strlen(optarg));
				break;
			case 'c':
				CLOUD = true;
				break;
	        default:
	   	        printf("Your command is wrong \n");
		        type=type_help;
		        break;
        }
    }

    if(type==type_help){
   	    usage(argv[0]);
	    return 0;
    }
    c = create_client();
	
	if (type == type_simulate) {
		simulata_backup(c, path, output_path);
		free(c);
		return 0;
	}else if(OVERHEAD == true) {
		backup_overhead(c, path, output_path);
		free(c);
		return 0;
	}
	
	
    if ((c->fd = bnet_connect(SERVER_IP, SERVER_PORT)) == -1){
	    err_msg1("Connection rejected!");
	    return 0;
    }

	if (G_PIPELINE) {
		c->recipe_fd = bnet_connect(SERVER_IP, SERVER_OTH_PORT);
		if (c->recipe_fd == -1) {
			err_msg1("Connection rejected!");
			return 0;
		}
	}
    
    if(type==type_test){
  	    test_data(c->fd, path);
	    return 0;
    }
    switch(type){
	    case type_login:
	        login(c);
	        break;
	    case type_logout:
	        logout(c);
	        break;
	    case type_quit:
            quit_client(c);
            break;
        case type_backup:
			if (G_PIPELINE)
				pipeline_backup(c, path, output_path);
			else
            	backup_client(c, path, output_path);
            break;
        case type_restore:
            restore_client(c, path, output_path);
            break;
        case type_delete:
            delete_client(c, delete_job);
            break;	
		case type_list:
			list_client(c);
			break;
	   default:
	   	    printf("Your command is wrong \n");
		    break;
    }
    free_client(c);
    return 0;
}
Ejemplo n.º 3
0
void backup_formal(int fd,char *msg){
	JCR *jcr=NULL;
	char fileset[256]={0};
	char *buf=(char *)calloc(1,SOCKET_BUF_SIZE+21);
	int len;

	int index=1;
	char vol_name[FILE_NAME_LEN];
	int vol_fd;
	Recipe *rp=NULL;
	FingerChunk *fc=NULL;
	char *p=NULL;
	int64_t rwlen=0;
	
	jobcount_init();
	jcr=jcr_new();
	jcr->dataSocket=fd;

	memset(vol_name,0,FILE_NAME_LEN);
	strcpy(vol_name,BackupVolPath);
	strcat(vol_name,"data_vol");
	vol_fd=open(vol_name,O_RDWR| O_CREAT,00644);
	if(vol_fd<0){
		err_msg1("can't open file");
		goto FAIL;
	}
	printf("%s %d vol_name:%s\n",__FILE__,__LINE__,vol_name);
        rwlen=lseek(vol_fd,0,SEEK_END);
	
	TIMER_DECLARE(gstart,gend);
	TIMER_DECLARE(wstart,wend);
	
	TIMER_START(gstart);
	if(sscanf(msg,backup_cmd,fileset)!=1){ // backup cmd
		goto FAIL;
	}
	jcr->jobv=jobv_new(fileset);
	jcr->nJobId=jcr->jobv->nJobId;
	
	printf("===========backup start==============\n");
	printf("%s,%d pathname:%s \n", __FILE__,__LINE__,fileset);

	
	while(bnet_recv(jcr->dataSocket,buf,&len)!=ERROR){ //文件名
		if(len==STREAM_END){
			printf("%s %d backup is over\n",__FILE__,__LINE__);
			break;
		}
		
		//printf("\033[40;32m recv file: %s (%d) \033[0m\n",buf,len);
		rp=recipe_new();
		memcpy(rp->filename,buf,len);
		rp->fileindex=index++;	
		
		while(bnet_recv(jcr->dataSocket,buf,&len)>0){ /*format: fingerprintf data data dta..*/
					//printf("\033[40;32m recv: file data (%d) \033[0m\n",len);	
			fc=fingerchunk_new(buf,0);
			fc->offset=rwlen;
			fc->length=len-sizeof(Fingerprint);

			check_data(fc->fingerprint,buf+sizeof(Fingerprint),fc->length);
					
			TIMER_START(wstart);
			 if(writen(vol_fd,buf+sizeof(Fingerprint),fc->length)!=fc->length)
					err_msg1("wrintn wrong");		 
			TIMER_END(wend);
			TIMER_DIFF(jcr->writeDataTime,wstart,wend);
			
			rwlen+=fc->length;		
			jcr->nChunkCount++;
			jcr->nSize+=fc->length;
			recipe_append_fingerchunk(rp,fc);
		}
				
		jcr->nFileCount++;
		if(G_VERBOSE)
			printf("receive file %s OK, total: %d\n",rp->filename,jcr->nFileCount);
		jobv_insert_recipe(jcr->jobv, rp);
		rp=NULL;	
	}
FAIL:	
	bnet_send(fd,"OK",2);  // 发送备份成功信息
	
	TIMER_END(gend);
	TIMER_DIFF(jcr->recvTime,gstart,gend);
	
	
	printf("============back over===============\n");
	printf("total time:%.4f   %.4f MB/s\n",jcr->recvTime,jcr->nSize*1.0/jcr->recvTime/1036288.0);
	printf("write time:%.4f  %.4f MB/s\n",jcr->writeDataTime,jcr->nSize*1.0/jcr->writeDataTime/1036288.0);
	printf("chunk count:%d\n",jcr->nChunkCount);
	printf("file count:%d\n",jcr->nFileCount);
	
	if(rp){
		recipe_free(rp);
	}
	
	jobv_destroy(jcr->jobv);
	jcr_free(jcr);
	jobcount_close();
	
	close(vol_fd);
}
Ejemplo n.º 4
0
void restore_formal(int fd,char *msg){
		JCR *jcr=NULL;
		Recipe *rp=NULL;
		FingerChunk *fc=NULL;
		char *buf=(char *)calloc(1,SOCKET_BUF_SIZE+21);
		char vol_name[FILE_NAME_LEN];
		int vol_fd;
		//char stream[30]={0};
		
		memset(vol_name,0,FILE_NAME_LEN);
		strcpy(vol_name,BackupVolPath);
		strcat(vol_name,"data_vol");
		vol_fd=open(vol_name,O_RDWR| O_CREAT,00644);

		jcr=jcr_new();
		jcr->dataSocket=fd;

		if(vol_fd<0){
			err_msg1("can't open file");
			goto FAIL;

		}
		
		if(sscanf(msg,restore_cmd,&jcr->nJobId)!=1){ // backup cmd
			goto FAIL;
		}
		jcr->jobv=jobv_open(jcr->nJobId);

		if(jcr->jobv==NULL){
			goto FAIL;
		}

		printf("%s,%d restore jobid:%d \n", __FILE__,__LINE__,jcr->nJobId);

		// send pathname
		bnet_send(fd,jcr->jobv->szBackupPath,strlen(jcr->jobv->szBackupPath));
		
		
		while((rp=jobv_search_next_recipe(jcr->jobv))){

			//send file name
		
			if(G_VERBOSE)
			  	printf("send file %s \n",rp->filename);
			bnet_send(fd,rp->filename,strlen(rp->filename));
			
			//send data
			
			for(fc=rp->first;fc;fc=fc->next){
				lseek(vol_fd,fc->offset,SEEK_SET);
				if(readn(vol_fd,buf,fc->length)!=fc->length)
					err_msg1("readn wrong");
				check_data(fc->fingerprint,buf,fc->length);
				bnet_send(fd,buf,fc->length);
			}
			bnet_signal(fd,DATA_END);

			recipe_free(rp);
		}
	FAIL:
		bnet_signal(fd,STREAM_END); /* over */
		jobv_destroy(jcr->jobv);
		jcr_free(jcr);
		
}