Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
1313a30c
Commit
1313a30c
authored
Sep 13, 2005
by
kent@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
innochecksum.c:
Changed from C++ comments to C comments Did some adaption to MySQL Coding Style
parent
b5dbd1c7
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
200 additions
and
178 deletions
+200
-178
extra/innochecksum.c
extra/innochecksum.c
+200
-178
No files found.
extra/innochecksum.c
View file @
1313a30c
...
...
@@ -24,7 +24,7 @@
Published with a permission.
*/
/
/ needed to have access to 64 bit file functions
/
* needed to have access to 64 bit file functions */
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
...
...
@@ -35,7 +35,7 @@
#include <sys/stat.h>
#include <unistd.h>
/
/ all of these ripped from InnoDB code from MySQL 4.0.22
/
* all of these ripped from InnoDB code from MySQL 4.0.22 */
#define UT_HASH_RANDOM_MASK 1463735687
#define UT_HASH_RANDOM_MASK2 1653893711
#define FIL_PAGE_LSN 16
...
...
@@ -46,18 +46,19 @@
#define FIL_PAGE_SPACE_OR_CHKSUM 0
#define UNIV_PAGE_SIZE (2 * 8192)
/
/ command line argument to do page checks (that's it)
/
/ another argument to specify page ranges... seek to right spot and go from there
/
* command line argument to do page checks (that's it) */
/
* another argument to specify page ranges... seek to right spot and go from there */
typedef
unsigned
long
int
ulint
;
typedef
unsigned
char
byte
;
/* innodb function in name; modified slightly to not have the ASM version (lots of #ifs that didn't apply) */
ulint
mach_read_from_4
(
byte
*
b
)
{
return
(
((
ulint
)(
b
[
0
])
<<
24
)
+
((
ulint
)(
b
[
1
])
<<
16
)
+
((
ulint
)(
b
[
2
])
<<
8
)
+
(
ulint
)(
b
[
3
])
ulint
mach_read_from_4
(
byte
*
b
)
{
return
(
((
ulint
)(
b
[
0
])
<<
24
)
+
((
ulint
)(
b
[
1
])
<<
16
)
+
((
ulint
)(
b
[
2
])
<<
8
)
+
(
ulint
)(
b
[
3
])
);
}
...
...
@@ -80,12 +81,13 @@ ut_fold_binary(
ulint
len
)
/* in: length */
{
ulint
i
;
ulint
fold
=
0
;
ulint
fold
=
0
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
fold
=
ut_fold_ulint_pair
(
fold
,
(
ulint
)(
*
str
));
for
(
i
=
0
;
i
<
len
;
i
++
)
{
fold
=
ut_fold_ulint_pair
(
fold
,
(
ulint
)(
*
str
));
str
++
;
str
++
;
}
return
(
fold
);
...
...
@@ -106,12 +108,12 @@ buf_calc_page_new_checksum(
checksum is stored, and also the last 8 bytes of page because
there we store the old formula checksum. */
checksum
=
ut_fold_binary
(
page
+
FIL_PAGE_OFFSET
,
FIL_PAGE_FILE_FLUSH_LSN
-
FIL_PAGE_OFFSET
)
+
ut_fold_binary
(
page
+
FIL_PAGE_DATA
,
UNIV_PAGE_SIZE
-
FIL_PAGE_DATA
-
FIL_PAGE_END_LSN_OLD_CHKSUM
);
checksum
=
checksum
&
0xFFFFFFFF
;
checksum
=
ut_fold_binary
(
page
+
FIL_PAGE_OFFSET
,
FIL_PAGE_FILE_FLUSH_LSN
-
FIL_PAGE_OFFSET
)
+
ut_fold_binary
(
page
+
FIL_PAGE_DATA
,
UNIV_PAGE_SIZE
-
FIL_PAGE_DATA
-
FIL_PAGE_END_LSN_OLD_CHKSUM
);
checksum
=
checksum
&
0xFFFFFFFF
;
return
(
checksum
);
}
...
...
@@ -124,183 +126,203 @@ buf_calc_page_old_checksum(
{
ulint
checksum
;
checksum
=
ut_fold_binary
(
page
,
FIL_PAGE_FILE_FLUSH_LSN
);
checksum
=
ut_fold_binary
(
page
,
FIL_PAGE_FILE_FLUSH_LSN
);
checksum
=
checksum
&
0xFFFFFFFF
;
checksum
=
checksum
&
0xFFFFFFFF
;
return
(
checksum
);
}
int
main
(
int
argc
,
char
**
argv
)
{
FILE
*
f
;
// our input file
byte
*
p
;
// storage of pages read
int
bytes
;
// bytes read count
ulint
ct
;
// current page number (0 based)
int
now
;
// current time
int
lastt
;
// last time
ulint
oldcsum
,
oldcsumfield
,
csum
,
csumfield
,
logseq
,
logseqfield
;
// ulints for checksum storage
struct
stat
st
;
// for stat, if you couldn't guess
unsigned
long
long
int
size
;
// size of file (has to be 64 bits)
ulint
pages
;
// number of pages in file
ulint
start_page
=
0
,
end_page
=
0
,
use_end_page
=
0
;
// for starting and ending at certain pages
off_t
offset
=
0
;
int
just_count
=
0
;
// if true, just print page count
int
verbose
=
0
;
int
debug
=
0
;
int
c
;
int
fd
;
// remove arguments
while
((
c
=
getopt
(
argc
,
argv
,
"cvds:e:p:"
))
!=
-
1
)
{
switch
(
c
)
{
case
'v'
:
verbose
=
1
;
break
;
case
'c'
:
just_count
=
1
;
break
;
case
's'
:
start_page
=
atoi
(
optarg
);
break
;
case
'e'
:
end_page
=
atoi
(
optarg
);
use_end_page
=
1
;
break
;
case
'p'
:
start_page
=
atoi
(
optarg
);
end_page
=
atoi
(
optarg
);
use_end_page
=
1
;
break
;
case
'd'
:
debug
=
1
;
break
;
case
':'
:
fprintf
(
stderr
,
"option -%c requires an argument
\n
"
,
optopt
);
return
1
;
break
;
case
'?'
:
fprintf
(
stderr
,
"unrecognized option: -%c
\n
"
,
optopt
);
return
1
;
break
;
}
int
main
(
int
argc
,
char
**
argv
)
{
FILE
*
f
;
/* our input file */
byte
*
p
;
/* storage of pages read */
int
bytes
;
/* bytes read count */
ulint
ct
;
/* current page number (0 based) */
int
now
;
/* current time */
int
lastt
;
/* last time */
ulint
oldcsum
,
oldcsumfield
,
csum
,
csumfield
,
logseq
,
logseqfield
;
/* ulints for checksum storage */
struct
stat
st
;
/* for stat, if you couldn't guess */
unsigned
long
long
int
size
;
/* size of file (has to be 64 bits) */
ulint
pages
;
/* number of pages in file */
ulint
start_page
=
0
,
end_page
=
0
,
use_end_page
=
0
;
/* for starting and ending at certain pages */
off_t
offset
=
0
;
int
just_count
=
0
;
/* if true, just print page count */
int
verbose
=
0
;
int
debug
=
0
;
int
c
;
int
fd
;
/* remove arguments */
while
((
c
=
getopt
(
argc
,
argv
,
"cvds:e:p:"
))
!=
-
1
)
{
switch
(
c
)
{
case
'v'
:
verbose
=
1
;
break
;
case
'c'
:
just_count
=
1
;
break
;
case
's'
:
start_page
=
atoi
(
optarg
);
break
;
case
'e'
:
end_page
=
atoi
(
optarg
);
use_end_page
=
1
;
break
;
case
'p'
:
start_page
=
atoi
(
optarg
);
end_page
=
atoi
(
optarg
);
use_end_page
=
1
;
break
;
case
'd'
:
debug
=
1
;
break
;
case
':'
:
fprintf
(
stderr
,
"option -%c requires an argument
\n
"
,
optopt
);
return
1
;
break
;
case
'?'
:
fprintf
(
stderr
,
"unrecognized option: -%c
\n
"
,
optopt
);
return
1
;
break
;
}
// debug implies verbose...
if
(
debug
)
verbose
=
1
;
// make sure we have the right arguments
if
(
optind
>=
argc
)
{
printf
(
"InnoDB offline file checksum utility.
\n
"
);
printf
(
"usage: %s [-c] [-s <start page>] [-e <end page>] [-p <page>] [-v] [-d] <filename>
\n
"
,
argv
[
0
]);
printf
(
"
\t
-c
\t
print the count of pages in the file
\n
"
);
printf
(
"
\t
-s n
\t
start on this page number (0 based)
\n
"
);
printf
(
"
\t
-e n
\t
end at this page number (0 based)
\n
"
);
printf
(
"
\t
-p n
\t
check only this page (0 based)
\n
"
);
printf
(
"
\t
-v
\t
verbose (prints progress every 5 seconds)
\n
"
);
printf
(
"
\t
-d
\t
debug mode (prints checksums for each page)
\n
"
);
return
1
;
}
/* debug implies verbose... */
if
(
debug
)
verbose
=
1
;
/* make sure we have the right arguments */
if
(
optind
>=
argc
)
{
printf
(
"InnoDB offline file checksum utility.
\n
"
);
printf
(
"usage: %s [-c] [-s <start page>] [-e <end page>] [-p <page>] [-v] [-d] <filename>
\n
"
,
argv
[
0
]);
printf
(
"
\t
-c
\t
print the count of pages in the file
\n
"
);
printf
(
"
\t
-s n
\t
start on this page number (0 based)
\n
"
);
printf
(
"
\t
-e n
\t
end at this page number (0 based)
\n
"
);
printf
(
"
\t
-p n
\t
check only this page (0 based)
\n
"
);
printf
(
"
\t
-v
\t
verbose (prints progress every 5 seconds)
\n
"
);
printf
(
"
\t
-d
\t
debug mode (prints checksums for each page)
\n
"
);
return
1
;
}
/* stat the file to get size and page count */
if
(
stat
(
argv
[
optind
],
&
st
))
{
perror
(
"error statting file"
);
return
1
;
}
size
=
st
.
st_size
;
pages
=
size
/
UNIV_PAGE_SIZE
;
if
(
just_count
)
{
printf
(
"%lu
\n
"
,
pages
);
return
0
;
}
else
if
(
verbose
)
{
printf
(
"file %s= %llu bytes (%lu pages)...
\n
"
,
argv
[
1
],
size
,
pages
);
printf
(
"checking pages in range %lu to %lu
\n
"
,
start_page
,
use_end_page
?
end_page
:
(
pages
-
1
));
}
/* open the file for reading */
f
=
fopen
(
argv
[
optind
],
"r"
);
if
(
!
f
)
{
perror
(
"error opening file"
);
return
1
;
}
/* seek to the necessary position */
if
(
start_page
)
{
fd
=
fileno
(
f
);
if
(
!
fd
)
{
perror
(
"unable to obtain file descriptor number"
);
return
1
;
}
// stat the file to get size and page count
if
(
stat
(
argv
[
optind
],
&
st
))
{
perror
(
"error statting file"
);
return
1
;
offset
=
(
off_t
)
start_page
*
(
off_t
)
UNIV_PAGE_SIZE
;
if
(
lseek
(
fd
,
offset
,
SEEK_SET
)
!=
offset
)
{
perror
(
"unable to seek to necessary offset"
);
return
1
;
}
size
=
st
.
st_size
;
pages
=
size
/
UNIV_PAGE_SIZE
;
if
(
just_count
)
{
printf
(
"%lu
\n
"
,
pages
);
return
0
;
}
else
if
(
verbose
)
{
printf
(
"file %s = %llu bytes (%lu pages)...
\n
"
,
argv
[
1
],
size
,
pages
);
printf
(
"checking pages in range %lu to %lu
\n
"
,
start_page
,
use_end_page
?
end_page
:
(
pages
-
1
));
}
/* allocate buffer for reading (so we don't realloc every time) */
p
=
(
byte
*
)
malloc
(
UNIV_PAGE_SIZE
);
/* main checksumming loop */
ct
=
start_page
;
lastt
=
0
;
while
(
!
feof
(
f
))
{
bytes
=
fread
(
p
,
1
,
UNIV_PAGE_SIZE
,
f
);
if
(
!
bytes
&&
feof
(
f
))
return
0
;
if
(
bytes
!=
UNIV_PAGE_SIZE
)
{
fprintf
(
stderr
,
"bytes read (%d) doesn't match universal page size (%d)
\n
"
,
bytes
,
UNIV_PAGE_SIZE
);
return
1
;
}
// open the file for reading
f
=
fopen
(
argv
[
optind
],
"r"
);
if
(
!
f
)
{
perror
(
"error opening file"
);
return
1
;
/* check the "stored log sequence numbers" */
logseq
=
mach_read_from_4
(
p
+
FIL_PAGE_LSN
+
4
);
logseqfield
=
mach_read_from_4
(
p
+
UNIV_PAGE_SIZE
-
FIL_PAGE_END_LSN_OLD_CHKSUM
+
4
);
if
(
debug
)
printf
(
"page %lu: log sequence number: first = %lu; second = %lu
\n
"
,
ct
,
logseq
,
logseqfield
);
if
(
logseq
!=
logseqfield
)
{
fprintf
(
stderr
,
"page %lu invalid (fails log sequence number check)
\n
"
,
ct
);
return
1
;
}
// seek to the necessary position
if
(
start_page
)
{
fd
=
fileno
(
f
);
if
(
!
fd
)
{
perror
(
"unable to obtain file descriptor number"
);
return
1
;
}
offset
=
(
off_t
)
start_page
*
(
off_t
)
UNIV_PAGE_SIZE
;
if
(
lseek
(
fd
,
offset
,
SEEK_SET
)
!=
offset
)
{
perror
(
"unable to seek to necessary offset"
);
return
1
;
}
/* check old method of checksumming */
oldcsum
=
buf_calc_page_old_checksum
(
p
);
oldcsumfield
=
mach_read_from_4
(
p
+
UNIV_PAGE_SIZE
-
FIL_PAGE_END_LSN_OLD_CHKSUM
);
if
(
debug
)
printf
(
"page %lu: old style: calculated = %lu; recorded = %lu
\n
"
,
ct
,
oldcsum
,
oldcsumfield
);
if
(
oldcsumfield
!=
mach_read_from_4
(
p
+
FIL_PAGE_LSN
)
&&
oldcsumfield
!=
oldcsum
)
{
fprintf
(
stderr
,
"page %lu invalid (fails old style checksum)
\n
"
,
ct
);
return
1
;
}
// allocate buffer for reading (so we don't realloc every time)
p
=
(
byte
*
)
malloc
(
UNIV_PAGE_SIZE
);
// main checksumming loop
ct
=
start_page
;
lastt
=
0
;
while
(
!
feof
(
f
))
{
bytes
=
fread
(
p
,
1
,
UNIV_PAGE_SIZE
,
f
);
if
(
!
bytes
&&
feof
(
f
))
return
0
;
if
(
bytes
!=
UNIV_PAGE_SIZE
)
{
fprintf
(
stderr
,
"bytes read (%d) doesn't match universal page size (%d)
\n
"
,
bytes
,
UNIV_PAGE_SIZE
);
return
1
;
}
// check the "stored log sequence numbers"
logseq
=
mach_read_from_4
(
p
+
FIL_PAGE_LSN
+
4
);
logseqfield
=
mach_read_from_4
(
p
+
UNIV_PAGE_SIZE
-
FIL_PAGE_END_LSN_OLD_CHKSUM
+
4
);
if
(
debug
)
printf
(
"page %lu: log sequence number: first = %lu; second = %lu
\n
"
,
ct
,
logseq
,
logseqfield
);
if
(
logseq
!=
logseqfield
)
{
fprintf
(
stderr
,
"page %lu invalid (fails log sequence number check)
\n
"
,
ct
);
return
1
;
}
// check old method of checksumming
oldcsum
=
buf_calc_page_old_checksum
(
p
);
oldcsumfield
=
mach_read_from_4
(
p
+
UNIV_PAGE_SIZE
-
FIL_PAGE_END_LSN_OLD_CHKSUM
);
if
(
debug
)
printf
(
"page %lu: old style: calculated = %lu; recorded = %lu
\n
"
,
ct
,
oldcsum
,
oldcsumfield
);
if
(
oldcsumfield
!=
mach_read_from_4
(
p
+
FIL_PAGE_LSN
)
&&
oldcsumfield
!=
oldcsum
)
{
fprintf
(
stderr
,
"page %lu invalid (fails old style checksum)
\n
"
,
ct
);
return
1
;
}
// now check the new method
csum
=
buf_calc_page_new_checksum
(
p
);
csumfield
=
mach_read_from_4
(
p
+
FIL_PAGE_SPACE_OR_CHKSUM
);
if
(
debug
)
printf
(
"page %lu: new style: calculated = %lu; recorded = %lu
\n
"
,
ct
,
csum
,
csumfield
);
if
(
csumfield
!=
0
&&
csum
!=
csumfield
)
{
fprintf
(
stderr
,
"page %lu invalid (fails new style checksum)
\n
"
,
ct
);
return
1
;
}
/* now check the new method */
csum
=
buf_calc_page_new_checksum
(
p
);
csumfield
=
mach_read_from_4
(
p
+
FIL_PAGE_SPACE_OR_CHKSUM
);
if
(
debug
)
printf
(
"page %lu: new style: calculated = %lu; recorded = %lu
\n
"
,
ct
,
csum
,
csumfield
);
if
(
csumfield
!=
0
&&
csum
!=
csumfield
)
{
fprintf
(
stderr
,
"page %lu invalid (fails new style checksum)
\n
"
,
ct
);
return
1
;
}
// end if this was the last page we were supposed to check
if
(
use_end_page
&&
(
ct
>=
end_page
))
return
0
;
// do counter increase and progress printing
ct
++
;
if
(
verbose
)
{
if
(
ct
%
64
==
0
)
{
now
=
time
(
0
);
if
(
!
lastt
)
lastt
=
now
;
if
(
now
-
lastt
>=
1
)
{
printf
(
"page %lu okay: %.3f%% done
\n
"
,
(
ct
-
1
),
(
float
)
ct
/
pages
*
100
);
lastt
=
now
;
}
}
/* end if this was the last page we were supposed to check */
if
(
use_end_page
&&
(
ct
>=
end_page
))
return
0
;
/* do counter increase and progress printing */
ct
++
;
if
(
verbose
)
{
if
(
ct
%
64
==
0
)
{
now
=
time
(
0
);
if
(
!
lastt
)
lastt
=
now
;
if
(
now
-
lastt
>=
1
)
{
printf
(
"page %lu okay: %.3f%% done
\n
"
,
(
ct
-
1
),
(
float
)
ct
/
pages
*
100
);
lastt
=
now
;
}
}
}
return
0
;
}
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment