Class: MiGA::Lair
Overview
Lair of MiGA Daemons handling job submissions
Constant Summary
Constants included from MiGA
CITATION, VERSION, VERSION_DATE, VERSION_NAME
Instance Attribute Summary collapse
-
#options ⇒ Object
Options used to setup the chief daemon.
-
#path ⇒ Object
(also: #daemon_home)
readonly
Absolute path to the directory where the projects are located.
Attributes included from Common::WithDaemon
Instance Method Summary collapse
-
#check_directories ⇒ Object
Traverse directories checking MiGA projects.
-
#daemon_first_loop ⇒ Object
First loop of the lair’s chief daemon.
-
#daemon_loop ⇒ Object
Run one loop step.
-
#daemon_name ⇒ Object
Name of the lair’s chief daemon.
-
#each_daemon(include_self = true) {|_self| ... } ⇒ Object
Perform block for each daemon, including the chief daemon if
include_self
. -
#each_project(dir = path) ⇒ Object
Perform block for each project in the
dir
directory, passing the absolute path of the project to the block. -
#initialize(path, opts = {}) ⇒ Lair
constructor
Initialize an inactive daemon for the directory at
path
. -
#launch_daemon(project) ⇒ Object
Launch daemon for the MiGA::Project
project
. -
#terminate_daemon(daemon) ⇒ Object
Send termination message to
daemon
, an object implementingMiGA::Common::WithDaemon
. -
#terminate_daemons ⇒ Object
Terminate all daemons in the lair (including the chief daemon).
Methods included from Common::WithDaemonClass
alive_file, last_alive, terminated_file
Methods included from Common::WithDaemon
#active?, #alive_file, #daemon, #declare_alive, #declare_alive_loop, #default_options, #in_loop, #last_alive, #launch_daemon_proc, #output_file, #pid_file, #process_alive?, #run, #start, #status, #stop, #terminate, #terminate_file, #terminated_file, #termination_file?, #write_alive_file
Methods inherited from MiGA
CITATION, CITATION_ARRAY, DEBUG, DEBUG_OFF, DEBUG_ON, DEBUG_TRACE_OFF, DEBUG_TRACE_ON, FULL_VERSION, LONG_VERSION, VERSION, VERSION_DATE, #advance, debug?, debug_trace?, initialized?, #like_io?, #num_suffix, rc_path, #result_files_exist?, #say
Methods included from Common::Path
Methods included from Common::Format
#clean_fasta_file, #seqs_length, #tabulate
Methods included from Common::Net
#download_file_ftp, #known_hosts, #remote_connection
Methods included from Common::SystemCall
Constructor Details
#initialize(path, opts = {}) ⇒ Lair
Initialize an inactive daemon for the directory at path
. See #daemon to wake the chief daemon. Supported options include:
-
json: json definition for all children daemons, by default: nil
-
latency: time to wait between iterations in seconds, by default: 120
-
wait_for: time to wait for a daemon to report being alive in seconds, by default: 30
-
keep_inactive: boolean indicating if daemons should stay alive even when inactive (when all tasks are complete), by default: false
-
name: A name for the chief daemon process, by default: basename of
path
-
trust_timestamp: boolean indicating if the
modified
timestamp of the project is to be trusted to determine changes in the project, by default: true -
dry: Only report when daemons would be launched, but don’t actually launch them
-
exclude: Array of project names to be excluded from the lair
35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/miga/lair.rb', line 35 def initialize(path, opts = {}) @path = File.(path) @options = opts { json: nil, latency: 30, wait_for: 30, keep_inactive: false, trust_timestamp: true, name: File.basename(@path), dry: false, exclude: [] }.each { |k, v| @options[k] = v if @options[k].nil? } end |
Instance Attribute Details
#options ⇒ Object
Options used to setup the chief daemon
17 18 19 |
# File 'lib/miga/lair.rb', line 17 def @options end |
#path ⇒ Object (readonly) Also known as: daemon_home
Absolute path to the directory where the projects are located
14 15 16 |
# File 'lib/miga/lair.rb', line 14 def path @path end |
Instance Method Details
#check_directories ⇒ Object
Traverse directories checking MiGA projects
131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/miga/lair.rb', line 131 def check_directories each_project do |project| d = MiGA::Daemon.new(project) next if d.active? l_alive = d.last_alive unless l_alive.nil? next if [:trust_timestamp] && project..updated < l_alive next if l_alive > Time.now - [:wait_for] end launch_daemon(project) end end |
#daemon_first_loop ⇒ Object
First loop of the lair’s chief daemon
62 63 64 65 66 67 68 |
# File 'lib/miga/lair.rb', line 62 def daemon_first_loop say '-----------------------------------' say '%s launched' % daemon_name say '-----------------------------------' say 'Configuration options:' say .to_s end |
#daemon_loop ⇒ Object
Run one loop step. Returns a Boolean indicating if the loop should continue.
72 73 74 75 76 77 78 |
# File 'lib/miga/lair.rb', line 72 def daemon_loop check_directories return false if [:dry] sleep([:latency]) true end |
#daemon_name ⇒ Object
Name of the lair’s chief daemon
56 57 58 |
# File 'lib/miga/lair.rb', line 56 def daemon_name "MiGA:#{[:name]}" end |
#each_daemon(include_self = true) {|_self| ... } ⇒ Object
Perform block for each daemon, including the chief daemon if include_self
.
124 125 126 127 |
# File 'lib/miga/lair.rb', line 124 def each_daemon(include_self = true) yield(self) if include_self each_project { |project| yield(MiGA::Daemon.new(project)) } end |
#each_project(dir = path) ⇒ Object
Perform block for each project in the dir
directory, passing the absolute path of the project to the block. Searches for MiGA projects recursively in all subdirectories that are not MiGA projects.
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/miga/lair.rb', line 105 def each_project(dir = path) Dir.entries(dir).each do |f| next if %w[. ..].include?(f) # Ruby <= 2.3 doesn't have Dir.children f = File.join(dir, f) if MiGA::Project.exist? f project = MiGA::Project.load(f) raise "Cannot load project: #{f}" if project.nil? yield(project) unless [:exclude].include?(project.name) elsif Dir.exist? f each_project(f) { |p| yield(p) } end end end |
#launch_daemon(project) ⇒ Object
Launch daemon for the MiGA::Project project
147 148 149 150 151 152 153 154 155 |
# File 'lib/miga/lair.rb', line 147 def launch_daemon(project) say "Launching daemon: #{project.path}" d = MiGA::Daemon.new(project, [:json]) d.runopts(:shutdown_when_done, true) unless [:keep_inactive] unless [:dry] d.start sleep(1) # <- to make sure the daemon started up (it takes about 0.1 secs) end end |
#terminate_daemon(daemon) ⇒ Object
Send termination message to daemon
, an object implementing MiGA::Common::WithDaemon
92 93 94 95 96 97 98 |
# File 'lib/miga/lair.rb', line 92 def terminate_daemon(daemon) say "Probing #{daemon.class} #{daemon.daemon_home}" if daemon.active? say 'Sending termination message' FileUtils.touch(daemon.terminate_file) end end |