KMR
kmrckptdump.c
1 /* kmrckptdump.c */
2 /* Copyright (C) 2012-2016 RIKEN AICS */
3 
4 #include <mpi.h>
5 #include <stdio.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <fcntl.h>
9 #include <unistd.h>
10 #include <stdlib.h>
11 #include <errno.h>
12 
13 #include "kmr.h"
14 #include "kmrimpl.h"
15 #include "kmrckpt.h"
16 
17 #define MAX_ELEMENT_SIZE 8192
18 
19 /* It returns a string that represents a key-value type. */
20 static char *
21 kv_field_str(enum kmr_kv_field v)
22 {
23  switch (v) {
24  case KMR_KV_BAD:
25  return "BAD";
26  case KMR_KV_OPAQUE:
27  return "OPAQUE";
28  case KMR_KV_CSTRING:
29  return "CSTRING";
30  case KMR_KV_INTEGER:
31  return "INTEGER";
32  case KMR_KV_FLOAT8:
33  return "FLOAT8";
34  case KMR_KV_POINTER_OWNED:
35  return "POINTER_OWNED";
36  case KMR_KV_POINTER_UNMANAGED:
37  return "KMR_KV_POINTER_UNMANAGED";
38  default:
39  return "UNKNOWN";
40  }
41 }
42 
43 /* It dumps a value to string. */
44 static void
45 dump_value(union kmr_unit_sized e, int len, enum kmr_kv_field data,
46  char *buf, int buflen)
47 {
48  if ( (data == KMR_KV_OPAQUE || data == KMR_KV_CSTRING)
49  && (strncmp("maxprocs", e.p, 8) == 0) ) {
50  int clen = (len < buflen) ? len : buflen;
51  memcpy(buf, e.p, (size_t)clen);
52  buf[clen - 1] = '\0';
53  for (int i = 0; i < len - 1; i++) {
54  if (buf[i] == '\0') {
55  buf[i] = ' ';
56  }
57  }
58  } else {
59  kmr_dump_slot(e, len, data, buf, buflen);
60  }
61 }
62 
63 int
64 main(int argc, char *argv[])
65 {
66  if (argc != 2) {
67  printf("%s ckpt-filename\n", argv[0]);
68  exit(1);
69  }
70 
71  // read checkpoint header info.
72  FILE *fp = fopen(argv[1], "r");
73  if (fp == NULL) {
74  perror("fopen");
75  exit(1);
76  }
77 
78  struct stat sb;
79  int ret = stat(argv[1], &sb);
80  if (ret != 0) {
81  perror("stat");
82  exit(1);
83  }
84 
85  if (strstr(argv[1], "_data_") != NULL) {
86  struct kmr_ckpt_data data_hdr;
87  size_t hdrsz = offsetof(struct kmr_ckpt_data, data);
88  size_t rc = fread((void *)&data_hdr, hdrsz, 1, fp);
89  if (rc != 1 && feof(fp) == 1) {
90  fprintf(stderr, "fread failed\n");
91  return 1;
92  }
93 
94  printf("================Header================\n");
95  printf("kvs_id = %ld\n", data_hdr.kvs_id);
96  printf("nprocs = %d\n", data_hdr.nprocs);
97  printf("rank = %d\n", data_hdr.rank);
98  printf("key_data = %s\n", kv_field_str(data_hdr.key_data));
99  printf("value_data = %s\n", kv_field_str(data_hdr.value_data));
100  printf("======================================\n");
101 
102  int cnt = 0;
103  unsigned int total = (unsigned int)hdrsz;
104  while(total < sb.st_size){
105  char buf[MAX_ELEMENT_SIZE];
106  // read kvs_entry header
107  size_t evhdrsz = offsetof(struct kmr_kvs_entry, c);
108  rc = fread(buf, evhdrsz, 1, fp);
109  if (rc != 1 && feof(fp) == 1) {
110  fprintf(stderr, "fread failed\n");
111  return 1;
112  }
113  struct kmr_kvs_entry *e = (struct kmr_kvs_entry *)buf;
114  // read ckpt kv data
115  size_t datasz = (size_t)(KMR_ALIGN(e->klen) + KMR_ALIGN(e->vlen));
116  if (datasz + evhdrsz > sizeof(buf)) {
117  printf("Key-value data too long for dump.\n");
118  break;
119  }
120  rc = fread(buf+evhdrsz, datasz, 1, fp);
121  if (rc != 1 && feof(fp) == 1) {
122  fprintf(stderr, "fread failed\n");
123  return 1;
124  }
125  struct kmr_kv_box ev;
126  ev = kmr_pick_kv2(e, data_hdr.key_data, data_hdr.value_data);
127  int kvlen = MAX_ELEMENT_SIZE / 2;
128  char keystr[kvlen], valstr[kvlen];
129  kmr_dump_slot(ev.k, e->klen, data_hdr.key_data, keystr,
130  (int)sizeof(keystr));
131  dump_value(ev.v, e->vlen, data_hdr.value_data, valstr,
132  (int)sizeof(valstr));
133  printf("[%d] key[%d] = %s | value[%d] = %s\n", cnt, ev.klen,
134  keystr, ev.vlen, valstr);
135  cnt++;
136  total += (unsigned int)(evhdrsz + datasz);
137  }
138  } else if (strstr(argv[1], "_log_") != NULL) {
139  struct kmr_ckpt_log log_hdr;
140  size_t hdrsz = offsetof(struct kmr_ckpt_log, data);
141  size_t rc = fread((void *)&log_hdr, hdrsz, 1, fp);
142  if (rc != 1 && feof(fp) == 1) {
143  fprintf(stderr, "fread failed\n");
144  return 1;
145  }
146 
147  printf("================Header================\n");
148  switch (log_hdr.mode) {
149  case KMR_CKPT_ALL:
150  printf("mode = SAVE_ALL\n");
151  break;
152  case KMR_CKPT_SELECTIVE:
153  printf("mode = SAVE_SELECTIVE\n");
154  break;
155  }
156  printf("nprocs = %d\n", log_hdr.nprocs);
157  printf("rank = %d\n", log_hdr.rank);
158  printf("======================================\n");
159 
160  int cnt = 0;
161  unsigned int total = (unsigned int)hdrsz;
162  while(total < sb.st_size){
163  struct kmr_ckpt_log_entry e;
164  // read ckpt log data
165  rc = fread((void *)&e, sizeof(e), 1, fp);
166  if (rc != 1 && feof(fp) == 1) {
167  fprintf(stderr, "fread failed\n");
168  return 1;
169  }
170  switch (e.state) {
171  case KMR_CKPT_LOG_WHOLE_START:
172  printf("[%05d] state = SAVE_WHOLE_START\n"
173  " op_seqno = %ld\n"
174  " kvi_id = %ld\n"
175  " kvo_id = %ld\n",
176  cnt, e.op_seqno, e.kvi_id, e.kvo_id);
177  break;
178  case KMR_CKPT_LOG_WHOLE_FINISH:
179  printf("[%05d] state = SAVE_WHOLE_FINISH\n"
180  " op_seqno = %ld\n"
181  " kvi_id = %ld\n"
182  " kvo_id = %ld\n",
183  cnt, e.op_seqno, e.kvi_id, e.kvo_id);
184  break;
185  case KMR_CKPT_LOG_BLOCK_START:
186  printf("[%05d] state = SAVE_BLOCK_START\n"
187  " op_seqno = %ld\n"
188  " kvi_id = %ld\n"
189  " kvo_id = %ld\n"
190  " kvi_cnt = %ld\n"
191  " kvo_cnt = %ld\n",
192  cnt, e.op_seqno, e.kvi_id, e.kvo_id, e.n_kvi, e.n_kvo);
193  break;
194  case KMR_CKPT_LOG_BLOCK_ADD:
195  printf("[%05d] state = SAVE_BLOCK_ADD\n"
196  " op_seqno = %ld\n"
197  " kvi_id = %ld\n"
198  " kvo_id = %ld\n"
199  " kvi_cnt = %ld\n"
200  " kvo_cnt = %ld\n",
201  cnt, e.op_seqno, e.kvi_id, e.kvo_id, e.n_kvi, e.n_kvo);
202  break;
203  case KMR_CKPT_LOG_BLOCK_FINISH:
204  printf("[%05d] state = SAVE_BLOCK_FINISH\n", cnt);
205  break;
206  case KMR_CKPT_LOG_INDEX_START:
207  printf("[%05d] state = SAVE_INDEX_START\n"
208  " op_seqno = %ld\n"
209  " kvi_id = %ld\n"
210  " kvo_id = %ld\n"
211  " kvi_cnt = %ld\n"
212  " kvo_cnt = %ld\n",
213  cnt, e.op_seqno, e.kvi_id, e.kvo_id, e.n_kvi, e.n_kvo);
214  break;
215  case KMR_CKPT_LOG_INDEX_ADD:
216  printf("[%05d] state = SAVE_INDEX_ADD\n"
217  " op_seqno = %ld\n"
218  " kvi_id = %ld\n"
219  " kvo_id = %ld\n"
220  " ikv_idx = %ld\n"
221  " kvo_cnt = %ld\n",
222  cnt, e.op_seqno, e.kvi_id, e.kvo_id, e.n_kvi, e.n_kvo);
223  break;
224  case KMR_CKPT_LOG_INDEX_FINISH:
225  printf("[%05d] state = SAVE_INDEX_FINISH\n", cnt);
226  break;
227  case KMR_CKPT_LOG_DELETE_START:
228  printf("[%05d] state = DATA_DELETE_START\n"
229  " kvs_id = %ld\n", cnt, e.kvi_id);
230  break;
231  case KMR_CKPT_LOG_DELETE_FINISH:
232  printf("[%05d] state = DATA_DELETE_FINISH\n"
233  " kvs_id = %ld\n", cnt, e.kvi_id);
234  break;
235  case KMR_CKPT_LOG_DELETABLE:
236  printf("[%05d] state = DATA_DELETABLE\n"
237  " kvs_id = %ld\n", cnt, e.kvi_id);
238  break;
239  case KMR_CKPT_LOG_PROGRESS:
240  printf("[%05d] state = PROGRESS\n"
241  " op_seqno = %ld\n"
242  " kvi_id = %ld\n"
243  " kvo_id = %ld\n",
244  cnt, e.op_seqno, e.kvi_id, e.kvo_id);
245  break;
246  case KMR_CKPT_LOG_SKIPPED:
247  printf("[%05d] state = SKIPPED\n"
248  " op_seqno = %ld\n"
249  " kvi_id = %ld\n"
250  " kvo_id = %ld\n",
251  cnt, e.op_seqno, e.kvi_id, e.kvo_id);
252  break;
253  case KMR_CKPT_LOG_LOCK_START:
254  printf("[%05d] state = LOCK_START\n", cnt);
255  break;
256  case KMR_CKPT_LOG_LOCK_FINISH:
257  printf("[%05d] state = LOCK_FINISH\n", cnt);
258  break;
259  }
260  cnt++;
261  total += (unsigned int)sizeof(e);
262  }
263  } else {
264  fprintf(stderr, "File is not a checkpoint file\n");
265  return 1;
266  }
267 
268  fclose(fp);
269  return 0;
270 }
271 
272 /*
273 Copyright (C) 2012-2016 RIKEN AICS
274 This library is distributed WITHOUT ANY WARRANTY. This library can be
275 redistributed and/or modified under the terms of the BSD 2-Clause License.
276 */
Utilities Private Part (do not include from applications).
#define KMR_ALIGN(X)
Rounds up a given size to the alignment restriction (currently eight bytes).
Definition: kmrimpl.h:75
Definition: kmr.h:348
kmr_kv_field
Datatypes of Keys or Values.
Definition: kmr.h:325
Handy Copy of a Key-Value Field.
Definition: kmr.h:358
KMR Interface.
Checkpoint/Restart Support.
Unit-Sized Storage.
Definition: kmr.h:340
Definition: kmrckpt.h:143