[ARVADOS] created: 0211e7c4e89dd855c6bb2628465902bc1f397ee9
Git user
git at public.curoverse.com
Mon Sep 26 16:54:07 EDT 2016
at 0211e7c4e89dd855c6bb2628465902bc1f397ee9 (commit)
commit 0211e7c4e89dd855c6bb2628465902bc1f397ee9
Author: Tom Clegg <tom at curoverse.com>
Date: Mon Sep 26 16:54:00 2016 -0400
9848: Copy the output and log collections (if any) when finalizing a container request.
When reusing a container, ensure log and output are readable.
diff --git a/services/api/app/models/container.rb b/services/api/app/models/container.rb
index c1c3eae..152da06 100644
--- a/services/api/app/models/container.rb
+++ b/services/api/app/models/container.rb
@@ -87,10 +87,34 @@ class Container < ArvadosModel
where('mounts = ?', self.deep_sort_hash(attrs[:mounts]).to_yaml).
where('runtime_constraints = ?', self.deep_sort_hash(attrs[:runtime_constraints]).to_yaml)
- # Check for Completed candidates that only had consistent outputs.
+ # Check for Completed candidates that had consistent outputs.
completed = candidates.where(state: Complete).where(exit_code: 0)
- if completed.select("output").group('output').limit(2).length == 1
- return completed.order('finished_at asc').limit(1).first
+ outputs = completed.select('output').group('output').limit(2)
+ if outputs.count != 1
+ Rails.logger.debug("Found #{outputs.count} different outputs")
+ elsif Collection.
+ readable_by(current_user).
+ where(portable_data_hash: outputs.first).
+ count < 1
+ Rails.logger.info("Found reusable container(s) " +
+ "but output #{outputs.first} is not readable " +
+ "by user #{current_user.uuid}")
+ else
+ # Return the oldest eligible container whose log is still
+ # present and readable by current_user.
+ readable_pdh = Collection.
+ readable_by(current_user).
+ select('portable_data_hash')
+ completed = completed.
+ where("log in (#{readable_pdh.to_sql})").
+ order('finished_at asc').
+ limit(1)
+ if completed.first
+ return completed.first
+ else
+ Rails.logger.info("Found reusable container(s) but none with a log " +
+ "readable by user #{current_user.uuid}")
+ end
end
# Check for Running candidates and return the most likely to finish sooner.
diff --git a/services/api/app/models/container_request.rb b/services/api/app/models/container_request.rb
index 872b3c5..a4ac314 100644
--- a/services/api/app/models/container_request.rb
+++ b/services/api/app/models/container_request.rb
@@ -64,10 +64,21 @@ class ContainerRequest < ArvadosModel
%w(modified_by_client_uuid container_uuid requesting_container_uuid)
end
+ # Finalize the container request after the container has
+ # finished/cancelled.
def container_completed!
- # may implement retry logic here in the future.
- self.state = ContainerRequest::Final
- self.save!
+ update_attributes!(state: ContainerRequest::Final)
+ c = Container.find_by_uuid(container_uuid)
+ ['output', 'log'].each do |out_type|
+ pdh = c.send(out_type)
+ next if pdh.nil?
+ manifest = Collection.where(portable_data_hash: pdh).first.manifest_text
+ Collection.create!(owner_uuid: owner_uuid,
+ manifest_text: manifest,
+ portable_data_hash: pdh,
+ name: "Container #{out_type} for request #{uuid}",
+ properties: {type: out_type, container_request: uuid})
+ end
end
protected
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list