On Mon, 2010-09-20 at 17:41 -0400, Chris Lalancette wrote:
> When an instance changes state, condor notices this and
> updates the EventLog.  We are currently putting that event
> into the aggregator, but we were not updating the instance
> state with it.  Use the events to properly keep the instance
> states up-to-date.

ACK

The note about the race below.. doesn't sound like it's actually a race,
just a delay?  Seems misleading.. races are scary :).  

        Ian


> Signed-off-by: Chris Lalancette <[email protected]>
> ---
>  src/dbomatic/dbomatic |   39 ++++++++++++++++++++++++++++++++++-----
>  1 files changed, 34 insertions(+), 5 deletions(-)
> 
> diff --git a/src/dbomatic/dbomatic b/src/dbomatic/dbomatic
> index 7434d36..440eba5 100755
> --- a/src/dbomatic/dbomatic
> +++ b/src/dbomatic/dbomatic
> @@ -63,7 +63,7 @@ EVENT_LOG_POS_FILE      =   
> "#{dbomatic_run_dir}/event_log_position"
>  
>  # Handle the event log's xml
>  class CondorEventLog < Nokogiri::XML::SAX::Document
> -  attr_accessor :tag, :event_type, :event_cmd, :event_time
> +  attr_accessor :tag, :event_type, :event_cmd, :event_time, :trigger_type
>  
>    # Store the name of the event log attribute we're looking at
>    def start_element(element, attributes)
> @@ -79,15 +79,16 @@ class CondorEventLog < Nokogiri::XML::SAX::Document
>          @event_cmd = string
>        elsif @tag == "EventTime"
>          @event_time = string
> +      elsif @tag == "TriggerEventTypeName"
> +        @trigger_type = string
>        end
>      end
>    end
>  
>    # Create a new entry for events which we have all the neccessary data for
>    def end_element(element)
> -    if element == "c" && !...@event_cmd.nil?
> -      # Condor may write to event log before condormatic returns and instance
> -      # table is updated. Extract instance name from event_cmd and query on 
> that
> +    if element == "c" and @event_type == "JobAdInformationEvent" and 
> !...@trigger_type.nil?
> +
>        inst_name = @event_cmd[4,@event_cmd.size-4].gsub(/_[0-9]*$/, '')
>        inst = Instance.find(:first, :conditions => ['name = ?', inst_name])
>        if inst.nil?
> @@ -97,9 +98,27 @@ class CondorEventLog < Nokogiri::XML::SAX::Document
>          InstanceEvent.create! :instance => inst,
>                                :event_type => @event_type,
>                                :event_time => @event_time
> +
> +        if @trigger_type == "ULOG_GRID_SUBMIT"
> +          inst.state = Instance::STATE_PENDING
> +          inst.save!
> +        elsif @trigger_type == "ULOG_JOB_ABORTED" or @trigger_type == 
> "ULOG_JOB_TERMINATED"
> +          inst.state = Instance::STATE_STOPPED
> +          inst.save!
> +        elsif @trigger_type == "ULOG_EXECUTE"
> +          inst.state = Instance::STATE_RUNNING
> +          inst.save!
> +        elsif @trigger_type == "ULOG_SUBMIT"
> +          # ULOG_SUBMIT happens when the job is first submitted to condor.
> +          # However, it's not a state that we care to export to users, but 
> it's
> +          # also not an error, so we just silently ignore it.
> +        else
> +          puts "Unexpected trigger type #...@trigger_type}, not updating 
> instance state"
> +        end
>        end
> -      @tag = @event_type = @event_cmd = @event_time = nil
> +      @tag = @event_type = @event_cmd = @event_time = @trigger_type = nil
>      end
> +
>    end
>  end
>  parser = Nokogiri::XML::SAX::PushParser.new(CondorEventLog.new)
> @@ -116,6 +135,13 @@ def parse_log_file(log_file, parser)
>    File.open(EVENT_LOG_POS_FILE, 'w') { |f| f.write log_file.pos.to_s }
>  end
>  
> +# sync up the states that condor knows about with what is in the aggregator
> +# database.  Note that there is still a race condition here between our
> +# sync here, and when we actually open up the EventLog for inotify watch, but
> +# it should be rather small (and should also be taken care of by the
> +# EventLog parsing)
> +condormatic_instances_sync_states
> +
>  notifier = INotify::Notifier.new
>  log_file = nil
>  
> @@ -126,6 +152,9 @@ if File.exists? CONDOR_EVENT_LOG_FILE
>    # incase of dbomatic restarts
>    if File.exists?(EVENT_LOG_POS_FILE)
>      File.open(EVENT_LOG_POS_FILE, 'r') { |f| log_file.pos = f.read.to_i }
> +    # FIXME: we really need to parse from here to the end of the file.
> +    # otherwise we won't get new events until something else causes the
> +    # inotify watch to fire.
>    end
>  
>    # Setup inotify watch for condor event log
> -- 
> 1.7.2.2
> 
> _______________________________________________
> deltacloud-devel mailing list
> [email protected]
> https://fedorahosted.org/mailman/listinfo/deltacloud-devel


_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to