fix to missing exclusive processing between terminate() and

finalize_process().

The process of making a child process zombie and the process of setting
the parent of the child process to process ID 1 are excluded.

Refs: #1257
Change-Id: Ic95d4d8ee92d6a4a63847e5eda20ec1ba92566ac
This commit is contained in:
Tomoki Shirasawa
2019-02-08 10:25:20 +09:00
parent ff0395581c
commit d78883c692
5 changed files with 135 additions and 17 deletions

View File

@@ -0,0 +1,67 @@
#!/bin/sh
USELTP=1
USEOSTEST=0
USESTRESSTEST=1
MCREBOOT=0
MCSTOP=0
. ../../common.sh
################################################################################
ng=0
org="`pwd`"
(
cd "$STRESSTESTBIN"
rm -f config.sh.bak
if [ -f config.sh ]; then
mv config.sh config.sh.bak
sed -e '/^MCKDIR=/d' config.sh.bak > config.sh
fi
echo "MCKDIR=\"$MCK_DIR\"" >> config.sh
if ! grep ^MCREBOOTOPTION= config.sh > /dev/null 2>&1; then
echo "MCREBOOTOPTION=\"$BOOTPARAM\"" >> config.sh
fi
rm -f "$org/C1201T01.log"
echo C1201T01 START
for i in {1..100}; do
sudo ./mck-stop.sh >> "$org/C1201T01.log" 2>&1
sudo ./mck-boot.sh >> "$org/C1201T01.log" 2>&1
for j in {1..10}; do
./mck-mcexec.sh ./killit -np 8 -t 2000 - \
./signalonfork \ -nosignal >> \
"$org/C1201T01.log" 2>&1
if [ "X$?" = X0 ]; then
echo -n .
else
ng=1
break
fi
done
echo
if [ "X$ng" = X1 ]; then
echo C1201T01: NG see C1201T01.log
break
fi
done
if [ $ng = 0 ]; then
echo
echo C1201T01: OK
fi
if [ -f config.sh.bak ]; then
mv config.sh.bak config.sh
fi
)
for i in fork01:02 fork02:03 fork03:04 fork04:05 fork07:06 fork08:07 fork09:08 \
fork10:09 fork11:10; do
tp=`echo $i|sed 's/:.*//'`
id=`echo $i|sed 's/.*://'`
sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
ok=`grep TPASS $tp.txt | wc -l`
ng=`grep TFAIL $tp.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** C1201T$id: $tp OK ($ok)"
else
echo "*** C1201T$id: $tp NG (ok=$ok ng=%ng)"
fi
done

View File

@@ -0,0 +1,153 @@
Script started on Tue Jan 29 09:56:27 2019
bash-4.2$ make test
sh ./C1201.sh
C1201T01 START
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
C1201T01: OK
fork01 1 TPASS : fork() returned 12252
fork01 2 TPASS : child pid and fork() return agree: 12252
*** C1201T02: fork01 OK (2)
fork02 0 TINFO : Inside parent
fork02 0 TINFO : Inside child
fork02 0 TINFO : exit status of wait 0
fork02 1 TPASS : test 1 PASSED
*** C1201T03: fork02 OK (1)
fork03 0 TINFO : process id in parent of child from fork : 12402
fork03 1 TPASS : test 1 PASSED
*** C1201T04: fork03 OK (1)
fork04 1 TPASS : Env var TERM unchanged after fork(): xterm
fork04 2 TPASS : Env var NoTSetzWq unchanged after fork(): getenv() does not find variable set
fork04 3 TPASS : Env var TESTPROG unchanged after fork(): FRKTCS04
*** C1201T05: fork04 OK (3)
fork07 0 TINFO : Forking 100 children
fork07 0 TINFO : Forked all 100 children, now collecting
fork07 0 TINFO : Collected all 100 children
fork07 1 TPASS : 100/100 children read correctly from an inheritted fd
*** C1201T06: fork07 OK (1)
fork08 0 TINFO : parent forksval: 1
fork08 0 TINFO : parent forksval: 2
fork08 0 TINFO : exit status of wait expected 0 got 0
fork08 1 TPASS : parent test PASSED
fork08 0 TINFO : second child got char: b
fork08 1 TPASS : Test passed in childnumber 2
fork08 0 TINFO : exit status of wait expected 0 got 0
fork08 2 TPASS : parent test PASSED
fork08 0 TINFO : exit status of wait expected 0 got 0
fork08 3 TPASS : parent test PASSED
fork08 0 TINFO : Number of processes forked is 2
*** C1201T07: fork08 OK (4)
fork09 0 TINFO : OPEN_MAX is 1024
fork09 0 TINFO : first file descriptor is 12
fork09 0 TINFO : Parent reporting 1023 files open
fork09 0 TINFO : Child opened new file #1023
fork09 1 TPASS : test 1 PASSED
*** C1201T08: fork09 OK (1)
fork10 0 TINFO : fork child A
fork10 1 TPASS : test 1 PASSED
*** C1201T09: fork10 OK (1)
fork11 1 TPASS : fork test passed, 100 processes
*** C1201T10: fork11 OK (1)
bash-4.2$ exit
exit
Script done on Tue Jan 29 14:27:41 2019

View File

@@ -0,0 +1,9 @@
TARGET=
all:: $(TARGET)
test:: $(TARGET)
sh ./C1201.sh
clean::
rm -f *.o $(TARGET)

View File

@@ -0,0 +1,42 @@
【Issue#1201, Issue#1257 動作確認】
□ テスト内容
Issue#1201 と Issue#1257 は 共に stress-6-1-signalonfork-001 でプロセス残留
が発生するもので、現象と発生頻度が異なる。
Issue#1201 はプロセスが PS_EXITED 状態で残留し、スレッドも残留する。概ね
10数回に1回の頻度で発生する。
Issue#1257 はプロセスが PS_ZOMBIE 状態で残留するが、スレッドは残留しない。
概ね 200 回程度に 1 回の頻度で発生する。
このため、2 件の Issue のテストは共通に行うことにした。
テスト内容は以下の通りである。
1. Issue 指摘事項の再現確認
C1201T01 stress-6-1-signalonfork-001 を 1000 回連続で正常終了することを確認。
発生頻度が低い Issue#1257 でも 200 回程度の連続実行で確実に再現する
ため、1000 回の連続実行で発生しなければ対策されたと判断する。
2. LTP を用いて既存処理に影響しないことを確認
プロセス生成処理関連を変更したため、fork のテストを選定した。
C1201T02 fork01 が PASS すること
C1201T03 fork02 が PASS すること
C1201T04 fork03 が PASS すること
C1201T05 fork04 が PASS すること
C1201T06 fork07 が PASS すること
C1201T07 fork08 が PASS すること
C1201T08 fork09 が PASS すること
C1201T09 fork10 が PASS すること
C1201T10 fork11 が PASS すること
□ 実行手順
$ make test
McKernelのインストール先や LTP の配置場所は、$HOME/.mck_test_config を
参照する。.mck_test_config は、McKernel を ビルドした際に生成される
mck_test_config.sample ファイルを $HOME に コピーし、適宜編集すること。
また、C1201.sh の以下の指定を適宜変更すること。
STRESSTESTDIR= ストレステストが存在するパス。
($HOME/stress_test の場合は変更不要)
□ 実行結果
C1201.txt 参照。
すべての項目をPASSしていることを確認。