diff --git a/swift/obj/replicator.py b/swift/obj/replicator.py index 97350ca870..477b276661 100644 --- a/swift/obj/replicator.py +++ b/swift/obj/replicator.py @@ -595,7 +595,7 @@ class ObjectReplicator(Daemon): self.logger.info("Unable to lock handoff partition %s for " "replication on device %s policy %d", job['partition'], job['device'], - int(job['policy'])) + job['policy']) self.logger.increment('partition.lock-failure.count') except (Exception, Timeout): self.logger.exception(_("Error syncing handoff partition")) diff --git a/test/unit/obj/test_replicator.py b/test/unit/obj/test_replicator.py index c7afc40536..d25c25490c 100644 --- a/test/unit/obj/test_replicator.py +++ b/test/unit/obj/test_replicator.py @@ -40,6 +40,7 @@ from swift.common import ring from swift.common.recon import RECON_OBJECT_FILE from swift.obj import diskfile, replicator as object_replicator from swift.common.storage_policy import StoragePolicy, POLICIES +from swift.common.exceptions import PartitionLockTimeout def _ips(*args, **kwargs): @@ -2118,6 +2119,20 @@ class TestObjectReplicator(unittest.TestCase): # After 10 cycles every partition is seen exactly once self.assertEqual(sorted(range(partitions)), sorted(seen)) + def test_update_deleted_partition_lock_timeout(self): + self.replicator.handoffs_remaining = 0 + jobs = self.replicator.collect_jobs() + delete_jobs = [j for j in jobs if j['delete']] + delete_jobs.sort(key=lambda j: j['policy']) + job = delete_jobs[0] + df_mgr = self.replicator._df_router[job['policy']] + with mock.patch.object(df_mgr, 'partition_lock', + side_effect=PartitionLockTimeout): + self.replicator.update_deleted(job) + logs = self.logger.get_lines_for_level('info') + self.assertEqual(['Unable to lock handoff partition 1 for ' + 'replication on device sda policy 0'], logs) + def test_replicate_skipped_partpower_increase(self): _create_test_rings(self.testdir, next_part_power=4) self.replicator.replicate()