)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ff92504d2fc0458d3e9c3f318d89f8d0e3fa2e8c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ankur Gupta \u003cankur.gupta@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-02-10 14:37:53 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Docstring omission in class BaseDiskFileManager. Added documentation for argument \u0027reclaim_age\u0027"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I29a53b8141c5607815f234a6123e2289200bca34"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a57f1b5_b65f6d40","line":7,"updated":"2016-02-10 20:47:23.000000000","message":"nit: the summary here sorta annoyingly long it wraps in an akward way and gets truncated by git log --oneline\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"94c1ff280926b723b54e4d3c3f15f6c36a9c72f1"}],"swift/obj/diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ff92504d2fc0458d3e9c3f318d89f8d0e3fa2e8c","unresolved":false,"context_lines":[{"line_number":2458,"context_line":"        will fall into a bucket either by fragment index for datafiles, or"},{"line_number":2459,"context_line":"        None (indicating a durable, metadata or tombstone)."},{"line_number":2460,"context_line":""},{"line_number":2461,"context_line":"        :param reclaim_age: age in seconds at which to remove tombstones"},{"line_number":2462,"context_line":"        \"\"\""},{"line_number":2463,"context_line":"        # hash_per_fi instead of single hash for whole suffix"},{"line_number":2464,"context_line":"        # here we flatten out the hashers hexdigest into a dictionary instead"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_36961df1","line":2461,"updated":"2016-02-10 20:47:23.000000000","message":"lol - what about :path:\n\nI\u0027m guessing the whole \"only difference between ... \" spiel was to sort of hint that you should also read *that* docstring (which does document reclaim_age - but oddly, again, not path)","commit_id":"94c1ff280926b723b54e4d3c3f15f6c36a9c72f1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dd4b5f1dd6a431d3a8169b077aa7c8d9f7f50c93","unresolved":false,"context_lines":[{"line_number":2111,"context_line":"        \"\"\""},{"line_number":2112,"context_line":"        Performs reclamation and returns an md5 of all (remaining) files."},{"line_number":2113,"context_line":""},{"line_number":2114,"context_line":"\t:param path: full path to directory "},{"line_number":2115,"context_line":"        :param reclaim_age: age in seconds at which to remove tombstones"},{"line_number":2116,"context_line":"        :raises PathNotDir: if given path is not a valid directory"},{"line_number":2117,"context_line":"        :raises OSError: for non-ENOTDIR errors"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a57f1b5_586e5b30","line":2114,"updated":"2016-02-11 01:42:29.000000000","message":"somewhere in gerrit you can change some setting that will highlight trailing whitespace in ugly bright red.\n\nBut the *more* important fix is to figure out how to do this highlighting in your editor [1]\n\n... because people *flip out* about trailing whitespace.  In code I think it makes sense - syntax and code should be precise.  In docstrings and doctree\u0027s I *personally* think it\u0027s meant for humans and humans are great at throwing out not useful information - but yeah... some other people care.\n\n1. all code editors/ides can do this - you have to turn it on - hit up any swift junkie in #openstack-swift on Freenode if you need some help","commit_id":"c0250b12090f925699dbba589d791e14f325a104"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d002f5c7d223d57e08f7b39744cb72d05b68caaa","unresolved":false,"context_lines":[{"line_number":724,"context_line":"    def _hash_suffix(self, path, reclaim_age):"},{"line_number":725,"context_line":"        \"\"\""},{"line_number":726,"context_line":"        Performs reclamation and returns an md5 of all (remaining) files."},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"        :param reclaim_age: age in seconds at which to remove tombstones"},{"line_number":729,"context_line":"        :raises PathNotDir: if given path is not a valid directory"},{"line_number":730,"context_line":"        :raises OSError: for non-ENOTDIR errors"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a57f1b5_05e70cb1","line":727,"updated":"2016-02-11 10:20:25.000000000","message":"oops its missing here too","commit_id":"86832135e6b5b133aa895c9adcc44718683a5b5a"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"4773c81573e22aacd55bc9a812f8561a37c5a051","unresolved":false,"context_lines":[{"line_number":830,"context_line":"        \"\"\""},{"line_number":831,"context_line":"        A context manager that will lock on the device given, if"},{"line_number":832,"context_line":"        configured to do so."},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"        :raises ReplicationLockTimeout: If the lock on the device"},{"line_number":835,"context_line":"            cannot be granted within the configured timeout."},{"line_number":836,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a57f1b5_6e1c8a77","line":833,"updated":"2016-02-11 16:30:32.000000000","message":"Missing a docstring here as well. Please fix while you are on to it.","commit_id":"86832135e6b5b133aa895c9adcc44718683a5b5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":858,"context_line":"        :param device: name of target device"},{"line_number":859,"context_line":"        :param account: account name for the object"},{"line_number":860,"context_line":"        :param container: container name for the object"},{"line_number":861,"context_line":"        :param obj: object name for the object"},{"line_number":862,"context_line":"        :param timestamp: a Timestamp"},{"line_number":863,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":864,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_c7577c58","line":861,"updated":"2016-02-12 10:47:49.000000000","message":"missing param data \"update data to be written to pickle file\"","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":895,"context_line":"    def object_audit_location_generator(self, device_dirs\u003dNone):"},{"line_number":896,"context_line":"        \"\"\""},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        :param device_dirs: location of target device"},{"line_number":899,"context_line":"        \"\"\""},{"line_number":900,"context_line":"        return object_audit_location_generator(self.devices, self.mount_check,"},{"line_number":901,"context_line":"                                               self.logger, device_dirs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_477f0cab","line":898,"updated":"2016-02-12 10:47:49.000000000","message":"hmmm, \"devices directory\" would be more accurate, albeit not adding much more information :)","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":903,"context_line":"    def get_diskfile_from_audit_location(self, audit_location):"},{"line_number":904,"context_line":"        \"\"\""},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        :param audit_location: object location to be audited"},{"line_number":907,"context_line":"        \"\"\""},{"line_number":908,"context_line":"        dev_path \u003d self.get_dev_path(audit_location.device, mount_check\u003dFalse)"},{"line_number":909,"context_line":"        return self.diskfile_cls.from_hash_dir("}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_3206cc1d","line":906,"updated":"2016-02-12 10:47:49.000000000","message":"nit: the docstring should not make statements about what the caller might do with the return value, i.e. \"to be audited\"","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        \"\"\""},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        :param audit_location: object location to be audited"},{"line_number":907,"context_line":"        \"\"\""},{"line_number":908,"context_line":"        dev_path \u003d self.get_dev_path(audit_location.device, mount_check\u003dFalse)"},{"line_number":909,"context_line":"        return self.diskfile_cls.from_hash_dir("},{"line_number":910,"context_line":"            self, audit_location.path, dev_path,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_322d6c95","line":907,"updated":"2016-02-12 10:47:49.000000000","message":"returns an instance of BaseDiskFile","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":920,"context_line":"        instead."},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"        :param device: name of target device"},{"line_number":923,"context_line":"        :param partition: partition on the device in which the object lives"},{"line_number":924,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":925,"context_line":"        :raises DiskFileNotExist: if the object does not exist"},{"line_number":926,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_d25418ff","line":923,"updated":"2016-02-12 10:47:49.000000000","message":"missing param object_hash - the hash of an object patch","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":922,"context_line":"        :param device: name of target device"},{"line_number":923,"context_line":"        :param partition: partition on the device in which the object lives"},{"line_number":924,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":925,"context_line":"        :raises DiskFileNotExist: if the object does not exist"},{"line_number":926,"context_line":"        \"\"\""},{"line_number":927,"context_line":"        dev_path \u003d self.get_dev_path(device)"},{"line_number":928,"context_line":"        if not dev_path:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_725d2414","line":925,"updated":"2016-02-12 10:47:49.000000000","message":"returns an instance of BaseDiskFile","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":963,"context_line":"        \"\"\""},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        :param device: name of target device"},{"line_number":966,"context_line":"        :param partition: partition of the device in which the object lives"},{"line_number":967,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":968,"context_line":"        \"\"\""},{"line_number":969,"context_line":"        dev_path \u003d self.get_dev_path(device)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_52c6e868","line":966,"updated":"2016-02-12 10:47:49.000000000","message":"in this context we\u0027re not handling any specific object so param partition is just \"a partition name\".\n\nmissing param suffixes - a list of suffix directories to be recalculated","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        :param device: name of target device"},{"line_number":966,"context_line":"        :param partition: partition of the device in which the object lives"},{"line_number":967,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":968,"context_line":"        \"\"\""},{"line_number":969,"context_line":"        dev_path \u003d self.get_dev_path(device)"},{"line_number":970,"context_line":"        if not dev_path:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_527588f7","line":967,"updated":"2016-02-12 10:47:49.000000000","message":"return a dictionary that maps suffix directory -\u003e hash value","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":996,"context_line":"        on the given device and partition."},{"line_number":997,"context_line":""},{"line_number":998,"context_line":"        :param device: name of target device"},{"line_number":999,"context_line":"        :param partition: partition on the device in which the object lives"},{"line_number":1000,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":1001,"context_line":"        \"\"\""},{"line_number":1002,"context_line":"        dev_path \u003d self.get_dev_path(device)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_f25cb47e","line":999,"updated":"2016-02-12 10:47:49.000000000","message":"in this context we\u0027re not handling any specific object so param partition is just \"a partition name\".","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":1032,"context_line":"        :class:`~swift.common.utils.Timestamp`"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"        :param device: name of target device"},{"line_number":1035,"context_line":"        :param partition: partition on the device in which the object lives"},{"line_number":1036,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":1037,"context_line":"        \"\"\""},{"line_number":1038,"context_line":"        dev_path \u003d self.get_dev_path(device)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_32cecc2e","line":1035,"updated":"2016-02-12 10:47:49.000000000","message":"in this context we\u0027re not handling any specific object so param partition is just \"a partition name\".","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"        :param device: name of target device"},{"line_number":1035,"context_line":"        :param partition: partition on the device in which the object lives"},{"line_number":1036,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":1037,"context_line":"        \"\"\""},{"line_number":1038,"context_line":"        dev_path \u003d self.get_dev_path(device)"},{"line_number":1039,"context_line":"        if not dev_path:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_f2a11447","line":1036,"updated":"2016-02-12 10:47:49.000000000","message":"param suffixes - an optional list of suffix dirs to be searched","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16ec60daf39e5dcbb23e1786b973041286cb616c","unresolved":false,"context_lines":[{"line_number":1865,"context_line":"        Takes source and filename separately so we can read from an open"},{"line_number":1866,"context_line":"        file if we have one."},{"line_number":1867,"context_line":""},{"line_number":1868,"context_line":"        \"\"\""},{"line_number":1869,"context_line":"        try:"},{"line_number":1870,"context_line":"            return read_metadata(source)"},{"line_number":1871,"context_line":"        except (DiskFileXattrNotSupported, DiskFileNotExist):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_7201a405","line":1868,"updated":"2016-02-12 10:47:49.000000000","message":"not sure about this description, its trying to read_metadata and raising a quarantine exception on failure","commit_id":"b9e38924fb14cd32699fabbf8a2b2155ca6503c0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a81f2f48a46796b15014d2d82c61e5333cd0940","unresolved":false,"context_lines":[{"line_number":858,"context_line":"        :param device: name of target device"},{"line_number":859,"context_line":"        :param account: account name for the object"},{"line_number":860,"context_line":"        :param container: container name for the object"},{"line_number":861,"context_line":"        :param data: updated data to be written to pickle file"},{"line_number":862,"context_line":"        :param obj: object name for the object"},{"line_number":863,"context_line":"        :param timestamp: a Timestamp"},{"line_number":864,"context_line":"        :param policy: the StoragePolicy instance"}],"source_content_type":"text/x-python","patch_set":6,"id":"dae33548_8d4f9bbc","line":861,"updated":"2016-02-16 11:31:12.000000000","message":"Its data describing an \"update\", hence \"update data\" :)\n\nWhenever an object is PUT/DELETEd the obj server attempts to update container server about object\u0027s changed state, but if the notification fails it then queues an \u0027async update\u0027 for later retry.","commit_id":"c0d8e651358d8e64cf6027c2eeca1718cb0eacad"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a81f2f48a46796b15014d2d82c61e5333cd0940","unresolved":false,"context_lines":[{"line_number":920,"context_line":"        instance representing the tombstoned object is returned"},{"line_number":921,"context_line":"        instead."},{"line_number":922,"context_line":""},{"line_number":923,"context_line":"        :param object_hash: the hash of an object path"},{"line_number":924,"context_line":"        :param device: name of target device"},{"line_number":925,"context_line":"        :param partition: partition on the device in which the object lives"},{"line_number":926,"context_line":"        :param policy: the StoragePolicy instance"}],"source_content_type":"text/x-python","patch_set":6,"id":"dae33548_2d5acf50","line":923,"updated":"2016-02-16 11:31:12.000000000","message":"nit: convention seems to be to list in positional order","commit_id":"c0d8e651358d8e64cf6027c2eeca1718cb0eacad"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a81f2f48a46796b15014d2d82c61e5333cd0940","unresolved":false,"context_lines":[{"line_number":968,"context_line":"        :param device: name of target device"},{"line_number":969,"context_line":"        :param partition: partition name"},{"line_number":970,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":971,"context_line":"        :param suffixes: a list of suffix directories to be recalculated"},{"line_number":972,"context_line":"        :returns: a dictionary that maps suffix directories"},{"line_number":973,"context_line":"        \"\"\""},{"line_number":974,"context_line":"        dev_path \u003d self.get_dev_path(device)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dae33548_6d02170d","line":971,"updated":"2016-02-16 11:31:12.000000000","message":"nit: ordering","commit_id":"c0d8e651358d8e64cf6027c2eeca1718cb0eacad"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a81f2f48a46796b15014d2d82c61e5333cd0940","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"        where timestamps are instances of"},{"line_number":1037,"context_line":"        :class:`~swift.common.utils.Timestamp`"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"        :param suffixes: optional list of suffix directories to be searched"},{"line_number":1040,"context_line":"        :param device: name of target device"},{"line_number":1041,"context_line":"        :param partition: partition name"},{"line_number":1042,"context_line":"        :param policy: the StoragePolicy instance"}],"source_content_type":"text/x-python","patch_set":6,"id":"dae33548_1021e49f","line":1039,"updated":"2016-02-16 11:31:12.000000000","message":"nit: ordering","commit_id":"c0d8e651358d8e64cf6027c2eeca1718cb0eacad"}]}
