Skip to content

Commit 7e603be

Browse files
authored
Merge pull request #1024 from sul-dlss/update-with-globus
Recreate Globus directory on update
2 parents cdf5400 + 425b140 commit 7e603be

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

app/services/versioned_files_service/globus.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,21 @@ def link_all_druids
1212
end
1313
end
1414

15+
# This method can take up to 1 minute to run for druids with many files.
16+
# For example bf070wx6289 has 36,789 files and took 58 seconds to run linking.
1517
def link_druid(druid)
1618
object = VersionedFilesService::Object.new(druid)
1719
link_globus_files(object)
1820
end
1921

22+
def globus_path_for(druid)
23+
DruidTools::PurlDruid.new(druid, @globus_root).pathname
24+
end
25+
26+
def globus_druid?(druid)
27+
@druid_list.include?(druid)
28+
end
29+
2030
private
2131

2232
def link_globus_files(object)
@@ -33,9 +43,5 @@ def link_globus_files(object)
3343
LinkSupport.link(source_file_path, globus_file_path)
3444
end
3545
end
36-
37-
def globus_path_for(druid)
38-
DruidTools::PurlDruid.new(druid, @globus_root).pathname
39-
end
4046
end
4147
end

app/services/versioned_files_service/update_action.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ def call
3636
PurgeContentAction.new(object: @object).call
3737

3838
ClearImageserverCache.call(druid: cocina.externalIdentifier, cocina_type: cocina.type, file_names: file_transfers.keys)
39+
40+
update_globus_links
3941
end
4042

4143
private
@@ -47,6 +49,22 @@ def call
4749
:head_version,
4850
to: :@object
4951

52+
def update_globus_links
53+
return unless Settings.filesystems.globus_root
54+
55+
druid_id = DruidTools::Druid.new(@object.druid).id
56+
globus_service = VersionedFilesService::Globus.new
57+
58+
return unless globus_service.globus_druid?(druid_id)
59+
60+
# Remove existing Globus hardlinks or files for the druid
61+
# E.g. delete /stacks/globus/bf/070/wx/6289/
62+
FileUtils.rm_rf(globus_service.globus_path_for(druid_id))
63+
64+
# Create new Globus links for the druid
65+
globus_service.link_druid(druid_id)
66+
end
67+
5068
def check_content_files!
5169
shelve_file_map.each do |filename, md5|
5270
next if content_md5s.include?(md5)

spec/services/versioned_files_service_spec.rb

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44

55
RSpec.describe VersionedFilesService do
66
let(:service) { described_class.new(druid:) }
7-
let(:druid) { 'druid:bc123df4567' }
7+
# Use a globus druid for testing
8+
let(:druid) { 'druid:bf070wx6289' }
89

910
let(:purl_pathname) { 'tmp/purl_root' }
1011
let(:stacks_pathname) { 'tmp/stacks' }
12+
let(:globus_pathname) { 'tmp/stacks/globus' }
1113

12-
let(:content_path) { "#{stacks_pathname}/bc/123/df/4567/bc123df4567/content" }
13-
let(:versions_path) { "#{stacks_pathname}/bc/123/df/4567/bc123df4567/versions" }
14-
let(:stacks_object_path) { "#{stacks_pathname}/bc/123/df/4567" }
14+
let(:content_path) { "#{stacks_pathname}/bf/070/wx/6289/bf070wx6289/content" }
15+
let(:versions_path) { "#{stacks_pathname}/bf/070/wx/6289/bf070wx6289/versions" }
16+
let(:stacks_object_path) { "#{stacks_pathname}/bf/070/wx/6289" }
1517

