Skip to content

Commit 2128cb3

Browse files
d-w-moorealanking
authored andcommitted
[#3][irods/irods#5927] test_repave_replica now passes in iRODS >= 4.2.12
PRC post PUT replication still does emulate the PUT api's after-the-fact replication, and for test_repave_replicas to pass post-4.2.11, it was merely necessary to remove REG_CHKSUM from the keywords active for REPL.
1 parent 572564b commit 2128cb3

File tree

4 files changed

+80
-57
lines changed

4 files changed

+80
-57
lines changed

irods/exception.py

+8
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,10 @@ class SYS_REPLICA_DOES_NOT_EXIST(iRODSException):
558558
code = -164000
559559

560560

561+
class SYS_NOT_ALLOWED(iRODSException):
562+
code = -169000
563+
564+
561565
class UserInputException(iRODSException):
562566
pass
563567

@@ -758,6 +762,10 @@ class LOCKED_DATA_OBJECT_ACCESS(SystemException):
758762
code = -406000
759763

760764

765+
class USER_INCOMPATIBLE_PARAMS(iRODSException):
766+
code = -402000
767+
768+
761769
class CHECK_VERIFICATION_RESULTS(SystemException):
762770
code = -407000
763771

irods/manager/data_object_manager.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,14 @@ def put(self, local_path, irods_path, return_data_object = False, num_threads =
161161
for chunk in chunks(f, self.WRITE_BUFFER_SIZE):
162162
o.write(chunk)
163163
if kw.ALL_KW in options:
164-
options[kw.UPDATE_REPL_KW] = ''
165-
self.replicate(obj, **options)
164+
repl_options = options.copy()
165+
repl_options[kw.UPDATE_REPL_KW] = ''
166+
# Leaving REG_CHKSUM_KW set would raise the error:
167+
# Requested to register checksum without verifying, but source replica has a checksum. This can result
168+
# in multiple replicas being marked good with different checksums, which is an inconsistency.
169+
del repl_options[kw.REG_CHKSUM_KW]
170+
self.replicate(obj, **repl_options)
171+
166172

167173
if return_data_object:
168174
return self.get(obj)

irods/session.py

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import absolute_import
22
import os
3+
import ast
34
import json
45
import errno
56
import logging
@@ -158,6 +159,13 @@ def port(self):
158159

159160
@property
160161
def server_version(self):
162+
try:
163+
reported_vsn = os.environ.get("PYTHON_IRODSCLIENT_REPORTED_SERVER_VERSION","")
164+
return tuple(ast.literal_eval(reported_vsn))
165+
except SyntaxError: # environment variable was malformed, empty, or unset
166+
return self.__server_version()
167+
168+
def __server_version(self):
161169
try:
162170
conn = next(iter(self.pool.active))
163171
return conn.server_version

irods/test/data_obj_test.py

+56-55
Original file line numberDiff line numberDiff line change
@@ -932,69 +932,70 @@ def test_replica_number(self):
932932

933933
def test_repave_replicas(self):
934934
# Can't do one step open/create with older servers
935-
if self.sess.server_version <= (4, 1, 4):
935+
server_vsn = self.sess.server_version
936+
if server_vsn <= (4, 1, 4):
936937
self.skipTest('For iRODS 4.1.5 and newer')
938+
try:
939+
number_of_replicas = 7
940+
session = self.sess
941+
zone = session.zone
942+
username = session.username
943+
test_dir = '/tmp'
944+
filename = 'repave_replica_test_file.txt'
945+
test_file = os.path.join(test_dir, filename)
946+
obj_path = '/{zone}/home/{username}/{filename}'.format(**locals())
947+
ufs_resources = []
948+
949+
# make test file
950+
obj_content = u'foobar'
951+
checksum = base64.b64encode(hashlib.sha256(obj_content.encode('utf-8')).digest()).decode()
952+
with open(test_file, 'w') as f:
953+
f.write(obj_content)
954+
955+
# put test file onto default resource
956+
options = {kw.REG_CHKSUM_KW: ''}
957+
session.data_objects.put(test_file, obj_path, **options)
958+
959+
# make ufs resources and replicate object
960+
for i in range(number_of_replicas):
961+
resource_name = unique_name(my_function_name(),i)
962+
resource_type = 'unixfilesystem'
963+
resource_host = session.host
964+
resource_path = '/tmp/{}'.format(resource_name)
965+
ufs_resources.append(session.resources.create(
966+
resource_name, resource_type, resource_host, resource_path))
937967

938-
number_of_replicas = 7
939-
session = self.sess
940-
zone = session.zone
941-
username = session.username
942-
test_dir = '/tmp'
943-
filename = 'repave_replica_test_file.txt'
944-
test_file = os.path.join(test_dir, filename)
945-
obj_path = '/{zone}/home/{username}/{filename}'.format(**locals())
946-
947-
# make test file
948-
obj_content = u'foobar'
949-
checksum = base64.b64encode(hashlib.sha256(obj_content.encode('utf-8')).digest()).decode()
950-
with open(test_file, 'w') as f:
951-
f.write(obj_content)
952-
953-
# put test file onto default resource
954-
options = {kw.REG_CHKSUM_KW: ''}
955-
session.data_objects.put(test_file, obj_path, **options)
956-
957-
# make ufs resources and replicate object
958-
ufs_resources = []
959-
for i in range(number_of_replicas):
960-
resource_name = unique_name(my_function_name(),i)
961-
resource_type = 'unixfilesystem'
962-
resource_host = session.host
963-
resource_path = '/tmp/{}'.format(resource_name)
964-
ufs_resources.append(session.resources.create(
965-
resource_name, resource_type, resource_host, resource_path))
966-
967-
session.data_objects.replicate(obj_path, resource=resource_name)
968-
969-
# refresh object
970-
obj = session.data_objects.get(obj_path)
968+
session.data_objects.replicate(obj_path, resource=resource_name)
971969

972-
# verify each replica's checksum
973-
for replica in obj.replicas:
974-
self.assertEqual(replica.checksum, 'sha2:{}'.format(checksum))
970+
# refresh object
971+
obj = session.data_objects.get(obj_path)
975972

976-
# now repave test file
977-
obj_content = u'bar'
978-
checksum = base64.b64encode(hashlib.sha256(obj_content.encode('utf-8')).digest()).decode()
979-
with open(test_file, 'w') as f:
980-
f.write(obj_content)
973+
# verify each replica's checksum
974+
for replica in obj.replicas:
975+
self.assertEqual(replica.checksum, 'sha2:{}'.format(checksum))
981976

982-
# update all replicas
983-
options = {kw.REG_CHKSUM_KW: '', kw.ALL_KW: ''}
984-
session.data_objects.put(test_file, obj_path, **options)
985-
obj = session.data_objects.get(obj_path)
977+
# now repave test file
978+
obj_content = u'bar'
979+
checksum = base64.b64encode(hashlib.sha256(obj_content.encode('utf-8')).digest()).decode()
980+
with open(test_file, 'w') as f:
981+
f.write(obj_content)
986982

987-
# verify each replica's checksum
988-
for replica in obj.replicas:
989-
self.assertEqual(replica.checksum, 'sha2:{}'.format(checksum))
983+
options = {kw.REG_CHKSUM_KW: '', kw.ALL_KW: ''}
984+
session.data_objects.put(test_file, obj_path, **options)
985+
obj = session.data_objects.get(obj_path)
990986

991-
# remove object
992-
obj.unlink(force=True)
993-
994-
# remove ufs resources
995-
for resource in ufs_resources:
996-
resource.remove()
987+
# verify each replica's checksum
988+
for replica in obj.replicas:
989+
self.assertEqual(replica.checksum, 'sha2:{}'.format(checksum))
997990

991+
finally:
992+
# remove data object
993+
data = self.sess.data_objects
994+
if data.exists(obj_path):
995+
data.unlink(obj_path,force=True)
996+
# remove ufs resources
997+
for resource in ufs_resources:
998+
resource.remove()
998999

9991000
def test_get_replica_size(self):
10001001
session = self.sess

0 commit comments

Comments
 (0)