no SQL inside the signal-handler (race-condition)
This commit is contained in:
parent
7141787728
commit
460e244536
194
atom
194
atom
@ -1462,109 +1462,112 @@ destroyworker() {
|
||||
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() {
|
||||
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 '
|
||||
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#*|}
|
||||
taskid=${workertasks[key]}
|
||||
(( ++ran ))
|
||||
(( active-- ))
|
||||
if destroyworker $key
|
||||
then
|
||||
(( ++ran ))
|
||||
(( 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
|
||||
finishedtasks+=($taskid)
|
||||
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 )
|
||||
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
|
||||
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