2016-10-27 10:07:58 |
John Dickinson |
description |
In an environment >= 2 *EC* policies deployed, object-reconstructor can get an unhandled "ZeroDivisionError" shown in the log.
This seems to be triggered due to count mismatch among device_count, part_count and reconstuction_device_count.
Both part_count and reconstruction_device_count seems calculated as total number of devices in all policies but device_count looks to be set as the number of devices for the last policy while collecting reconstruction parts. And then, if Swift has many EC policies and few partitions are in the policies, the code[1] will be under 1 and python integer will truncate/round it as 0.
1: https://github.com/openstack/swift/blob/master/swift/obj/reconstructor.py#L351-L353
Traceback:
"/usr/local/bin/swift-object-reconstructor", line 31, in <module>#012 run_daemon(ObjectReconstructor, conf_file, **options)#012 File "/usr/local/lib/python2.7/dist-packages/swift/common/daemon.py", line 110, in run_daemon#012 klass(conf).run(once=once, **kwargs)#012 File "/usr/local/lib/python2.7/dist-packages/swift/common/daemon.py", line 55, in run#012 self.run_once(**kwargs)#012 File "/usr/local/lib/python2.7/dist-packages/swift/obj/reconstructor.py", line 943, in run_once#012 override_partitions=override_partitions)#012 File "/usr/local/lib/python2.7/dist-packages/swift/obj/reconstructor.py", line 933, in reconstruct#012 self.stats_line()#012 File "/usr/local/lib/python2.7/dist-packages/swift/obj/reconstructor.py", line 371, in stats_line#012 total_part_count)})#012 File "/usr/local/lib/python2.7/dist-packages/swift/common/utils.py", line 1946, in compute_eta#012 completion = (float(current_value) / final_value) or 0.00001#012ZeroDivisionError: float division by zero
Affected: since Liberty |
In an environment >= 2 *EC* policies deployed, object-reconstructor can get an unhandled "ZeroDivisionError" shown in the log.
This seems to be triggered due to count mismatch among device_count, part_count and reconstuction_device_count.
Both part_count and reconstruction_device_count seems calculated as total number of devices in all policies but device_count looks to be set as the number of devices for the last policy while collecting reconstruction parts. And then, if Swift has many EC policies and few partitions are in the policies, the code[1] will be under 1 and python integer will truncate/round it as 0.
1: https://github.com/openstack/swift/blob/master/swift/obj/reconstructor.py#L351-L353
Traceback:
"/usr/local/bin/swift-object-reconstructor", line 31, in <module>
run_daemon(ObjectReconstructor, conf_file, **options)
File "/usr/local/lib/python2.7/dist-packages/swift/common/daemon.py", line 110, in run_daemon
klass(conf).run(once=once, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/swift/common/daemon.py", line 55, in run
self.run_once(**kwargs)
File "/usr/local/lib/python2.7/dist-packages/swift/obj/reconstructor.py", line 943, in run_once
override_partitions=override_partitions)
File "/usr/local/lib/python2.7/dist-packages/swift/obj/reconstructor.py", line 933, in reconstruct
self.stats_line()
File "/usr/local/lib/python2.7/dist-packages/swift/obj/reconstructor.py", line 371, in stats_line
total_part_count)})
File "/usr/local/lib/python2.7/dist-packages/swift/common/utils.py", line 1946, in compute_eta
completion = (float(current_value) / final_value) or 0.00001
ZeroDivisionError: float division by zero
Affected: since Liberty |
|