no SQL inside the signal-handler (race-condition)
This commit is contained in:
parent
7141787728
commit
460e244536
92
atom
92
atom
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user