class Longleaf::ServiceCandidateIndexIterator

Iterator for getting file candidates which have services which need to be run. Implementation uses an index of file metadata to determine if the file needs any services run.

Public Class Methods

new(file_selector, event, app_config, force = false) click to toggle source
# File lib/longleaf/candidates/service_candidate_index_iterator.rb, line 13
def initialize(file_selector, event, app_config, force = false)
  @file_selector = file_selector
  @event = event
  @app_config = app_config
  @force = force
  @index_manager = @app_config.index_manager
  @stale_datetime = Time.now.utc
  @result_set = nil
end

Public Instance Methods

each() { |file_rec| ... } click to toggle source

Iterate through the candidates in this object and execute the provided block with each candidate. A block is required.

# File lib/longleaf/candidates/service_candidate_index_iterator.rb, line 60
def each
  file_rec = next_candidate
  until file_rec.nil?
    yield file_rec

    file_rec = next_candidate
  end
end
next_candidate() click to toggle source

Get the file record for the next candidate which needs services run which match the provided file_selector @return [FileRecord] file record of the next candidate with services needing to be run,

or nil if there are no more candidates.
# File lib/longleaf/candidates/service_candidate_index_iterator.rb, line 27
def next_candidate
  file_rec = nil
  # loop until a candidate with metadata is retrieved
  loop do
    # Get the next page of results if the previous page has been processed
    fetch_next_page if @result_set.nil? || @result_set.empty?

    # Retrieve the next possible candidate path from the page
    next_path = @result_set.shift
    # given that the page was just retrieved, getting a nil path indicates that the retrieved page of
    # candidates is empty and there are no more candidates to iterate at this time.
    return nil if next_path.nil?

    logger.debug("Retrieved candidate #{next_path}")
    storage_loc = @app_config.location_manager.get_location_by_path(next_path)
    file_rec = FileRecord.new(next_path, storage_loc)

    # Keep seeking until a registered candidate is found, according to the file system.
    if file_rec.metadata_present?
      break
    else
      logger.warn("Encountered #{next_path} in index, but path is not registered. Clearing out of synch entry.")
      @index_manager.remove(file_rec)
    end
  end

  @app_config.md_manager.load(file_rec)

  file_rec
end

Private Instance Methods

fetch_next_page() click to toggle source
# File lib/longleaf/candidates/service_candidate_index_iterator.rb, line 70
def fetch_next_page
  if @force
    @result_set = @index_manager.registered_paths(@file_selector)
  else
    case @event
    when EventNames::PRESERVE
      @result_set = @index_manager.paths_with_stale_services(@file_selector, @stale_datetime)
    when EventNames::CLEANUP
      # TODO
    end
  end
  logger.debug("Retrieve result set with #{@result_set&.length} entries")
end