sun_solaris_cr_6800929_large_command_substitution_hang.sh revision 81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6a
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# CDDL HEADER START
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# The contents of this file are subject to the terms of the
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# Common Development and Distribution License (the "License").
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# You may not use this file except in compliance with the License.
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# or http://www.opensolaris.org/os/licensing.
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# See the License for the specific language governing permissions
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# and limitations under the License.
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# When distributing Covered Code, include this CDDL HEADER in each
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# If applicable, add the following below this CDDL HEADER, with the
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fields enclosed by brackets "[]" replaced with your own identifying
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# information: Portions Copyright [yyyy] [name of copyright owner]
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# CDDL HEADER END
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# Use is subject to license terms.
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# Test whether CR #6800929 ("snv_106 ksh93 update breaks Install(1M)") has been fixed.
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# Quote from CR #6800929:
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# ---- snip ----
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# so i just upgraded this morning from snv_105 to snv_106. now
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# Install(1M) is hanging whenever i run it. i'm running it as follows:
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# Install -o debug -k i86xpv -T domu-219:/tmp
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# and here's where it's hung:
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# ---8<---
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# xxxxx@xxxxx $ pstack 204600
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# 204600: /bin/ksh /opt/onbld/bin/Install -o debug -k i86xpv -T domu-219:/tmp
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff2e3d1a write (1, 4154c0, 64)
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7ffefdafc8 sfwr () + 2d0
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7ffefc0f6f _sfflsbuf () + 217
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7ffefcb9f7 sfsync () + 17f
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7ffefc5c58 _sfphead () + 188
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7ffefc5ef5 _sfpmove () + 55
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7ffefc2595 _sfmode () + 22d
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7ffefc5fb1 sfpool () + 99
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff15eb8e sh_exec () + 2f56
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff15f78c sh_exec () + 3b54
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff15d9c8 sh_exec () + 1d90
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff15788e sh_subshell () + 646
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff134562 comsubst () + 8a2
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff12f61f copyto () + bcf
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff12df79 sh_macexpand () + 1f1
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff1129f5 arg_expand () + a5
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff112812 sh_argbuild () + 9a
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff15dbe2 sh_exec () + 1faa
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff15d854 sh_exec () + 1c1c
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff0f22ef b_dot_cmd () + 507
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff161559 sh_funct () + 199
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff15ef35 sh_exec () + 32fd
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff136e86 exfile () + 786
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# fffffd7fff136676 sh_main () + 7fe
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# 0000000000400e72 main () + 52
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# 0000000000400ccc ????
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# ---8<---
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# there is only one place where Install(1M) invokes "uniq":
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# set -- `grep "^CONF" $modlist | sort | uniq`;
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik#
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# as it turns out, i can easily reproduce this problem as follows:
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# ---8<---
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# xxxxx@xxxxx $ ksh93
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# xxxxx@xxxxx $ set -- `cat /etc/termcap | sort | uniq`
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# <hang>
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# ---8<---
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# ---- snip ----
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikfunction err_exit
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik{
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik print -u2 -n "\t"
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik print -u2 -r ${Command}[$1]: "${@:2}"
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik (( Errors+=1 ))
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik}
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikalias err_exit='err_exit $LINENO'
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikinteger Errors=0
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikinteger i j d
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Diktypeset tmpfile
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# test 1: run loop and check various temp filesizes
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Diktmpfile="$(mktemp "/tmp/sun_solaris_cr_6800929_large_command_substitution_hang.${PPID}.$$.XXXXXX")" || err_exit "Cannot create temporary file."
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikfor (( i=1*1024 ; i <= 512*1024 ; i*=2 )) ; do
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik # Create temp file
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik {
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik for ((j=0 ; j < i ; j+=16 )) ; do
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik print "0123456789abcde"
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik done
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik } >"${tmpfile}"
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik # Run test child
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik ${SHELL} -c "builtin cat ; print -- \"\$(cat \"${tmpfile}\" | cat)\" ; true" >/dev/null &
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik (( childpid=$! ))
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik # wait up to log2(i) seconds for the child to terminate
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik # (this is 10 seconds for 1KB and 19 seconds for 512KB)
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik (( d=log2(i) ))
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik for (( j=0 ; j < d ; j++ )) ; do
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik kill -0 ${childpid} 2>/dev/null || break
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik sleep 0.5
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik done
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik if kill -0 ${childpid} 2>/dev/null ; then
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik err_exit "test1: child (pid=${childpid}) still busy, filesize=${i}."
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik kill -KILL ${childpid} 2>/dev/null
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik fi
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik wait # wait for child (and/or avoid zombies/slime)
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik rm "${tmpfile}"
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikdone
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# test 2: Edward's Solaris-specific testcase
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik${SHELL} -c 'builtin uniq ; set -- `cat /etc/termcap | sort | uniq` ; true' >/dev/null &
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik(( childpid=$! ))
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Diksleep 5
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikif kill -0 ${childpid} 2>/dev/null ; then
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik err_exit "test2: child (pid=${childpid}) still busy."
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik kill -KILL ${childpid} 2>/dev/null
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikfi
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikwait # wait for child (and/or avoid zombies/slime)
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dik# tests done
81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6aCasper H.S. Dikexit $((Errors))