Beispiel #1
0
int main(int argc, char **argv)
{
  long l;
  int k, w, i, j, m;
  int *matrix;
  char **data, **coding;
  int *erasures, *erased;
  int *decoding_matrix, *dm_ids;
  
  if (argc != 3) usage(NULL);
  if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k");
  if (sscanf(argv[2], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w");
  m = 2;
  if (w <= 16 && k + m > (1 << w)) usage("k + m is too big");

  matrix = reed_sol_r6_coding_matrix(k, w);

  printf("Last 2 rows of the Distribution Matrix:\n\n");
  jerasure_print_matrix(matrix, m, k, w);
  printf("\n");

  srand48(0);
  data = talloc(char *, k);
  for (i = 0; i < k; i++) {
    data[i] = talloc(char, sizeof(long));
    l = lrand48();
    memcpy(data[i], &l, sizeof(long));
  }

  coding = talloc(char *, m);
  for (i = 0; i < m; i++) {
    coding[i] = talloc(char, sizeof(long));
  }

  reed_sol_r6_encode(k, w, data, coding, sizeof(long));
  
  printf("Encoding Complete:\n\n");
  print_data_and_coding(k, m, w, sizeof(long), data, coding);

  erasures = talloc(int, (m+1));
  erased = talloc(int, (k+m));
  for (i = 0; i < m+k; i++) erased[i] = 0;
  l = 0;
  for (i = 0; i < m; ) {
    erasures[i] = lrand48()%(k+m);
    if (erased[erasures[i]] == 0) {
      erased[erasures[i]] = 1;
      memcpy((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], &l, sizeof(long));
      i++;
    }
  }
  erasures[i] = -1;

  printf("Erased %d random devices:\n\n", m);
  print_data_and_coding(k, m, w, sizeof(long), data, coding);
  
  i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, sizeof(long));

  printf("State of the system after decoding:\n\n");
  print_data_and_coding(k, m, w, sizeof(long), data, coding);
  
  return 0;
}
Beispiel #2
0
int main(int argc, char **argv)
{
  long l;
  int k, w, i, j, m;
  int *matrix;
  char **data, **coding, **dcopy, **ccopy;
  unsigned char uc;
  int *erasures, *erased;
  int *decoding_matrix, *dm_ids;
  uint32_t seed;
  
  if (argc != 5) usage(NULL);
  if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k");
  if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m");
  if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w");
  if (sscanf(argv[4], "%u", &seed) == 0) usage("Bad seed");
  if (w <= 16 && k + m > (1 << w)) usage("k + m is too big");

  matrix = reed_sol_vandermonde_coding_matrix(k, m, w);

  printf("<HTML><TITLE>reed_sol_01 %d %d %d %d</title>\n", k, m, w, seed);
  printf("<h3>reed_sol_01 %d %d %d %d</h3>\n", k, m, w, seed);
  printf("<pre>\n");
  printf("Last m rows of the generator Matrix (G^T):\n\n");
  jerasure_print_matrix(matrix, m, k, w);
  printf("\n");

  MOA_Seed(seed);
  data = talloc(char *, k);
  dcopy = talloc(char *, k);
  for (i = 0; i < k; i++) {
    data[i] = talloc(char, sizeof(long));
    dcopy[i] = talloc(char, sizeof(long));
    for (j = 0; j < sizeof(long); j++) {
      uc = MOA_Random_W(8, 1);
      data[i][j] = (char) uc;
    }
    memcpy(dcopy[i], data[i], sizeof(long));
  }

  coding = talloc(char *, m);
  ccopy = talloc(char *, m);
  for (i = 0; i < m; i++) {
    coding[i] = talloc(char, sizeof(long));
    ccopy[i] = talloc(char, sizeof(long));
  }

  jerasure_matrix_encode(k, m, w, matrix, data, coding, sizeof(long));

  for (i = 0; i < m; i++) {
    memcpy(ccopy[i], coding[i], sizeof(long));
  }
  
  printf("Encoding Complete:\n\n");
  print_data_and_coding(k, m, w, sizeof(long), data, coding);

  erasures = talloc(int, (m+1));
  erased = talloc(int, (k+m));
  for (i = 0; i < m+k; i++) erased[i] = 0;
  l = 0;
  for (i = 0; i < m; ) {
    erasures[i] = MOA_Random_W(31, 0)%(k+m);
    if (erased[erasures[i]] == 0) {
      erased[erasures[i]] = 1;
      memcpy((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], &l, sizeof(long));
      i++;
    }
  }
  erasures[i] = -1;

  printf("Erased %d random devices:\n\n", m);
  print_data_and_coding(k, m, w, sizeof(long), data, coding);
  
  i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, sizeof(long));

  printf("State of the system after decoding:\n\n");
  print_data_and_coding(k, m, w, sizeof(long), data, coding);
  
  for (i = 0; i < k; i++) if (memcmp(data[i], dcopy[i], sizeof(long)) != 0) {
    printf("ERROR: D%x after decoding does not match its state before decoding!<br>\n", i);
  }
  for (i = 0; i < m; i++) if (memcmp(coding[i], ccopy[i], sizeof(long)) != 0) {
    printf("ERROR: C%x after decoding does not match its state before decoding!<br>\n", i);
  }

  return 0;
}
int main(int argc, char **argv)
{
  int k, w, i, m, iterations, bufsize;
  int *matrix;
  char **data, **coding, **old_values;
  int *erasures, *erased;
  uint32_t seed;
  double t = 0, total_time = 0;
  gf_t *gf = NULL;
  
  if (argc < 8) usage(NULL);  
  if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k");
  if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m");
  if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w");
  if (sscanf(argv[4], "%d", &seed) == 0) usage("Bad seed");
  if (sscanf(argv[5], "%d", &iterations) == 0) usage("Bad iterations");
  if (sscanf(argv[6], "%d", &bufsize) == 0) usage("Bad bufsize");
  if (w <= 16 && k + m > (1 << w)) usage("k + m is too big");

  MOA_Seed(seed);

  gf = get_gf(w, argc, argv, 7); 

  if (gf == NULL) {
    usage("Invalid arguments given for GF!\n");
  }

  galois_change_technique(gf, w); 

  matrix = reed_sol_vandermonde_coding_matrix(k, m, w);

  printf("<HTML><TITLE>reed_sol_time_gf");
  for (i = 1; i < argc; i++) printf(" %s", argv[i]);
  printf("</TITLE>\n");
  printf("<h3>reed_sol_time_gf");
  for (i = 1; i < argc; i++) printf(" %s", argv[i]);
  printf("</h3>\n");
  printf("<pre>\n");

  printf("Last m rows of the generator matrix (G^T):\n\n");
  jerasure_print_matrix(matrix, m, k, w,NULL);
  printf("\n");

  data = talloc(char *, k);
  for (i = 0; i < k; i++) {
    data[i] = talloc(char, bufsize);
    MOA_Fill_Random_Region(data[i], bufsize);
  }

  coding = talloc(char *, m);
  old_values = talloc(char *, m);
  for (i = 0; i < m; i++) {
    coding[i] = talloc(char, bufsize);
    old_values[i] = talloc(char, bufsize);
  }

  for (i = 0; i < iterations; i++) {
    t = timing_now();
    jerasure_matrix_encode(k, m, w, matrix, data, coding, bufsize);
    total_time += timing_now() - t;
  }

  printf("Encode throughput for %d iterations: %.2f MB/s (%.2f sec)\n", iterations, (double)(k*iterations*bufsize/1024/1024) / total_time, total_time);
  
  erasures = talloc(int, (m+1));
  erased = talloc(int, (k+m));
  for (i = 0; i < m+k; i++) erased[i] = 0;
  for (i = 0; i < m; ) {
    erasures[i] = ((unsigned int)MOA_Random_W(w, 1))%(k+m);
    if (erased[erasures[i]] == 0) {
      erased[erasures[i]] = 1;
      memcpy(old_values[i], (erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], bufsize);
      bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], bufsize);
      i++;
    }
  }
  erasures[i] = -1;

  for (i = 0; i < iterations; i++) {
    t = timing_now();
    jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, bufsize);
    total_time += timing_now() - t;
  }
  
  printf("Decode throughput for %d iterations: %.2f MB/s (%.2f sec)\n", iterations, (double)(k*iterations*bufsize/1024/1024) / total_time, total_time);

  for (i = 0; i < m; i++) {
    if (erasures[i] < k) {
      if (memcmp(data[erasures[i]], old_values[i], bufsize)) {
        fprintf(stderr, "Decoding failed for %d!\n", erasures[i]);
        exit(1);
      }
    } else {
      if (memcmp(coding[erasures[i]-k], old_values[i], bufsize)) {
        fprintf(stderr, "Decoding failed for %d!\n", erasures[i]);
        exit(1);
      }
    }
  }
  
  return 0;
}
Beispiel #4
0
int main(int argc, char **argv)
{
  long l;
  int k, w, i, j, m;
  int *matrix;
  char **data, **coding, **old_values;
  int *erasures, *erased;
  int *decoding_matrix, *dm_ids;
  gf_t *gf = NULL;
  uint32_t seed;
  
  if (argc < 6) usage("Not enough command line arguments");  
  if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k");
  if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m");
  if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w");
  if (sscanf(argv[4], "%d", &seed) == 0) usage("Bad seed");
  if (w <= 16 && k + m > (1 << w)) usage("k + m is too big");

  MOA_Seed(seed);

  gf = get_gf(w, argc, argv, 5); 

  if (gf == NULL) {
    usage("Invalid arguments given for GF!\n");
  }

  galois_change_technique(gf, w); 

  matrix = reed_sol_vandermonde_coding_matrix(k, m, w);

  printf("<HTML><TITLE>reed_sol_test_gf");
  for (i = 1; i < argc; i++) printf(" %s", argv[i]);
  printf("</TITLE>\n");
  printf("<h3>reed_sol_test_gf");
  for (i = 1; i < argc; i++) printf(" %s", argv[i]);
  printf("</h3>\n");
  printf("<pre>\n");

  printf("Last m rows of the generator matrix (G^T):\n\n");
  jerasure_print_matrix(matrix, m, k, w);
  printf("\n");

  data = talloc(char *, k);
  for (i = 0; i < k; i++) {
    data[i] = talloc(char, BUFSIZE);
    MOA_Fill_Random_Region(data[i], BUFSIZE);
  }

  coding = talloc(char *, m);
  old_values = talloc(char *, m);
  for (i = 0; i < m; i++) {
    coding[i] = talloc(char, BUFSIZE);
    old_values[i] = talloc(char, BUFSIZE);
  }

  jerasure_matrix_encode(k, m, w, matrix, data, coding, BUFSIZE);
  
  erasures = talloc(int, (m+1));
  erased = talloc(int, (k+m));
  for (i = 0; i < m+k; i++) erased[i] = 0;
  l = 0;
  for (i = 0; i < m; ) {
    erasures[i] = ((unsigned int)MOA_Random_W(w,1))%(k+m);
    if (erased[erasures[i]] == 0) {
      erased[erasures[i]] = 1;
      memcpy(old_values[i], (erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], BUFSIZE);
      bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], BUFSIZE);
      i++;
    }
  }
  erasures[i] = -1;

  i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, BUFSIZE);

  for (i = 0; i < m; i++) {
    if (erasures[i] < k) {
      if (memcmp(data[erasures[i]], old_values[i], BUFSIZE)) {
        fprintf(stderr, "Decoding failed for %d!\n", erasures[i]);
        exit(1);
      }
    } else {
      if (memcmp(coding[erasures[i]-k], old_values[i], BUFSIZE)) {
        fprintf(stderr, "Decoding failed for %d!\n", erasures[i]);
        exit(1);
      }
    }
  }
  
  printf("Encoding and decoding were both successful.\n");
  return 0;
}
Beispiel #5
0
int main(int argc, char **argv)
{
  gdata l;
  int k, w, i, j, m;
  int *matrix;
  char **data, **coding;
  int *erasures, *erased;
  int *decoding_matrix, *dm_ids;
  struct jerasure_context *ctx;
  
  if (argc != 4) usage(NULL);
  if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k");
  if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m");
  if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w");
  if (w <= 16 && k + m > (1 << w)) usage("k + m is too big");

  ctx = jerasure_make_context(w);
  matrix = reed_sol_vandermonde_coding_matrix(ctx, k, m);

  printf("Last m rows of the Distribution Matrix:\n\n");
  jerasure_print_matrix(matrix, m, k, w);
  printf("\n");

  srand48(0);
  data = talloc(char *, k);
  for (i = 0; i < k; i++) {
    data[i] = talloc(char, sizeof(gdata));
    fillrand(data[i], sizeof(gdata));
  }

  coding = talloc(char *, m);
  for (i = 0; i < m; i++) {
    coding[i] = talloc(char, sizeof(gdata));
  }

  jerasure_matrix_encode(ctx, k, m, matrix, data, coding, sizeof(gdata));
  
  printf("Encoding Complete:\n\n");
  print_data_and_coding_1(k, m, w, sizeof(gdata), data, coding);

  erasures = talloc(int, (m+1));
  erased = talloc(int, (k+m));
  for (i = 0; i < m+k; i++) erased[i] = 0;
  l = 0;
  for (i = 0; i < m; ) {
    erasures[i] = lrand48()%(k+m);
    if (erased[erasures[i]] == 0) {
      erased[erasures[i]] = 1;
      memcpy((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], &l, sizeof(gdata));
      i++;
    }
  }
  erasures[i] = -1;

  printf("Erased %d random devices:\n\n", m);
  print_data_and_coding_1(k, m, w, sizeof(gdata), data, coding);
  
  i = jerasure_matrix_decode(ctx, k, m, matrix, 1, erasures, data, coding, sizeof(gdata));

  printf("State of the system after decoding:\n\n");
  print_data_and_coding_1(k, m, w, sizeof(gdata), data, coding);
  /* free data to avoid false positives for leak testing */
  free(erased);
  free(erasures);
  for (i = 0; i < m; i++) {
    free(coding[i]);
  }
  free(coding);
  for (i = 0; i < k; i++) {
    free(data[i]);
  }
  free(data);
  free(matrix);
  jerasure_release_context(ctx);

  return 0;
}
Beispiel #6
0
int main (int argc, char **argv) {
	FILE *fp;				// File pointer
        char *dummy;
        int err;

	/* Jerasure arguments */
	char **data;
	char **coding;
	int *erasures;
	int *erased;
	int *matrix;
	int *bitmatrix;
	
	/* Parameters */
	int k, m, w, packetsize, buffersize;
	enum Coding_Technique tech;
	char *c_tech;
	
	int i, j;				// loop control variables
	int blocksize;			// size of individual files
	int origsize;			// size of file before padding
	int total;				// used to write data, not padding to file
	struct stat status;		// used to find size of individual files
	int numerased;			// number of erased files
		
	/* Used to recreate file names */
	char *temp;
	char *cs1, *cs2, *extension;
	char *fname;
	int md;
	char *curdir;

	/* Used to time decoding */
	struct timeval t1, t2, t3, t4;
	struct timezone tz;
	double tsec;
	double totalsec;

	
	signal(SIGQUIT, ctrl_bs_handler);

	matrix = NULL;
	bitmatrix = NULL;
	totalsec = 0.0;
        blocksize = -1;

	/* Start timing */
	gettimeofday(&t1, &tz);

	/* Error checking parameters */
	if (argc != 2) {
		fprintf(stderr, "usage: inputfile\n");
		exit(0);
	}
	curdir = (char *)malloc(sizeof(char)*100);
	dummy = getcwd(curdir, 100);
	
	/* Begin recreation of file names */
	cs1 = (char*)malloc(sizeof(char)*strlen(argv[1]));
	cs2 = strrchr(argv[1], '/');
	if (cs2 != NULL) {
		cs2++;
		strcpy(cs1, cs2);
	}
	else {
		strcpy(cs1, argv[1]);
	}
	cs2 = strchr(cs1, '.');
	if (cs2 != NULL) {
                extension = strdup(cs2);
		*cs2 = '\0';
	} else {
           extension = strdup("");
        }	
	fname = (char *)malloc(sizeof(char*)*(100+strlen(argv[1])+10));

	/* Read in parameters from metadata file */
	sprintf(fname, "%s/Coding/%s_meta.txt", curdir, cs1);

	fp = fopen(fname, "rb");
        if (fp == NULL) {
          fprintf(stderr, "Error: no metadata file %s\n", fname);
          exit(1);
        }
	temp = (char *)malloc(sizeof(char)*(strlen(argv[1])+10));
	err = fscanf(fp, "%s", temp);	
	
	if (fscanf(fp, "%d", &origsize) != 1) {
		fprintf(stderr, "Original size is not valid\n");
		exit(0);
	}
	if (fscanf(fp, "%d %d %d %d %d", &k, &m, &w, &packetsize, &buffersize) != 5) {
		fprintf(stderr, "Parameters are not correct\n");
		exit(0);
	}
	c_tech = (char *)malloc(sizeof(char)*(strlen(argv[1])+10));
	err = fscanf(fp, "%s", c_tech);
	err = fscanf(fp, "%d", &tech);
	method = tech;
	err = fscanf(fp, "%d", &readins);
	fclose(fp);	

	/* Allocate memory */
	erased = (int *)malloc(sizeof(int)*(k+m));
	for (i = 0; i < k+m; i++)
		erased[i] = 0;
	erasures = (int *)malloc(sizeof(int)*(k+m));

	data = (char **)malloc(sizeof(char *)*k);
	coding = (char **)malloc(sizeof(char *)*m);
	if (buffersize != origsize) {
		for (i = 0; i < k; i++) {
			data[i] = (char *)malloc(sizeof(char)*(buffersize/k));
		}
		for (i = 0; i < m; i++) {
			coding[i] = (char *)malloc(sizeof(char)*(buffersize/k));
		}
		blocksize = buffersize/k;
	}

	sprintf(temp, "%d", k);
	md = strlen(temp);
	gettimeofday(&t3, &tz);

	/* Create coding matrix or bitmatrix */
	switch(tech) {
		case No_Coding:
                case RDP:
                case EVENODD:
			break;
		case Reed_Sol_Van:
			matrix = reed_sol_vandermonde_coding_matrix(k, m, w);
			break;
		case Reed_Sol_R6_Op:
			matrix = reed_sol_r6_coding_matrix(k, w);
			break;
		case Cauchy_Orig:
			matrix = cauchy_original_coding_matrix(k, m, w);
			bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix);
			break;
		case Cauchy_Good:
			matrix = cauchy_good_general_coding_matrix(k, m, w);
			bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix);
			break;
		case Liberation:
			bitmatrix = liberation_coding_bitmatrix(k, w);
			break;
		case Blaum_Roth:
			bitmatrix = blaum_roth_coding_bitmatrix(k, w);
			break;
		case Liber8tion:
			bitmatrix = liber8tion_coding_bitmatrix(k);
			break;
		default:
			fprintf(stderr,  "unsupported coding technique used\n");
			break;
	}
	gettimeofday(&t4, &tz);
	tsec = 0.0;
	tsec += t4.tv_usec;
	tsec -= t3.tv_usec;
	tsec /= 1000000.0;
	tsec += t4.tv_sec;
	tsec -= t3.tv_sec;
	totalsec += tsec;
	
	/* Begin decoding process */
	total = 0;
	n = 1;	
	while (n <= readins) {
		numerased = 0;
		/* Open files, check for erasures, read in data/coding */	
		for (i = 1; i <= k; i++) {
			sprintf(fname, "%s/Coding/%s_k%0*d%s", curdir, cs1, md, i, extension);
			fp = fopen(fname, "rb");
			if (fp == NULL) {
				erased[i-1] = 1;
				erasures[numerased] = i-1;
				numerased++;
				//printf("%s failed\n", fname);
			}
			else {
				if (buffersize == origsize) {
					stat(fname, &status);
					blocksize = status.st_size;
					data[i-1] = (char *)malloc(sizeof(char)*blocksize);
					err = fread(data[i-1], sizeof(char), blocksize, fp);
				}
				else {
					fseek(fp, blocksize*(n-1), SEEK_SET); 
					err = fread(data[i-1], sizeof(char), buffersize/k, fp);
				}
				fclose(fp);
			}
		}
		for (i = 1; i <= m; i++) {
			sprintf(fname, "%s/Coding/%s_m%0*d%s", curdir, cs1, md, i, extension);
				fp = fopen(fname, "rb");
			if (fp == NULL) {
				erased[k+(i-1)] = 1;
				erasures[numerased] = k+i-1;
				numerased++;
				//printf("%s failed\n", fname);
			}
			else {
				if (buffersize == origsize) {
					stat(fname, &status);
					blocksize = status.st_size;
					coding[i-1] = (char *)malloc(sizeof(char)*blocksize);
					err = fread(coding[i-1], sizeof(char), blocksize, fp);
				}
				else {
					fseek(fp, blocksize*(n-1), SEEK_SET);
					err = fread(coding[i-1], sizeof(char), blocksize, fp);
				}
				fclose(fp);
			}
		}
		/* Finish allocating data/coding if needed */
		if (n == 1) {
			for (i = 0; i < numerased; i++) {
				if (erasures[i] < k) {
					data[erasures[i]] = (char *)malloc(sizeof(char)*blocksize);
				}
				else {
					coding[erasures[i]-k] = (char *)malloc(sizeof(char)*blocksize);
				}
			}
		}
		
		erasures[numerased] = -1;
		gettimeofday(&t3, &tz);
	
		/* Choose proper decoding method */
		if (tech == Reed_Sol_Van || tech == Reed_Sol_R6_Op) {
			i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, blocksize);
		}
		else if (tech == Cauchy_Orig || tech == Cauchy_Good || tech == Liberation || tech == Blaum_Roth || tech == Liber8tion) {
			i = jerasure_schedule_decode_lazy(k, m, w, bitmatrix, erasures, data, coding, blocksize, packetsize, 1);
		}
		else {
			fprintf(stderr, "Not a valid coding technique.\n");
			exit(0);
		}
		gettimeofday(&t4, &tz);
	
		/* Exit if decoding was unsuccessful */
		if (i == -1) {
			fprintf(stderr, "Unsuccessful!\n");
			exit(0);
		}
	
		/* Create decoded file */
		sprintf(fname, "%s/Coding/%s_decoded%s", curdir, cs1, extension);
		if (n == 1) {
			fp = fopen(fname, "wb");
		}
		else {
			fp = fopen(fname, "ab");
		}
		for (i = 0; i < k; i++) {
			if (total+blocksize <= origsize) {
				fwrite(data[i], sizeof(char), blocksize, fp);
				total+= blocksize;
			}
			else {
				for (j = 0; j < blocksize; j++) {
					if (total < origsize) {
						fprintf(fp, "%c", data[i][j]);
						total++;
					}
					else {
						break;
					}
					
				}
			}
		}
		n++;
		fclose(fp);
		tsec = 0.0;
		tsec += t4.tv_usec;
		tsec -= t3.tv_usec;
		tsec /= 1000000.0;
		tsec += t4.tv_sec;
		tsec -= t3.tv_sec;
		totalsec += tsec;
	}
	
	/* Free allocated memory */
	free(cs1);
	free(extension);
	free(fname);
	free(data);
	free(coding);
	free(erasures);
	free(erased);

	/* Stop timing and print time */
	gettimeofday(&t2, &tz);
	tsec = 0;
	tsec += t2.tv_usec;
	tsec -= t1.tv_usec;
	tsec /= 1000000.0;
	tsec += t2.tv_sec;
	tsec -= t1.tv_sec;
	printf("Decoding (MB/sec): %0.10f\n", (origsize/1024/1024)/totalsec);
	printf("De_Total (MB/sec): %0.10f\n\n", (origsize/1024/1024)/tsec);

        return(0);
}
/*decoder that decoded using only 'k' SRC encoded files */
void Decode_by_reed_sol(){

	int *encoder_matrix;
	int *total;
	int temp_size;
	lookupTable *repairChunksTable,*nodePacketData;
	char **data,**coding;
	int *node2ReadFrom;
	int *erasedNodes,*erasure;
	int *erasedArray,*erasedstream;
	int bytesWritten2File;
	int i,j,p;
	int extra,q,z,decodeFlag;
	int index;
	int nodeSurviving;
	struct timeval start_mem_time, stop_mem_time;
	struct timezone tz;
	double total_mem_time;

	m = n-k;
	encoder_matrix = NULL;
	total_mem_time =0.0;	
	encoder_matrix = reed_sol_vandermonde_coding_matrix(k, m, w);

	
	total = (int*)malloc(sizeof(int)*n);		
	bytesEachDataStreamWrites2File = (int*)malloc(sizeof(int)*k*f);
	repairChunksTable = (lookupTable *)malloc(sizeof(lookupTable)*(f)*(f+1));
	data = (char**)malloc(sizeof(char*)*k);
	coding = (char**)malloc(sizeof(char*)*m);	
		
	nodePacketData = (lookupTable*)malloc(sizeof(lookupTable)*(f+1)*k);
	repairChunksTable = (lookupTable*)malloc(sizeof(lookupTable)*(f)*filesUnavailable);	
	
				
	//printf("Lost Files are :\n");	
	//for(i=0;i<filesUnavailable;i++)
	//	printf("%d. %s\n",i,fileNamesUnavailable[i]);
	
	node2ReadFrom = (int*)malloc(sizeof(int)*(k));
	erasedNodes = (int*)malloc(sizeof(int)*filesUnavailable);
	erasure = (int*)malloc(sizeof(int)*(n-k+1));
	erasedstream = (int*)malloc(sizeof(int)*(n-k+1));
	erasedArray = 	(int*)malloc(sizeof(int)*(n));
	
	temp_size = size;
	for(i=0;i<k*f;i++){
		if(temp_size>chunkSize){
		bytesEachDataStreamWrites2File[i] = chunkSize;
		temp_size = temp_size - chunkSize;
		}
		else if((temp_size < chunkSize)&&(temp_size != 0)){
			bytesEachDataStreamWrites2File[i] = temp_size;
			temp_size = 0;
		}
		else if(temp_size == 0){
			bytesEachDataStreamWrites2File[i] = 0;
		}
	}
	
	
	for(i=0;i<n;i++)
		erasedArray[i] = -1;
	// find files lost(or files lost)
	
	j=0;
	for(i=0;i<n;i++){
		if((nodeIndexUnavailable[i] == 1)){
			erasedNodes[j] = i;
			j++;	
		}
	}
	// -1 indicates available and 1 indicates lost	
	
	// pick any k files to read from and assume rest to be erased
	j=0;
	p=0;
	for(i=0;i<n;i++){
		if((nodeIndexUnavailable[i] == -1)&&(j<k)){
			node2ReadFrom[j] = i;
			j++;	
		}
		else{
			erasure[p] = i;
			erasedstream[p] = i;
			p++;
		}
	}
	erasure[p] = -1;
	erasedstream[p] = -1; 
	j=0;
	nodeSurviving = 0;
	for(j=0;j<k;j++){
		for(i = nodeSurviving;i<n;i++){
			if(nodeIndexUnavailable[i] == -1){
				nodeSurviving = i;
				break;
			}
		}		
	 
		for(i=0;i<(f+1);i++){
			(nodePacketData[i + j*(f+1)].chunkInfo).fileIndex = ((LookupTable[i+nodeSurviving*(f+1)])->chunkInfo).fileIndex;
			(nodePacketData[i+ j*(f+1)].chunkInfo).start = ((LookupTable[i+nodeSurviving*(f+1)])->chunkInfo).start;		
			((nodePacketData[i + j*(f+1)].chunkInfo).Nbytes =((LookupTable[i+nodeSurviving*(f+1)])->chunkInfo).Nbytes);
		}
		nodeSurviving = nodeSurviving + 1;		
	}
	
			
	/*determine number of read-ins */
	if (chunkSize > buffersize && buffersize != 0) {
		if (chunkSize%buffersize != 0) {
			readins = chunkSize/buffersize;
		}
		else {
			readins = chunkSize/buffersize;
		}
		}
	else {
		readins = 1;
		buffersize = chunkSize;
	}	
	
	readFileStreams = (FILE**)malloc(sizeof(FILE*)*k);
	filedecoded = (FILE**)malloc(sizeof(FILE*));
	
	for(i=0;i<k;i++){
		if((readFileStreams[i] = fopen(file2beread[node2ReadFrom[i]],"rb")) == NULL)		
			printf("Unable to read file \n");
			}
	filedecoded[0] = fopen(decodedName,"wb");
		
			
	/*pick any 'k' files to be used for decoding*/		
	for(i=0;i<f;i++){
		for(j=0;j<k;j++){
			if(readins == 1)
				data[j] = (char*)calloc(chunkSize,sizeof(char));
			else
				data[j] = (char*)calloc(buffersize,sizeof(char));	
		}
		for(j=0;j<m;j++){
			if(readins == 1)
				coding[j] = (char*)calloc(chunkSize,sizeof(char));
			else
				coding[j] = (char*)calloc(buffersize,sizeof(char));	
		}
		for(j=0;j<n;j++)
			total[j] = 0;
			
	
		p=1;
		while(p<=readins){
			for(j=0;j<k;j++){
				fseek(readFileStreams[j],i*chunkSize+(p-1)*buffersize,SEEK_SET);
						
				if((nodePacketData[i + j*(f+1)].chunkInfo).fileIndex < k){
					index = (nodePacketData[i + j*(f+1)].chunkInfo).fileIndex;
					erasedArray[index] = 1;
					if (total[index] < chunkSize && total[index]+buffersize <= chunkSize) {
							total[index] += fread(data[index], sizeof(char), buffersize,readFileStreams[j]);
							fflush(readFileStreams[j]);
						}
						else if (total[index] < chunkSize && total[index]+chunkSize > chunkSize) {
							extra = fread(data[index], sizeof(char), buffersize, readFileStreams[j]);
							fflush(readFileStreams[j]);
							for (q = extra; q < buffersize; q++) {
								data[index][q] = '0';
							}
						}
						else if (total[index] == chunkSize) {
							for (q = 0; q < buffersize; q++) {
								data[index][q] = '0';
							}
						}
				
					}
				else{
					index = (nodePacketData[i + j*(f+1)].chunkInfo).fileIndex-k;
					erasedArray[index+k] = 1;
					if (total[index+k] < chunkSize && total[index+k]+buffersize <= chunkSize) {
							total[index+k] += fread(coding[index], sizeof(char), buffersize,readFileStreams[j]);
							fflush(readFileStreams[j]);
						}
						else if (total[index+k] < chunkSize && total[index+k]+chunkSize > chunkSize) {
							extra = fread(coding[index], sizeof(char), buffersize, readFileStreams[j]);
							fflush(readFileStreams[j]);
							for (q = extra; q < buffersize; q++) {
								coding[index][q] = '0';
							}
						}
						else if (total[index+k] == chunkSize) {
							for (q = 0; q < buffersize; q++) {
								coding[index][q] = '0';
							}
						}
				}
			}
			z=0;
			for(j=0;j<n;j++){
				if(erasedArray[j] == -1){
					erasedstream[z] = j;
					z++;
				}
			}
			erasedstream[z] = -1;
			z = 0;
					
				gettimeofday(&start_mem_time, &tz);	
			if((decodeFlag = jerasure_matrix_decode(k, m, w, encoder_matrix, 1, erasedstream, data, coding, buffersize))==-1){
				printf("Decoding Failed\n");
				exit(0);
			}
				gettimeofday(&stop_mem_time, &tz);
				mem_time = 0.0;
				mem_time += stop_mem_time.tv_usec;
				mem_time -= start_mem_time.tv_usec;
				mem_time /= 1000000.0;
				mem_time += stop_mem_time.tv_sec;
				mem_time -= start_mem_time.tv_sec;
				total_mem_time += mem_time;
			for(j=0;j<n;j++)
				erasedArray[j] = -1;
			
			for(j=0;j<k;j++){				
				if(bytesEachDataStreamWrites2File[i*k+j]>0){
					fseek(filedecoded[0],(i*k+j)*chunkSize+(p-1)*buffersize,SEEK_SET);
					if (bytesEachDataStreamWrites2File[i*k+j] >= buffersize) {
						bytesEachDataStreamWrites2File[i*k+j] -= fwrite(data[j], sizeof(char), buffersize,filedecoded[0]);
						bytesWritten2File += buffersize;
						fflush(filedecoded[0]);
					}
				else if (bytesEachDataStreamWrites2File[i*k+j] < buffersize) {
					for(q=0;q<(bytesEachDataStreamWrites2File[i*k+j]);q++){
							fprintf(filedecoded[0],"%c",data[j][q]);
							}
							bytesWritten2File = bytesWritten2File + q;
							bytesEachDataStreamWrites2File[i*k+j] -= q;
						if(bytesWritten2File == size)	 	
							break;
						
						}
					}					
				}
			p++;
			if(bytesWritten2File == size)	 	
				break;
		}
		for(j=0;j<k;j++)
			free(data[j]);
		for(j=0;j<m;j++)
			free(coding[j]);	
		if(bytesWritten2File == size)	 	
				break;		
	}
	fclose(filedecoded[0]);
	for(i=0;i<k;i++)
		fclose(readFileStreams[i]);
	
	printf("Decoding Rate (file size /totaltime) is %0.10f\n",(((float)size/1024)/1024)/(total_mem_time));	
} 
Beispiel #8
0
int main(int argc, char **argv)
{
  int k, m, w, size;
  int i, j;
  int *matrix;
  char **data, **coding;
  int *erasures, *erased;
  int *decoding_matrix, *dm_ids;
  uint32_t seed;
  
  if (argc != 6) usage(NULL);
  if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k");
  if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m");
  if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w");
  if (w < 32 && k + m > (1 << w)) usage("k + m must be <= 2 ^ w");
  if (sscanf(argv[4], "%d", &size) == 0 || size % sizeof(long) != 0) 
		usage("size must be multiple of sizeof(long)");
  if (sscanf(argv[5], "%d", &seed) == 0) usage("Bad seed");

  matrix = talloc(int, m*k);
  for (i = 0; i < m; i++) {
    for (j = 0; j < k; j++) {
      matrix[i*k+j] = galois_single_divide(1, i ^ (m + j), w);
    }
  }

  printf("<HTML><TITLE>jerasure_05");
  for (i = 1; i < argc; i++) printf(" %s", argv[i]);
  printf("</TITLE>\n");
  printf("<h3>jerasure_05");
  for (i = 1; i < argc; i++) printf(" %s", argv[i]);
  printf("</h3>\n");
  printf("<pre>\n");

  printf("The Coding Matrix (the last m rows of the Generator Matrix G^T):\n\n");
  jerasure_print_matrix(matrix, m, k, w);
  printf("\n");

  MOA_Seed(seed);
  data = talloc(char *, k);
  for (i = 0; i < k; i++) {
    data[i] = talloc(char, size);
    MOA_Fill_Random_Region(data[i], size);
  }

  coding = talloc(char *, m);
  for (i = 0; i < m; i++) {
    coding[i] = talloc(char, size);
  }

  jerasure_matrix_encode(k, m, w, matrix, data, coding, size);
  
  printf("Encoding Complete:\n\n");
  print_data_and_coding(k, m, w, size, data, coding);

  erasures = talloc(int, (m+1));
  erased = talloc(int, (k+m));
  for (i = 0; i < m+k; i++) erased[i] = 0;
  for (i = 0; i < m; ) {
    erasures[i] = (MOA_Random_W(w, 1))%(k+m);
    if (erased[erasures[i]] == 0) {
      erased[erasures[i]] = 1;
	  
      bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], size);
      i++;
    }
  }
  erasures[i] = -1;

  printf("Erased %d random devices:\n\n", m);
  print_data_and_coding(k, m, w, size, data, coding);
  
  i = jerasure_matrix_decode(k, m, w, matrix, 0, erasures, data, coding, size);

  printf("State of the system after decoding:\n\n");
  print_data_and_coding(k, m, w, size, data, coding);
  
  decoding_matrix = talloc(int, k*k);
  dm_ids = talloc(int, k);

  for (i = 0; i < m; i++) erased[i] = 1;
  for (; i < k+m; i++) erased[i] = 0;

  jerasure_make_decoding_matrix(k, m, w, matrix, erased, decoding_matrix, dm_ids);

  printf("Suppose we erase the first %d devices.  Here is the decoding matrix:\n\n", m);
  jerasure_print_matrix(decoding_matrix, k, k, w);
  printf("\n");
  printf("And dm_ids:\n\n");
  jerasure_print_matrix(dm_ids, 1, k, w);

  bzero(data[0], size);
  jerasure_matrix_dotprod(k, w, decoding_matrix, dm_ids, 0, data, coding, size);

  printf("\nAfter calling jerasure_matrix_dotprod, we calculate the value of device #0 to be:\n\n");
  printf("D0 :");
  for(i=0;i< size; i+=(w/8)) {
	  printf(" ");
	  for(j=0;j < w/8;j++){
		printf("%02x", (unsigned char)data[0][i+j]);
	  }
  }
  printf("\n\n");

  return 0;
}