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
|
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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user