54
50
/* command line argument to do page checks (that's it) */
55
51
/* another argument to specify page ranges... seek to right spot and go from there */
53
typedef unsigned long int ulint;
54
typedef unsigned char uchar;
57
56
/* innodb function in name; modified slightly to not have the ASM version (lots of #ifs that didn't apply) */
58
static uint32_t mach_read_from_4(unsigned char *b)
57
ulint mach_read_from_4(uchar *b)
60
return( ((uint32_t)(b[0]) << 24)
61
+ ((uint32_t)(b[1]) << 16)
62
+ ((uint32_t)(b[2]) << 8)
59
return( ((ulint)(b[0]) << 24)
60
+ ((ulint)(b[1]) << 16)
61
+ ((ulint)(b[2]) << 8)
68
ut_fold_uint32_t_pair(
69
68
/*===============*/
70
69
/* out: folded value */
71
uint32_t n1, /* in: uint32_t */
72
uint32_t n2) /* in: uint32_t */
70
ulint n1, /* in: ulint */
71
ulint n2) /* in: ulint */
74
73
return(((((n1 ^ n2 ^ UT_HASH_RANDOM_MASK2) << 8) + n1)
75
74
^ UT_HASH_RANDOM_MASK) + n2);
81
80
/* out: folded value */
82
unsigned char* str, /* in: string of bytes */
83
uint32_t len) /* in: length */
81
uchar* str, /* in: string of bytes */
82
ulint len) /* in: length */
88
87
for (i= 0; i < len; i++)
90
fold= ut_fold_uint32_t_pair(fold, (uint32_t)(*str));
89
fold= ut_fold_ulint_pair(fold, (ulint)(*str));
99
98
buf_calc_page_new_checksum(
100
99
/*=======================*/
101
100
/* out: checksum */
102
unsigned char* page) /* in: buffer page */
101
uchar* page) /* in: buffer page */
106
105
/* Since the fields FIL_PAGE_FILE_FLUSH_LSN and ..._ARCH_LOG_NO
107
106
are written outside the buffer pool to the first pages of data
120
119
return(checksum);
124
123
buf_calc_page_old_checksum(
125
124
/*=======================*/
126
125
/* out: checksum */
127
unsigned char* page) /* in: buffer page */
126
uchar* page) /* in: buffer page */
131
130
checksum= ut_fold_binary(page, FIL_PAGE_FILE_FLUSH_LSN);
139
138
int main(int argc, char **argv)
141
140
FILE *f; /* our input file */
142
unsigned char *p; /* storage of pages read */
141
uchar *p; /* storage of pages read */
143
142
int bytes; /* bytes read count */
144
uint32_t ct; /* current page number (0 based) */
143
ulint ct; /* current page number (0 based) */
145
144
int now; /* current time */
146
145
int lastt; /* last time */
147
uint32_t oldcsum, oldcsumfield, csum, csumfield, logseq, logseqfield; /* uint32_ts for checksum storage */
146
ulint oldcsum, oldcsumfield, csum, csumfield, logseq, logseqfield; /* ulints for checksum storage */
148
147
struct stat st; /* for stat, if you couldn't guess */
149
uint64_t size; /* size of file (has to be 64 bits) */
150
uint32_t pages; /* number of pages in file */
151
uint32_t start_page= 0, end_page= 0, use_end_page= 0; /* for starting and ending at certain pages */
148
unsigned long long int size; /* size of file (has to be 64 bits) */
149
ulint pages; /* number of pages in file */
150
ulint start_page= 0, end_page= 0, use_end_page= 0; /* for starting and ending at certain pages */
153
152
int just_count= 0; /* if true, just print page count */
220
219
pages= size / UNIV_PAGE_SIZE;
223
printf("%u\n", pages);
222
printf("%lu\n", pages);
226
225
else if (verbose)
228
printf("file %s= %"PRIu64" bytes (%u pages)...\n", argv[1], size, pages);
229
printf("checking pages in range %u to %u\n", start_page, use_end_page ? end_page : (pages - 1));
227
printf("file %s= %llu bytes (%lu pages)...\n", argv[1], size, pages);
228
printf("checking pages in range %lu to %lu\n", start_page, use_end_page ? end_page : (pages - 1));
232
231
/* open the file for reading */
276
275
logseq= mach_read_from_4(p + FIL_PAGE_LSN + 4);
277
276
logseqfield= mach_read_from_4(p + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM + 4);
279
printf("page %u: log sequence number: first = %u; second = %u\n", ct, logseq, logseqfield);
278
printf("page %lu: log sequence number: first = %lu; second = %lu\n", ct, logseq, logseqfield);
280
279
if (logseq != logseqfield)
282
fprintf(stderr, "page %u invalid (fails log sequence number check)\n", ct);
281
fprintf(stderr, "page %lu invalid (fails log sequence number check)\n", ct);
287
286
oldcsum= buf_calc_page_old_checksum(p);
288
287
oldcsumfield= mach_read_from_4(p + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM);
290
printf("page %u: old style: calculated = %u; recorded = %u\n", ct, oldcsum, oldcsumfield);
289
printf("page %lu: old style: calculated = %lu; recorded = %lu\n", ct, oldcsum, oldcsumfield);
291
290
if (oldcsumfield != mach_read_from_4(p + FIL_PAGE_LSN) && oldcsumfield != oldcsum)
293
fprintf(stderr, "page %u invalid (fails old style checksum)\n", ct);
292
fprintf(stderr, "page %lu invalid (fails old style checksum)\n", ct);
298
297
csum= buf_calc_page_new_checksum(p);
299
298
csumfield= mach_read_from_4(p + FIL_PAGE_SPACE_OR_CHKSUM);
301
printf("page %u: new style: calculated = %u; recorded = %u\n", ct, csum, csumfield);
300
printf("page %lu: new style: calculated = %lu; recorded = %lu\n", ct, csum, csumfield);
302
301
if (csumfield != 0 && csum != csumfield)
304
fprintf(stderr, "page %u invalid (fails new style checksum)\n", ct);
303
fprintf(stderr, "page %lu invalid (fails new style checksum)\n", ct);