mirror of
https://github.com/coreutils/coreutils.git
synced 2024-11-24 10:23:31 +08:00
md5sum, sha*sum, sum: line-buffer the printed checksums
* src/md5sum.c (main): Set stdout to line buffered mode to ensure parallel running instances don't intersperse their output. This adds 5% to the run time in the worst case of many zero length files, or 2% with standard file sizes. * src/sum.c (main): Likewise. * tests/misc/md5sum-parallel: New test for atomic output. * tests/Makefile.am: Reference it. * NEWS: Mention the fix
This commit is contained in:
parent
71adb516de
commit
710fe413fe
5
NEWS
5
NEWS
@ -12,6 +12,11 @@ GNU coreutils NEWS -*- outline -*-
|
|||||||
btrfs, cgroupfs, cramfs-wend, debugfs, futexfs, hfs, inotifyfs, minux3,
|
btrfs, cgroupfs, cramfs-wend, debugfs, futexfs, hfs, inotifyfs, minux3,
|
||||||
nilfs, securityfs, selinux, xenfs
|
nilfs, securityfs, selinux, xenfs
|
||||||
|
|
||||||
|
md5sum now prints checksums atomically so that concurrent
|
||||||
|
processes will not intersperse their output.
|
||||||
|
This also affected sum, sha1sum, sha224sum, sha384sum and sha512sum.
|
||||||
|
[the bug dates back to the initial implementation]
|
||||||
|
|
||||||
** New features
|
** New features
|
||||||
|
|
||||||
md5sum --check now also accepts openssl-style checksums.
|
md5sum --check now also accepts openssl-style checksums.
|
||||||
|
@ -513,7 +513,6 @@ digest_check (const char *checkfile_name)
|
|||||||
if (!status_only)
|
if (!status_only)
|
||||||
{
|
{
|
||||||
printf (_("%s: FAILED open or read\n"), filename);
|
printf (_("%s: FAILED open or read\n"), filename);
|
||||||
fflush (stdout);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -539,7 +538,6 @@ digest_check (const char *checkfile_name)
|
|||||||
printf ("%s: %s\n", filename, _("FAILED"));
|
printf ("%s: %s\n", filename, _("FAILED"));
|
||||||
else if (!quiet)
|
else if (!quiet)
|
||||||
printf ("%s: %s\n", filename, _("OK"));
|
printf ("%s: %s\n", filename, _("OK"));
|
||||||
fflush (stdout);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -619,6 +617,10 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
atexit (close_stdout);
|
atexit (close_stdout);
|
||||||
|
|
||||||
|
/* Line buffer stdout to ensure lines are written atomically and immediately
|
||||||
|
so that processes running in parallel do not intersperse their output. */
|
||||||
|
setvbuf (stdout, NULL, _IOLBF, 0);
|
||||||
|
|
||||||
while ((opt = getopt_long (argc, argv, "bctw", long_options, NULL)) != -1)
|
while ((opt = getopt_long (argc, argv, "bctw", long_options, NULL)) != -1)
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
|
@ -233,6 +233,10 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
atexit (close_stdout);
|
atexit (close_stdout);
|
||||||
|
|
||||||
|
/* Line buffer stdout to ensure lines are written atomically and immediately
|
||||||
|
so that processes running in parallel do not intersperse their output. */
|
||||||
|
setvbuf (stdout, NULL, _IOLBF, 0);
|
||||||
|
|
||||||
have_read_stdin = false;
|
have_read_stdin = false;
|
||||||
|
|
||||||
while ((optc = getopt_long (argc, argv, "rs", longopts, NULL)) != -1)
|
while ((optc = getopt_long (argc, argv, "rs", longopts, NULL)) != -1)
|
||||||
|
@ -178,6 +178,7 @@ TESTS = \
|
|||||||
misc/id-groups \
|
misc/id-groups \
|
||||||
misc/md5sum \
|
misc/md5sum \
|
||||||
misc/md5sum-newline \
|
misc/md5sum-newline \
|
||||||
|
misc/md5sum-parallel \
|
||||||
misc/mknod \
|
misc/mknod \
|
||||||
misc/nice \
|
misc/nice \
|
||||||
misc/nl \
|
misc/nl \
|
||||||
|
38
tests/misc/md5sum-parallel
Executable file
38
tests/misc/md5sum-parallel
Executable file
@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Ensure that md5sum prints each checksum atomically
|
||||||
|
# so that concurrent md5sums don't intersperse their output
|
||||||
|
|
||||||
|
# Copyright (C) 2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
. $srcdir/test-lib.sh
|
||||||
|
|
||||||
|
if test "$VERBOSE" = yes; then
|
||||||
|
set -x
|
||||||
|
md5sum --version
|
||||||
|
fi
|
||||||
|
|
||||||
|
fail=0
|
||||||
|
|
||||||
|
(mkdir tmp && cd tmp && seq 500 | xargs touch)
|
||||||
|
|
||||||
|
# This will output at least 16KiB per process
|
||||||
|
# and start 3 processes, with 2 running concurrently,
|
||||||
|
# which triggers often on Fedora 11 at least.
|
||||||
|
(find tmp tmp tmp -type f | xargs -n500 -P2 md5sum) |
|
||||||
|
sed -n '/[0-9a-f]\{32\} /!p' |
|
||||||
|
grep . > /dev/null && fail=1
|
||||||
|
|
||||||
|
Exit $fail
|
Loading…
Reference in New Issue
Block a user