Blame view

Examples/jerasure_08.c 8.18 KB
44201cf4   KMG   Added new license...
1
/* *
be40b4e5   Jim Plank   Revision 2.0 is r...
2
 * Copyright (c) 2014, James S. Plank and Kevin Greenan
44201cf4   KMG   Added new license...
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 * All rights reserved.
 *
 * Jerasure - A C/C++ Library for a Variety of Reed-Solomon and RAID-6 Erasure
 * Coding Techniques
 *
 * Revision 2.0: Galois Field backend now links to GF-Complete
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 *  - Neither the name of the University of Tennessee nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
 * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
b5745fa4   Jim Plank   Adding the curren...
38
 */
44201cf4   KMG   Added new license...
39

be40b4e5   Jim Plank   Revision 2.0 is r...
40
41
42
43
44
45
46
/* Jerasure's authors:

   Revision 2.x - 2014: James S. Plank and Kevin M. Greenan.
   Revision 1.2 - 2008: James S. Plank, Scott Simmerman and Catherine D. Schuman.
   Revision 1.0 - 2007: James S. Plank.
 */

b5745fa4   Jim Plank   Adding the curren...
47
#include <stdio.h>
b5745fa4   Jim Plank   Adding the curren...
48
#include <string.h>
9124ad13   Jim Plank   Ran through all o...
49
50
51
#include <stdlib.h>
#include <stdint.h>
#include <gf_rand.h>
b5745fa4   Jim Plank   Adding the curren...
52
53
54
55
#include "jerasure.h"

#define talloc(type, num) (type *) malloc(sizeof(type)*(num))

e79904ea   David Glessner   This is the squas...
56
static void usage(char *s)
b5745fa4   Jim Plank   Adding the curren...
57
{
9124ad13   Jim Plank   Ran through all o...
58
  fprintf(stderr, "usage: jerasure_08 k w seed - Example schedule cache usage with RAID-6\n");
b5745fa4   Jim Plank   Adding the curren...
59
  fprintf(stderr, "       \n");
9124ad13   Jim Plank   Ran through all o...
60
61
  fprintf(stderr, "       m=2.  k+m must be <= 2^w.  It sets up a RAID-6 generator matrix and encodes\n");
  fprintf(stderr, "       k sets of w*%ld bytes. It creates a schedule cache for decoding.\n", sizeof(long));
b5745fa4   Jim Plank   Adding the curren...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  fprintf(stderr, "       It demonstrates using the schedule cache for both encoding and decoding.\n");
  fprintf(stderr, "       Then it demonstrates using jerasure_do_parity() to re-encode the first.\n");
  fprintf(stderr, "       coding device\n");
  fprintf(stderr, "       \n");
  fprintf(stderr, "This demonstrates: jerasure_generate_schedule_cache()\n");
  fprintf(stderr, "                   jerasure_smart_bitmatrix_to_schedule()\n");
  fprintf(stderr, "                   jerasure_schedule_encode()\n");
  fprintf(stderr, "                   jerasure_schedule_decode_cache()\n");
  fprintf(stderr, "                   jerasure_free_schedule()\n");
  fprintf(stderr, "                   jerasure_free_schedule_cache()\n");
  fprintf(stderr, "                   jerasure_get_stats()\n");
  fprintf(stderr, "                   jerasure_do_parity()\n");
  if (s != NULL) fprintf(stderr, "%s\n", s);
  exit(1);
}

