Class: Longleaf::RegisterEvent

Inherits:
Object
  • Object
show all
Includes:
EventStatusTracking
Defined in:
lib/longleaf/events/register_event.rb

Overview

Event to register a file with longleaf

Instance Method Summary collapse

Methods included from EventStatusTracking

#record_failure, #record_success, #return_status, #track_failure, #track_status, #track_success

Methods included from Logging

#initialize_logger, initialize_logger, #logger, logger

Constructor Details

#initialize(file_rec:, app_manager:, force: false, checksums: nil) ⇒ RegisterEvent

Returns a new instance of RegisterEvent

Parameters:

  • file_rec (FileRecord)

    file record

  • app_manager (ApplicationConfigManager)

    the application configuration

  • force (boolean)

    if true, then already registered files will be re-registered

Raises:

  • (ArgumentError)


17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/longleaf/events/register_event.rb', line 17

def initialize(file_rec:, app_manager:, force: false, checksums: nil)
  raise ArgumentError.new('Must provide a file_rec parameter') if file_rec.nil?
  raise ArgumentError.new('Parameter file_rec must be a FileRecord') \
      unless file_rec.is_a?(FileRecord)
  raise ArgumentError.new('Must provide an ApplicationConfigManager') if app_manager.nil?
  raise ArgumentError.new('Parameter app_manager must be an ApplicationConfigManager') \
      unless app_manager.is_a?(ApplicationConfigManager)

  @app_manager = app_manager
  @file_rec = file_rec
  @force = force
  @checksums = checksums
end

Instance Method Details

#performObject

Perform a registration event on the given file

Raises:

  • RegistrationError if a file cannot be registered



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/longleaf/events/register_event.rb', line 33

def perform
  begin
    # Only need to re-register file if the force flag is provided
    if @file_rec. && !@force
      raise RegistrationError.new("Unable to register '#{@file_rec.path}', it is already registered.")
    end

    # create metadata record
    md_rec = MetadataRecord.new(registered: Time.now.utc.iso8601(3))
    @file_rec. = md_rec

    # retain significant details from former record
    if @file_rec.
      retain_existing_properties
    end

    populate_file_properties

    md_rec.checksums.merge!(@checksums) unless @checksums.nil?

    # persist the metadata
    @app_manager.md_manager.persist(@file_rec)

    record_success(EventNames::REGISTER, @file_rec.path)
  rescue RegistrationError => err
    record_failure(EventNames::REGISTER, @file_rec.path, err.message)
  rescue InvalidStoragePathError => err
    record_failure(EventNames::REGISTER, @file_rec.path, err.message)
  end

  return_status
end

#populate_file_propertiesObject (private)



67
68
69
70
71
72
73
# File 'lib/longleaf/events/register_event.rb', line 67

def populate_file_properties
  md_rec = @file_rec.

  # Set file properties
  md_rec.last_modified = File.mtime(@file_rec.path).utc.iso8601(3)
  md_rec.file_size = File.size(@file_rec.path)
end

#retain_existing_propertiesObject (private)

Copy a subset of properties from an existing metadata record to the new record



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/longleaf/events/register_event.rb', line 76

def retain_existing_properties
  md_rec = @file_rec.

  old_md = MetadataDeserializer.deserialize(file_path: @file_rec.,
          digest_algs: @file_rec.storage_location.)
  # Copy custom properties
  old_md.properties.each { |name, value| md_rec.properties[name] = value }
  # Copy stale-replicas flag per service
  old_md.list_services.each do |serv_name|
    serv_rec = old_md.service(serv_name)

    stale_replicas = serv_rec.stale_replicas
    if stale_replicas
      new_service = md_rec.service(serv_name)
      new_service.stale_replicas = stale_replicas unless new_service.nil?
    end
  end
end