Mixed versions of liberasurecode leads to quarantined fragments
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
OpenStack Object Storage (swift) |
Fix Released
|
Undecided
|
Unassigned | ||
liberasurecode |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
If you've got a proxy-server on liberasurecode 1.6.0 or later and an object-server on liberasurecode 1.5.0 or earlier, clients can write data that then can't be read:
$ swift upload cont obj
obj
$ swift download cont obj --no-download
Object 'cont/obj' not found
object-server logs show frags getting quarantined:
Jul 2 18:07:34 saio object-6046: STDERR: Traceback (most recent call last):
File ".../swift/
self.
File ".../pyeclib/
return self.ec_
File ".../pyeclib/
formatted)
pyeclib.
Fragment integrity check failed. Please inspect syslog for liberasurecode error report.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File ".../eventlet/
for data in result:
File ".../swift/
self.close()
File ".../swift/
self.
File ".../swift/
self.
File ".../swift/
raise DiskFileQuarant
swift.
(txn: txf593f19270234
This falls out of our resolution to bug #1666320 in https:/
Note that this is only a problem *if your servers were using libec's alternative CRC*. If they're using zlib pre-upgrade, the upgrade should be seamless.
Also note that changing the order in which you upgrade things isn't sufficient to avoid the issue:
* If you upgrade all object servers before all proxies, you may still have the reconstructor write fragments that the proxies can't read.
* When upgrading a fleet of proxies, you will have upgraded proxies writing down data that not-yet-upgraded proxies can't read.
Of course, when the proxy can't read the frag, it won't quarantine anything (for obvious reasons). It'll respond 500 and log tracebacks like
Jul 2 19:11:27 saio proxy-server: Error decoding fragments for '/AUTH_ test/cont/ obj': proxy/controlle rs/obj. py", line 1430, in _decode_ segments_ from_fragments pyeclib_ driver. decode( fragments) ec_iface. py", line 292, in decode metadata_ checks) core.py" , line 87, in decode checks) ec_iface. ECInvalidFragme ntMetadata: pyeclib_c_decode ERROR: Fragment integrity check failed. Please inspect syslog for liberasurecode error report. (txn: tx2dd3ad4ff3704 7689a3b8- 005efe315f) (client_ip: 127.0.0.1) proxy/server. py", line 572, in handle_request proxy/controlle rs/base. py", line 291, in wrapped proxy/controlle rs/obj. py", line 264, in GET proxy/controlle rs/obj. py", line 252, in GETorHEAD or_head_ response( req, node_iter, partition, policy) proxy/controlle rs/obj. py", line 2426, in _get_or_ head_response iter.kickoff( req, resp) proxy/controlle rs/obj. py", line 1085, in kickoff stashed_ iter = reiterate( self._real_ iter(req, resp.headers)) common/ utils.py" , line 4010, in reiterate common/ utils.py" , line 4711, in string_along proxy/controlle rs/obj. py", line 1366, in _iter_one_range segment_ iter): proxy/controlle rs/obj. py", line 1430, in _decode_ segments_ from_fragments pyeclib_ driver. decode( fragments) ec_iface. py", line 292, in decode metadata_ checks) core.py" , line 87, in decode checks) ec_iface. ECInvalidFragme ntMetadata: pyeclib_c_decode ERROR: Fragment integrity check failed. Please inspect syslog for liberasurecode error report. (txn: tx2dd3ad4ff3704 7689a3b8- 005efe315f) (client_ip: 127.0.0.1)
Traceback (most recent call last):
File ".../swift/
segment = self.policy.
File ".../pyeclib/
force_
File ".../pyeclib/
fragment_len, ranges, force_metadata_
pyeclib.
Jul 2 19:11:27 saio proxy-server: ERROR Unhandled exception in request:
Traceback (most recent call last):
File ".../swift/
return handler(req)
File ".../swift/
return func(*a, **kw)
File ".../swift/
return self.GETorHEAD(req)
File ".../swift/
resp = self._get_
File ".../swift/
app_
File ".../swift/
self.
File ".../swift/
chunk = next(iterator)
File ".../swift/
for x in useful_iter:
File ".../swift/
for i, next_seg in enumerate(
File ".../swift/
segment = self.policy.
File ".../pyeclib/
force_
File ".../pyeclib/
fragment_len, ranges, force_metadata_
pyeclib.