summaryrefslogtreecommitdiff
path: root/tests/cp/link-heap
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2008-11-19 19:36:45 +0100
committerJim Meyering <meyering@redhat.com>2008-11-20 10:21:52 +0100
commit3ece0355d52e41a1b079c0c46477a32250278c11 (patch)
treeea24ea4aae7129a936c291f29ee7b2724bed6d5c /tests/cp/link-heap
parent1760ade090cbf8c854c1033399d51ff4fdde3ae0 (diff)
downloadcoreutils-3ece0355d52e41a1b079c0c46477a32250278c11.tar.xz
cp: use far less memory in some cases
cp --link was "remembering" many name,dev,inode triples unnecessarily. cp was doing the same, even without --link, for every directory in the source hierarchy, while it can do its job with entries merely for the command-line arguments. Prompted by a report from Patrick Shoenfeld. Details <http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/15081>. * src/copy.c (copy_internal): Refrain from remembering name,dev,inode for most files, when invoked via cp --link. Record an infloop-avoidance triple for each directory specified on the command line, not for each directory in the source tree. Don't record a dir-triple when x->hard_link is set. * NEWS (Buf fixes): Mention it. * tests/cp/link-heap: New file. Test for cp's lowered memory usage. * tests/Makefile.am (TESTS): Add link-heap.
Diffstat (limited to 'tests/cp/link-heap')
-rwxr-xr-xtests/cp/link-heap41
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/cp/link-heap b/tests/cp/link-heap
new file mode 100755
index 000000000..b20c7d3b1
--- /dev/null
+++ b/tests/cp/link-heap
@@ -0,0 +1,41 @@
+#!/bin/sh
+# ensure that cp --preserve=link --link doesn't waste heap
+
+# Copyright (C) 2008 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/>.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ cp --version
+fi
+
+. $srcdir/test-lib.sh
+expensive_
+require_ulimit_
+
+a=$(printf %031d 0)
+b=$(printf %031d 1)
+(mkdir $a \
+ && cd $a \
+ && seq --format=%031g 10000 |xargs touch \
+ && seq --format=d%030g 10000 |xargs mkdir ) || framework_failure
+cp -al $a $b || framework_failure
+mkdir e || framework_failure
+mv $a $b e || framework_failure
+
+fail=0
+(ulimit -v 10000; cp -al e f) || fail=1
+
+Exit $fail