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 wait $dyingworker
} }
checkworkers() { gettaskinfos() {
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
echo ' echo '
SELECT SELECT
id, id,
@ -1487,7 +1473,7 @@ checkworkers() {
filename filename
FROM tasks FROM tasks
WHERE WHERE
id='${workertasks[key]}'; id='$1';
' >&3 ' >&3
read -u4 line read -u4 line
taskid=${line%%|*} taskid=${line%%|*}
@ -1502,10 +1488,34 @@ checkworkers() {
rest=${rest#*|} rest=${rest#*|}
destfilename=${rest%%|*} destfilename=${rest%%|*}
rest=${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 then
(( ++ran )) rm -f "$cleanup"
(( active-- )) || true fi
unset failedtasks[taskid]
done
for taskid in ${finishedtasks[@]}
do
gettaskinfos $taskid
Delete tasks <<<"id = $taskid" Delete tasks <<<"id = $taskid"
if [ -n "$destfilename" ] if [ -n "$destfilename" ]
then then
@ -1530,16 +1540,6 @@ checkworkers() {
"WHERE id=$destfileid;" \ "WHERE id=$destfileid;" \
>&3 >&3
fi 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(*) echo "SELECT COUNT(*)
FROM tasks FROM tasks
WHERE ( status = 0 OR status = 1 ) WHERE ( status = 0 OR status = 1 )
@ -1549,22 +1549,25 @@ checkworkers() {
then then
rm -f "$cleanup" rm -f "$cleanup"
fi fi
if (( ${#alienresults[@]} )) unset finishedtasks[taskid]
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
done 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
fi fi
done done
@ -2057,6 +2060,7 @@ do
(( ++concurrency )) (( ++concurrency ))
fi fi
fi fi
cleaner
master master
if ((taskcount - remaining)) if ((taskcount - remaining))
then then