ForceRun any job in FlowTracer

#!/bin/csh -f
# -*- Tcl -*- \
    exec vovsh -f $0 $*:q


namespace eval Aeware {
 

    proc SetChangeStatusProp { id msg status } {
    set now   [clock seconds]
    set nowts [clock format $now]
    catch {vtk_prop_set $id "FORCE_STATUS_CHANGE" "$nowts: $msg: set status to $status by [vtk_logname]"}
    catch {vtk_prop_delete $id "FORCE_VALIDATE" }    
    }
    
    
    proc ValidateAndUpdateJobOutputs { id reason } {
    if { ! [catch { vtk_object_get $id objInfo } ] } {
        if { $objInfo(type) == "TRANSITION" } {
        foreach fileId [lindex [vtk_node_get_ios $id "@ID@"] 1] {
            if { [catch {vtk_node_change_status $fileId VALID THIS_NODE_ONLY} errmsg] } {
            VovError "Cannot validate ($reason) output file $fileId: $errmsg"
            } else {
            catch {vtk_place_update $fileId}
            ::Aeware::SetChangeStatusProp $fileId $reason VALID
            }
        }
        }
    }
    }
    
    proc softRevalidate { ucid } {
    set fmt "@LEVEL@ @NODETYPE@ @ID@ @STATUS@ @STARTED@ @ENDED@"
    set count 0
    vtk_set_get $ucid setinfo
    set size $setinfo(size)
    set elems [lsort -integer -index 0 [vtk_set_get_elements $ucid $fmt]] 
    
    foreach elem $elems {
        set lv [shift elem];            # Discard level.
        set nt [shift elem];            
        set id [shift elem]
        set st [shift elem]

        if {$st != "VALID"} {
        catch [vtk_node_change_status $id VALID THIS_NODE_ONLY]
        ::Aeware::SetChangeStatusProp $id "Soft Revalidate" VALID
        ::Aeware::ValidateAndUpdateJobOutputs $id "Soft Revalidate"
        }
    }
    vtk_sanity_check 0 SANITY 
    }
    

    proc flagForcedJobs { setid } {
    set fmt "@LEVEL@ @NODETYPE@ @ID@ @STATUS@ @STARTED@ @ENDED@"
    set elems [lsort -integer -index 0 [vtk_set_get_elements $setid $fmt]] 
    set jarray() {}
    set now   [clock seconds]
    set nowpp [clock format $now]
    set propName EXIT_CODE_WAIVED
    foreach elem $elems {
        set lv [shift elem]
        set nt [shift elem]
        set id [shift elem]
        set st [shift elem]
        if { $nt == "FILE" } continue
        if { $st != "VALID" } continue
        
        vtk_transition_get $id jarray
        if { $jarray(legalexit) == "" } {
        } elseif { $jarray(exit) != $jarray(legalexit) } {
        puts "Exit code waive $id $jarray(exit) $jarray(legalexit)"
        if [catch {vtk_prop_set -nosticky -text $id $propName "Waiver discovered by revalidate on $nowpp"} ] {
            puts "unable to set waiver prop on $id"
        }
        }       
    }
    }