1618
before do
17-
allow(Settings.filesystems).to receive_messages(stacks_root: stacks_pathname, purl_root: purl_pathname)
19+
allow(Settings.filesystems).to receive_messages(stacks_root: stacks_pathname, purl_root: purl_pathname, globus_root: globus_pathname)
1820
FileUtils.rm_rf(stacks_pathname)
1921
FileUtils.rm_rf(purl_pathname)
2022
end
@@ -55,6 +57,7 @@
5557
type: Cocina::Models::ObjectType.file,
5658
label: 'the regular file',
5759
filename: 'file2.txt',
60+
size: 9,
5861
version: 1,
5962
hasMessageDigests: [
6063
{ type: 'md5', digest: '3e25960a79dbc69b674cd4ec67a72c62' }
@@ -69,6 +72,7 @@
6972
type: Cocina::Models::ObjectType.file,
7073
label: 'the hierarchical file',
7174
filename: 'files/file2.txt',
75+
size: 9,
7276
version: 1,
7377
hasMessageDigests: [
7478
{ type: 'md5', digest: '5997de4d5abb55f21f652aa61b8f3aaf' }
@@ -115,6 +119,7 @@
115119
type: Cocina::Models::ObjectType.file,
116120
label: 'not shelved file',
117121
filename: 'not_shelved.txt',
122+
size: 9,
118123
version: 1,
119124
hasMessageDigests: [
120125
{ type: 'md5', digest: '4f25960a79dbc69b674cd4ec67a72c73' }
@@ -129,6 +134,7 @@
129134
type: Cocina::Models::ObjectType.file,
130135
label: 'the regular file',
131136
filename: 'file2.txt',
137+
size: 9,
132138
version: 1,
133139
hasMessageDigests: [
134140
{ type: 'md5', digest: '3e25960a79dbc69b674cd4ec67a72c62' }
@@ -143,6 +149,7 @@
143149
type: Cocina::Models::ObjectType.file,
144150
label: 'the hierarchical file',
145151
filename: 'files/file2.txt',
152+
size: 9,
146153
version: 1,
147154
hasMessageDigests: [
148155
{ type: 'md5', digest: '5997de4d5abb55f21f652aa61b8f3aaf' }
@@ -161,6 +168,8 @@
161168

162169
let(:file_transfers) { { 'file2.txt' => 'd7e54aed-c0c4-48af-af93-bc673f079f9a', 'files/file2.txt' => '7f807e3c-4cde-4b6d-8e76-f24455316a01' } }
163170

171+
let(:globus_object_path) { "#{globus_pathname}/bf/070/wx/6289" }
172+
164173
before do
165174
write_file_transfers(file_transfers:, access_transfer_stage:)
166175
end
@@ -192,6 +201,10 @@
192201
# Symlinks to stacks filesystem
193202
expect("#{stacks_object_path}/file2.txt").to link_to("#{content_path}/3e25960a79dbc69b674cd4ec67a72c62")
194203
expect("#{stacks_object_path}/files/file2.txt").to link_to("#{content_path}/5997de4d5abb55f21f652aa61b8f3aaf")
204+
205+
# Hardlinks to globus filesystem
206+
expect(File).to exist("#{globus_object_path}/file2.txt")
207+
expect(File).to exist("#{globus_object_path}/files/file2.txt")
195208
end
196209
end
197210

@@ -212,6 +225,7 @@
212225
type: Cocina::Models::ObjectType.file,
213226
label: 'the to be removed file',
214227
filename: 'file1.txt',
228+
size: 9,
215229
version: 1,
216230
hasMessageDigests: [
217231
{ type: 'md5', digest: '327d41a48b459a2807d750324bd864ce' }
@@ -226,6 +240,7 @@
226240
type: Cocina::Models::ObjectType.file,
227241
label: 'the regular file',
228242
filename: 'file2.txt',
243+
size: 9,
229244
version: 1,
230245
hasMessageDigests: [
231246
{ type: 'md5', digest: '3e25960a79dbc69b674cd4ec67a72c62' }
@@ -240,6 +255,7 @@
240255
type: Cocina::Models::ObjectType.file,
241256
label: 'the hierarchical file',
242257
filename: 'files/file2.txt',
258+
size: 9,
243259
version: 1,
244260
hasMessageDigests: [
245261
{ type: 'md5', digest: '5997de4d5abb55f21f652aa61b8f3aaf' }
@@ -276,6 +292,7 @@
276292
type: Cocina::Models::ObjectType.file,
277293
label: 'the regular file',
278294
filename: 'file2.txt',
295+
size: 9,
279296
version: 1,
280297
hasMessageDigests: [
281298
{ type: 'md5', digest: '4f35960a79dbc69b674cd4ec67a72d73' }
@@ -290,6 +307,7 @@
290307
type: Cocina::Models::ObjectType.file,
291308
label: 'the hierarchical file',
292309
filename: 'files/file2.txt',
310+
size: 9,
293311
version: 1,
294312
hasMessageDigests: [
295313
{ type: 'md5', digest: '5997de4d5abb55f21f652aa61b8f3aaf' }
@@ -304,6 +322,7 @@
304322
type: Cocina::Models::ObjectType.file,
305323
label: 'the new file',
306324
filename: 'file3.txt',
325+
size: 9,
307326
version: 1,
308327
hasMessageDigests: [
309328
{ type: 'md5', digest: '6007de4d5abb55f21f652aa61b8f3bbg' }
@@ -386,6 +405,7 @@
386405
type: Cocina::Models::ObjectType.file,
387406
label: 'the to be removed file',
388407
filename: 'file1.txt',
408+
size: 9,
389409
version: 1,
390410
hasMessageDigests: [
391411
{ type: 'md5', digest: '327d41a48b459a2807d750324bd864ce' }
@@ -400,6 +420,7 @@
400420
type: Cocina::Models::ObjectType.file,
401421
label: 'the regular file',
402422
filename: 'file2.txt',
423+
size: 9,
403424
version: 1,
404425
hasMessageDigests: [
405426
{ type: 'md5', digest: '3e25960a79dbc69b674cd4ec67a72c62' }
@@ -436,6 +457,7 @@
436457
type: Cocina::Models::ObjectType.file,
437458
label: 'the regular file',
438459
filename: 'file2.txt',
460+
size: 9,
439461
version: 1,
440462
hasMessageDigests: [
441463
{ type: 'md5', digest: '3e25960a79dbc69b674cd4ec67a72c62' }

0 commit comments

Comments
 (0)