From 460e2445360744eaeed67bd10030ddf1ee7b5b6d Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Thu, 4 Apr 2013 13:21:51 +0200 Subject: [PATCH] no SQL inside the signal-handler (race-condition) --- atom | 194 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 99 insertions(+), 95 deletions(-) diff --git a/atom b/atom index 3c34fe0..444137b 100755 --- a/atom +++ b/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