e79904ea   David Glessner   This is the squas...
78
static void print_array(char **ptrs, int ndevices, int size, int packetsize, char *label)
b5745fa4   Jim Plank   Adding the curren...
79
{
9124ad13   Jim Plank   Ran through all o...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  int i, j, x;
  unsigned char *up;

  printf("<center><table border=3 cellpadding=3><tr><td></td>\n");

  for (i = 0; i < ndevices; i++) printf("<td align=center>%s%x</td>\n", label, i);
  printf("</tr>\n");
  printf("<td align=right><pre>");
  for (j = 0; j < size/packetsize; j++) printf("Packet %d\n", j);
  printf("</pre></td>\n");
  for (i = 0; i < ndevices; i++) {
    printf("<td><pre>");
    up = (unsigned char *) ptrs[i];
    for (j = 0; j < size/packetsize; j++) {
      for (x = 0; x < packetsize; x++) {
        if (x > 0 && x%4 == 0) printf(" ");
        printf("%02x", up[j*packetsize+x]);
      }
      printf("\n");
    }
    printf("</td>\n");
  }
  printf("</tr></table></center>\n");
b5745fa4   Jim Plank   Adding the curren...
103
104
105
106
}

int main(int argc, char **argv)
{
b5745fa4   Jim Plank   Adding the curren...
107
108
  int k, w, i, j, m;
  int *matrix, *bitmatrix;
e79904ea   David Glessner   This is the squas...
109
  char **data, **coding;
b5745fa4   Jim Plank   Adding the curren...
110
111
112
  int **smart, ***cache;
  int *erasures, *erased;
  double stats[3];
9124ad13   Jim Plank   Ran through all o...
113
  uint32_t seed;
b5745fa4   Jim Plank   Adding the curren...
114
  
9124ad13   Jim Plank   Ran through all o...
115
  if (argc != 4) usage("Wrong number of arguments");
b5745fa4   Jim Plank   Adding the curren...
116
117
  if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k");
  if (sscanf(argv[2], "%d", &w) == 0 || w <= 0 || w > 32) usage("Bad m");
9124ad13   Jim Plank   Ran through all o...
118
  if (sscanf(argv[3], "%d", &seed) == 0) usage("Bad seed");
b5745fa4   Jim Plank   Adding the curren...
119
120
121
  m = 2;
  if (w < 30 && (k+m) > (1 << w)) usage("k + m is too big");

9124ad13   Jim Plank   Ran through all o...
122
123
  MOA_Seed(seed);

b5745fa4   Jim Plank   Adding the curren...
124
125
126
127
128
129
130
131
132
133
134
135
  matrix = talloc(int, m*k);
  for (j = 0; j < k; j++) matrix[j] = 1;
  i = 1;
  for (j = 0; j < k; j++) {
    matrix[k+j] = i;
    i = galois_single_multiply(i, 2, w);
  }
  bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix);

  smart = jerasure_smart_bitmatrix_to_schedule(k, m, w, bitmatrix);
  cache = jerasure_generate_schedule_cache(k, m, w, bitmatrix, 1);

b5745fa4   Jim Plank   Adding the curren...
136
137
138
  data = talloc(char *, k);
  for (i = 0; i < k; i++) {
    data[i] = talloc(char, sizeof(long)*w);
9124ad13   Jim Plank   Ran through all o...
139
    MOA_Fill_Random_Region(data[i], sizeof(long)*w);
b5745fa4   Jim Plank   Adding the curren...
140
141
142
143
144
145
146
147
148
  }

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

  jerasure_schedule_encode(k, m, w, smart, data, coding, w*sizeof(long), sizeof(long));
  jerasure_get_stats(stats);
9124ad13   Jim Plank   Ran through all o...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

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

  printf("Encoding Complete: - %.0lf XOR'd bytes.  Here is the state of the system:\n<p>\n", stats[0]);
  printf("<p>\n");
  print_array(data, k, sizeof(long)*w, sizeof(long), "D");
  printf("<p>\n");
  print_array(coding, m, sizeof(long)*w, sizeof(long), "C");
  printf("<hr>\n");
