)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"9fe68aa2a3c7315f9851e64b1706ceaf6d59b48f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"84d84119_e669b4ac","updated":"2023-05-22 06:12:21.000000000","message":"Maybe I should not do this while in bed but the code looks odd!","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"affd48733ec58b04ada893b4e3dca12284fbec3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1fc76775_e0def66c","updated":"2023-06-20 02:17:30.000000000","message":"Looks like a systematic failure in probe tests perhaps?","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5363dd6e_6ea01762","updated":"2023-06-20 13:52:44.000000000","message":"Might be worth breaking the patch up into the FakeStatsdClient refactor, and then the surgical bug fix in the sharder.\n\nI think that ultimately it will add clarity to have StatsdClient faked separately from the logger - i.e. to better match the structure of the real code.\n\nThere\u0027s some helper methods in FakeLogger, like get_increment_counts, that really belong to the FakeStatsdClient, but moving them will cause even more churn. However, their implementation could be moved and a forwarding method left in FakeLogger with note that that route is deprecated.\n\nThis should be rebased on https://review.opendev.org/c/openstack/swift/+/886028 to make this patch simpler","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16083be4dbabfec1790f7672587a141fd0bb86d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f178aff4_2ce029a0","updated":"2023-06-27 10:43:08.000000000","message":"superseded by https://review.opendev.org/c/openstack/swift/+/886883","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6a3f0a9776c772260e751bb3d1398b20bd3235ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"5469e46d_1d26490a","updated":"2023-07-21 05:08:15.000000000","message":"The approach in this patch looks good with me, patch itself is almost ready, only need simple respin to address a few comments. Thanks for working on this!","commit_id":"02b0f4b02f63e0465e92c5e26f4bc209687cfff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3741933f118c257ec530fcaa6f4891e288632c51","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"4152e6ca_b85a132d","updated":"2023-07-21 14:22:38.000000000","message":"@Matt here\u0027s another idea that saves us writing our own (Friday afternoon here and it felt like mock *has* to have an answer for this problem!)...\n\n```\nclass DebugStatsdClient(StatsdClient):\n    def __init__(self, *args, **kwargs):\n        super(DebugStatsdClient, self).__init__(*args, **kwargs)\n        # MagicMock with wraps keeps a record of each call and also forwards it\n        self.increment \u003d mock.MagicMock(wraps\u003dself.increment)\n        self.update_stats \u003d mock.MagicMock(wraps\u003dself.update_stats)\n        # TODO: override methods that set up socket etc\n\n    def get_counts(self, func, selector\u003dNone):\n        counts \u003d defaultdict(int)\n        for call in func.call_args_list:\n            k, v \u003d selector(call) if selector else (call[0][0], 1)\n            counts[k] +\u003d v\n        return counts\n\n    def get_increment_counts(self):\n        return self.get_counts(self.increment)\n\n    def get_stats_counts(self):\n        return self.get_counts(self.update_stats, lambda call: call[0][:2])\n        ```","commit_id":"83f60a0e1c02a7a291161fee5c07deaed90f5303"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2d5047f47543dac84e52859ff1fdd9760ae5eafd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"d30faf81_f0f849ce","in_reply_to":"4152e6ca_b85a132d","updated":"2023-07-23 23:44:02.000000000","message":"oh yeah, I forget we can do more with mock. interesting, yeah that might simplify things a bunch","commit_id":"83f60a0e1c02a7a291161fee5c07deaed90f5303"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"9130f6ae_a12986fb","updated":"2023-08-04 18:03:18.000000000","message":"I like this! But there\u0027s a couple of bugs in FakeStatsdClient and a couple of assertions that should not have changed.","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"e57660bf_7b5b5b98","updated":"2023-08-07 04:33:56.000000000","message":"new patchset incoming","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f97fdb703ee14cbfdf33e8ea00fcb2c45f47e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"59070fc3_c6b19dfe","updated":"2023-08-07 09:07:59.000000000","message":"LGTM\n\n```\nfrom test.debug_logger import FakeStatsdClient\ncl \u003d FakeStatsdClient(\u0027h\u0027, 99)\ncl.increment(\u0027foo\u0027)\ncl.update_stats(\u0027foo\u0027, 3)\nprint(cl.get_increment_counts())\nprint(cl.get_stats_counts())\n{\u0027foo\u0027: 1}\n{\u0027foo\u0027: 4}\nprint(cl.sendto_calls)\n[(b\u0027foo:1|c\u0027, (\u0027h\u0027, 99)), (b\u0027foo:3|c\u0027, (\u0027h\u0027, 99))]\ncl.clear()\ncl.sendto_calls\n[]\ncl.send_calls\n[]\ncl.calls\ndefaultdict(\u003cclass \u0027list\u0027\u003e, {\u0027update_stats\u0027: [((), {})]})\n```\n\nI perceive the following benefits from this change:\n\n- more real code is executed during tests which could help avoid bugs (for example, a recent case of passing a non-float value to StatsdClient.timing).\n\n- more intuitive interface to access captured statsd metrics\n\n- capturing metrics emission closer to the wire (i.e. send and sendto calls), which will enable us to make more targeted assertions about statsd metric names e.g. https://review.opendev.org/c/openstack/swift/+/890639","commit_id":"f50df66fb44fb6ddf3843c99699d217b05183439"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5c1990b5864b1495f7ce9ecce679297a6a428025","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d68dc82f_df10cb7b","updated":"2023-08-07 10:03:26.000000000","message":"fixed a couple of nits","commit_id":"00bfc425ce3b1bfee38cea97be2ad0a734e4aa47"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7c367eb566fa70d3cdf99147273701c2b72703bb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5645c20c_0b5e07a8","updated":"2023-08-08 09:54:18.000000000","message":"recheck","commit_id":"00bfc425ce3b1bfee38cea97be2ad0a734e4aa47"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8889fbca9a00b0d67b35ba39643702c1a1f67a88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"7915d6b4_d9e781b9","updated":"2023-08-07 16:15:22.000000000","message":"recheck\n\nLooks like a listing consistency issue in `test/probe/test_container_merge_policy_index.py::TestReservedNamespaceMergePolicyIndex::test_reconciler_move_object_twice`?","commit_id":"00bfc425ce3b1bfee38cea97be2ad0a734e4aa47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6eea4e29cd1bb64ba38bc472cafbd9c0849fdd08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"7c24c1fa_767cfdf6","updated":"2023-08-08 14:07:47.000000000","message":"recheck\n\ntimed out job","commit_id":"00bfc425ce3b1bfee38cea97be2ad0a734e4aa47"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":1270,"context_line":"                # However, we don\u0027t know if we\u0027re IPv4 or IPv6 in this case, so"},{"line_number":1271,"context_line":"                # we assume legacy IPv4."},{"line_number":1272,"context_line":"                sock_family \u003d socket.AF_INET"},{"line_number":1273,"context_line":"        return addr_info, sock_family"},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":"    def _set_prefix(self, tail_prefix):"},{"line_number":1276,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"15557716_acfc0bda","line":1273,"updated":"2023-08-04 18:03:18.000000000","message":"nice extraction","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"                # However, we don\u0027t know if we\u0027re IPv4 or IPv6 in this case, so"},{"line_number":1271,"context_line":"                # we assume legacy IPv4."},{"line_number":1272,"context_line":"                sock_family \u003d socket.AF_INET"},{"line_number":1273,"context_line":"        return addr_info, sock_family"},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":"    def _set_prefix(self, tail_prefix):"},{"line_number":1276,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"1810bae4_670b674e","line":1273,"in_reply_to":"15557716_acfc0bda","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"}],"swift/container/sharder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"083a51dc8c6868a24469014085627b0545fc317b","unresolved":true,"context_lines":[{"line_number":2396,"context_line":"                                      \u0027state\u0027)"},{"line_number":2397,"context_line":"                    self.logger.timing_since("},{"line_number":2398,"context_line":"                        \u0027sharder.sharding.completed\u0027,"},{"line_number":2399,"context_line":"                        float(broker.get_own_shard_range().epoch))"},{"line_number":2400,"context_line":"                else:"},{"line_number":2401,"context_line":"                    self.info(broker, \u0027Completed cleaving, DB remaining in \u0027"},{"line_number":2402,"context_line":"                                      \u0027sharding state\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"90193d1f_8c76f255","line":2399,"updated":"2023-05-23 00:08:57.000000000","message":"Lol, there is SO much test arch churn over this cast!","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"db5d30a8aa9b64043acb409791ee719445244d48","unresolved":true,"context_lines":[{"line_number":2396,"context_line":"                                      \u0027state\u0027)"},{"line_number":2397,"context_line":"                    self.logger.timing_since("},{"line_number":2398,"context_line":"                        \u0027sharder.sharding.completed\u0027,"},{"line_number":2399,"context_line":"                        float(broker.get_own_shard_range().epoch))"},{"line_number":2400,"context_line":"                else:"},{"line_number":2401,"context_line":"                    self.info(broker, \u0027Completed cleaving, DB remaining in \u0027"},{"line_number":2402,"context_line":"                                      \u0027sharding state\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"eaf1d328_fb7b6976","line":2399,"in_reply_to":"90193d1f_8c76f255","updated":"2023-06-23 23:51:13.000000000","message":"There is indeed! WDYT about something a little more targeted, like https://review.opendev.org/c/openstack/swift/+/886883 ?","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"}],"test/debug_logger.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"9fe68aa2a3c7315f9851e64b1706ceaf6d59b48f","unresolved":true,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def close(self):"},{"line_number":203,"context_line":"        self.clear"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def set_name(self, name):"},{"line_number":206,"context_line":"        # don\u0027t touch _handlers"},{"line_number":207,"context_line":"        self._name \u003d name"}],"source_content_type":"text/x-python","patch_set":1,"id":"c60cd98b_b29e139f","line":204,"updated":"2023-05-22 06:12:21.000000000","message":"Does this really work...? I suspect it does not actually call.","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def close(self):"},{"line_number":203,"context_line":"        self.clear"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def set_name(self, name):"},{"line_number":206,"context_line":"        # don\u0027t touch _handlers"},{"line_number":207,"context_line":"        self._name \u003d name"}],"source_content_type":"text/x-python","patch_set":1,"id":"95d66ba7_24963b4b","line":204,"in_reply_to":"9b985575_a8792c41","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"083a51dc8c6868a24469014085627b0545fc317b","unresolved":true,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def close(self):"},{"line_number":203,"context_line":"        self.clear"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def set_name(self, name):"},{"line_number":206,"context_line":"        # don\u0027t touch _handlers"},{"line_number":207,"context_line":"        self._name \u003d name"}],"source_content_type":"text/x-python","patch_set":1,"id":"9b985575_a8792c41","line":204,"in_reply_to":"c60cd98b_b29e139f","updated":"2023-05-23 00:08:57.000000000","message":"nice, yeah, that doesn\u0027t look right. Thanks Pete.\n\nDev of this kinda went.. I just need to cast this thing to a float.. now I just need to test it.. oh, well that wont work, now I need to FakeStatsdClient. Great, now how will that go with every other test... crap, it touches all over the place.. ok debug time.\nEnded up pushing this up without reviewing it myself because I had to rush out.","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"bc6f951d68839a1cfafd78f4456e4c31175dcaaf","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    def update_stats(self, m_name, m_value, sample_rate\u003dNone):"},{"line_number":54,"context_line":"        self.calls[\u0027update_stats\u0027].append((m_name, m_value, sample_rate))"},{"line_number":55,"context_line":"        return super(FakeStatsdClient, self).update_stats("},{"line_number":56,"context_line":"            m_name, m_value, sample_rate)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":59,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa550684_5c585c26","line":56,"updated":"2023-05-23 02:51:49.000000000","message":"This is something I don\u0027t quite like: this is not a fake Statsd client, is it? It is a wrapper client that records the calls, and then invokes the methods of class StatsdClient. Why is this safe? What if it manages to open a socket and starts bombing someone with stats updates? Please reassure me about this.","commit_id":"2a9abb7e2016c8d474e1ab2a234bb1cc16eaa0e9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    def update_stats(self, m_name, m_value, sample_rate\u003dNone):"},{"line_number":54,"context_line":"        self.calls[\u0027update_stats\u0027].append((m_name, m_value, sample_rate))"},{"line_number":55,"context_line":"        return super(FakeStatsdClient, self).update_stats("},{"line_number":56,"context_line":"            m_name, m_value, sample_rate)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":59,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":2,"id":"aec577be_7a53e18a","line":56,"in_reply_to":"60c0b25f_40ad073b","updated":"2023-06-20 13:52:44.000000000","message":"or, you could *only* override _open_socket to return self, and implement a sendto and close method for FakeStatsdClient, and capture the sendto args. Then we could make assertions about the metric name formatting that happens in _send()","commit_id":"2a9abb7e2016c8d474e1ab2a234bb1cc16eaa0e9"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"2178d04fe611e3e6d7c7dd9288fc7e5014af69e9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def update_stats(self, m_name, m_value, sample_rate\u003dNone):"},{"line_number":54,"context_line":"        self.calls[\u0027update_stats\u0027].append((m_name, m_value, sample_rate))"},{"line_number":55,"context_line":"        return super(FakeStatsdClient, self).update_stats("},{"line_number":56,"context_line":"            m_name, m_value, sample_rate)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":59,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":2,"id":"ea36288a_9526cfe1","line":56,"in_reply_to":"aec577be_7a53e18a","updated":"2023-07-21 00:36:41.000000000","message":"Agree with Mat, this new FakeStatsdClient only lives in test code and _send method is overrided, so it\u0027s pretty safe. This patch is trying to solve the problems that some of our metrics emitting code have good unit test coverages, but they failed in production because they are not really executed. One example is the bug which this patch fixed: https://review.opendev.org/c/openstack/swift/+/886883","commit_id":"2a9abb7e2016c8d474e1ab2a234bb1cc16eaa0e9"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e4046e8275ab18040f4948de6fff175611f80804","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    def update_stats(self, m_name, m_value, sample_rate\u003dNone):"},{"line_number":54,"context_line":"        self.calls[\u0027update_stats\u0027].append((m_name, m_value, sample_rate))"},{"line_number":55,"context_line":"        return super(FakeStatsdClient, self).update_stats("},{"line_number":56,"context_line":"            m_name, m_value, sample_rate)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":59,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":2,"id":"f4b7ab7c_56ba9b58","line":56,"in_reply_to":"aec577be_7a53e18a","updated":"2023-07-21 07:34:58.000000000","message":"hmm, yeah, good idea. Let\u0027s see how that shakes out.\n\nOh not bad, did both. So it mimics what the old debugger_logger stats did, but can also delve into sendto_calls:\n\n    self.logger.statsd_client.calls\n    \u0027update_stats\u0027: [(\u0027misplaced_success\u0027, 1, None), (\u0027misplaced_success\u0027, 1, None), \n    (\u0027cleaved_db_created\u0027, 1, None), (\u0027cleaved_success\u0027, 1, None), (\u0027cleaved_db_created\u0027, 1, None), (\u0027cleaved_success\u0027, 1, None)]\n    \u0027timing_since\u0027: [(\u0027sharder.sharding.mov..._misplaced\u0027, 1689909934.2703102, None), (\u0027sharder.sharding.set_state\u0027, 1689909934.2732975, None), (\u0027sharder.sharding.cleave\u0027, 1689909934.309469, None)]\n    \u0027timing\u0027: [(\u0027sharder.sharding.mov..._misplaced\u0027, 1.5976428985595703, None), (\u0027sharder.sharding.set_state\u0027, 36.10873222351074, None), (\u0027sharder.sharding.cleave\u0027, 202.61430740356445, None)]\n    len(): 3\n\n    self.logger.statsd_client.sendto_calls\n    0: (b\u0027misplaced_success:1|c\u0027, (\u0027host\u0027, 8125))\n    1: (b\u0027sharder.sharding.mov...5595703|ms\u0027, (\u0027host\u0027, 8125))\n    2: (b\u0027sharder.sharding.set...2351074|ms\u0027, (\u0027host\u0027, 8125))\n    3: (b\u0027misplaced_success:1|c\u0027, (\u0027host\u0027, 8125))\n    4: (b\u0027cleaved_db_created:1|c\u0027, (\u0027host\u0027, 8125))\n    5: (b\u0027cleaved_success:1|c\u0027, (\u0027host\u0027, 8125))\n    6: (b\u0027cleaved_db_created:1|c\u0027, (\u0027host\u0027, 8125))\n    7: (b\u0027cleaved_success:1|c\u0027, (\u0027host\u0027, 8125))\n    8: (b\u0027sharder.sharding.cle...0356445|ms\u0027, (\u0027host\u0027, 8125))\n    len(): 9","commit_id":"2a9abb7e2016c8d474e1ab2a234bb1cc16eaa0e9"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def update_stats(self, m_name, m_value, sample_rate\u003dNone):"},{"line_number":54,"context_line":"        self.calls[\u0027update_stats\u0027].append((m_name, m_value, sample_rate))"},{"line_number":55,"context_line":"        return super(FakeStatsdClient, self).update_stats("},{"line_number":56,"context_line":"            m_name, m_value, sample_rate)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":59,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":2,"id":"d0989e07_e9048f58","line":56,"in_reply_to":"f4b7ab7c_56ba9b58","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"2a9abb7e2016c8d474e1ab2a234bb1cc16eaa0e9"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"055fe3ba1258b4ae5f88005fa1b184569dc718bd","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    def update_stats(self, m_name, m_value, sample_rate\u003dNone):"},{"line_number":54,"context_line":"        self.calls[\u0027update_stats\u0027].append((m_name, m_value, sample_rate))"},{"line_number":55,"context_line":"        return super(FakeStatsdClient, self).update_stats("},{"line_number":56,"context_line":"            m_name, m_value, sample_rate)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":59,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":2,"id":"60c0b25f_40ad073b","line":56,"in_reply_to":"fa550684_5c585c26","updated":"2023-05-23 06:46:11.000000000","message":"Because 1, I don\u0027t actually create or connect to the socket. Most socket configuration happens in the StatsdClient contructor which I don\u0027t call.\n2. all stats calls in the client go through the _send method which is what opens the socket and sends the data, which is why I override it specifically.\n\nI guess I could also override _open_socket(self) as well to be doubly sure.","commit_id":"2a9abb7e2016c8d474e1ab2a234bb1cc16eaa0e9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        self._set_prefix(tail_prefix)"},{"line_number":40,"context_line":"        self._default_sample_rate \u003d default_sample_rate"},{"line_number":41,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":42,"context_line":"        self.logger \u003d logger"},{"line_number":43,"context_line":"        self.send_calls \u003d []"},{"line_number":44,"context_line":"        self.calls \u003d defaultdict(list)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"f716cc39_8bb1a4f5","line":42,"updated":"2023-06-20 13:52:44.000000000","message":"would it not be ok to call the superclass constructor rather than init all the attributes here?","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self._set_prefix(tail_prefix)"},{"line_number":40,"context_line":"        self._default_sample_rate \u003d default_sample_rate"},{"line_number":41,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":42,"context_line":"        self.logger \u003d logger"},{"line_number":43,"context_line":"        self.send_calls \u003d []"},{"line_number":44,"context_line":"        self.calls \u003d defaultdict(list)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"03e4b916_0e3c0400","line":42,"in_reply_to":"21408e9c_8564aad7","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6a3f0a9776c772260e751bb3d1398b20bd3235ce","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        self._set_prefix(tail_prefix)"},{"line_number":40,"context_line":"        self._default_sample_rate \u003d default_sample_rate"},{"line_number":41,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":42,"context_line":"        self.logger \u003d logger"},{"line_number":43,"context_line":"        self.send_calls \u003d []"},{"line_number":44,"context_line":"        self.calls \u003d defaultdict(list)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5dfa64d9_39e9eea9","line":42,"in_reply_to":"4a24c5ff_0238c0a4","updated":"2023-07-21 05:08:15.000000000","message":"Yeah, calling the super constructor seems reasonable.","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e4046e8275ab18040f4948de6fff175611f80804","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        self._set_prefix(tail_prefix)"},{"line_number":40,"context_line":"        self._default_sample_rate \u003d default_sample_rate"},{"line_number":41,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":42,"context_line":"        self.logger \u003d logger"},{"line_number":43,"context_line":"        self.send_calls \u003d []"},{"line_number":44,"context_line":"        self.calls \u003d defaultdict(list)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"21408e9c_8564aad7","line":42,"in_reply_to":"f716cc39_8bb1a4f5","updated":"2023-07-21 07:34:58.000000000","message":"I was trying to avoid any needless socket work. But yeah good suggestion. I\u0027ll refactor the socket calls in the constructor out so we can easily override it, makes it better for testing.","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ab2678ab1b963559f4f32e360eaafcadda3f7559","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        self._set_prefix(tail_prefix)"},{"line_number":40,"context_line":"        self._default_sample_rate \u003d default_sample_rate"},{"line_number":41,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":42,"context_line":"        self.logger \u003d logger"},{"line_number":43,"context_line":"        self.send_calls \u003d []"},{"line_number":44,"context_line":"        self.calls \u003d defaultdict(list)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"4a24c5ff_0238c0a4","line":42,"in_reply_to":"f716cc39_8bb1a4f5","updated":"2023-07-20 18:59:53.000000000","message":"in fact, if the goal is to execute as much of the StatsdClient code as possible, perhaps this *should* call the super constructor (but patch the critical code that sends to socket)","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            metric, orig_time, sample_rate)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def transfer_rate(self, metric, elapsed_time, byte_xfer, sample_rate\u003dNone):"},{"line_number":78,"context_line":"        self.calls[\u0027transfer_rate\u0027].append((metric, sample_rate))"},{"line_number":79,"context_line":"        return super(FakeStatsdClient, self).transfer_rate("},{"line_number":80,"context_line":"            metric, elapsed_time, byte_xfer, sample_rate)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"01e9f3e3_ad83bc69","line":78,"range":{"start_line":78,"start_character":44,"end_line":78,"end_character":63},"updated":"2023-06-20 13:52:44.000000000","message":"this one doesn\u0027t capture all of the args?","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e4046e8275ab18040f4948de6fff175611f80804","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            metric, orig_time, sample_rate)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def transfer_rate(self, metric, elapsed_time, byte_xfer, sample_rate\u003dNone):"},{"line_number":78,"context_line":"        self.calls[\u0027transfer_rate\u0027].append((metric, sample_rate))"},{"line_number":79,"context_line":"        return super(FakeStatsdClient, self).transfer_rate("},{"line_number":80,"context_line":"            metric, elapsed_time, byte_xfer, sample_rate)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"37d864dd_eab85e5f","line":78,"range":{"start_line":78,"start_character":44,"end_line":78,"end_character":63},"in_reply_to":"01e9f3e3_ad83bc69","updated":"2023-07-21 07:34:58.000000000","message":"Done","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        self.log_dict[store_name].append((tuple(cargs), captured))"},{"line_number":170,"context_line":"        super(FakeLogger, self)._log(level, msg, *args, **kwargs)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def get_increments(self):"},{"line_number":173,"context_line":"        return [call[0] for call in self.statsd_client.calls[\u0027increment\u0027]]"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def get_increment_counts(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"2a4b2c67_c0507fea","line":172,"updated":"2023-06-20 13:52:44.000000000","message":"this is not called often and could therefore be moved to FakeStatsdClient without too much churn","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self.log_dict[store_name].append((tuple(cargs), captured))"},{"line_number":170,"context_line":"        super(FakeLogger, self)._log(level, msg, *args, **kwargs)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def get_increments(self):"},{"line_number":173,"context_line":"        return [call[0] for call in self.statsd_client.calls[\u0027increment\u0027]]"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def get_increment_counts(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1b946040_bc62c2f9","line":172,"in_reply_to":"2a4b2c67_c0507fea","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":172,"context_line":"    def get_increments(self):"},{"line_number":173,"context_line":"        return [call[0] for call in self.statsd_client.calls[\u0027increment\u0027]]"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def get_increment_counts(self):"},{"line_number":176,"context_line":"        # note: this method reports the sum of stats sent via the increment"},{"line_number":177,"context_line":"        # method only; consider using get_stats_counts instead to get the sum"},{"line_number":178,"context_line":"        # of stats sent via both the increment and update_stats methods"}],"source_content_type":"text/x-python","patch_set":4,"id":"26efee6b_d8edd0e6","line":175,"updated":"2023-06-20 13:52:44.000000000","message":"this is called a lot","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def get_increments(self):"},{"line_number":173,"context_line":"        return [call[0] for call in self.statsd_client.calls[\u0027increment\u0027]]"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def get_increment_counts(self):"},{"line_number":176,"context_line":"        # note: this method reports the sum of stats sent via the increment"},{"line_number":177,"context_line":"        # method only; consider using get_stats_counts instead to get the sum"},{"line_number":178,"context_line":"        # of stats sent via both the increment and update_stats methods"}],"source_content_type":"text/x-python","patch_set":4,"id":"6c3e41b5_54ae6eac","line":175,"in_reply_to":"26efee6b_d8edd0e6","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":183,"context_line":"            counts[metric] +\u003d 1"},{"line_number":184,"context_line":"        return counts"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def get_update_stats(self):"},{"line_number":187,"context_line":"        return [call for call in self.statsd_client.calls[\u0027update_stats\u0027]]"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def get_stats_counts(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"048908f2_36d71560","line":186,"updated":"2023-06-20 13:52:44.000000000","message":"could move to FakeStatsdClient","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            counts[metric] +\u003d 1"},{"line_number":184,"context_line":"        return counts"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def get_update_stats(self):"},{"line_number":187,"context_line":"        return [call for call in self.statsd_client.calls[\u0027update_stats\u0027]]"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def get_stats_counts(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"2b95478a_ca6608fa","line":186,"in_reply_to":"048908f2_36d71560","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":186,"context_line":"    def get_update_stats(self):"},{"line_number":187,"context_line":"        return [call for call in self.statsd_client.calls[\u0027update_stats\u0027]]"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def get_stats_counts(self):"},{"line_number":190,"context_line":"        # return dict key-\u003ecount for stats, aggregating calls to both the"},{"line_number":191,"context_line":"        # increment and update methods"},{"line_number":192,"context_line":"        counts \u003d self.get_increment_counts()"}],"source_content_type":"text/x-python","patch_set":4,"id":"8587329f_99652fe2","line":189,"updated":"2023-06-20 13:52:44.000000000","message":"called a lot","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    def get_update_stats(self):"},{"line_number":187,"context_line":"        return [call for call in self.statsd_client.calls[\u0027update_stats\u0027]]"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def get_stats_counts(self):"},{"line_number":190,"context_line":"        # return dict key-\u003ecount for stats, aggregating calls to both the"},{"line_number":191,"context_line":"        # increment and update methods"},{"line_number":192,"context_line":"        counts \u003d self.get_increment_counts()"}],"source_content_type":"text/x-python","patch_set":4,"id":"81a4d12c_55100210","line":189,"in_reply_to":"8587329f_99652fe2","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":273,"context_line":"    decrement \u003d statsd_delegate(\u0027decrement\u0027)"},{"line_number":274,"context_line":"    timing \u003d statsd_delegate(\u0027timing\u0027)"},{"line_number":275,"context_line":"    timing_since \u003d statsd_delegate(\u0027timing_since\u0027)"},{"line_number":276,"context_line":"    transfer_rate \u003d statsd_delegate(\u0027transfer_rate\u0027)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"def debug_logger(name\u003d\u0027test\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"6251dad8_84efb124","line":276,"updated":"2023-06-20 13:52:44.000000000","message":"at first glance this looks unnecessary because it\u0027s duplicating what\u0027s in the super-class, except it is necessary because the superclass forwards to StatsdClient methods, not FakeStatsdClient methods.\n\nBUT, if you rebase on https://review.opendev.org/c/openstack/swift/+/886028 then this delegating becomes unnecessary :) which is good because I\u0027d hate to see it repeated in test infrastructure.","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ab2678ab1b963559f4f32e360eaafcadda3f7559","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    decrement \u003d statsd_delegate(\u0027decrement\u0027)"},{"line_number":274,"context_line":"    timing \u003d statsd_delegate(\u0027timing\u0027)"},{"line_number":275,"context_line":"    timing_since \u003d statsd_delegate(\u0027timing_since\u0027)"},{"line_number":276,"context_line":"    transfer_rate \u003d statsd_delegate(\u0027transfer_rate\u0027)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"def debug_logger(name\u003d\u0027test\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"65444c90_384e9ec4","line":276,"in_reply_to":"6251dad8_84efb124","updated":"2023-07-20 18:59:53.000000000","message":"Done","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ab2678ab1b963559f4f32e360eaafcadda3f7559","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":58,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"},{"line_number":59,"context_line":"        return super(FakeStatsdClient, self).increment("},{"line_number":60,"context_line":"            metric, sample_rate)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def decrement(self, metric, sample_rate\u003dNone):"},{"line_number":63,"context_line":"        self.calls[\u0027decrement\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":7,"id":"8877fdfe_f1e22781","line":60,"updated":"2023-07-20 18:59:53.000000000","message":"could maybe use a trick similar to the statsd_delegate in utils.LogAdpater:\n\n```\ndiff --git a/test/debug_logger.py b/test/debug_logger.py\nindex 890999e1e..7fcb3ac91 100644\n--- a/test/debug_logger.py\n+++ b/test/debug_logger.py\n@@ -41,6 +41,15 @@ class FakeStatsdClient(utils.StatsdClient):\n         self.logger \u003d logger\n         self.send_calls \u003d []\n         self.calls \u003d defaultdict(list)\n+        self.increment \u003d self.capture(\u0027increment\u0027)\n+\n+    def capture(self, func_name):\n+        func \u003d getattr(super(FakeStatsdClient, self), func_name)\n+\n+        def wrapper(*args, **kwargs):\n+            self.calls[func_name].append((args, kwargs))\n+            return func(*args, **kwargs)\n+        return wrapper\n\n     def _send(self, *args, **kwargs):\n         self.send_calls.append((args, kwargs))\n@@ -54,11 +63,6 @@ class FakeStatsdClient(utils.StatsdClient):\n         return super(FakeStatsdClient, self).update_stats(\n             m_name, m_value, sample_rate)\n\n-    def increment(self, metric, sample_rate\u003dNone):\n-        self.calls[\u0027increment\u0027].append((metric, sample_rate))\n-        return super(FakeStatsdClient, self).increment(\n-            metric, sample_rate)\n-\n     def decrement(self, metric, sample_rate\u003dNone):\n         self.calls[\u0027decrement\u0027].append((metric, sample_rate))\n         return super(FakeStatsdClient, self).decrement(metric, sample_rate)\n         ```","commit_id":"02b0f4b02f63e0465e92c5e26f4bc209687cfff8"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":58,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"},{"line_number":59,"context_line":"        return super(FakeStatsdClient, self).increment("},{"line_number":60,"context_line":"            metric, sample_rate)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def decrement(self, metric, sample_rate\u003dNone):"},{"line_number":63,"context_line":"        self.calls[\u0027decrement\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":7,"id":"d4567c3f_1e7aa591","line":60,"in_reply_to":"556f8bac_51b6db54","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"02b0f4b02f63e0465e92c5e26f4bc209687cfff8"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"74745232bad8eec29609bbd1f66231e08a4c0996","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":58,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"},{"line_number":59,"context_line":"        return super(FakeStatsdClient, self).increment("},{"line_number":60,"context_line":"            metric, sample_rate)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def decrement(self, metric, sample_rate\u003dNone):"},{"line_number":63,"context_line":"        self.calls[\u0027decrement\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7114ec7f_40beeff8","line":60,"in_reply_to":"57fa2447_9f049d4f","updated":"2023-07-21 07:36:04.000000000","message":"Doing this has made a lot of churn and I wont get through all the test churn. So will work more on this next week. (so will bump it from our downstream release)","commit_id":"02b0f4b02f63e0465e92c5e26f4bc209687cfff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ef4b104d75bbcf4c87accc0d321ea3fbc34b0253","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":58,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"},{"line_number":59,"context_line":"        return super(FakeStatsdClient, self).increment("},{"line_number":60,"context_line":"            metric, sample_rate)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def decrement(self, metric, sample_rate\u003dNone):"},{"line_number":63,"context_line":"        self.calls[\u0027decrement\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":7,"id":"556f8bac_51b6db54","line":60,"in_reply_to":"7114ec7f_40beeff8","updated":"2023-07-21 08:55:27.000000000","message":"I hadn\u0027t anticipated that using the closure to override the methods would have any impact on the callers - the interface to the FakeStatsdClient should remain the same??\n\nThe tests that are failing seem to be due to the get_increments[_count] method being removed from DebugLogger","commit_id":"02b0f4b02f63e0465e92c5e26f4bc209687cfff8"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6a3f0a9776c772260e751bb3d1398b20bd3235ce","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    def increment(self, metric, sample_rate\u003dNone):"},{"line_number":58,"context_line":"        self.calls[\u0027increment\u0027].append((metric, sample_rate))"},{"line_number":59,"context_line":"        return super(FakeStatsdClient, self).increment("},{"line_number":60,"context_line":"            metric, sample_rate)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def decrement(self, metric, sample_rate\u003dNone):"},{"line_number":63,"context_line":"        self.calls[\u0027decrement\u0027].append((metric, sample_rate))"}],"source_content_type":"text/x-python","patch_set":7,"id":"57fa2447_9f049d4f","line":60,"in_reply_to":"8877fdfe_f1e22781","updated":"2023-07-21 05:08:15.000000000","message":"interesting trick, so all those metrics logging functions can be defined this way, but \"_send\", \"clear\" and others still need to be overrided.","commit_id":"02b0f4b02f63e0465e92c5e26f4bc209687cfff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3741933f118c257ec530fcaa6f4891e288632c51","unresolved":true,"context_lines":[{"line_number":110,"context_line":"    def get_stats_counts(self):"},{"line_number":111,"context_line":"        # return dict key-\u003ecount for stats, aggregating calls to both the"},{"line_number":112,"context_line":"        # increment and update methods"},{"line_number":113,"context_line":"        counts \u003d self.get_increment_counts()"},{"line_number":114,"context_line":"        for metric, step, _ in self.get_update_stats():"},{"line_number":115,"context_line":"            if metric not in counts:"},{"line_number":116,"context_line":"                counts[metric] \u003d 0"}],"source_content_type":"text/x-python","patch_set":8,"id":"e9d82d6d_4e2a11f8","line":113,"updated":"2023-07-21 14:22:38.000000000","message":"if we wrap the StasdClient methods (rather than replace them) then this aggregation shouldn\u0027t be necessary: calls to increment will forward to calls to update_stats and get counted there. So as this stands get_stats_count might end up double-reporting increments","commit_id":"83f60a0e1c02a7a291161fee5c07deaed90f5303"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def get_stats_counts(self):"},{"line_number":111,"context_line":"        # return dict key-\u003ecount for stats, aggregating calls to both the"},{"line_number":112,"context_line":"        # increment and update methods"},{"line_number":113,"context_line":"        counts \u003d self.get_increment_counts()"},{"line_number":114,"context_line":"        for metric, step, _ in self.get_update_stats():"},{"line_number":115,"context_line":"            if metric not in counts:"},{"line_number":116,"context_line":"                counts[metric] \u003d 0"}],"source_content_type":"text/x-python","patch_set":8,"id":"7e9a42d2_875eefc2","line":113,"in_reply_to":"bc694cad_35c3aadc","updated":"2023-08-07 04:33:56.000000000","message":"yeah, that\u0027s true, we are basically just adding together... I\u0027ll remove the aggregation.","commit_id":"83f60a0e1c02a7a291161fee5c07deaed90f5303"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":110,"context_line":"    def get_stats_counts(self):"},{"line_number":111,"context_line":"        # return dict key-\u003ecount for stats, aggregating calls to both the"},{"line_number":112,"context_line":"        # increment and update methods"},{"line_number":113,"context_line":"        counts \u003d self.get_increment_counts()"},{"line_number":114,"context_line":"        for metric, step, _ in self.get_update_stats():"},{"line_number":115,"context_line":"            if metric not in counts:"},{"line_number":116,"context_line":"                counts[metric] \u003d 0"}],"source_content_type":"text/x-python","patch_set":8,"id":"bc694cad_35c3aadc","line":113,"in_reply_to":"e9d82d6d_4e2a11f8","updated":"2023-08-04 18:03:18.000000000","message":"comment still true I think :\n\n```\nfrom test.debug_logger import FakeStatsdClient\ncl \u003d FakeStatsdClient(\u0027h\u0027, 99)\ncl.increment(\u0027foo\u0027)\nprint(cl.get_increment_counts())\nprint(cl.get_stats_counts())\n{\u0027foo\u0027: 1}\n{\u0027foo\u0027: 2}\n```\n\nbut why no test failures?","commit_id":"83f60a0e1c02a7a291161fee5c07deaed90f5303"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        self.timing_since \u003d self.capture(\"timing_since\")"},{"line_number":48,"context_line":"        self.transfer_rate \u003d self.capture(\"transfer_rate\")"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def capture(self, func_name):"},{"line_number":51,"context_line":"        func \u003d getattr(super(FakeStatsdClient, self), func_name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        def wrapper(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"35afedb9_c3609e75","line":50,"updated":"2023-08-04 18:03:18.000000000","message":"nit: make it `_capture`","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.timing_since \u003d self.capture(\"timing_since\")"},{"line_number":48,"context_line":"        self.transfer_rate \u003d self.capture(\"transfer_rate\")"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def capture(self, func_name):"},{"line_number":51,"context_line":"        func \u003d getattr(super(FakeStatsdClient, self), func_name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        def wrapper(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7064b0e5_700f0bf4","line":50,"in_reply_to":"35afedb9_c3609e75","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def clear(self):"},{"line_number":76,"context_line":"        self.send_calls \u003d []"},{"line_number":77,"context_line":"        self.calls \u003d defaultdict(list)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def get_increments(self):"},{"line_number":80,"context_line":"        return [call[0][0] for call in self.calls[\u0027increment\u0027]]"}],"source_content_type":"text/x-python","patch_set":9,"id":"347ff507_b375e1ff","line":77,"updated":"2023-08-04 18:03:18.000000000","message":"also clear sendto_calls","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def clear(self):"},{"line_number":76,"context_line":"        self.send_calls \u003d []"},{"line_number":77,"context_line":"        self.calls \u003d defaultdict(list)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def get_increments(self):"},{"line_number":80,"context_line":"        return [call[0][0] for call in self.calls[\u0027increment\u0027]]"}],"source_content_type":"text/x-python","patch_set":9,"id":"97c83eab_be08005c","line":77,"in_reply_to":"347ff507_b375e1ff","updated":"2023-08-07 04:33:56.000000000","message":"oh yeah, opps.","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":199,"context_line":"        self.formatter \u003d obj"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def close(self):"},{"line_number":202,"context_line":"        self.clear()"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def set_name(self, name):"},{"line_number":205,"context_line":"        # don\u0027t touch _handlers"}],"source_content_type":"text/x-python","patch_set":9,"id":"23f454a0_a07fd071","line":202,"updated":"2023-08-04 18:03:18.000000000","message":"nit: locate adjacent to clear because it just calls straight through","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        self.formatter \u003d obj"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def close(self):"},{"line_number":202,"context_line":"        self.clear()"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def set_name(self, name):"},{"line_number":205,"context_line":"        # don\u0027t touch _handlers"}],"source_content_type":"text/x-python","patch_set":9,"id":"af36fc2a_38ae147f","line":202,"in_reply_to":"23f454a0_a07fd071","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f97fdb703ee14cbfdf33e8ea00fcb2c45f47e9","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        counts \u003d {}"},{"line_number":86,"context_line":"        for metric in self.get_increments():"},{"line_number":87,"context_line":"            if metric not in counts:"},{"line_number":88,"context_line":"                counts[metric] \u003d 0"},{"line_number":89,"context_line":"            counts[metric] +\u003d 1"},{"line_number":90,"context_line":"        return counts"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7395d532_366bcd68","line":88,"updated":"2023-08-07 09:07:59.000000000","message":"nit: counts could be a defaultdict","commit_id":"f50df66fb44fb6ddf3843c99699d217b05183439"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5c1990b5864b1495f7ce9ecce679297a6a428025","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        counts \u003d {}"},{"line_number":86,"context_line":"        for metric in self.get_increments():"},{"line_number":87,"context_line":"            if metric not in counts:"},{"line_number":88,"context_line":"                counts[metric] \u003d 0"},{"line_number":89,"context_line":"            counts[metric] +\u003d 1"},{"line_number":90,"context_line":"        return counts"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"29e94ffe_3237bd17","line":88,"in_reply_to":"7395d532_366bcd68","updated":"2023-08-07 10:03:26.000000000","message":"Done","commit_id":"f50df66fb44fb6ddf3843c99699d217b05183439"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f97fdb703ee14cbfdf33e8ea00fcb2c45f47e9","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        counts \u003d {}"},{"line_number":97,"context_line":"        for metric, step in self.get_update_stats():"},{"line_number":98,"context_line":"            if metric not in counts:"},{"line_number":99,"context_line":"                counts[metric] \u003d 0"},{"line_number":100,"context_line":"            counts[metric] +\u003d step"},{"line_number":101,"context_line":"        return counts"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9aca1ebe_488e4ae6","line":99,"updated":"2023-08-07 09:07:59.000000000","message":"nit: counts could be a defaultdict","commit_id":"f50df66fb44fb6ddf3843c99699d217b05183439"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5c1990b5864b1495f7ce9ecce679297a6a428025","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        counts \u003d {}"},{"line_number":97,"context_line":"        for metric, step in self.get_update_stats():"},{"line_number":98,"context_line":"            if metric not in counts:"},{"line_number":99,"context_line":"                counts[metric] \u003d 0"},{"line_number":100,"context_line":"            counts[metric] +\u003d step"},{"line_number":101,"context_line":"        return counts"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"92a8b7c7_7c122712","line":99,"in_reply_to":"9aca1ebe_488e4ae6","updated":"2023-08-07 10:03:26.000000000","message":"Done","commit_id":"f50df66fb44fb6ddf3843c99699d217b05183439"}],"test/unit/account/test_server.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"083a51dc8c6868a24469014085627b0545fc317b","unresolved":true,"context_lines":[{"line_number":2649,"context_line":"        with mock.patch("},{"line_number":2650,"context_line":"                \u0027time.time\u0027,"},{"line_number":2651,"context_line":"                mock.MagicMock(side_effect\u003d[10000.0, 10001.0, 10002.0,"},{"line_number":2652,"context_line":"                                            10002.0, 10002.0])):"},{"line_number":2653,"context_line":"            with mock.patch("},{"line_number":2654,"context_line":"                    \u0027os.getpid\u0027, mock.MagicMock(return_value\u003d1234)):"},{"line_number":2655,"context_line":"                req.get_response(self.controller)"}],"source_content_type":"text/x-python","patch_set":1,"id":"305eb0d7_d96f0040","line":2652,"updated":"2023-05-23 00:08:57.000000000","message":"Basically just adding an extra time.time() call mock.","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":2649,"context_line":"        with mock.patch("},{"line_number":2650,"context_line":"                \u0027time.time\u0027,"},{"line_number":2651,"context_line":"                mock.MagicMock(side_effect\u003d[10000.0, 10001.0, 10002.0,"},{"line_number":2652,"context_line":"                                            10002.0, 10002.0])):"},{"line_number":2653,"context_line":"            with mock.patch("},{"line_number":2654,"context_line":"                    \u0027os.getpid\u0027, mock.MagicMock(return_value\u003d1234)):"},{"line_number":2655,"context_line":"                req.get_response(self.controller)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1db4fbbb_f980d5a7","line":2652,"in_reply_to":"305eb0d7_d96f0040","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"}],"test/unit/common/middleware/test_proxy_logging.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"083a51dc8c6868a24469014085627b0545fc317b","unresolved":true,"context_lines":[{"line_number":126,"context_line":"        timing_calls \u003d app.access_logger.statsd_client.calls[\u0027timing\u0027]"},{"line_number":127,"context_line":"        found \u003d False"},{"line_number":128,"context_line":"        for timing_call in timing_calls:"},{"line_number":129,"context_line":"            self.assertEqual(3, len(timing_call))"},{"line_number":130,"context_line":"            if timing_call[0] \u003d\u003d exp_metric:"},{"line_number":131,"context_line":"                found \u003d True"},{"line_number":132,"context_line":"                if exp_timing is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"6f38f585_b4c236b6","line":129,"updated":"2023-05-23 00:08:57.000000000","message":"The call always includes the sample_rate as that\u0027s an optional param on every statsd client call.","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        timing_calls \u003d app.access_logger.statsd_client.calls[\u0027timing\u0027]"},{"line_number":127,"context_line":"        found \u003d False"},{"line_number":128,"context_line":"        for timing_call in timing_calls:"},{"line_number":129,"context_line":"            self.assertEqual(3, len(timing_call))"},{"line_number":130,"context_line":"            if timing_call[0] \u003d\u003d exp_metric:"},{"line_number":131,"context_line":"                found \u003d True"},{"line_number":132,"context_line":"                if exp_timing is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"4b60e619_bda00b09","line":129,"in_reply_to":"6f38f585_b4c236b6","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"083a51dc8c6868a24469014085627b0545fc317b","unresolved":true,"context_lines":[{"line_number":232,"context_line":"                    self.assertTiming(\u0027%s.policy.0.GET.321.timing\u0027 % exp_type,"},{"line_number":233,"context_line":"                                      app, exp_timing\u003d2.71828182846 * 1000)"},{"line_number":234,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"},{"line_number":235,"context_line":"                                             4 + 7, None),"},{"line_number":236,"context_line":"                                            (\u0027object.policy.0.GET.321.xfer\u0027,"},{"line_number":237,"context_line":"                                            4 + 7, None)],"},{"line_number":238,"context_line":"                                           app)"}],"source_content_type":"text/x-python","patch_set":1,"id":"49d79109_e57490f1","line":235,"range":{"start_line":235,"start_character":52,"end_line":235,"end_character":56},"updated":"2023-05-23 00:08:57.000000000","message":"This is the sample rate as sent to the client method. Basically default to None so it uses the clients global.\n\nThe FakeClient is capturing the exact call to the methods, so includes the None.","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                    self.assertTiming(\u0027%s.policy.0.GET.321.timing\u0027 % exp_type,"},{"line_number":233,"context_line":"                                      app, exp_timing\u003d2.71828182846 * 1000)"},{"line_number":234,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"},{"line_number":235,"context_line":"                                             4 + 7, None),"},{"line_number":236,"context_line":"                                            (\u0027object.policy.0.GET.321.xfer\u0027,"},{"line_number":237,"context_line":"                                            4 + 7, None)],"},{"line_number":238,"context_line":"                                           app)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ed3eb973_250e949e","line":235,"range":{"start_line":235,"start_character":52,"end_line":235,"end_character":56},"in_reply_to":"49d79109_e57490f1","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":240,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"},{"line_number":241,"context_line":"                                             4 + 7),"},{"line_number":242,"context_line":"                                            (\u0027object.policy.0.GET.321.xfer\u0027,"},{"line_number":243,"context_line":"                                             4 + 7)],"},{"line_number":244,"context_line":"                                           app)"},{"line_number":245,"context_line":"                else:"},{"line_number":246,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"}],"source_content_type":"text/x-python","patch_set":9,"id":"79757c98_d15e0ad3","line":243,"updated":"2023-08-04 18:03:18.000000000","message":"ok, these stats are sent via update_stats so only counted once in FakeStatsdClient","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"},{"line_number":241,"context_line":"                                             4 + 7),"},{"line_number":242,"context_line":"                                            (\u0027object.policy.0.GET.321.xfer\u0027,"},{"line_number":243,"context_line":"                                             4 + 7)],"},{"line_number":244,"context_line":"                                           app)"},{"line_number":245,"context_line":"                else:"},{"line_number":246,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"}],"source_content_type":"text/x-python","patch_set":9,"id":"0f1535de_0ff5c9f8","line":243,"in_reply_to":"79757c98_d15e0ad3","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":362,"context_line":"            self.assertTiming(\u0027account.%s.299.timing\u0027 % exp_method, app,"},{"line_number":363,"context_line":"                              exp_timing\u003d1.17 * 1000)"},{"line_number":364,"context_line":"            self.assertUpdateStats([(\u0027account.%s.299.xfer\u0027 % exp_method,"},{"line_number":365,"context_line":"                                   11 + 3, None)], app)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":368,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"aebb6a63_926ac166","line":365,"range":{"start_line":365,"start_character":42,"end_line":365,"end_character":47},"updated":"2023-08-04 18:03:18.000000000","message":"why do some of the calls have this third arg \u003d\u003d None, but not all?","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            self.assertTiming(\u0027account.%s.299.timing\u0027 % exp_method, app,"},{"line_number":363,"context_line":"                              exp_timing\u003d1.17 * 1000)"},{"line_number":364,"context_line":"            self.assertUpdateStats([(\u0027account.%s.299.xfer\u0027 % exp_method,"},{"line_number":365,"context_line":"                                   11 + 3, None)], app)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":368,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"1e727694_3337c886","line":365,"range":{"start_line":365,"start_character":42,"end_line":365,"end_character":47},"in_reply_to":"aebb6a63_926ac166","updated":"2023-08-07 04:33:56.000000000","message":"Hmm, first version of this patch reworked the calls, so we\u0027d be always getting the sample_rate which defaulted to None.. but now we\u0027re back to how it was before and that now comes in as a kwarg. So the None isn\u0027t required anymore. We ignore it... so some residual cleanup I missed. Basically this None will be ignored so don\u0027t need it.","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"}],"test/unit/common/test_db_replicator.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":1157,"context_line":"            self.assertTrue(os.path.exists(temp_file2.name))"},{"line_number":1158,"context_line":"            self.assertEqual("},{"line_number":1159,"context_line":"                [((\u0027removes.some_device\u0027,), {})],"},{"line_number":1160,"context_line":"                replicator.logger.statsd_client.calls[\u0027increment\u0027])"},{"line_number":1161,"context_line":"            self.assertEqual(1, replicator.stats[\u0027remove\u0027])"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"            temp_file2.db_file \u003d temp_file2.name"}],"source_content_type":"text/x-python","patch_set":9,"id":"49b10284_d1756e04","line":1160,"updated":"2023-08-04 18:03:18.000000000","message":"this is much clearer naming :)","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":1157,"context_line":"            self.assertTrue(os.path.exists(temp_file2.name))"},{"line_number":1158,"context_line":"            self.assertEqual("},{"line_number":1159,"context_line":"                [((\u0027removes.some_device\u0027,), {})],"},{"line_number":1160,"context_line":"                replicator.logger.statsd_client.calls[\u0027increment\u0027])"},{"line_number":1161,"context_line":"            self.assertEqual(1, replicator.stats[\u0027remove\u0027])"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"            temp_file2.db_file \u003d temp_file2.name"}],"source_content_type":"text/x-python","patch_set":9,"id":"1cca3c03_c60c8ee3","line":1160,"in_reply_to":"49b10284_d1756e04","updated":"2023-08-07 04:33:56.000000000","message":"yeah, better then log_dict :)","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"}],"test/unit/container/test_replicator.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"083a51dc8c6868a24469014085627b0545fc317b","unresolved":true,"context_lines":[{"line_number":884,"context_line":"        # push to remote, and third node was missing (also maybe reconciler)"},{"line_number":885,"context_line":"        self.assertTrue(2 \u003c daemon.stats[\u0027rsync\u0027] \u003c\u003d 3, daemon.stats[\u0027rsync\u0027])"},{"line_number":886,"context_line":"        self.assertEqual("},{"line_number":887,"context_line":"            2, self.logger.get_stats_counts().get(\u0027reconciler_db_created\u0027))"},{"line_number":888,"context_line":"        self.assertFalse("},{"line_number":889,"context_line":"            self.logger.get_stats_counts().get(\u0027reconciler_db_exists\u0027))"},{"line_number":890,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"0fdb222f_94451c14","line":887,"range":{"start_line":887,"start_character":12,"end_line":887,"end_character":13},"updated":"2023-05-23 00:08:57.000000000","message":"Not sure why this is now 2... didn\u0027t have time to gid in to it.","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":884,"context_line":"        # push to remote, and third node was missing (also maybe reconciler)"},{"line_number":885,"context_line":"        self.assertTrue(2 \u003c daemon.stats[\u0027rsync\u0027] \u003c\u003d 3, daemon.stats[\u0027rsync\u0027])"},{"line_number":886,"context_line":"        self.assertEqual("},{"line_number":887,"context_line":"            2, self.logger.get_stats_counts().get(\u0027reconciler_db_created\u0027))"},{"line_number":888,"context_line":"        self.assertFalse("},{"line_number":889,"context_line":"            self.logger.get_stats_counts().get(\u0027reconciler_db_exists\u0027))"},{"line_number":890,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dc4d772a_7924334f","line":887,"range":{"start_line":887,"start_character":12,"end_line":887,"end_character":13},"in_reply_to":"0fdb222f_94451c14","updated":"2023-06-20 13:52:44.000000000","message":"StatsdClient.increment calls update_stats and get_stats_count returns the aggregate counts of increment and update_stats calls. So one increment will result in get_stats_counts() \u003d 2. \n\nBefore, the debug_logger did not forward the increment to StatsdClient and so only the increment was counted.\n\nI\u0027m thinking that this should become self.logger.get_incrememt_counts \u003d\u003d 1","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":884,"context_line":"        # push to remote, and third node was missing (also maybe reconciler)"},{"line_number":885,"context_line":"        self.assertTrue(2 \u003c daemon.stats[\u0027rsync\u0027] \u003c\u003d 3, daemon.stats[\u0027rsync\u0027])"},{"line_number":886,"context_line":"        self.assertEqual("},{"line_number":887,"context_line":"            2, self.logger.get_stats_counts().get(\u0027reconciler_db_created\u0027))"},{"line_number":888,"context_line":"        self.assertFalse("},{"line_number":889,"context_line":"            self.logger.get_stats_counts().get(\u0027reconciler_db_exists\u0027))"},{"line_number":890,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d6bde021_c000ca7c","line":887,"range":{"start_line":887,"start_character":12,"end_line":887,"end_character":13},"in_reply_to":"dc4d772a_7924334f","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":911,"context_line":"        self.assertFalse("},{"line_number":912,"context_line":"            self.logger.get_stats_counts().get(\u0027reconciler_db_created\u0027))"},{"line_number":913,"context_line":"        self.assertEqual("},{"line_number":914,"context_line":"            2, self.logger.get_stats_counts().get(\u0027reconciler_db_exists\u0027))"},{"line_number":915,"context_line":"        # but it may not be on the same node as us anymore though..."},{"line_number":916,"context_line":"        reconciler \u003d self._get_broker(reconciler.account,"},{"line_number":917,"context_line":"                                      reconciler.container, node_index\u003d0)"}],"source_content_type":"text/x-python","patch_set":4,"id":"d5c359aa_f8ddcd19","line":914,"updated":"2023-06-20 13:52:44.000000000","message":"ditto","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":911,"context_line":"        self.assertFalse("},{"line_number":912,"context_line":"            self.logger.get_stats_counts().get(\u0027reconciler_db_created\u0027))"},{"line_number":913,"context_line":"        self.assertEqual("},{"line_number":914,"context_line":"            2, self.logger.get_stats_counts().get(\u0027reconciler_db_exists\u0027))"},{"line_number":915,"context_line":"        # but it may not be on the same node as us anymore though..."},{"line_number":916,"context_line":"        reconciler \u003d self._get_broker(reconciler.account,"},{"line_number":917,"context_line":"                                      reconciler.container, node_index\u003d0)"}],"source_content_type":"text/x-python","patch_set":4,"id":"04266ad9_af920361","line":914,"in_reply_to":"d5c359aa_f8ddcd19","updated":"2023-08-07 04:33:56.000000000","message":"Ack","commit_id":"177f07b86559e7a5546de64276b04c30c200c6f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":884,"context_line":"        # push to remote, and third node was missing (also maybe reconciler)"},{"line_number":885,"context_line":"        self.assertTrue(2 \u003c daemon.stats[\u0027rsync\u0027] \u003c\u003d 3, daemon.stats[\u0027rsync\u0027])"},{"line_number":886,"context_line":"        self.assertEqual("},{"line_number":887,"context_line":"            2, self.logger.statsd_client.get_stats_counts().get("},{"line_number":888,"context_line":"                \u0027reconciler_db_created\u0027))"},{"line_number":889,"context_line":"        self.assertFalse("},{"line_number":890,"context_line":"            self.logger.statsd_client.get_stats_counts().get("}],"source_content_type":"text/x-python","patch_set":9,"id":"7ff11dbb_6cf3b785","line":887,"range":{"start_line":887,"start_character":12,"end_line":887,"end_character":13},"updated":"2023-08-04 18:03:18.000000000","message":"no! it\u0027s 1 increment call but the FakeStatsdClient is double-counting it","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":884,"context_line":"        # push to remote, and third node was missing (also maybe reconciler)"},{"line_number":885,"context_line":"        self.assertTrue(2 \u003c daemon.stats[\u0027rsync\u0027] \u003c\u003d 3, daemon.stats[\u0027rsync\u0027])"},{"line_number":886,"context_line":"        self.assertEqual("},{"line_number":887,"context_line":"            2, self.logger.statsd_client.get_stats_counts().get("},{"line_number":888,"context_line":"                \u0027reconciler_db_created\u0027))"},{"line_number":889,"context_line":"        self.assertFalse("},{"line_number":890,"context_line":"            self.logger.statsd_client.get_stats_counts().get("}],"source_content_type":"text/x-python","patch_set":9,"id":"64eacd4f_da9a9cbe","line":887,"range":{"start_line":887,"start_character":12,"end_line":887,"end_character":13},"in_reply_to":"7ff11dbb_6cf3b785","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":914,"context_line":"            self.logger.statsd_client.get_stats_counts().get("},{"line_number":915,"context_line":"                \u0027reconciler_db_created\u0027))"},{"line_number":916,"context_line":"        self.assertEqual("},{"line_number":917,"context_line":"            2, self.logger.statsd_client.get_stats_counts().get("},{"line_number":918,"context_line":"                \u0027reconciler_db_exists\u0027))"},{"line_number":919,"context_line":"        # but it may not be on the same node as us anymore though..."},{"line_number":920,"context_line":"        reconciler \u003d self._get_broker(reconciler.account,"}],"source_content_type":"text/x-python","patch_set":9,"id":"cbb82d9f_d80bc8bd","line":917,"updated":"2023-08-04 18:03:18.000000000","message":"ditto - it should be 1","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":914,"context_line":"            self.logger.statsd_client.get_stats_counts().get("},{"line_number":915,"context_line":"                \u0027reconciler_db_created\u0027))"},{"line_number":916,"context_line":"        self.assertEqual("},{"line_number":917,"context_line":"            2, self.logger.statsd_client.get_stats_counts().get("},{"line_number":918,"context_line":"                \u0027reconciler_db_exists\u0027))"},{"line_number":919,"context_line":"        # but it may not be on the same node as us anymore though..."},{"line_number":920,"context_line":"        reconciler \u003d self._get_broker(reconciler.account,"}],"source_content_type":"text/x-python","patch_set":9,"id":"559216d9_61c5d153","line":917,"in_reply_to":"cbb82d9f_d80bc8bd","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"}],"test/unit/obj/test_updater.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"083a51dc8c6868a24469014085627b0545fc317b","unresolved":true,"context_lines":[{"line_number":535,"context_line":"        self.assertEqual("},{"line_number":536,"context_line":"            sorted(ou.logger.statsd_client.calls[\u0027timing\u0027]),"},{"line_number":537,"context_line":"            sorted([(\u0027updater.timing.status.500\u0027, mock.ANY, None), ] * 3 +"},{"line_number":538,"context_line":"                   [(\u0027timing\u0027, mock.ANY, None), ] * 4))"},{"line_number":539,"context_line":"        ou.logger.clear()"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        bindsock \u003d listen_zero()"}],"source_content_type":"text/x-python","patch_set":1,"id":"8c20284a_dabdcaf1","line":538,"updated":"2023-05-23 00:08:57.000000000","message":"The new FakeStatsdClient captures all calls (before getting to the _send call). Some call timing again, like timing_since will then call timing, so both calls show up.","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8a17aa58a8af2b9cc971d3c08e308a79e4d6444c","unresolved":true,"context_lines":[{"line_number":535,"context_line":"        self.assertEqual("},{"line_number":536,"context_line":"            sorted(ou.logger.statsd_client.calls[\u0027timing\u0027]),"},{"line_number":537,"context_line":"            sorted([(\u0027updater.timing.status.500\u0027, mock.ANY, None), ] * 3 +"},{"line_number":538,"context_line":"                   [(\u0027timing\u0027, mock.ANY, None), ] * 4))"},{"line_number":539,"context_line":"        ou.logger.clear()"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        bindsock \u003d listen_zero()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a31711f_51ccf3d4","line":538,"in_reply_to":"8c20284a_dabdcaf1","updated":"2023-06-20 13:52:44.000000000","message":"maybe we could break out some _ methods in StatsdClient, so timing() and timing_since() both call _timing() ?? That would avoid this confusion","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":false,"context_lines":[{"line_number":535,"context_line":"        self.assertEqual("},{"line_number":536,"context_line":"            sorted(ou.logger.statsd_client.calls[\u0027timing\u0027]),"},{"line_number":537,"context_line":"            sorted([(\u0027updater.timing.status.500\u0027, mock.ANY, None), ] * 3 +"},{"line_number":538,"context_line":"                   [(\u0027timing\u0027, mock.ANY, None), ] * 4))"},{"line_number":539,"context_line":"        ou.logger.clear()"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        bindsock \u003d listen_zero()"}],"source_content_type":"text/x-python","patch_set":1,"id":"76bdaab7_9cbd3918","line":538,"in_reply_to":"9a31711f_51ccf3d4","updated":"2023-08-04 18:03:18.000000000","message":"Done","commit_id":"56fa16db58e2e189e28f8598ff4e4d6892ffb289"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d19790940983f7e7288428cd74d3b42e61233b80","unresolved":true,"context_lines":[{"line_number":1881,"context_line":"            {\u0027successes\u0027: 5, \u0027unlinks\u0027: 5, \u0027deferrals\u0027: 4, \u0027drains\u0027: 2},"},{"line_number":1882,"context_line":"            self.logger.statsd_client.get_increment_counts())"},{"line_number":1883,"context_line":"        self.assertEqual("},{"line_number":1884,"context_line":"            self.logger.statsd_client.get_stats_counts()[\u0027skips\u0027], 2)"},{"line_number":1885,"context_line":""},{"line_number":1886,"context_line":""},{"line_number":1887,"context_line":"class TestObjectUpdaterFunctions(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":9,"id":"48d4cfd4_69215c31","line":1884,"updated":"2023-08-04 18:03:18.000000000","message":"nit: other assertEquals in this context have the expected value first, so:\n\n```\nself.assertEqual(\n            2, self.logger.statsd_client.get_stats_counts()[\u0027skips\u0027])\n```","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ff7e0fad7c6a0ca3c033b930c7127c8e93cd762a","unresolved":false,"context_lines":[{"line_number":1881,"context_line":"            {\u0027successes\u0027: 5, \u0027unlinks\u0027: 5, \u0027deferrals\u0027: 4, \u0027drains\u0027: 2},"},{"line_number":1882,"context_line":"            self.logger.statsd_client.get_increment_counts())"},{"line_number":1883,"context_line":"        self.assertEqual("},{"line_number":1884,"context_line":"            self.logger.statsd_client.get_stats_counts()[\u0027skips\u0027], 2)"},{"line_number":1885,"context_line":""},{"line_number":1886,"context_line":""},{"line_number":1887,"context_line":"class TestObjectUpdaterFunctions(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ccf6b1cd_fbdadfea","line":1884,"in_reply_to":"48d4cfd4_69215c31","updated":"2023-08-07 04:33:56.000000000","message":"Done","commit_id":"e56bf277f554d43c67ee89b573cb5840a3c21457"}]}
