)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02b4a9f5e8c8bb3436b7ad714ff31f7e748f86be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"aa76d1cd_d1ba48fb","updated":"2022-01-14 21:16:06.000000000","message":"i see you\u0027ve got this marked WIP so this isn\u0027t a review; i was just trying to see what was going on and what we think it will look like.","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46cc456272c5e2b22755be7dcb4ba5fcb6b3a0cc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"43f272c5_7f6914db","updated":"2022-01-17 15:51:17.000000000","message":"thanks Clay!\n\nI\u0027m pushing a new version which enhances the SwiftLoggerFormatter rather than introducing a new class","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7b4190a4_41b78530","updated":"2022-01-19 15:38:38.000000000","message":"@Clay thanks for great review!\n\nI\u0027m a coward so will propose the change to NodeIter interface as a follow up and we can squash.","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"eec32f77_a653897c","updated":"2022-01-18 18:52:18.000000000","message":"maybe a couple things worth fixing... mostly my feedback is \"yes please, spooky action at a distance causes bugs and explicit is better than implicit; so keep going!\"","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dd06e9284b480e53937aba1b77bf18fde8ce2802","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7bc421ff_4b6e4706","updated":"2022-01-17 18:46:21.000000000","message":"rebased to avoid merge conflict with the patch that actually causes us to notice this problem","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3958d84d31cfbc2f7a8ab10ac465f1af73261fd7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"58d398ec_3248ed02","updated":"2022-01-19 18:38:33.000000000","message":"I should probably write a launchpad bug and link to i","commit_id":"091c12da42a9788fb900fbe0fcdc75ea76d4a51b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"33bcf44119c5862dbc107b479ff32063739a5fcb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"dc17902f_743aeff6","updated":"2022-01-20 06:23:46.000000000","message":"It\u0027s making sense so far, only part way through the review, but time to stop for dinner 😊\n\nWill continue later or in the morning.","commit_id":"091c12da42a9788fb900fbe0fcdc75ea76d4a51b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55da2344e6b89f4d6b405d621068f5a1c9ca0da0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e8222752_aed10ab9","updated":"2022-01-27 06:05:27.000000000","message":"Love this, rather then applying/changing the loggers prefix, we instead prefix the metric name inside the controller. So the metric names are correct and can\u0027t leave the logger prefix in a bad state!","commit_id":"091c12da42a9788fb900fbe0fcdc75ea76d4a51b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b121701a5ca5ccf21f3e1ca0d44938e5c1955ce2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"d0f44543_34763d57","updated":"2022-02-03 19:31:41.000000000","message":"I think I can live with this.","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bbdb72d2b47e7b06d15b9668ba02fe0a567f14e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"9956e2c0_9829687f","updated":"2022-01-28 21:11:39.000000000","message":"The more I dig into this, the stranger it seems to me that we keep trying to make our loggers look like statsd clients...","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0e40a6419752d117f8805e256c1026cfe7195aef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3d32e7aa_40ad893e","updated":"2022-02-03 23:20:49.000000000","message":"recheck","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2b7c7490dc46491a1bcedd20378268a3eba166c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"a7f03ca1_c8c5ecb0","updated":"2022-02-03 21:27:31.000000000","message":"recheck","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f4d53075e7f39457223fccd516764557f773778","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"cbf13532_1fc4bfaa","updated":"2022-02-04 04:39:56.000000000","message":"recheck","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"}],"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":2092,"context_line":"    def prefix_metric(self, metric):"},{"line_number":2093,"context_line":"        if \u0027metric_prefix\u0027 in self.extra:"},{"line_number":2094,"context_line":"            return \u0027%s.%s\u0027 % (self.extra[\u0027metric_prefix\u0027], metric)"},{"line_number":2095,"context_line":"        return metric"},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":"    def update_stats(self, metric, *a, **kw):"},{"line_number":2098,"context_line":"        return self.logger.update_stats(self.prefix_metric(metric), *a, **kw)"}],"source_content_type":"text/x-python","patch_set":5,"id":"2b04919a_60f7759f","line":2095,"updated":"2022-01-18 18:52:18.000000000","message":"this is more like \"maybe_prefix_metric\"\n\nI think it\u0027d be easier to keep straight as `get_metric_name` where MetricsPrefixLoggerAdapter overrides the method so it\u0027s plain to demonstrate that `metric_prefix` is required for initialization and never gets mutated.","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"    def prefix_metric(self, metric):"},{"line_number":2093,"context_line":"        if \u0027metric_prefix\u0027 in self.extra:"},{"line_number":2094,"context_line":"            return \u0027%s.%s\u0027 % (self.extra[\u0027metric_prefix\u0027], metric)"},{"line_number":2095,"context_line":"        return metric"},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":"    def update_stats(self, metric, *a, **kw):"},{"line_number":2098,"context_line":"        return self.logger.update_stats(self.prefix_metric(metric), *a, **kw)"}],"source_content_type":"text/x-python","patch_set":5,"id":"800dc8b1_00ce3372","line":2095,"in_reply_to":"2b04919a_60f7759f","updated":"2022-01-19 15:38:38.000000000","message":"Done, but we do need to pick up the exception call override in PrefixLoggerAdapter","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f0fc54afff232f0895a973b5d141849a7abda584","unresolved":true,"context_lines":[{"line_number":2084,"context_line":"class SwiftLoggerAdapter(logging.LoggerAdapter):"},{"line_number":2085,"context_line":"    \"\"\""},{"line_number":2086,"context_line":"    A logging.LoggerAdapter subclass that also passes through StatsD method"},{"line_number":2087,"context_line":"    calls. Adds an optional metric_prefix to statsd metric names."},{"line_number":2088,"context_line":""},{"line_number":2089,"context_line":"    Like logging.LoggerAdapter, you have to subclass this and override the"},{"line_number":2090,"context_line":"    process() method to accomplish anything useful."}],"source_content_type":"text/x-python","patch_set":9,"id":"53f83f8d_d21b67d1","line":2087,"updated":"2022-01-28 19:58:06.000000000","message":"Does it?","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7e88a409ea59d9947ef1a3ffd65ed4f90f6d4671","unresolved":true,"context_lines":[{"line_number":2084,"context_line":"class SwiftLoggerAdapter(logging.LoggerAdapter):"},{"line_number":2085,"context_line":"    \"\"\""},{"line_number":2086,"context_line":"    A logging.LoggerAdapter subclass that also passes through StatsD method"},{"line_number":2087,"context_line":"    calls. Adds an optional metric_prefix to statsd metric names."},{"line_number":2088,"context_line":""},{"line_number":2089,"context_line":"    Like logging.LoggerAdapter, you have to subclass this and override the"},{"line_number":2090,"context_line":"    process() method to accomplish anything useful."}],"source_content_type":"text/x-python","patch_set":9,"id":"53ad4882_7f6a8fe8","line":2087,"in_reply_to":"53f83f8d_d21b67d1","updated":"2022-02-04 11:20:57.000000000","message":"Fixed in https://review.opendev.org/c/openstack/swift/+/827845","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bbdb72d2b47e7b06d15b9668ba02fe0a567f14e4","unresolved":true,"context_lines":[{"line_number":2163,"context_line":"        self.metric_prefix \u003d metric_prefix"},{"line_number":2164,"context_line":""},{"line_number":2165,"context_line":"    def get_metric_name(self, metric):"},{"line_number":2166,"context_line":"        return \u0027%s.%s\u0027 % (self.metric_prefix, metric)"},{"line_number":2167,"context_line":""},{"line_number":2168,"context_line":""},{"line_number":2169,"context_line":"# double inheritance to support property with setter"}],"source_content_type":"text/x-python","patch_set":9,"id":"eb225caa_727a2949","line":2166,"updated":"2022-01-28 21:11:39.000000000","message":"It feels weird to me that we\u0027re wrapping the logger instead of the statsd client... the conflated concerns seem not-great.","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bbdb72d2b47e7b06d15b9668ba02fe0a567f14e4","unresolved":true,"context_lines":[{"line_number":2167,"context_line":""},{"line_number":2168,"context_line":""},{"line_number":2169,"context_line":"# double inheritance to support property with setter"},{"line_number":2170,"context_line":"class LogAdapter(logging.LoggerAdapter, object):"},{"line_number":2171,"context_line":"    \"\"\""},{"line_number":2172,"context_line":"    A Logger like object which performs some reformatting on calls to"},{"line_number":2173,"context_line":"    :meth:`exception`.  Can be used to store a threadlocal transaction id and"}],"source_content_type":"text/x-python","patch_set":9,"id":"10df228a_afbbb6d0","line":2170,"updated":"2022-01-28 21:11:39.000000000","message":"It bugs me that this doesn\u0027t inherit from SwiftLogAdapter. Or maybe it should be vice-versa? Either way, the split in class hierarchies is weird.","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f0fc54afff232f0895a973b5d141849a7abda584","unresolved":true,"context_lines":[{"line_number":2296,"context_line":"            call \u003d self._exception"},{"line_number":2297,"context_line":"        call(\u0027%s: %s\u0027 % (msg, emsg), *args, **kwargs)"},{"line_number":2298,"context_line":""},{"line_number":2299,"context_line":"    def set_statsd_prefix(self, prefix):"},{"line_number":2300,"context_line":"        \"\"\""},{"line_number":2301,"context_line":"        The StatsD client prefix defaults to the \"name\" of the logger.  This"},{"line_number":2302,"context_line":"        method may override that default with a specific value.  Currently used"}],"source_content_type":"text/x-python","patch_set":9,"id":"a5522b53_b74a67d9","line":2299,"updated":"2022-01-28 19:58:06.000000000","message":"OK, so we\u0027ve still got callers in proxy-server, proxy-logging, tempauth, and presumably some 3rd-party middlewares -- so I guess we can\u0027t get rid of the interface just yet.","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46cc456272c5e2b22755be7dcb4ba5fcb6b3a0cc","unresolved":true,"context_lines":[{"line_number":1694,"context_line":""},{"line_number":1695,"context_line":"    def increment(self, metric_name):"},{"line_number":1696,"context_line":"        statsd_metric_name \u003d \u0027%s.%s\u0027 % (self.metric_prefix, metric_name)"},{"line_number":1697,"context_line":"        self.logger.increment(statsd_metric_name)"},{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":""},{"line_number":1700,"context_line":"class Controller(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5e3dbe2a_3edad22d","line":1697,"updated":"2022-01-17 15:51:17.000000000","message":"I can enhance the existing SwiftLoggerAdapter to provide this functionality","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02b4a9f5e8c8bb3436b7ad714ff31f7e748f86be","unresolved":true,"context_lines":[{"line_number":1715,"context_line":"        self.trans_id \u003d \u0027-\u0027"},{"line_number":1716,"context_line":"        self._allowed_methods \u003d None"},{"line_number":1717,"context_line":"        self._private_methods \u003d None"},{"line_number":1718,"context_line":"        self.stats \u003d StatsWrapper(self.app.logger, self.server_type.lower())"},{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":"    @property"},{"line_number":1721,"context_line":"    def allowed_methods(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"af17b3e3_6b9e5f8e","line":1718,"updated":"2022-01-14 21:16:06.000000000","message":"whoa!  that\u0027s sneaky right there.  per-instance prefix.","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02b4a9f5e8c8bb3436b7ad714ff31f7e748f86be","unresolved":true,"context_lines":[{"line_number":1938,"context_line":"        :returns: a swob.Response object"},{"line_number":1939,"context_line":"        \"\"\""},{"line_number":1940,"context_line":"        nodes \u003d GreenthreadSafeIterator("},{"line_number":1941,"context_line":"            node_iterator or self.app.iter_nodes(ring, part, stats\u003dself.stats)"},{"line_number":1942,"context_line":"        )"},{"line_number":1943,"context_line":"        node_number \u003d node_count or len(ring.get_part_nodes(part))"},{"line_number":1944,"context_line":"        pile \u003d GreenAsyncPile(node_number)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a41d0e3_fdd77d6f","line":1941,"updated":"2022-01-14 21:16:06.000000000","message":"so in this context, we don\u0027t know/care which type of *nodes* were iterating; we only care which controller class is calling make_request","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46cc456272c5e2b22755be7dcb4ba5fcb6b3a0cc","unresolved":true,"context_lines":[{"line_number":1938,"context_line":"        :returns: a swob.Response object"},{"line_number":1939,"context_line":"        \"\"\""},{"line_number":1940,"context_line":"        nodes \u003d GreenthreadSafeIterator("},{"line_number":1941,"context_line":"            node_iterator or self.app.iter_nodes(ring, part, stats\u003dself.stats)"},{"line_number":1942,"context_line":"        )"},{"line_number":1943,"context_line":"        node_number \u003d node_count or len(ring.get_part_nodes(part))"},{"line_number":1944,"context_line":"        pile \u003d GreenAsyncPile(node_number)"}],"source_content_type":"text/x-python","patch_set":1,"id":"209be7f1_12cb9563","line":1941,"in_reply_to":"3a41d0e3_fdd77d6f","updated":"2022-01-17 15:51:17.000000000","message":"that\u0027s a very good observation - currently the stats would be prefixed by whichever server type was the last to mutate the logger, not they will be prefixed by the current controller type, but should we figure a way to prefix the stats with the ring type?","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02b4a9f5e8c8bb3436b7ad714ff31f7e748f86be","unresolved":true,"context_lines":[{"line_number":2399,"context_line":"        if cached_ranges is None and memcache:"},{"line_number":2400,"context_line":"            cached_ranges \u003d memcache.get(cache_key)"},{"line_number":2401,"context_line":"            self.stats.increment(\u0027shard_updating.cache.%s\u0027"},{"line_number":2402,"context_line":"                                 % (\u0027hit\u0027 if cached_ranges else \u0027miss\u0027))"},{"line_number":2403,"context_line":""},{"line_number":2404,"context_line":"        if cached_ranges:"},{"line_number":2405,"context_line":"            shard_ranges \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"f0081890_3c219ddd","line":2402,"updated":"2022-01-14 21:16:06.000000000","message":"do we only call _get_update_shard from one controller type or another?  I assume it\u0027s in base because we use it in multiple subclasses - in which case reading this it\u0027s not obvious to me at all that we wouldn\u0027t still get this stat with different prefixes.  is that ... desirable?","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46cc456272c5e2b22755be7dcb4ba5fcb6b3a0cc","unresolved":true,"context_lines":[{"line_number":2399,"context_line":"        if cached_ranges is None and memcache:"},{"line_number":2400,"context_line":"            cached_ranges \u003d memcache.get(cache_key)"},{"line_number":2401,"context_line":"            self.stats.increment(\u0027shard_updating.cache.%s\u0027"},{"line_number":2402,"context_line":"                                 % (\u0027hit\u0027 if cached_ranges else \u0027miss\u0027))"},{"line_number":2403,"context_line":""},{"line_number":2404,"context_line":"        if cached_ranges:"},{"line_number":2405,"context_line":"            shard_ranges \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"909da891_a79c08ea","line":2402,"in_reply_to":"f0081890_3c219ddd","updated":"2022-01-17 15:51:17.000000000","message":"AFAICT it is only called from obj controller (and I may move it to that subclass)","commit_id":"62856d0f5a76544415ffc7af009bf1dfa6883a47"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":964,"context_line":"        self.path \u003d path"},{"line_number":965,"context_line":"        self.backend_headers \u003d backend_headers"},{"line_number":966,"context_line":"        self.client_chunk_size \u003d client_chunk_size"},{"line_number":967,"context_line":"        self.logger \u003d logger if logger else app.logger"},{"line_number":968,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":969,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":970,"context_line":"        self.used_nodes \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"ce7506eb_1d7d4c1a","line":967,"updated":"2022-01-18 18:52:18.000000000","message":"i\u0027ve gotten used to `logger or app.logger`\n\nhttps://github.com/openstack/swift/blob/master/swift/obj/server.py#L141\n\nAFAIK it\u0027s functionally equivalent","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":964,"context_line":"        self.path \u003d path"},{"line_number":965,"context_line":"        self.backend_headers \u003d backend_headers"},{"line_number":966,"context_line":"        self.client_chunk_size \u003d client_chunk_size"},{"line_number":967,"context_line":"        self.logger \u003d logger if logger else app.logger"},{"line_number":968,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":969,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":970,"context_line":"        self.used_nodes \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a758cf4_b58416c5","line":967,"in_reply_to":"ce7506eb_1d7d4c1a","updated":"2022-01-19 15:38:38.000000000","message":"Done","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":1614,"context_line":"            policy\u003dpolicy)"},{"line_number":1615,"context_line":"        self.handoff_iter \u003d node_iter"},{"line_number":1616,"context_line":"        self._node_provider \u003d None"},{"line_number":1617,"context_line":"        self.logger \u003d logger if logger else self.app.logger"},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"    @property"},{"line_number":1620,"context_line":"    def primaries_left(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ac3edbd6_e7310c1b","line":1617,"updated":"2022-01-18 18:52:18.000000000","message":"I don\u0027t think this needs to be optional","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":true,"context_lines":[{"line_number":1614,"context_line":"            policy\u003dpolicy)"},{"line_number":1615,"context_line":"        self.handoff_iter \u003d node_iter"},{"line_number":1616,"context_line":"        self._node_provider \u003d None"},{"line_number":1617,"context_line":"        self.logger \u003d logger if logger else self.app.logger"},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"    @property"},{"line_number":1620,"context_line":"    def primaries_left(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9c9e6be3_b93fb397","line":1617,"in_reply_to":"ac3edbd6_e7310c1b","updated":"2022-01-19 15:38:38.000000000","message":"no, but I\u0027m hesitant to change the interface. Maybe I shouldn\u0027t be.","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":1710,"context_line":"        self._private_methods \u003d None"},{"line_number":1711,"context_line":"        # adapt the app logger to prefix statsd metrics with the server type"},{"line_number":1712,"context_line":"        self.logger \u003d PrefixLoggerAdapter("},{"line_number":1713,"context_line":"            self.app.logger, {\u0027metric_prefix\u0027: self.server_type.lower()})"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"    @property"},{"line_number":1716,"context_line":"    def allowed_methods(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"4aab0cee_ab139774","line":1713,"updated":"2022-01-18 18:52:18.000000000","message":"it seems like this will only cause log messages to have a prefix if we call `set_prefix` like we do in background daemons to prefix log messages with worker/pid","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":true,"context_lines":[{"line_number":1710,"context_line":"        self._private_methods \u003d None"},{"line_number":1711,"context_line":"        # adapt the app logger to prefix statsd metrics with the server type"},{"line_number":1712,"context_line":"        self.logger \u003d PrefixLoggerAdapter("},{"line_number":1713,"context_line":"            self.app.logger, {\u0027metric_prefix\u0027: self.server_type.lower()})"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"    @property"},{"line_number":1716,"context_line":"    def allowed_methods(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"301b4e49_671e2625","line":1713,"in_reply_to":"4aab0cee_ab139774","updated":"2022-01-19 15:38:38.000000000","message":"replacing with MetricPrefixLoggerAdapter","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":2137,"context_line":"                                   partition, path, backend_headers,"},{"line_number":2138,"context_line":"                                   concurrency, policy\u003dpolicy,"},{"line_number":2139,"context_line":"                                   client_chunk_size\u003dclient_chunk_size,"},{"line_number":2140,"context_line":"                                   logger\u003dself.logger)"},{"line_number":2141,"context_line":"        res \u003d handler.get_working_response(req)"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        if not res:"}],"source_content_type":"text/x-python","patch_set":5,"id":"6a44fd68_b44bca2c","line":2140,"updated":"2022-01-18 18:52:18.000000000","message":"i\u0027m not sure why some of these params are kwargs - I think this is the one and only place we create one of these","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":true,"context_lines":[{"line_number":2137,"context_line":"                                   partition, path, backend_headers,"},{"line_number":2138,"context_line":"                                   concurrency, policy\u003dpolicy,"},{"line_number":2139,"context_line":"                                   client_chunk_size\u003dclient_chunk_size,"},{"line_number":2140,"context_line":"                                   logger\u003dself.logger)"},{"line_number":2141,"context_line":"        res \u003d handler.get_working_response(req)"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        if not res:"}],"source_content_type":"text/x-python","patch_set":5,"id":"16dd0940_ab5e127b","line":2140,"in_reply_to":"6a44fd68_b44bca2c","updated":"2022-01-19 15:38:38.000000000","message":"my guess is that it avoided test churn as new args were added","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"33bcf44119c5862dbc107b479ff32063739a5fcb","unresolved":true,"context_lines":[{"line_number":1710,"context_line":"        self._private_methods \u003d None"},{"line_number":1711,"context_line":"        # adapt the app logger to prefix statsd metrics with the server type"},{"line_number":1712,"context_line":"        self.logger \u003d MetricsPrefixLoggerAdapter("},{"line_number":1713,"context_line":"            self.app.logger, {}, self.server_type.lower())"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"    @property"},{"line_number":1716,"context_line":"    def allowed_methods(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"770bef62_27272909","line":1713,"updated":"2022-01-20 06:23:46.000000000","message":"So it\u0027ll now prefix with the server_type rather then postfix? \n\n  object.proxy-server rather then proxy-server.object (or whatever the old pattern was)","commit_id":"091c12da42a9788fb900fbe0fcdc75ea76d4a51b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55da2344e6b89f4d6b405d621068f5a1c9ca0da0","unresolved":true,"context_lines":[{"line_number":1710,"context_line":"        self._private_methods \u003d None"},{"line_number":1711,"context_line":"        # adapt the app logger to prefix statsd metrics with the server type"},{"line_number":1712,"context_line":"        self.logger \u003d MetricsPrefixLoggerAdapter("},{"line_number":1713,"context_line":"            self.app.logger, {}, self.server_type.lower())"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"    @property"},{"line_number":1716,"context_line":"    def allowed_methods(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"347ec041_24ed1a49","line":1713,"in_reply_to":"43a1d778_2aee5214","updated":"2022-01-27 06:05:27.000000000","message":"Oh right, ok, thanks for the clarification :)","commit_id":"091c12da42a9788fb900fbe0fcdc75ea76d4a51b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"04952d63187207d5c3bb9f0cb7f102792d2b3e05","unresolved":true,"context_lines":[{"line_number":1710,"context_line":"        self._private_methods \u003d None"},{"line_number":1711,"context_line":"        # adapt the app logger to prefix statsd metrics with the server type"},{"line_number":1712,"context_line":"        self.logger \u003d MetricsPrefixLoggerAdapter("},{"line_number":1713,"context_line":"            self.app.logger, {}, self.server_type.lower())"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"    @property"},{"line_number":1716,"context_line":"    def allowed_methods(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"43a1d778_2aee5214","line":1713,"in_reply_to":"770bef62_27272909","updated":"2022-01-20 10:02:35.000000000","message":"no, the adapter adds the prefix to the name (e.g. object.foo) then passes on to the StatdsClient which adds its prefix (e.g. proxy-server.object.foo)","commit_id":"091c12da42a9788fb900fbe0fcdc75ea76d4a51b"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":2392,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":2393,"context_line":"        self.source \u003d None"},{"line_number":2394,"context_line":"        self.logger_thread_locals \u003d logger_thread_locals"},{"line_number":2395,"context_line":"        self.logger \u003d logger if logger else app.logger"},{"line_number":2396,"context_line":""},{"line_number":2397,"context_line":"    def fast_forward(self, num_bytes):"},{"line_number":2398,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"674c0fd3_1401d0f7","line":2395,"updated":"2022-01-18 18:52:18.000000000","message":"I think if we can require logger_thread_locals we can require a logger","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":2392,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":2393,"context_line":"        self.source \u003d None"},{"line_number":2394,"context_line":"        self.logger_thread_locals \u003d logger_thread_locals"},{"line_number":2395,"context_line":"        self.logger \u003d logger if logger else app.logger"},{"line_number":2396,"context_line":""},{"line_number":2397,"context_line":"    def fast_forward(self, num_bytes):"},{"line_number":2398,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"e81650e3_da3e3681","line":2395,"in_reply_to":"674c0fd3_1401d0f7","updated":"2022-01-19 15:38:38.000000000","message":"Done, I was being unnecessarily defensive, this class is only instantiated in one place!","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":2854,"context_line":""},{"line_number":2855,"context_line":"        getter \u003d ECFragGetter(self.app, req, node_iter, partition,"},{"line_number":2856,"context_line":"                              policy, req.swift_entity_path, backend_headers,"},{"line_number":2857,"context_line":"                              header_provider, logger_thread_locals)"},{"line_number":2858,"context_line":"        return (getter, getter.response_parts_iter(req))"},{"line_number":2859,"context_line":""},{"line_number":2860,"context_line":"    def _convert_range(self, req, policy):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3bdba7c8_3cc5cff7","line":2857,"updated":"2022-01-18 18:52:18.000000000","message":"How do we know we don\u0027t want to pass in our logger here directly?\n\ndo we *ever* pass in a logger to ECFragGetter?","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":true,"context_lines":[{"line_number":2854,"context_line":""},{"line_number":2855,"context_line":"        getter \u003d ECFragGetter(self.app, req, node_iter, partition,"},{"line_number":2856,"context_line":"                              policy, req.swift_entity_path, backend_headers,"},{"line_number":2857,"context_line":"                              header_provider, logger_thread_locals)"},{"line_number":2858,"context_line":"        return (getter, getter.response_parts_iter(req))"},{"line_number":2859,"context_line":""},{"line_number":2860,"context_line":"    def _convert_range(self, req, policy):"}],"source_content_type":"text/x-python","patch_set":5,"id":"721c3765_908692a7","line":2857,"in_reply_to":"3bdba7c8_3cc5cff7","updated":"2022-01-19 15:38:38.000000000","message":"that\u0027s a bug :( thanks\n\nthe one place we send a metric in this class is line 2709 which IIRC isn\u0027t covered by a test, and I\u0027m not sure we know if it is ever reachable :/","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"}],"swift/proxy/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":547,"context_line":"                return HTTPForbidden(request\u003dreq, body\u003d\u0027Invalid host header\u0027)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"            self.logger.set_statsd_prefix(\u0027proxy-server.\u0027 +"},{"line_number":550,"context_line":"                                          controller.server_type.lower())"},{"line_number":551,"context_line":"            controller \u003d controller(self, **path_parts)"},{"line_number":552,"context_line":"            if \u0027swift.trans_id\u0027 not in req.environ:"},{"line_number":553,"context_line":"                # if this wasn\u0027t set by an earlier middleware, set it now"}],"source_content_type":"text/x-python","patch_set":5,"id":"8464a8b9_6bcb5dc5","side":"PARENT","line":550,"updated":"2022-01-18 18:52:18.000000000","message":"yay!!!","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":547,"context_line":"                return HTTPForbidden(request\u003dreq, body\u003d\u0027Invalid host header\u0027)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"            self.logger.set_statsd_prefix(\u0027proxy-server.\u0027 +"},{"line_number":550,"context_line":"                                          controller.server_type.lower())"},{"line_number":551,"context_line":"            controller \u003d controller(self, **path_parts)"},{"line_number":552,"context_line":"            if \u0027swift.trans_id\u0027 not in req.environ:"},{"line_number":553,"context_line":"                # if this wasn\u0027t set by an earlier middleware, set it now"}],"source_content_type":"text/x-python","patch_set":5,"id":"131f596a_dee6aa68","side":"PARENT","line":550,"in_reply_to":"8464a8b9_6bcb5dc5","updated":"2022-01-19 15:38:38.000000000","message":"Ack","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":514,"context_line":"        :param req: swob.Request object"},{"line_number":515,"context_line":"        \"\"\""},{"line_number":516,"context_line":"        try:"},{"line_number":517,"context_line":"            self.logger.set_statsd_prefix(\u0027proxy-server\u0027)"},{"line_number":518,"context_line":"            if req.content_length and req.content_length \u003c 0:"},{"line_number":519,"context_line":"                self.logger.increment(\u0027errors\u0027)"},{"line_number":520,"context_line":"                return HTTPBadRequest(request\u003dreq,"}],"source_content_type":"text/x-python","patch_set":5,"id":"a0920842_a92a89cc","line":517,"updated":"2022-01-18 18:52:18.000000000","message":"i noticed this line is getting some more testing\n\nmaybe we shouldn\u0027t reset this statsd prefix every request anymore?","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":514,"context_line":"        :param req: swob.Request object"},{"line_number":515,"context_line":"        \"\"\""},{"line_number":516,"context_line":"        try:"},{"line_number":517,"context_line":"            self.logger.set_statsd_prefix(\u0027proxy-server\u0027)"},{"line_number":518,"context_line":"            if req.content_length and req.content_length \u003c 0:"},{"line_number":519,"context_line":"                self.logger.increment(\u0027errors\u0027)"},{"line_number":520,"context_line":"                return HTTPBadRequest(request\u003dreq,"}],"source_content_type":"text/x-python","patch_set":5,"id":"8dd66e22_e13e7359","line":517,"in_reply_to":"a0920842_a92a89cc","updated":"2022-01-19 15:38:38.000000000","message":"Done","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":701,"context_line":"            \u0027port\u0027: node[\u0027port\u0027], \u0027device\u0027: node[\u0027device\u0027]})"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    def iter_nodes(self, ring, partition, node_iter\u003dNone, policy\u003dNone,"},{"line_number":704,"context_line":"                   logger\u003dNone):"},{"line_number":705,"context_line":"        return NodeIter(self, ring, partition, node_iter\u003dnode_iter,"},{"line_number":706,"context_line":"                        policy\u003dpolicy, logger\u003dlogger)"},{"line_number":707,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c1f67ea9_034c7b28","line":704,"updated":"2022-01-18 18:52:18.000000000","message":"I couldn\u0027t find anyone who calls iter_nodes that doesn\u0027t pass in a logger","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":701,"context_line":"            \u0027port\u0027: node[\u0027port\u0027], \u0027device\u0027: node[\u0027device\u0027]})"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    def iter_nodes(self, ring, partition, node_iter\u003dNone, policy\u003dNone,"},{"line_number":704,"context_line":"                   logger\u003dNone):"},{"line_number":705,"context_line":"        return NodeIter(self, ring, partition, node_iter\u003dnode_iter,"},{"line_number":706,"context_line":"                        policy\u003dpolicy, logger\u003dlogger)"},{"line_number":707,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"367e293e_8461a3ff","line":704,"in_reply_to":"c1f67ea9_034c7b28","updated":"2022-01-19 15:38:38.000000000","message":"Done","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":703,"context_line":"    def iter_nodes(self, ring, partition, node_iter\u003dNone, policy\u003dNone,"},{"line_number":704,"context_line":"                   logger\u003dNone):"},{"line_number":705,"context_line":"        return NodeIter(self, ring, partition, node_iter\u003dnode_iter,"},{"line_number":706,"context_line":"                        policy\u003dpolicy, logger\u003dlogger)"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"    def exception_occurred(self, node, typ, additional_info,"},{"line_number":709,"context_line":"                           **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"f4acf630_2a1ce921","line":706,"updated":"2022-01-18 18:52:18.000000000","message":"I think this is the only place we create a NodeIter object - and we pass in logger","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":703,"context_line":"    def iter_nodes(self, ring, partition, node_iter\u003dNone, policy\u003dNone,"},{"line_number":704,"context_line":"                   logger\u003dNone):"},{"line_number":705,"context_line":"        return NodeIter(self, ring, partition, node_iter\u003dnode_iter,"},{"line_number":706,"context_line":"                        policy\u003dpolicy, logger\u003dlogger)"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"    def exception_occurred(self, node, typ, additional_info,"},{"line_number":709,"context_line":"                           **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"473c32f9_ade3a751","line":706,"in_reply_to":"f4acf630_2a1ce921","updated":"2022-01-19 15:38:38.000000000","message":"Ack","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f0fc54afff232f0895a973b5d141849a7abda584","unresolved":true,"context_lines":[{"line_number":198,"context_line":"            self.logger \u003d get_logger(conf, log_route\u003d\u0027proxy-server\u0027)"},{"line_number":199,"context_line":"        else:"},{"line_number":200,"context_line":"            self.logger \u003d logger"},{"line_number":201,"context_line":"        self.logger.set_statsd_prefix(\u0027proxy-server\u0027)"},{"line_number":202,"context_line":"        self._error_limiting \u003d {}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        swift_dir \u003d conf.get(\u0027swift_dir\u0027, \u0027/etc/swift\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"c67c9b9e_1c326661","line":201,"updated":"2022-01-28 19:58:06.000000000","message":"I feel like the big take-away from all of this is that calling set_statsd_prefix() on a long-lived logger instance is inherently messy outside of initialization.\n\nMakes me wonder if this should start being something handled in get_logger()...","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"83a505c280cd37f9e2247be8315d0f7b485c974b","unresolved":true,"context_lines":[{"line_number":198,"context_line":"            self.logger \u003d get_logger(conf, log_route\u003d\u0027proxy-server\u0027)"},{"line_number":199,"context_line":"        else:"},{"line_number":200,"context_line":"            self.logger \u003d logger"},{"line_number":201,"context_line":"        self.logger.set_statsd_prefix(\u0027proxy-server\u0027)"},{"line_number":202,"context_line":"        self._error_limiting \u003d {}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        swift_dir \u003d conf.get(\u0027swift_dir\u0027, \u0027/etc/swift\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"225c22cc_0bfaa8ba","line":201,"in_reply_to":"c67c9b9e_1c326661","updated":"2022-02-04 11:21:18.000000000","message":"see https://review.opendev.org/c/openstack/swift/+/827845","commit_id":"6942b25cc109258804989c32fa3ffe2b536c6e77"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":6362,"context_line":"            logger.increment(\u0027test\u0027)"},{"line_number":6363,"context_line":"        self.assertEqual("},{"line_number":6364,"context_line":"            [mock.call(\u0027one.test1\u0027), mock.call(\u0027two.test2\u0027),"},{"line_number":6365,"context_line":"             mock.call(\u0027test3\u0027), mock.call(\u0027test\u0027)],"},{"line_number":6366,"context_line":"            mock_increment.call_args_list)"},{"line_number":6367,"context_line":""},{"line_number":6368,"context_line":"        adapter1.extra[\u0027metric_prefix\u0027] \u003d \u0027not one\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"93e1e273_9adcb9e8","line":6365,"updated":"2022-01-18 18:52:18.000000000","message":"so the adapter\u0027s increment calls the loggers increment but w/ a prefix","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":6362,"context_line":"            logger.increment(\u0027test\u0027)"},{"line_number":6363,"context_line":"        self.assertEqual("},{"line_number":6364,"context_line":"            [mock.call(\u0027one.test1\u0027), mock.call(\u0027two.test2\u0027),"},{"line_number":6365,"context_line":"             mock.call(\u0027test3\u0027), mock.call(\u0027test\u0027)],"},{"line_number":6366,"context_line":"            mock_increment.call_args_list)"},{"line_number":6367,"context_line":""},{"line_number":6368,"context_line":"        adapter1.extra[\u0027metric_prefix\u0027] \u003d \u0027not one\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"f6973c5e_658b712c","line":6365,"in_reply_to":"93e1e273_9adcb9e8","updated":"2022-01-19 15:38:38.000000000","message":"Ack","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":6365,"context_line":"             mock.call(\u0027test3\u0027), mock.call(\u0027test\u0027)],"},{"line_number":6366,"context_line":"            mock_increment.call_args_list)"},{"line_number":6367,"context_line":""},{"line_number":6368,"context_line":"        adapter1.extra[\u0027metric_prefix\u0027] \u003d \u0027not one\u0027"},{"line_number":6369,"context_line":"        with mock.patch.object(logger, \u0027increment\u0027) as mock_increment:"},{"line_number":6370,"context_line":"            adapter1.increment(\u0027test1\u0027)"},{"line_number":6371,"context_line":"            adapter2.increment(\u0027test2\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"2f8432ef_f98e6c8c","line":6368,"updated":"2022-01-18 18:52:18.000000000","message":"and it\u0027s mutable","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":6365,"context_line":"             mock.call(\u0027test3\u0027), mock.call(\u0027test\u0027)],"},{"line_number":6366,"context_line":"            mock_increment.call_args_list)"},{"line_number":6367,"context_line":""},{"line_number":6368,"context_line":"        adapter1.extra[\u0027metric_prefix\u0027] \u003d \u0027not one\u0027"},{"line_number":6369,"context_line":"        with mock.patch.object(logger, \u0027increment\u0027) as mock_increment:"},{"line_number":6370,"context_line":"            adapter1.increment(\u0027test1\u0027)"},{"line_number":6371,"context_line":"            adapter2.increment(\u0027test2\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"03fccb34_0abe0e59","line":6368,"in_reply_to":"2f8432ef_f98e6c8c","updated":"2022-01-19 15:38:38.000000000","message":"Ack","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55da2344e6b89f4d6b405d621068f5a1c9ca0da0","unresolved":true,"context_lines":[{"line_number":6353,"context_line":"        locals1 \u003d (\u0027tx_123\u0027, \u00271.2.3.4\u0027)"},{"line_number":6354,"context_line":"        adapter1.thread_locals \u003d locals1"},{"line_number":6355,"context_line":"        self.assertEqual(adapter1.thread_locals, locals1)"},{"line_number":6356,"context_line":"        self.assertEqual(adapter2.thread_locals, locals1)"},{"line_number":6357,"context_line":"        self.assertEqual(logger.thread_locals, locals1)"},{"line_number":6358,"context_line":""},{"line_number":6359,"context_line":"        locals2 \u003d (\u0027tx_456\u0027, \u00271.2.3.456\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"8978be21_c83090c4","line":6356,"updated":"2022-01-27 06:05:27.000000000","message":"Oh right, because using the setter (on line 6354) means it set in the logger, so the getter here will pull out locals1, nice!","commit_id":"091c12da42a9788fb900fbe0fcdc75ea76d4a51b"}],"test/unit/proxy/controllers/test_container.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":2258,"context_line":"            [\u0027container.shard_listing.cache.hit\u0027])"},{"line_number":2259,"context_line":"        self.assertEqual("},{"line_number":2260,"context_line":"            [((\u0027proxy-server\u0027,), {})],"},{"line_number":2261,"context_line":"            self.app.logger.log_dict[\u0027set_statsd_prefix\u0027])"},{"line_number":2262,"context_line":""},{"line_number":2263,"context_line":"        # put this back the way we found it for later subtests"},{"line_number":2264,"context_line":"        self.app.container_listing_shard_ranges_skip_cache \u003d 0.0"}],"source_content_type":"text/x-python","patch_set":5,"id":"fe5c84a0_f9ce5545","line":2261,"updated":"2022-01-18 18:52:18.000000000","message":"checking that set_statsd_prefix is called is verying... existing behavior?","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":true,"context_lines":[{"line_number":2258,"context_line":"            [\u0027container.shard_listing.cache.hit\u0027])"},{"line_number":2259,"context_line":"        self.assertEqual("},{"line_number":2260,"context_line":"            [((\u0027proxy-server\u0027,), {})],"},{"line_number":2261,"context_line":"            self.app.logger.log_dict[\u0027set_statsd_prefix\u0027])"},{"line_number":2262,"context_line":""},{"line_number":2263,"context_line":"        # put this back the way we found it for later subtests"},{"line_number":2264,"context_line":"        self.app.container_listing_shard_ranges_skip_cache \u003d 0.0"}],"source_content_type":"text/x-python","patch_set":5,"id":"10ec3d70_28261deb","line":2261,"in_reply_to":"fe5c84a0_f9ce5545","updated":"2022-01-19 15:38:38.000000000","message":"also verifying that we no longer call set_statsd_prefix(\u0027account\u0027|\u0027container\u0027|\u0027object\u0027)","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"}],"test/unit/proxy/controllers/test_info.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":35,"context_line":"                       admin_key\u003dNone):"},{"line_number":36,"context_line":"        disallowed_sections \u003d disallowed_sections or []"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        app \u003d Mock(spec\u003dProxyApp, logger\u003ddebug_logger())"},{"line_number":39,"context_line":"        return InfoController(app, None, expose_info,"},{"line_number":40,"context_line":"                              disallowed_sections, admin_key)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"26d2dcd7_6a1b7f31","line":38,"updated":"2022-01-18 18:52:18.000000000","message":"i was surprised you caught this - i\u0027m so used to mock making up attributes with MagicMock - but i guess the spec kwarg gets you the AttributeErrors; good hygine on the part of the test author","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                       admin_key\u003dNone):"},{"line_number":36,"context_line":"        disallowed_sections \u003d disallowed_sections or []"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        app \u003d Mock(spec\u003dProxyApp, logger\u003ddebug_logger())"},{"line_number":39,"context_line":"        return InfoController(app, None, expose_info,"},{"line_number":40,"context_line":"                              disallowed_sections, admin_key)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"d90399f2_a6cd9e12","line":38,"in_reply_to":"26d2dcd7_6a1b7f31","updated":"2022-01-19 15:38:38.000000000","message":"Ack","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c83019963d283f24a37894904e5f26b4571bba25","unresolved":true,"context_lines":[{"line_number":3975,"context_line":""},{"line_number":3976,"context_line":"            self.assertEqual(resp.status_int, 202)"},{"line_number":3977,"context_line":"            stats \u003d self.app.logger.get_increment_counts()"},{"line_number":3978,"context_line":"            self.assertEqual({\u0027object.shard_updating.backend.200\u0027: 1}, stats)"},{"line_number":3979,"context_line":"            backend_requests \u003d fake_conn.requests"},{"line_number":3980,"context_line":"            self.assertEqual("},{"line_number":3981,"context_line":"                # account, container HEAD, container GET, obj"}],"source_content_type":"text/x-python","patch_set":5,"id":"ebdfc331_302777a8","line":3978,"updated":"2022-01-18 18:52:18.000000000","message":"so much better to maintain than the magic/hidden prefix mangling!","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d024c2c2885e096b2a483549305bcbb24d2b7ce9","unresolved":false,"context_lines":[{"line_number":3975,"context_line":""},{"line_number":3976,"context_line":"            self.assertEqual(resp.status_int, 202)"},{"line_number":3977,"context_line":"            stats \u003d self.app.logger.get_increment_counts()"},{"line_number":3978,"context_line":"            self.assertEqual({\u0027object.shard_updating.backend.200\u0027: 1}, stats)"},{"line_number":3979,"context_line":"            backend_requests \u003d fake_conn.requests"},{"line_number":3980,"context_line":"            self.assertEqual("},{"line_number":3981,"context_line":"                # account, container HEAD, container GET, obj"}],"source_content_type":"text/x-python","patch_set":5,"id":"a5364d35_1f79f935","line":3978,"in_reply_to":"ebdfc331_302777a8","updated":"2022-01-19 15:38:38.000000000","message":"Ack","commit_id":"94245d0134de097a5a3e73ed130d3a25c1b0efb4"}]}
