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

194
atom
View File

@ -1462,109 +1462,112 @@ destroyworker() {
wait $dyingworker wait $dyingworker
} }
gettaskinfos() {
echo '
SELECT
id,
source_file,
required,
cleanup,
fileid,
filename
FROM tasks
WHERE
id='$1';
' >&3
read -u4 line
taskid=${line%%|*}
rest="${line#*|}|"
sourcefileid=${rest%%|*}
rest=${rest#*|}
required=${rest%%|*}
rest=${rest#*|}
cleanup=${rest%%|*}
rest=${rest#*|}
destfileid=${rest%%|*}
rest=${rest#*|}
destfilename=${rest%%|*}
rest=${rest#*|}
}
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
rm -f "$cleanup"
fi
unset failedtasks[taskid]
done
for taskid in ${finishedtasks[@]}
do
gettaskinfos $taskid
Delete tasks <<<"id = $taskid"
if [ -n "$destfilename" ]
then
echo \
"UPDATE destination_files" \
"SET filename=\"${destfilename//\"/\"\"}\"," \
" last_change=(" \
" SELECT last_change" \
" FROM source_files" \
" WHERE id=$sourcefileid" \
" )," \
" old_filename=(" \
" SELECT filename" \
" FROM destination_files" \
" WHERE id=$destfileid" \
" )," \
" rename_pattern=(" \
" SELECT rename_pattern" \
" FROM tasks" \
" WHERE id=$taskid" \
" )" \
"WHERE id=$destfileid;" \
>&3
fi
echo "SELECT COUNT(*)
FROM tasks
WHERE ( status = 0 OR status = 1 )
AND required = $taskid;">&3
read -u4 count
if (( count == 0 ))
then
rm -f "$cleanup"
fi
unset finishedtasks[taskid]
done
}
checkworkers() { checkworkers() {
for key in ${!workers[@]} for key in ${!workers[@]}
do do
if ! kill -0 ${workers[key]} 2>/dev/null if ! kill -0 ${workers[key]} 2>/dev/null
then then
if read -u4 -t 0.01 alienquery taskid=${workertasks[key]}
then (( ++ran ))
alienresults=(${alienquery%%|*}) (( active-- ))
rest="${alienquery#*|}|"
while [ -n "$rest" ]
do
alienresults+=("${rest%%|*}")
rest=${rest#*|}
done
fi
echo '
SELECT
id,
source_file,
required,
cleanup,
fileid,
filename
FROM tasks
WHERE
id='${workertasks[key]}';
' >&3
read -u4 line
taskid=${line%%|*}
rest="${line#*|}|"
sourcefileid=${rest%%|*}
rest=${rest#*|}
required=${rest%%|*}
rest=${rest#*|}
cleanup=${rest%%|*}
rest=${rest#*|}
destfileid=${rest%%|*}
rest=${rest#*|}
destfilename=${rest%%|*}
rest=${rest#*|}
if destroyworker $key if destroyworker $key
then then
(( ++ran )) finishedtasks+=($taskid)
(( active-- )) || true
Delete tasks <<<"id = $taskid"
if [ -n "$destfilename" ]
then
echo \
"UPDATE destination_files" \
"SET filename=\"${destfilename//\"/\"\"}\"," \
" last_change=(" \
" SELECT last_change" \
" FROM source_files" \
" WHERE id=$sourcefileid" \
" )," \
" old_filename=(" \
" SELECT filename" \
" FROM destination_files" \
" WHERE id=$destfileid" \
" )," \
" rename_pattern=(" \
" SELECT rename_pattern" \
" FROM tasks" \
" WHERE id=$taskid" \
" )" \
"WHERE id=$destfileid;" \
>&3
fi
else else
faildepends=$( failedtasks+=($taskid)
Select tasks 'COUNT(*)' <<-EOWhere (( ++ran ))
requires = $taskid (( ++failed ))
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 )
AND required = $taskid;">&3
read -u4 count
if (( count == 0 ))
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
done
echo "$alienquery;" >&3
unset alienquery alienresults
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