    proc validateThruSkipping { w ucid skipMsg {ignoreMissingFiles 0} } {
    set fmt "@LEVEL@ @NODETYPE@ @ID@ @STATUS@ @STARTED@ @ENDED@"
    set count 0
    set setToRetrace {}
    array set triggered {}
    set unskippable {}
    vtk_set_get $ucid setinfo
    set size $setinfo(size)
    set elems [lsort -integer -index 0 [vtk_set_get_elements $ucid $fmt]] 
    set count 0
    foreach elem $elems {
        if { [incr count] % 100 == 0 } {
        ::VovGUI::SetBusyState "ReValidating (skip) [format %.2f%% [expr (100.0*$count)/$size]]"
        }
        set skippable 1
        set lv [shift elem];            # Discard level.
        set nt [shift elem];            # Node type. Only care about jobs
        if { $nt == "FILE" } continue
        
        set id [shift elem]
        set st [shift elem]
        set it [shift elem]
        set et [shift elem];    
        
        switch $st {
        "FAILED" -
        "INVALID" -
        "SCHEDULED" {}
        default {
            continue
        }
        }
        catch {vtk_prop_delete $id FORCE_VALIDATE}
        set ios [vtk_ios_get $id "@ID@ @DB@ @NAME@ @TIMESTAMP@"]
        set youngest 0
        foreach input [lindex $ios 0] {
        set inid  [shift input]
        set db    [shift input]
        set name  [shift input]
        set ts    [shift input]
        if { $db == "FILE" } {
            set nax [vtk_path_expand $name]
            if { $ts > $et } {
            if { $ts > $youngest } {
                set youngest $ts
                set youngestId $inid
            }
            } elseif { [info exists triggered($inid)] } {
            set youngest [lindex $triggered($inid) 0]
            set youngestId [lindex $triggered($inid) 1]
            }
        }
        }
        foreach output [lindex $ios 1] {
        set outid [shift output]
        set db    [shift output]
        set name  [shift output]
        set ts    [shift output]
        if { $youngest > 0 } {
            set triggered($outid) [list $youngest $youngestId ]
        }
        if { $db == "FILE" } {
            set nax [vtk_path_expand $name]
            if { ! [file exists $nax] } {
            if { !$ignoreMissingFiles } {
                set skippable 0
                lappend_no_dup unskippable $id
            }
            }
        }
        }
        if { $skippable && $youngest > 0 } {
        set propName "JOB_SKIP_REASON"
        set jarray() {}
        vtk_transition_get $id jarray
        set jarray(autoflow) 1
        catch {vtk_transition_set $id jarray}
        ::VovGUI::SetChangeStatusProp $id "SoftRevalidate" "$jarray(extendedstatus)"
        
        lappend setToRetrace $id
        if [catch {vtk_prop_set -nosticky -text $id $propName "$skipMsg waiving change on $youngestId"}] {
            puts "Error setting $propName on $id =$skipMsg $youngestId="
        }
        }
    } 
    set unskipCount [llength $unskippable]

    return setToRetrace
    }
    
    proc makeDashT2 { w idList {forceRunJobs 0} {ignoreMissingFiles 0} } {
    set propName "JOB_SKIP_REASON"
    set setid [vtk_set_create -client "tmp:[pid]"       ""]
    set ucid  [vtk_set_create -client "tmp:[pid]upcone" ""]
    
    vtk_set_operation $setid $idList ATTACH
    vtk_set_operation $ucid  $setid  UPCONE
    if {$forceRunJobs} {
        set runjobs [vtk_set_subselect $setid "isjob"]
        vtk_set_operation $ucid $idList DETACH
    }
    ::Aeware::softRevalidate $ucid
    set now   [clock seconds]
    set nowpp [clock format $now]
    set skipMsg "REVALIDATED: Skip Flag set by [vtk_logname] on $nowpp due to revalidate request on $idList"
    if [catch {set setToRetrace [::Aeware::validateThruSkipping $w $ucid $skipMsg $ignoreMissingFiles]}] {
        set missingFiles 1
    } else {
        set missingFiles 0
        if { $setToRetrace != {} } {
        set setId [vtk_set_create -client -transient "tmp:skip_set[pid][clock seconds]" ""]
        vtk_set_operation $setId  $setToRetrace ATTACH
        vtk_retrace_start  -target SET $setId -mode "FORCE SKIPCHECK" 
        catch {vtk_set_forget $setId}
        }
        ::Aeware::flagForcedJobs $ucid
        if {$forceRunJobs} {
            vtk_retrace_start -mode "FORCE SKIPCHECK" -target SET $runjobs 
            vtk_set_forget $runjobs
        }
    }
    vtk_set_forget $ucid
    vtk_set_forget $setid
    }

    proc ForceRunJobs { sel {ignoreMissingFiles 0} } {
    
    set w 0
    if [catch {::Aeware::makeDashT2 $w $sel 1 $ignoreMissingFiles } errmsg] {
        VovError "Failed to run ForceRunHelper on $sel: $errmsg"
    }
    }
    
}

::Aeware::ForceRunJobs $argv

Did you find this article helpful?