)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2341420d39d32adc5cdc1b7bbd28e8b4c755fec0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"method just as reasonably have been implemented on the Manager."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Operators will have to verify the existing DEFAULT section"},{"line_number":23,"context_line":"values in their config files to ensure that desired values are used."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Closes-Bug: #1626296"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1a6eadb0_dc95c640","line":23,"updated":"2016-12-13 17:09:21.000000000","message":"I think this could be more explicit - imagine this is read by an operator that is not familiar with the patch. How about:\n\n\"Previously a reclaim_age value in the DEFAULT section of the object-server.conf file would be ignored and only reclaim_age values set in the object-replicator and object-reconstructor sections would be used. With this change a reclaim_age value in the DEFAULT section will be used by the object-replicator and object-reconstructor if values are not set in their respective sections. Operators should therefore verify that any existing reclaim_age option that may be set in the DEFAULT section has the desired value before upgrading.\"","commit_id":"e2e2d52c9057b4f8e61d5c964601b887f42c6968"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"41aafd5b5a1cb51f257b5c6762a6cff4430de559","unresolved":false,"context_lines":[{"line_number":20,"context_line":"method just as reasonably have been implemented on the Manager."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Operators will have to verify the existing DEFAULT section"},{"line_number":23,"context_line":"values in their config files to ensure that desired values are used."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Closes-Bug: #1626296"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1a6eadb0_311dd2bd","line":23,"in_reply_to":"1a6eadb0_dc95c640","updated":"2016-12-14 14:21:27.000000000","message":"Agreed, it needs to be more explicit. This looks good.","commit_id":"e2e2d52c9057b4f8e61d5c964601b887f42c6968"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"2a4c2dd2904d228db45d0de44d59fb723a401a89","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"},{"line_number":27,"context_line":"respective sections. Operators should therefore verify that any existing"},{"line_number":28,"context_line":"reclaim_age option that may be set in the DEFAULT section has the desired"},{"line_number":29,"context_line":"value before upgrading."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"da4df55a_dae84b7f","line":26,"range":{"start_line":24,"start_character":71,"end_line":26,"end_character":64},"updated":"2016-12-23 11:55:53.000000000","message":"I wonder if we should also mention that, DEFAULT section value will be preferred over object-replicator and object-reconstructor section values (when they are not empty). Or is it already common knowledge?","commit_id":"78a65b603c6ba2b9b267f3b73a1017984996de29"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"74738e05de66045aa7d4307988c5f6152824bd2d","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"},{"line_number":27,"context_line":"respective sections. Operators should therefore verify that any existing"},{"line_number":28,"context_line":"reclaim_age option that may be set in the DEFAULT section has the desired"},{"line_number":29,"context_line":"value before upgrading."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"ba5201f7_aee19b9c","line":26,"range":{"start_line":24,"start_character":71,"end_line":26,"end_character":64},"in_reply_to":"ba5201f7_e8bd5bd8","updated":"2017-01-03 11:37:12.000000000","message":"Ah ok. Didn\u0027t think it was different for daemons.\n\nEven so, shouldn\u0027t we modify in this context (of commit msg) -  we\u0027re mentioning \"DEFAULT is used *IF* values are not set in replicator and reconstructor sections\" - which is incorrect?","commit_id":"78a65b603c6ba2b9b267f3b73a1017984996de29"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"69a9494e012cb7d48e50f907279643a6788c2f7d","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"},{"line_number":27,"context_line":"respective sections. Operators should therefore verify that any existing"},{"line_number":28,"context_line":"reclaim_age option that may be set in the DEFAULT section has the desired"},{"line_number":29,"context_line":"value before upgrading."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"ba5201f7_e8bd5bd8","line":26,"range":{"start_line":24,"start_character":71,"end_line":26,"end_character":64},"in_reply_to":"da4df55a_0f5c46ec","updated":"2017-01-03 10:36:20.000000000","message":"That test is verifying that a DEFAULT section value is preferred to the replicator section value. But a DEFAULT section value is NOT preferred over an auditor section value.\n\nhttps://gist.github.com/alistairncoles/7bed18d67d6d9f33cebdf21f08ec7938\n\nIIRC the behaviour in the servers is different because paste does give precedence to the DEFAULT section values. But the daemons use ConfigParser.","commit_id":"78a65b603c6ba2b9b267f3b73a1017984996de29"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"716e2bf3b5d7d05b828c75b639e5cdf7d5f78d4b","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"},{"line_number":27,"context_line":"respective sections. Operators should therefore verify that any existing"},{"line_number":28,"context_line":"reclaim_age option that may be set in the DEFAULT section has the desired"},{"line_number":29,"context_line":"value before upgrading."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"da4df55a_0f5c46ec","line":26,"range":{"start_line":24,"start_character":71,"end_line":26,"end_character":64},"in_reply_to":"da4df55a_c3ee9f8a","updated":"2016-12-23 16:23:53.000000000","message":"We even have a test for it - https://github.com/openstack/swift/blob/master/test/unit/obj/test_auditor.py#L995","commit_id":"78a65b603c6ba2b9b267f3b73a1017984996de29"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0bab2486deed058e11896305501bec688692a6ce","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"},{"line_number":27,"context_line":"respective sections. Operators should therefore verify that any existing"},{"line_number":28,"context_line":"reclaim_age option that may be set in the DEFAULT section has the desired"},{"line_number":29,"context_line":"value before upgrading."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"da4df55a_c3ee9f8a","line":26,"range":{"start_line":24,"start_character":71,"end_line":26,"end_character":64},"in_reply_to":"da4df55a_dae84b7f","updated":"2016-12-23 14:30:08.000000000","message":"I didn\u0027t think that DEFAULT was preferred over section values when they are set for the daemons?","commit_id":"78a65b603c6ba2b9b267f3b73a1017984996de29"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Move documented reclaim_age option to correct location"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The reclaim_age is a DiskFile option, it doesn\u0027t make sense for two"},{"line_number":10,"context_line":"different object services or nodes to use different values."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"I also driveby cleanup the reclaim_age plumbing from get_hashes to"},{"line_number":13,"context_line":"cleanup_ondiks_files since it\u0027s a method on the Manager and has access"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_c714bd45","line":10,"updated":"2017-01-11 16:48:57.000000000","message":"I\u0027m not entirely sure this is true; it seems like there could be value in having separate reclaim ages for replicated vs. EC policies. Say, the reconstructor gets backed up (and requires a longer consistency window) while the replicator\u0027s still humming along just fine. No reason to have those replicated ts inodes tied up unnecessarily.\n\nIt gets messy for the object-server/-auditor, though :-/ I guess they\u0027d need to use the greater of the two? So put the greater in the DEFAULT section and the lesser in the replicator/reconstructor section.","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Move documented reclaim_age option to correct location"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The reclaim_age is a DiskFile option, it doesn\u0027t make sense for two"},{"line_number":10,"context_line":"different object services or nodes to use different values."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"I also driveby cleanup the reclaim_age plumbing from get_hashes to"},{"line_number":13,"context_line":"cleanup_ondiks_files since it\u0027s a method on the Manager and has access"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_72ef4687","line":10,"in_reply_to":"ba5201f7_c714bd45","updated":"2017-01-11 19:25:05.000000000","message":"I think you\u0027re correct that a use-case for such a configuration exists.\n\nHowever; we\u0027ve never supported it on purpose.  You can\u0027t really have different settings per-policy or per-diskfile.\n\nI think that DEFAULT section handling on wsgi/paste services is somewhat confusing [1] - but maybe you could pull off *something* with min/max values?\n\nBest bet would probably be a completely different /etc/swift2 and configure everything on non-conflicting ports - you might be able to pull it off?  But I don\u0027t think we should recommend or attempt to document a configuration like that for this?\n\nIMHO such a configuration is explicitly undocumented and unsupported.  When we tackle per-policy settings - we\u0027ll keep this use-case in mind - and I\u0027m sure we can come up with a clear strategy.\n\n1. http://docs.openstack.org/developer/swift/deployment_guide.html?highlight\u003dconfiguration%20set#general-server-configuration","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":19,"context_line":"timeout doesn\u0027t really need to be coupled with reclaim_age and that"},{"line_number":20,"context_line":"method just as reasonably have been implemented on the Manager."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_15a50e46","line":23,"range":{"start_line":22,"start_character":15,"end_line":23,"end_character":40},"updated":"2017-01-11 16:48:57.000000000","message":"Is this really true? If so, I don\u0027t see how the current patch could work, given that both before and after we\u0027re calling int(conf.get(\u0027reclaim_age\u0027, ...)) ...?\n\nIf not, I think the\n\n\u003e reclaim_age value in the DEFAULT section will be used by the object-replicator and object-reconstructor if values are not set in their respective sections\n\nis already true, in which case I\u0027m not sure we really need this UpgradeImpact section at all.","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"de3b37f5343baf0e7077ebed4de15df30bd356d7","unresolved":false,"context_lines":[{"line_number":20,"context_line":"method just as reasonably have been implemented on the Manager."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_fbf6b88d","line":23,"in_reply_to":"ba5201f7_15a50e46","updated":"2017-01-11 17:43:35.000000000","message":"Yeah this is wrong :\u0027(\n\nThe bug says it correct.  Anyone not setting in DEFAULT wasn\u0027t getting what they want.  We\u0027re not going to try \"fix it\" so each individual section can have it\u0027s own reclaim age because that\u0027s stupid.  If you using the default, and you set it in the replicator section according the docs, sorry but it wasn\u0027t working.  Move it to DEFAULT - that is now the documented and will continue to be the only supported way to use a non-default reclaim age.\n\nTechnically if were using a non-default reclaim age not in the default section it will work slightly *less* after this patch.  So maybe going from not working to seriously not even trying is worth the UpgradeImpact.\n\nThe point is set reclaim age in the DEFAULT section - how hard is that!?  ;)","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":20,"context_line":"method just as reasonably have been implemented on the Manager."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_d80bb322","line":23,"in_reply_to":"ba5201f7_322dbea8","updated":"2017-01-11 19:25:05.000000000","message":"yeah, there\u0027s not really a behavior change here - so sure - fix it now - don\u0027t fix it ever - I don\u0027t care","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a8451ba96259a196854a4b03cd2137cc28bf00b3","unresolved":false,"context_lines":[{"line_number":20,"context_line":"method just as reasonably have been implemented on the Manager."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"UpgradeImpact: Previously a reclaim_age value in the DEFAULT section of the"},{"line_number":23,"context_line":"object-server.conf file would be ignored and only reclaim_age values set in"},{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_322dbea8","line":23,"in_reply_to":"ba5201f7_fbf6b88d","updated":"2017-01-11 19:05:30.000000000","message":"So maybe something like\n\n\u003e UpgradeImpact: If the reclaim_age is currently set in the object-replicator or object-reconstructor sections of object-server.conf, it should be moved to the DEFAULT section. If the object-replicator and object-reconstructor were using different values, the greater should be used for all object services. This may be done before or after upgrading Swift.\n\n? Am I right about that last part?","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":24,"context_line":"the object-replicator and object-reconstructor sections would be used. With"},{"line_number":25,"context_line":"this change a reclaim_age value in the DEFAULT section will be used by the"},{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"},{"line_number":27,"context_line":"respective sections. Operators should therefore verify that any existing"},{"line_number":28,"context_line":"reclaim_age option that may be set in the DEFAULT section has the desired"},{"line_number":29,"context_line":"value before upgrading."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Closes-Bug: #1626296"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_6f092d84","line":29,"range":{"start_line":27,"start_character":21,"end_line":29,"end_character":22},"updated":"2017-01-11 16:48:57.000000000","message":"This seems contradictory to the earlier statement that\n\n\u003e it doesn\u0027t make sense for two different object services or nodes to use different values\n\nIf an operator feels that the DEFAULT reclaim_age is inappropriate, what\u0027s the recourse? Go ahead and add different values to the object-replicator and object-reconstructor sections anyway?","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"object-replicator and object-reconstructor if values are not set in their"},{"line_number":27,"context_line":"respective sections. Operators should therefore verify that any existing"},{"line_number":28,"context_line":"reclaim_age option that may be set in the DEFAULT section has the desired"},{"line_number":29,"context_line":"value before upgrading."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Closes-Bug: #1626296"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ba5201f7_35e5a837","line":29,"in_reply_to":"ba5201f7_6f092d84","updated":"2017-01-11 19:25:05.000000000","message":"Done","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"bc85e3ce1c2817906ddf55ba92aacb291744db68","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"There is no change in behavior - this configuration change can happen"},{"line_number":34,"context_line":"before or after upgrading Swift.  But the desired configuration must be"},{"line_number":35,"context_line":"repsented correctly according to the current documentation."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Closes-Bug: #1626296"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9a57fde8_5e49f9cf","line":35,"updated":"2017-01-12 10:05:40.000000000","message":"Nice! (prefer the version w/o the typos of course ;)","commit_id":"22bc257dd1fac74dce5cdb6789ee0e2a2c4c680f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e97a0e69ace577c75b98711162f3abeaf7680982","unresolved":false,"context_lines":[{"line_number":28,"context_line":"If a non-default reclaim_age is currently configured for any services,"},{"line_number":29,"context_line":"it should be moved to the DEFAULT section. If there are different"},{"line_number":30,"context_line":"non-default values, the greater should be used for all object services"},{"line_number":31,"context_line":"and configured in the DEFAULT section."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"There is no change in behavior - this configuration change can happen"},{"line_number":34,"context_line":"before or after upgrading Swift.  But the desired configuration must be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9a57fde8_c79a79c5","line":31,"updated":"2017-01-12 13:02:49.000000000","message":"see comment at line 33. I might add here:\n\n\"If a reclaim_age value is currently set in the DEFAULT section then it must have the desired value before upgrading object servers.\"\n\nTo most that might of course appear to be a blindingly obvious statement. And the minimum necessary precautionary requirement is that any current value in DEFAULT isn\u0027t stupidly small, but it\u0027s the simplest statement I could come up with that covers us.","commit_id":"f955ff02001662a228ab865f080cc84d4f7ce16e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e97a0e69ace577c75b98711162f3abeaf7680982","unresolved":false,"context_lines":[{"line_number":30,"context_line":"non-default values, the greater should be used for all object services"},{"line_number":31,"context_line":"and configured in the DEFAULT section."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"There is no change in behavior - this configuration change can happen"},{"line_number":34,"context_line":"before or after upgrading Swift.  But the desired configuration must be"},{"line_number":35,"context_line":"represented correctly according to the current documentation."},{"line_number":36,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9a57fde8_4c5eae46","line":33,"updated":"2017-01-12 13:02:49.000000000","message":"I think there is a change in behaviour that could bite an op that has some previously benign craziness in their config file. Note: I admit there is only an impact in a crazy corner case (read on for details...). I tried to get this captured in the previous version of UpgradeImpact text but perhaps did a bad job of communicating it.\n\nBefore, the reclaim_age applied in cleanup_ondisk_files during a DELETE request was one week, always, regardless of anything in conf file. Note that the call to cleanup_ondisk_files from _finalize_put did not specify any reclaim_arg value and so the default arg value\u003dONE_WEEK was used. In this context the reclaim_age (one week) was used to test whether any freshly created tombstone should be reclaimed, which of course never was the case. With this patch, it is whatever you have configured in DEFAULT.\n\nGranted, before this patch the docs never said that reclaim_age could be in the DEFAULT section. But imagine that at some point an op has been messing around with reclaim_age and out of badness set a crazy reclaim_age\u003d0 in DEFAULT section, just to prove to themselves that the sensible value they had set in object-replicator section would take precedence.\n\nNow, before, if you had a reclaim_age\u003d0 in DEFAULT section and a sensible value like a week in object-replicator/reconstructor sections, and delete an object, everything is as you\u0027d expect i.e. you\u0027ll see a tombstone file in the data dir. \n\nWith this patch, the crazy value in the DEFAULT section is no longer ignored in finalize_put-\u003ecleanup_ondisk_files, so when you delete an object with DEFAULT reclaim_age\u003d0, your tombstone gets immediately reclaimed before the DELETE request returns :(\n\nLike I said up front, this is a somewhat contrived and crazy scenario. But I\u0027m noting it for the record because I feel that I failed to communicate before.\n\nProbably addressed by the one sentence addition suggested at line 31","commit_id":"f955ff02001662a228ab865f080cc84d4f7ce16e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"73555f8630c49257489ffecc8f42e6857ee1d7e6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"services and configured only in the [DEFAULT] section."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"If you specify a reclaim_age value in any object related config you"},{"line_number":35,"context_line":"should move it to *only* the [DEFAULT] section before you upgrade.  If"},{"line_number":36,"context_line":"you configure a reclaim_age less that your consistency window you are"},{"line_number":37,"context_line":"likely to be eaten by a Grue."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"7a3c09a3_99dd2073","line":35,"updated":"2017-01-13 15:28:05.000000000","message":"ok, I think this statement covers my concern on patchset 14.","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"73555f8630c49257489ffecc8f42e6857ee1d7e6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"If you specify a reclaim_age value in any object related config you"},{"line_number":35,"context_line":"should move it to *only* the [DEFAULT] section before you upgrade.  If"},{"line_number":36,"context_line":"you configure a reclaim_age less that your consistency window you are"},{"line_number":37,"context_line":"likely to be eaten by a Grue."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Closes-Bug: #1626296"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"7a3c09a3_f95f040c","line":37,"updated":"2017-01-13 15:28:05.000000000","message":"LOL (I had to google)","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"}],"doc/source/deployment_guide.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":228,"context_line":"used by the service are ignored."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"Consider the example of an object storage node.  By convention, configuration"},{"line_number":231,"context_line":"for the object-server, object-updater, object-replicator, and object-auditor"},{"line_number":232,"context_line":"exist in a single file ``/etc/swift/object-server.conf``::"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    [DEFAULT]"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a71b18c_0b61b1a8","side":"PARENT","line":231,"updated":"2016-12-08 17:44:06.000000000","message":"off topic: add object-reconstructor to this list","commit_id":"b36d8d9afedfdd4fd1eb7a5ecdb44aa740e3f7b1"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":228,"context_line":"used by the service are ignored."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"Consider the example of an object storage node.  By convention, configuration"},{"line_number":231,"context_line":"for the object-server, object-updater, object-replicator, and object-auditor"},{"line_number":232,"context_line":"exist in a single file ``/etc/swift/object-server.conf``::"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    [DEFAULT]"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a6eadb0_23cf8457","side":"PARENT","line":231,"in_reply_to":"3a71b18c_0b61b1a8","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"b36d8d9afedfdd4fd1eb7a5ecdb44aa740e3f7b1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":515,"context_line":"disk_chunk_size                  65536       Size of chunks to read/write to disk"},{"line_number":516,"context_line":"container_update_timeout         1           Time to wait while sending a container"},{"line_number":517,"context_line":"                                             update on object update."},{"line_number":518,"context_line":"reclaim_age                      604800      Time elapsed in seconds before the tombstone"},{"line_number":519,"context_line":"                                             file representing a deleted object can be"},{"line_number":520,"context_line":"                                             reclaimed.  This is the maximum window for"},{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a71b18c_b662e0d6","line":518,"updated":"2016-12-08 17:44:06.000000000","message":"this causes a sphinx error and the table is not rendered in the html. The column widths must be \u003c\u003d width of header and footer delimiters, so needs two more -- and \u003d\u003d at top and bottom of column","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":515,"context_line":"disk_chunk_size                  65536       Size of chunks to read/write to disk"},{"line_number":516,"context_line":"container_update_timeout         1           Time to wait while sending a container"},{"line_number":517,"context_line":"                                             update on object update."},{"line_number":518,"context_line":"reclaim_age                      604800      Time elapsed in seconds before the tombstone"},{"line_number":519,"context_line":"                                             file representing a deleted object can be"},{"line_number":520,"context_line":"                                             reclaimed.  This is the maximum window for"},{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a6eadb0_43c5603a","line":518,"in_reply_to":"3a71b18c_b662e0d6","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":520,"context_line":"                                             reclaimed.  This is the maximum window for"},{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"},{"line_number":522,"context_line":"                                             disconnected from the cluster because of a"},{"line_number":523,"context_line":"                                             fault it reintroduced into the cluster after"},{"line_number":524,"context_line":"                                             this window without having it\u0027s data purged"},{"line_number":525,"context_line":"                                             it will result in dark data.  This setting"},{"line_number":526,"context_line":"                                             should be consistent across all object"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a71b18c_0b98d11a","line":523,"updated":"2016-12-08 17:44:06.000000000","message":"s/it/is/","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":520,"context_line":"                                             reclaimed.  This is the maximum window for"},{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"},{"line_number":522,"context_line":"                                             disconnected from the cluster because of a"},{"line_number":523,"context_line":"                                             fault it reintroduced into the cluster after"},{"line_number":524,"context_line":"                                             this window without having it\u0027s data purged"},{"line_number":525,"context_line":"                                             it will result in dark data.  This setting"},{"line_number":526,"context_line":"                                             should be consistent across all object"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a6eadb0_63c25c35","line":523,"in_reply_to":"3a71b18c_0b98d11a","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"},{"line_number":522,"context_line":"                                             disconnected from the cluster because of a"},{"line_number":523,"context_line":"                                             fault it reintroduced into the cluster after"},{"line_number":524,"context_line":"                                             this window without having it\u0027s data purged"},{"line_number":525,"context_line":"                                             it will result in dark data.  This setting"},{"line_number":526,"context_line":"                                             should be consistent across all object"},{"line_number":527,"context_line":"                                             services."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a71b18c_2bb66d8a","line":524,"updated":"2016-12-08 17:44:06.000000000","message":"s/it\u0027s/its/","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"},{"line_number":522,"context_line":"                                             disconnected from the cluster because of a"},{"line_number":523,"context_line":"                                             fault it reintroduced into the cluster after"},{"line_number":524,"context_line":"                                             this window without having it\u0027s data purged"},{"line_number":525,"context_line":"                                             it will result in dark data.  This setting"},{"line_number":526,"context_line":"                                             should be consistent across all object"},{"line_number":527,"context_line":"                                             services."}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a6eadb0_83ddb816","line":524,"in_reply_to":"3a71b18c_2bb66d8a","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e31268f9e370af6136fb3a1ed92555dcd7aef4f9","unresolved":false,"context_lines":[{"line_number":228,"context_line":"used by the service are ignored."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"Consider the example of an object storage node.  By convention, configuration"},{"line_number":231,"context_line":"for the object-server, object-updater, object-replicator, object-auditor and"},{"line_number":232,"context_line":"object-reconstructor exist in a single file ``/etc/swift/object-server.conf``::"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    [DEFAULT]"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a6eadb0_12656fe0","line":231,"updated":"2016-12-19 20:54:40.000000000","message":"nit: The oxford comma got lost here.","commit_id":"907b1383841dfb7be8bf4f50119b27ee5348e918"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":232,"context_line":"object-reconstructor exist in a single file ``/etc/swift/object-server.conf``::"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    [DEFAULT]"},{"line_number":235,"context_line":"    reclaim_age \u003d 604800"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    [pipeline:main]"},{"line_number":238,"context_line":"    pipeline \u003d object-server"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba5201f7_2fc80522","line":235,"updated":"2017-01-11 16:48:57.000000000","message":"Not really to do with your patch, but why is this the only config value given here? Feels weird.","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":518,"context_line":"reclaim_age                      604800      Time elapsed in seconds before the tombstone"},{"line_number":519,"context_line":"                                             file representing a deleted object can be"},{"line_number":520,"context_line":"                                             reclaimed.  This is the maximum window for"},{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"},{"line_number":522,"context_line":"                                             disconnected from the cluster because of a"},{"line_number":523,"context_line":"                                             fault is reintroduced into the cluster after"},{"line_number":524,"context_line":"                                             this window without having its data purged"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba5201f7_6fe5ada2","line":521,"range":{"start_line":521,"start_character":68,"end_line":521,"end_character":69},"updated":"2017-01-11 16:48:57.000000000","message":"nit: I think a semicolon might be better? Or even break it into two sentences.","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":518,"context_line":"reclaim_age                      604800      Time elapsed in seconds before the tombstone"},{"line_number":519,"context_line":"                                             file representing a deleted object can be"},{"line_number":520,"context_line":"                                             reclaimed.  This is the maximum window for"},{"line_number":521,"context_line":"                                             your consistency engine, if a node that was"},{"line_number":522,"context_line":"                                             disconnected from the cluster because of a"},{"line_number":523,"context_line":"                                             fault is reintroduced into the cluster after"},{"line_number":524,"context_line":"                                             this window without having its data purged"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba5201f7_8c8014c1","line":521,"in_reply_to":"ba5201f7_6fe5ada2","updated":"2017-01-11 19:25:05.000000000","message":"Done","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":523,"context_line":"                                             fault is reintroduced into the cluster after"},{"line_number":524,"context_line":"                                             this window without having its data purged"},{"line_number":525,"context_line":"                                             it will result in dark data.  This setting"},{"line_number":526,"context_line":"                                             should be consistent across all object"},{"line_number":527,"context_line":"                                             services."},{"line_number":528,"context_line":"nice_priority                    None        Scheduling priority of server processes."},{"line_number":529,"context_line":"                                             Niceness values range from -20 (most"},{"line_number":530,"context_line":"                                             favorable to the process) to 19 (least"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba5201f7_af7875c5","line":527,"range":{"start_line":526,"start_character":55,"end_line":527,"end_character":53},"updated":"2017-01-11 16:48:57.000000000","message":"All of the services within a node, or all of the services within a cluster?","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                                             this window without having its data purged"},{"line_number":525,"context_line":"                                             it will result in dark data.  This setting"},{"line_number":526,"context_line":"                                             should be consistent across all object"},{"line_number":527,"context_line":"                                             services."},{"line_number":528,"context_line":"nice_priority                    None        Scheduling priority of server processes."},{"line_number":529,"context_line":"                                             Niceness values range from -20 (most"},{"line_number":530,"context_line":"                                             favorable to the process) to 19 (least"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba5201f7_8c9c940f","line":527,"in_reply_to":"ba5201f7_af7875c5","updated":"2017-01-11 19:25:05.000000000","message":"*all object services* - there is no qualifier that might reduce scope - how about all object services managed by the ops team? :P","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"}],"etc/object-server.conf-sample":[{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b9f452edd2fcb2b780e1eec409d271a701df39cd","unresolved":false,"context_lines":[{"line_number":69,"context_line":"# network_chunk_size \u003d 65536"},{"line_number":70,"context_line":"# disk_chunk_size \u003d 65536"},{"line_number":71,"context_line":"#"},{"line_number":72,"context_line":"# Reclimation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor buy the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"5a8bc5a2_f49c8b6b","line":72,"updated":"2016-09-22 15:38:24.000000000","message":"typo: s/reclimation/reclamation","commit_id":"28568d45a70a986140e39edbc57af7637d93b8db"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b9f452edd2fcb2b780e1eec409d271a701df39cd","unresolved":false,"context_lines":[{"line_number":70,"context_line":"# disk_chunk_size \u003d 65536"},{"line_number":71,"context_line":"#"},{"line_number":72,"context_line":"# Reclimation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor buy the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"},{"line_number":76,"context_line":"# reclaim_age \u003d 604800"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"5a8bc5a2_d476af3d","line":73,"updated":"2016-09-22 15:38:24.000000000","message":"typo: s/buy/but","commit_id":"28568d45a70a986140e39edbc57af7637d93b8db"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"# network_chunk_size \u003d 65536"},{"line_number":70,"context_line":"# disk_chunk_size \u003d 65536"},{"line_number":71,"context_line":"#"},{"line_number":72,"context_line":"# Reclimation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor buy the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"3a71b18c_9cbeedfd","line":72,"updated":"2016-12-08 17:44:06.000000000","message":"s/Reclimation/Reclamation/","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"# network_chunk_size \u003d 65536"},{"line_number":70,"context_line":"# disk_chunk_size \u003d 65536"},{"line_number":71,"context_line":"#"},{"line_number":72,"context_line":"# Reclimation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor buy the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"1a6eadb0_8304d87e","line":72,"in_reply_to":"3a71b18c_9cbeedfd","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":70,"context_line":"# disk_chunk_size \u003d 65536"},{"line_number":71,"context_line":"#"},{"line_number":72,"context_line":"# Reclimation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor buy the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"},{"line_number":76,"context_line":"# reclaim_age \u003d 604800"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"3a71b18c_7c467122","line":73,"updated":"2016-12-08 17:44:06.000000000","message":"s/buy/but/","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"# disk_chunk_size \u003d 65536"},{"line_number":71,"context_line":"#"},{"line_number":72,"context_line":"# Reclimation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor buy the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"},{"line_number":76,"context_line":"# reclaim_age \u003d 604800"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"1a6eadb0_e303cc71","line":73,"in_reply_to":"3a71b18c_7c467122","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"# Reclamation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor but the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"},{"line_number":76,"context_line":"# reclaim_age \u003d 604800"},{"line_number":77,"context_line":"#"},{"line_number":78,"context_line":"# You can set scheduling priority of processes. Niceness values range from -20"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"ba5201f7_af0dd53f","line":75,"range":{"start_line":75,"start_character":6,"end_line":75,"end_character":57},"updated":"2017-01-11 16:48:57.000000000","message":"Ok, I\u0027ll bite: what happens when it\u0027s less than the container reclaim_age?","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"# Reclamation of tombstone files is performed primarily by the replicator and"},{"line_number":73,"context_line":"# the reconstructor but the object-server and object-auditor also reference"},{"line_number":74,"context_line":"# this value - it should be the same for all object services in the cluster,"},{"line_number":75,"context_line":"# and not greater than the container services reclaim_age"},{"line_number":76,"context_line":"# reclaim_age \u003d 604800"},{"line_number":77,"context_line":"#"},{"line_number":78,"context_line":"# You can set scheduling priority of processes. Niceness values range from -20"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"ba5201f7_6c6930f9","line":75,"in_reply_to":"ba5201f7_af0dd53f","updated":"2017-01-11 19:25:05.000000000","message":"https://bugs.launchpad.net/swift/+bug/1300850","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"}],"swift/obj/diskfile.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"PICKLE_PROTOCOL \u003d 2"},{"line_number":81,"context_line":"DEFAULT_RECLAIM_AGE \u003d timedelta(days\u003d7).total_seconds()"},{"line_number":82,"context_line":"HASH_FILE \u003d \u0027hashes.pkl\u0027"},{"line_number":83,"context_line":"HASH_INVALIDATIONS_FILE \u003d \u0027hashes.invalid\u0027"},{"line_number":84,"context_line":"METADATA_KEY \u003d \u0027user.swift.metadata\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_22abf28a","line":81,"updated":"2016-12-08 17:44:06.000000000","message":"lol. yup, don\u0027t reinvent the wheel/week\n\nbut now you have introduced me to the function I feel obliged to point out:\n\n  timedelta(weeks\u003d1).total_seconds()","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"PICKLE_PROTOCOL \u003d 2"},{"line_number":81,"context_line":"DEFAULT_RECLAIM_AGE \u003d timedelta(days\u003d7).total_seconds()"},{"line_number":82,"context_line":"HASH_FILE \u003d \u0027hashes.pkl\u0027"},{"line_number":83,"context_line":"HASH_INVALIDATIONS_FILE \u003d \u0027hashes.invalid\u0027"},{"line_number":84,"context_line":"METADATA_KEY \u003d \u0027user.swift.metadata\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_bde731e3","line":81,"in_reply_to":"3a71b18c_22abf28a","updated":"2016-12-13 14:39:01.000000000","message":"Sounds about right","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":887,"context_line":""},{"line_number":888,"context_line":"        return results"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def cleanup_ondisk_files(self, hsh_path, **kwargs):"},{"line_number":891,"context_line":"        \"\"\""},{"line_number":892,"context_line":"        Clean up on-disk files that are obsolete and gather the set of valid"},{"line_number":893,"context_line":"        on-disk files for an object."}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_c25dde16","line":890,"updated":"2016-12-08 17:44:06.000000000","message":"Yes! this method is either called with no reclaim_age or the value passed is equal to self.reclaim_age anyway:\n\n* from _get_hashes via _hash_suffix, where the reconstructor or replicator pass their reclaim_age, but that value is read from same conf as used to create the df manager instance that they are calling, so equals self.reclaim_age\n\n* from yield_hashes which passes self.reclaim_age\n\n* from get_diskfile_from_hash passes self.reclaim_age\n\n* from finalize_put and finalize_durable which pass no value for reclaim_age so default arg value of one week applied. BUT with this change the instance var will apply, so if someone had a crazy option value in conf for object server that was previously ignored, it will now apply during finalize_put/durable.","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":901,"context_line":"                  reverse sorted, stored under the key \u0027files\u0027."},{"line_number":902,"context_line":"        \"\"\""},{"line_number":903,"context_line":"        def is_reclaimable(timestamp):"},{"line_number":904,"context_line":"            return (time.time() - float(timestamp)) \u003e self.reclaim_age"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        files \u003d listdir(hsh_path)"},{"line_number":907,"context_line":"        files.sort(reverse\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_c2495eb9","line":904,"updated":"2016-12-08 17:44:06.000000000","message":"right, so this is the only place we need to reference reclaim_age","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2341420d39d32adc5cdc1b7bbd28e8b4c755fec0","unresolved":false,"context_lines":[{"line_number":558,"context_line":"        self.keep_cache_size \u003d int(conf.get(\u0027keep_cache_size\u0027, 5242880))"},{"line_number":559,"context_line":"        self.bytes_per_sync \u003d int(conf.get(\u0027mb_per_sync\u0027, 512)) * 1024 * 1024"},{"line_number":560,"context_line":"        self.mount_check \u003d config_true_value(conf.get(\u0027mount_check\u0027, \u0027true\u0027))"},{"line_number":561,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, DEFAULT_RECLAIM_AGE))"},{"line_number":562,"context_line":"        self.replication_one_per_device \u003d config_true_value("},{"line_number":563,"context_line":"            conf.get(\u0027replication_one_per_device\u0027, \u0027true\u0027))"},{"line_number":564,"context_line":"        self.replication_lock_timeout \u003d int(conf.get("}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_37d97522","line":561,"updated":"2016-12-13 17:09:21.000000000","message":"we don\u0027t have a direct test to protect against this regression:\n\n  self.reclaim_age \u003d int(conf.get(\u0027reclaim_oopsage\u0027, DEFAULT_RECLAIM_AGE))\n\nsome tests in test_auditor fail but a direct test in test_diskfile.py here would be nice, see https://review.openstack.org/410311","commit_id":"e2e2d52c9057b4f8e61d5c964601b887f42c6968"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"41aafd5b5a1cb51f257b5c6762a6cff4430de559","unresolved":false,"context_lines":[{"line_number":558,"context_line":"        self.keep_cache_size \u003d int(conf.get(\u0027keep_cache_size\u0027, 5242880))"},{"line_number":559,"context_line":"        self.bytes_per_sync \u003d int(conf.get(\u0027mb_per_sync\u0027, 512)) * 1024 * 1024"},{"line_number":560,"context_line":"        self.mount_check \u003d config_true_value(conf.get(\u0027mount_check\u0027, \u0027true\u0027))"},{"line_number":561,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, DEFAULT_RECLAIM_AGE))"},{"line_number":562,"context_line":"        self.replication_one_per_device \u003d config_true_value("},{"line_number":563,"context_line":"            conf.get(\u0027replication_one_per_device\u0027, \u0027true\u0027))"},{"line_number":564,"context_line":"        self.replication_lock_timeout \u003d int(conf.get("}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_51c88e22","line":561,"in_reply_to":"1a6eadb0_37d97522","updated":"2016-12-14 14:21:27.000000000","message":"lol oopsage. Makes sense.","commit_id":"e2e2d52c9057b4f8e61d5c964601b887f42c6968"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"PICKLE_PROTOCOL \u003d 2"},{"line_number":81,"context_line":"DEFAULT_RECLAIM_AGE \u003d timedelta(weeks\u003d1).total_seconds()"},{"line_number":82,"context_line":"HASH_FILE \u003d \u0027hashes.pkl\u0027"},{"line_number":83,"context_line":"HASH_INVALIDATIONS_FILE \u003d \u0027hashes.invalid\u0027"},{"line_number":84,"context_line":"METADATA_KEY \u003d \u0027user.swift.metadata\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_32bcde05","line":81,"updated":"2017-01-11 19:25:05.000000000","message":"In retrospect, keeping the literal int might be preferred just for quick consistency checks with the docs!","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":92,"context_line":"get_data_dir \u003d partial(get_policy_string, DATADIR_BASE)"},{"line_number":93,"context_line":"get_async_dir \u003d partial(get_policy_string, ASYNCDIR_BASE)"},{"line_number":94,"context_line":"get_tmp_dir \u003d partial(get_policy_string, TMP_BASE)"},{"line_number":95,"context_line":"MIN_TIME_UPDATE_AUDITOR_STATUS \u003d 60"},{"line_number":96,"context_line":"# This matches rsync tempfiles, like \".\u003ctimestamp\u003e.data.Xy095a\""},{"line_number":97,"context_line":"RE_RSYNC_TEMPFILE \u003d re.compile(r\u0027^\\..*\\.([a-zA-Z0-9_]){6}$\u0027)"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_7a7f2917","line":95,"range":{"start_line":95,"start_character":33,"end_line":95,"end_character":35},"updated":"2017-01-11 16:48:57.000000000","message":"Worth doing a\n\n ... \u003d timedelta(minutes\u003d1).total_seconds()\n\nor meh?","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":92,"context_line":"get_data_dir \u003d partial(get_policy_string, DATADIR_BASE)"},{"line_number":93,"context_line":"get_async_dir \u003d partial(get_policy_string, ASYNCDIR_BASE)"},{"line_number":94,"context_line":"get_tmp_dir \u003d partial(get_policy_string, TMP_BASE)"},{"line_number":95,"context_line":"MIN_TIME_UPDATE_AUDITOR_STATUS \u003d 60"},{"line_number":96,"context_line":"# This matches rsync tempfiles, like \".\u003ctimestamp\u003e.data.Xy095a\""},{"line_number":97,"context_line":"RE_RSYNC_TEMPFILE \u003d re.compile(r\u0027^\\..*\\.([a-zA-Z0-9_]){6}$\u0027)"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b2c7ee96","line":95,"in_reply_to":"ba5201f7_7a7f2917","updated":"2017-01-11 19:25:05.000000000","message":"seems like a reasonable follow up if someone wants to shoot for consistency \"use timedetals for all constants that represent seconds\"\n\nthe inconsistency doesn\u0027t bother me.\n\nIf matt reviews this he\u0027d definitely tell me to either not use timedelta for default_reclaim_age or use it everywhere [1] - and I would definitely choose to not use it for default_reclaim_age which I think is a subjectively a worse outcome - but the lesser of other possible evils from my perspective.\n\n1. I wasn\u0027t *not* consistent on purpose to spite matt - i just write the diffs that make sense to me - then when I put my review hat on I\u0027m able to step back from the change and realize the inconsistency can reasonably be less attractive to some than the minimal benefit (if any?) of spelling the seconds with a time delta.","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"}],"swift/obj/expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f8e8e4114837614f765d2d754dcbc2a278ae958a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            raise ValueError(\"concurrency must be set to at least 1\")"},{"line_number":66,"context_line":"        self.processes \u003d int(self.conf.get(\u0027processes\u0027, 0))"},{"line_number":67,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":68,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 86400 * 7))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def report(self, final\u003dFalse):"},{"line_number":71,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_5eeea6ed","side":"PARENT","line":68,"updated":"2016-09-21 22:32:03.000000000","message":"I don\u0027t really have that strong of an opinion here about using the other default - but the semantic behavior of this config option doesn\u0027t really seem to be related to the other IMHO - I\u0027m not even sure it\u0027s a great default value?\n\nThis sets how long after an expired row ... expires ... that this daemon will keep re-trying to issue a DELETE before saying it succeeded anyway and letting the row get reaped.  I\u0027m not sure how often a DELETE can really 503 in Swift - exponential backoff sure - but keep going for a week?","commit_id":"dd512a3207db2bc720b85f2b914e29d8c2608dfb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.processes \u003d int(self.conf.get(\u0027processes\u0027, 0))"},{"line_number":67,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":68,"context_line":"        # this config option has the same *name* as the object services"},{"line_number":69,"context_line":"        # reclaim_age option - but it an entirely different thing.  The name"},{"line_number":70,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":71,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":72,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 86400 * 7))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_e249fa8f","line":69,"updated":"2016-12-08 17:44:06.000000000","message":"s/it/it is/","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.processes \u003d int(self.conf.get(\u0027processes\u0027, 0))"},{"line_number":67,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":68,"context_line":"        # this config option has the same *name* as the object services"},{"line_number":69,"context_line":"        # reclaim_age option - but it an entirely different thing.  The name"},{"line_number":70,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":71,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":72,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 86400 * 7))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_233dc42b","line":69,"in_reply_to":"3a71b18c_e249fa8f","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # this config option has the same *name* as the object services"},{"line_number":69,"context_line":"        # reclaim_age option - but it an entirely different thing.  The name"},{"line_number":70,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":71,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":72,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 86400 * 7))"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def report(self, final\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_8546901f","line":71,"updated":"2016-12-08 17:44:06.000000000","message":"+1 for highlighting the difference; worth saying what the option *does* mean?","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # this config option has the same *name* as the object services"},{"line_number":69,"context_line":"        # reclaim_age option - but it an entirely different thing.  The name"},{"line_number":70,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":71,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":72,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 86400 * 7))"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def report(self, final\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_c3d170cf","line":71,"in_reply_to":"3a71b18c_8546901f","updated":"2016-12-13 14:39:01.000000000","message":"We already do explain what it is in /etc/object-expirer.conf-sample\nSo maybe just point out a reference to the sample conf file?","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        # reclaim_age option - but it an entirely different thing.  The name"},{"line_number":70,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":71,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":72,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 86400 * 7))"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def report(self, final\u003dFalse):"},{"line_number":75,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_a22f02a0","line":72,"updated":"2016-12-08 17:44:06.000000000","message":"for consistency should we use timedelta() here too?","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        # reclaim_age option - but it an entirely different thing.  The name"},{"line_number":70,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":71,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":72,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 86400 * 7))"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def report(self, final\u003dFalse):"},{"line_number":75,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_e3d66cc4","line":72,"in_reply_to":"3a71b18c_a22f02a0","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.processes \u003d int(self.conf.get(\u0027processes\u0027, 0))"},{"line_number":68,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":69,"context_line":"        # this config option has the same *name* as the object services"},{"line_number":70,"context_line":"        # reclaim_age option - but it is an entirely different thing. The name"},{"line_number":71,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":72,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":73,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b542823c","line":70,"updated":"2017-01-11 16:48:57.000000000","message":"Should we include something about what it *does* mean here? Or am I only thinking that would be useful because I\u0027m looking at this particular patch and have obect-*server* reclaim_age loaded in my head?","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.processes \u003d int(self.conf.get(\u0027processes\u0027, 0))"},{"line_number":68,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":69,"context_line":"        # this config option has the same *name* as the object services"},{"line_number":70,"context_line":"        # reclaim_age option - but it is an entirely different thing. The name"},{"line_number":71,"context_line":"        # is confusing, and the default value has a historical numerical"},{"line_number":72,"context_line":"        # equivalency with DEFAULT_RECLAIM_AGE but they are not coupled"},{"line_number":73,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_727ae6f2","line":70,"in_reply_to":"ba5201f7_b542823c","updated":"2017-01-11 19:25:05.000000000","message":"Done","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"bc85e3ce1c2817906ddf55ba92aacb291744db68","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":68,"context_line":"        # This option defines how long an un-processable expired object"},{"line_number":69,"context_line":"        # marker will be retried before it is abandoned.  It is not coupled"},{"line_number":70,"context_line":"        # with the tombstone reclaim age in the consistency engine."},{"line_number":71,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def report(self, final\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a57fde8_989459e9","line":70,"updated":"2017-01-12 10:05:40.000000000","message":"+1, I think Alistair will be happy to see this too ;)","commit_id":"22bc257dd1fac74dce5cdb6789ee0e2a2c4c680f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"8079e656cf73df08c47026828956aabaacc02fb2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # This option defines how long an un-processable expired object"},{"line_number":69,"context_line":"        # marker will be retried before it is abandoned.  It is not coupled"},{"line_number":70,"context_line":"        # with the tombstone reclaim age in the consistency engine."},{"line_number":71,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def report(self, final\u003dFalse):"},{"line_number":74,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_7e7addf2","line":71,"updated":"2017-01-16 11:00:40.000000000","message":"I\u0027d prefer\n\n diskfile.DEFAULT_RECLAIM_AGE\n\ninstead of a hardcoded value at this point","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"e60535df9e294d691f6fa129cb6bbcb50cf888e9","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # This option defines how long an un-processable expired object"},{"line_number":69,"context_line":"        # marker will be retried before it is abandoned.  It is not coupled"},{"line_number":70,"context_line":"        # with the tombstone reclaim age in the consistency engine."},{"line_number":71,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def report(self, final\u003dFalse):"},{"line_number":74,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_dbfe7537","line":71,"in_reply_to":"7a3c09a3_7e7addf2","updated":"2017-01-16 15:01:02.000000000","message":"I don\u0027t think importing from diskfile is the right thing to do for the same reason Alistair mentioned - they both don\u0027t mean the same and also the comment here tries to explicitly clarify that.\n\nMaybe just define a default value right in this file and use it - could be a follow up IMO.","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b7ed2243222dfcd25e32648c189fbd45e198f2e0","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # This option defines how long an un-processable expired object"},{"line_number":69,"context_line":"        # marker will be retried before it is abandoned.  It is not coupled"},{"line_number":70,"context_line":"        # with the tombstone reclaim age in the consistency engine."},{"line_number":71,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def report(self, final\u003dFalse):"},{"line_number":74,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_1608d52b","line":71,"in_reply_to":"7a3c09a3_7e7addf2","updated":"2017-01-16 14:29:51.000000000","message":"IDK for sure (I\u0027m not the author) but I think this may have been deliberately left this way because it does not have same meaning as the diskfile reclaim age and shouldn\u0027t be tied to a diskfile parameter?? That would be the first import from diskfile to expirer.","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        df_mgr \u003d self._df_router[policy]"},{"line_number":431,"context_line":"        hashed, suffix_hashes \u003d tpool_reraise("},{"line_number":432,"context_line":"            df_mgr._get_hashes, path, recalculate\u003drecalculate,"},{"line_number":433,"context_line":"            do_listdir\u003ddo_listdir)"},{"line_number":434,"context_line":"        self.logger.update_stats(\u0027suffix.hashes\u0027, hashed)"},{"line_number":435,"context_line":"        return suffix_hashes"},{"line_number":436,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_25abfc8a","line":433,"updated":"2016-12-08 17:44:06.000000000","message":"yes, passing reclaim_age was pointless as its value was derived from the same conf dict as the df_mgr\u0027s","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":830,"context_line":"                obj_path \u003d join(dev_path, data_dir)"},{"line_number":831,"context_line":"                tmp_path \u003d join(dev_path, get_tmp_dir(int(policy)))"},{"line_number":832,"context_line":"                unlink_older_than(tmp_path, time.time() -"},{"line_number":833,"context_line":"                                  self._diskfile_mgr.reclaim_age)"},{"line_number":834,"context_line":"                if not os.path.exists(obj_path):"},{"line_number":835,"context_line":"                    try:"},{"line_number":836,"context_line":"                        mkdirs(obj_path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_8507701c","line":833,"updated":"2016-12-08 17:44:06.000000000","message":"off topic: this cleanup feels like it should be encapsulated in the diskfile manager - the use of a tmp dir is a diskfile internal implementation choice, and cleaning it up here has caused reclaim_age to leak out :(","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5cb14a3b76a0efd5e4486d6de4b87943f4316dd7","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            \u0027user-agent\u0027: \u0027obj-reconstructor %s\u0027 % os.getpid()}"},{"line_number":151,"context_line":"        self.handoffs_first \u003d config_true_value(conf.get(\u0027handoffs_first\u0027,"},{"line_number":152,"context_line":"                                                         False))"},{"line_number":153,"context_line":"        self._df_router \u003d DiskFileRouter(conf, self.logger)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def load_object_ring(self, policy):"},{"line_number":156,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_9511fe06","line":153,"range":{"start_line":153,"start_character":41,"end_line":153,"end_character":45},"updated":"2017-01-11 16:48:57.000000000","message":"So this is how it gets plumbed in now, instead. Got it.","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"48e02a73cf8bd2e8dc4d591f75b3a159f82b22e8","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            \u0027user-agent\u0027: \u0027obj-reconstructor %s\u0027 % os.getpid()}"},{"line_number":151,"context_line":"        self.handoffs_first \u003d config_true_value(conf.get(\u0027handoffs_first\u0027,"},{"line_number":152,"context_line":"                                                         False))"},{"line_number":153,"context_line":"        self._df_router \u003d DiskFileRouter(conf, self.logger)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def load_object_ring(self, policy):"},{"line_number":156,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_f255f64f","line":153,"in_reply_to":"ba5201f7_9511fe06","updated":"2017-01-11 19:25:05.000000000","message":"Done","commit_id":"f41466bdecd21398a79aaeba3efb90a2eccb5cbd"}],"swift/obj/replicator.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                self._diskfile_mgr._get_hashes, job[\u0027path\u0027],"},{"line_number":411,"context_line":"                do_listdir\u003d_do_listdir("},{"line_number":412,"context_line":"                    int(job[\u0027partition\u0027]),"},{"line_number":413,"context_line":"                    self.replication_cycle))"},{"line_number":414,"context_line":"            self.suffix_hash +\u003d hashed"},{"line_number":415,"context_line":"            self.logger.update_stats(\u0027suffix.hashes\u0027, hashed)"},{"line_number":416,"context_line":"            attempts_left \u003d len(job[\u0027nodes\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_d05da416","line":413,"updated":"2016-12-08 17:44:06.000000000","message":"ok, same as reconstructor - no need to pass reclaim_age since value is same as df_mgr\u0027s own.","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2d018560b4155601ab26dd5751f134e932b385cf","unresolved":false,"context_lines":[{"line_number":6230,"context_line":"                df.delete(Timestamp(now - 10001))"},{"line_number":6231,"context_line":"                # write a meta file that\u0027s not quite so old"},{"line_number":6232,"context_line":"                ts_meta \u003d Timestamp(now - 501)"},{"line_number":6233,"context_line":"                df.write_metadata({\u0027X-Timestamp\u0027: ts_meta.internal})"},{"line_number":6234,"context_line":"            # sanity check"},{"line_number":6235,"context_line":"            self.assertEqual(2, len(os.listdir(df._datadir)))"},{"line_number":6236,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_263b38ed","line":6233,"updated":"2016-12-01 12:59:00.000000000","message":"See, this is maddness, these tests were changing df_mgr.reclaim_age - but that didn\u0027t effect the DiskFile\u0027s cleanup_ondisk_files - which is maddnes","commit_id":"e953e96c1129e960f4fbac8de19c825c16207154"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":6224,"context_line":"            now \u003d time()"},{"line_number":6225,"context_line":"            # scale back the df manager\u0027s reclaim age a bit"},{"line_number":6226,"context_line":"            df_mgr.reclaim_age \u003d 1000"},{"line_number":6227,"context_line":"            # write a tombstone that\u0027s just a *little* older than reclaim time"},{"line_number":6228,"context_line":"            with mock.patch.object(diskfile.BaseDiskFileManager,"},{"line_number":6229,"context_line":"                                   \u0027cleanup_ondisk_files\u0027, autospec\u003dTrue):"},{"line_number":6230,"context_line":"                df.delete(Timestamp(now - 10001))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_9007ac1c","line":6227,"updated":"2016-12-08 17:44:06.000000000","message":"the tombstone is actually a *lot* older - probably was meant to be 1001 not 10001","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":6224,"context_line":"            now \u003d time()"},{"line_number":6225,"context_line":"            # scale back the df manager\u0027s reclaim age a bit"},{"line_number":6226,"context_line":"            df_mgr.reclaim_age \u003d 1000"},{"line_number":6227,"context_line":"            # write a tombstone that\u0027s just a *little* older than reclaim time"},{"line_number":6228,"context_line":"            with mock.patch.object(diskfile.BaseDiskFileManager,"},{"line_number":6229,"context_line":"                                   \u0027cleanup_ondisk_files\u0027, autospec\u003dTrue):"},{"line_number":6230,"context_line":"                df.delete(Timestamp(now - 10001))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_e3ed8c8c","line":6227,"in_reply_to":"3a71b18c_9007ac1c","updated":"2016-12-13 14:39:01.000000000","message":"yup, done.","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"41a561b8de15e8e8b4f8f0e9f8eb402bf01418d8","unresolved":false,"context_lines":[{"line_number":6227,"context_line":"            # write a tombstone that\u0027s just a *little* older than reclaim time"},{"line_number":6228,"context_line":"            with mock.patch.object(diskfile.BaseDiskFileManager,"},{"line_number":6229,"context_line":"                                   \u0027cleanup_ondisk_files\u0027, autospec\u003dTrue):"},{"line_number":6230,"context_line":"                df.delete(Timestamp(now - 10001))"},{"line_number":6231,"context_line":"                # write a meta file that\u0027s not quite so old"},{"line_number":6232,"context_line":"                ts_meta \u003d Timestamp(now - 501)"},{"line_number":6233,"context_line":"                df.write_metadata({\u0027X-Timestamp\u0027: ts_meta.internal})"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_10347cf9","line":6230,"updated":"2016-12-08 17:44:06.000000000","message":"ok, so this test failed after the change to use self.reclaim_age. But moving line 6226 to line 6237 is sufficient to fix, the mock isn\u0027t needed. i.e.\n\n            # write an old tombstone\n            df.delete(Timestamp(now - 1001))\n            # write a meta file that\u0027s not quite so old\n            ts_meta \u003d Timestamp(now - 501)\n            df.write_metadata({\u0027X-Timestamp\u0027: ts_meta.internal})\n            # sanity check\n            self.assertEqual(2, len(os.listdir(df._datadir)))\n\n            # scale back the df manager\u0027s reclaim age a bit to make the\n            # tombstone reclaimable\n            df_mgr.reclaim_age \u003d 1000\n            hashes \u003d df_mgr.get_hashes(\u0027sda1\u0027, \u00270\u0027, [], policy)\n            # the tombstone is reclaimed, the meta file remains, the suffix","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"5a8a45485797597ad81fc99e05acd81a6d6e7ab9","unresolved":false,"context_lines":[{"line_number":6227,"context_line":"            # write a tombstone that\u0027s just a *little* older than reclaim time"},{"line_number":6228,"context_line":"            with mock.patch.object(diskfile.BaseDiskFileManager,"},{"line_number":6229,"context_line":"                                   \u0027cleanup_ondisk_files\u0027, autospec\u003dTrue):"},{"line_number":6230,"context_line":"                df.delete(Timestamp(now - 10001))"},{"line_number":6231,"context_line":"                # write a meta file that\u0027s not quite so old"},{"line_number":6232,"context_line":"                ts_meta \u003d Timestamp(now - 501)"},{"line_number":6233,"context_line":"                df.write_metadata({\u0027X-Timestamp\u0027: ts_meta.internal})"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_43aba01d","line":6230,"in_reply_to":"3a71b18c_10347cf9","updated":"2016-12-13 14:39:01.000000000","message":"Done","commit_id":"1217ede701e5b5ca9fae564b97b4bc65baf5621d"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"73555f8630c49257489ffecc8f42e6857ee1d7e6","unresolved":false,"context_lines":[{"line_number":6227,"context_line":"            with mock.patch(\u0027swift.obj.diskfile.time.time\u0027) as mock_time:"},{"line_number":6228,"context_line":"                mock_time.return_value \u003d the_future"},{"line_number":6229,"context_line":"                resp \u003d delete_request.get_response(self.object_controller)"},{"line_number":6230,"context_line":"                # we won\u0027t even create the tombstone"},{"line_number":6231,"context_line":"                self.assertFalse(os.path.exists(tombstone_file))"},{"line_number":6232,"context_line":"                # hashdir sticks around tho"},{"line_number":6233,"context_line":"                self.assertTrue(os.path.exists(objfile._datadir))"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_27a8841f","line":6230,"updated":"2017-01-13 15:28:05.000000000","message":"right!","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"73555f8630c49257489ffecc8f42e6857ee1d7e6","unresolved":false,"context_lines":[{"line_number":6229,"context_line":"                resp \u003d delete_request.get_response(self.object_controller)"},{"line_number":6230,"context_line":"                # we won\u0027t even create the tombstone"},{"line_number":6231,"context_line":"                self.assertFalse(os.path.exists(tombstone_file))"},{"line_number":6232,"context_line":"                # hashdir sticks around tho"},{"line_number":6233,"context_line":"                self.assertTrue(os.path.exists(objfile._datadir))"},{"line_number":6234,"context_line":"                # REPLICATE will clean it all up"},{"line_number":6235,"context_line":"                resp \u003d replicate_request.get_response(self.object_controller)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_ec6583e1","line":6232,"updated":"2017-01-13 15:28:05.000000000","message":"yeah i noticed that too","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"676cb9806541059c5093f7961015b229fd898321","unresolved":false,"context_lines":[{"line_number":6231,"context_line":"                self.assertFalse(os.path.exists(tombstone_file))"},{"line_number":6232,"context_line":"                # hashdir sticks around tho"},{"line_number":6233,"context_line":"                self.assertTrue(os.path.exists(objfile._datadir))"},{"line_number":6234,"context_line":"                # REPLICATE will clean it all up"},{"line_number":6235,"context_line":"                resp \u003d replicate_request.get_response(self.object_controller)"},{"line_number":6236,"context_line":"                self.assertEqual(resp.status_int, 200)"},{"line_number":6237,"context_line":"                self.assertEqual({}, pickle.loads(resp.body))"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_918ce580","line":6234,"updated":"2017-01-16 07:02:41.000000000","message":"nice","commit_id":"69f7be99a6e090a251412a6925e0f29946818c6a"}]}