b5745fa4   Jim Plank   Adding the curren...
164
165
166
167
168
169
170
171
172
173

  erasures = talloc(int, (m+1));
  erasures[0] = k;
  erasures[1] = k+1;
  erasures[2] = -1;
  for (j = 0; j < m; j++) bzero(coding[j], sizeof(long)*w);

  jerasure_schedule_decode_cache(k, m, w, cache, erasures, data, coding, w*sizeof(long), sizeof(long));
  jerasure_get_stats(stats);
  printf("Encoding Using the Schedule Cache: - %.0lf XOR'd bytes\n\n", stats[0]);
9124ad13   Jim Plank   Ran through all o...
174
175
176
177
178
  printf("<p>\n");
  print_array(data, k, sizeof(long)*w, sizeof(long), "D");
  printf("<p>\n");
  print_array(coding, m, sizeof(long)*w, sizeof(long), "C");
  printf("<hr>\n");
b5745fa4   Jim Plank   Adding the curren...
179
180
181
182

  erased = talloc(int, (k+m));
  for (i = 0; i < m+k; i++) erased[i] = 0;
  for (i = 0; i < m; ) {
9124ad13   Jim Plank   Ran through all o...
183
    erasures[i] = MOA_Random_W(w, 1)%(k+m);
b5745fa4   Jim Plank   Adding the curren...
184
185
186
187
188
189
190
191
192
    if (erased[erasures[i]] == 0) {
      erased[erasures[i]] = 1;
      bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], sizeof(long)*w);
      i++;
    }
  }
  erasures[i] = -1;

  printf("Erased %d random devices:\n\n", m);
9124ad13   Jim Plank   Ran through all o...
193
194
195
196
197
  printf("<p>\n");
  print_array(data, k, sizeof(long)*w, sizeof(long), "D");
  printf("<p>\n");
  print_array(coding, m, sizeof(long)*w, sizeof(long), "C");
  printf("<hr>\n");
b5745fa4   Jim Plank   Adding the curren...
198
199
200
201
202
  
  jerasure_schedule_decode_cache(k, m, w, cache, erasures, data, coding, w*sizeof(long), sizeof(long));
  jerasure_get_stats(stats);

  printf("State of the system after decoding: %.0lf XOR'd bytes\n\n", stats[0]);
9124ad13   Jim Plank   Ran through all o...
203
204
205
206
207
  printf("<p>\n");
  print_array(data, k, sizeof(long)*w, sizeof(long), "D");
  printf("<p>\n");
  print_array(coding, m, sizeof(long)*w, sizeof(long), "C");
  printf("<hr>\n");
b5745fa4   Jim Plank   Adding the curren...
208
209
  
  bzero(coding[0], sizeof(long)*w);
e79904ea   David Glessner   This is the squas...
210
  printf("Erased the first coding device:\n\n");
9124ad13   Jim Plank   Ran through all o...
211
212
213
214
215
216
  printf("<p>\n");
  print_array(data, k, sizeof(long)*w, sizeof(long), "D");
  printf("<p>\n");
  print_array(coding, m, sizeof(long)*w, sizeof(long), "C");
  printf("<hr>\n");
  
b5745fa4   Jim Plank   Adding the curren...
217
  jerasure_do_parity(k, data, coding[0], sizeof(long)*w);
9124ad13   Jim Plank   Ran through all o...
218
219
220
221
222
223
224
  printf("State of the system after using\n");
  printf("<b>jerasure_do_parity()</b> to re-encode it:\n\n");
  printf("<p>\n");
  print_array(data, k, sizeof(long)*w, sizeof(long), "D");
  printf("<p>\n");
  print_array(coding, m, sizeof(long)*w, sizeof(long), "C");
  printf("<hr>\n");
b5745fa4   Jim Plank   Adding the curren...
225
226
227
228
  
  jerasure_free_schedule(smart);
  jerasure_free_schedule_cache(k, m, cache);
  
9124ad13   Jim Plank   Ran through all o...
229
  printf("Smart schedule and cache freed.\n\n");
b5745fa4   Jim Plank   Adding the curren...
230
231
232

  return 0;
}