Repository: rucio/rucio

Issue:
Default checksum algorithms not triggered
Motivation
----------
If the custom checksum support RSE attribute `supported_checksums` is not set, the RSE is by default defined compatible with the standard checksum algorithms.

Due to how `get_rse_attribute` works, when `supported_checksums` is not found, an empty string containing is returned instead of a `None` string.

The following logic assumed to have an `None` string, instead of a string formatted like that.


Modification
------------

Update the logic to sense such behavior and return the standard `GLOBALLY_SUPPORTED_CHECKSUMS` list in that case.



Discussion:

Resolving patch:
diff --git a/lib/rucio/core/rse.py b/lib/rucio/core/rse.py
--- a/lib/rucio/core/rse.py
+++ b/lib/rucio/core/rse.py
@@ -550,15 +550,14 @@ def get_rse_supported_checksums(rse_id=None, session=None):
               Use 'none' to explicitly tell the RSE does not support any checksum algorithm.
     """
 
-    # each checksum is formatted as: ["[u'adler32']"]
-    supported_checksum_list = str(get_rse_attribute(CHECKSUM_KEY, rse_id=rse_id, session=session)) \
-        .replace('[u\'', '') \
-        .replace('\']', '') \
-        .split(',')
+    checksum_support_attribute_list = get_rse_attribute(key=CHECKSUM_KEY, rse_id=rse_id, session=session)
 
-    if not supported_checksum_list:
+    if not checksum_support_attribute_list:
         return GLOBALLY_SUPPORTED_CHECKSUMS
     else:
+        supported_checksum_list = checksum_support_attribute_list[0].split(',')
+        if 'none' in supported_checksum_list:
+            return []
         return supported_checksum_list
 
 
diff --git a/lib/rucio/daemons/conveyor/common.py b/lib/rucio/daemons/conveyor/common.py
--- a/lib/rucio/daemons/conveyor/common.py
+++ b/lib/rucio/daemons/conveyor/common.py
@@ -265,32 +265,24 @@ def bulk_group_transfer(transfers, policy='rule', group_bulk=200, source_strateg
         source_supported_checksums = get_rse_supported_checksums(rse_id=source_rse_id, session=session)
         common_checksum_names = set(source_supported_checksums).intersection(dest_supported_checksums)
 
-        logging.info('source RSE checksum compatibility: {}'.format(source_supported_checksums))
-        logging.info('destination RSE checksum compatibility: {}'.format(dest_supported_checksums))
-
         if source_supported_checksums == ['none']:
             if dest_supported_checksums == ['none']:
                 # both endpoints support none
                 verify_checksum = 'none'
-                logging.info('Skipping checksum verification.')
             else:
                 # src supports none but dst does
                 verify_checksum = 'destination'
-                logging.info('Verifying checksum only at destination.')
         else:
             if dest_supported_checksums == ['none']:
                 # source supports some but destination does not
                 verify_checksum = 'source'
-                logging.info('Verifying checksum only at source.')
             else:
                 if len(common_checksum_names) == 0:
                     # source and dst support some bot none in common (dst priority)
                     verify_checksum = 'destination'
-                    logging.info('Verifying checksum only at destination.')
                 else:
                     # source and dst have some in common
                     verify_checksum = 'both'
-                    logging.info('Verifying checksum at both ends.')
 
         t_file = {'sources': transfer['sources'],
                   'destinations': transfer['dest_urls'],
@@ -310,10 +302,6 @@ def bulk_group_transfer(transfers, policy='rule', group_bulk=200, source_strateg
             if verify_checksum == 'destination':
                 set_checksum_value(t_file, dest_supported_checksums)
 
-            logging.info('Checksum set to: {}'.format(t_file['checksum']))
-        else:
-            logging.info('Checksum empty since skipping checksum verification')
-
         multihop = transfer.get('multihop', False)
 
         external_host = transfer['external_host']


Test patch: