no SQL inside the signal-handler (race-condition)

This commit is contained in:
Vincent Riquer 2013-04-04 13:21:51 +02:00
parent 7141787728
commit 460e244536

92
atom
View File

@ -1462,21 +1462,7 @@ destroyworker() {
wait $dyingworker
}
checkworkers() {
for key in ${!workers[@]}
do
if ! kill -0 ${workers[key]} 2>/dev/null
then
if read -u4 -t 0.01 alienquery
then
alienresults=(${alienquery%%|*})
rest="${alienquery#*|}|"
while [ -n "$rest" ]
do
alienresults+=("${rest%%|*}")
rest=${rest#*|}
done
fi
gettaskinfos() {
echo '
SELECT
id,
@ -1487,7 +1473,7 @@ checkworkers() {
filename
FROM tasks
WHERE
id='${workertasks[key]}';
id='$1';
' >&3
read -u4 line
taskid=${line%%|*}
@ -1502,10 +1488,34 @@ checkworkers() {
rest=${rest#*|}
destfilename=${rest%%|*}
rest=${rest#*|}
if destroyworker $key
}
cleaner() {
for taskid in ${failedtasks[@]}
do
gettaskinfos $taskid
faildepends=$(
Select tasks 'COUNT(*)' <<-EOWhere
requires = $taskid
EOWhere
)
(( failed+=faildepends ))
Update tasks status 2 <<<"id = $taskid"
Update tasks status 2 <<<"requires = $taskid"
echo "SELECT COUNT(*)
FROM tasks
WHERE ( status = 0 OR status = 1 )
AND required = $taskid;">&3
read -u4 count
if (( count == 0 ))
then
(( ++ran ))
(( active-- )) || true
rm -f "$cleanup"
fi
unset failedtasks[taskid]
done
for taskid in ${finishedtasks[@]}
do
gettaskinfos $taskid
Delete tasks <<<"id = $taskid"
if [ -n "$destfilename" ]
then
@ -1530,16 +1540,6 @@ checkworkers() {
"WHERE id=$destfileid;" \
>&3
fi
else
faildepends=$(
Select tasks 'COUNT(*)' <<-EOWhere
requires = $taskid
EOWhere
)
(( failed+=faildepends ))
Update tasks status 2 <<<"id = $taskid"
Update tasks status 2 <<<"requires = $taskid"
fi
echo "SELECT COUNT(*)
FROM tasks
WHERE ( status = 0 OR status = 1 )
@ -1549,22 +1549,25 @@ checkworkers() {
then
rm -f "$cleanup"
fi
if (( ${#alienresults[@]} ))
then
alienquery='SELECT '
for key in ${!alienresults[@]}
do
(( key > 0 )) && alienquery+=,
expr='^[0-9]*$'
if [[ ${alienresults[key]} =~ $expr ]]
then
alienquery+=${alienresults[key]}
else
alienquery+="\"${alienresults[@]//\"/\"\"}\""
fi
unset finishedtasks[taskid]
done
echo "$alienquery;" >&3
unset alienquery alienresults
}
checkworkers() {
for key in ${!workers[@]}
do
if ! kill -0 ${workers[key]} 2>/dev/null
then
taskid=${workertasks[key]}
(( ++ran ))
(( active-- ))
if destroyworker $key
then
finishedtasks+=($taskid)
else
failedtasks+=($taskid)
(( ++ran ))
(( ++failed ))
fi
fi
done
@ -2057,6 +2060,7 @@ do
(( ++concurrency ))
fi
fi
cleaner
master
if ((taskcount - remaining))
then