)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbff7a19ae57ab01358fb363b5f327cecea88818","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c812cbc7_d1e7e235","updated":"2023-09-06 20:24:11.000000000","message":"Love that the meat of it\u0027s in `swift/cli/` -- should make it much easier for us to add some tests! I\u0027ll see about writing some over the next week or two...","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"32595c2a24e043c17b5d6f74efc0acfe60801687","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e7cc203a_f3bacad8","updated":"2023-09-06 20:58:29.000000000","message":"could we rename it to something else... the status clearly belongs to something that is yet to be expired but is not already expired. \u0027swift-to-be-expired-status\u0027 seems too cumbersome, so maybe \u0027swift-expirer-status\u0027?","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6ffd586bba753b1a81034eee1df4fc0803b9c52f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"fed681f0_093a0c72","updated":"2023-09-07 02:12:13.000000000","message":"ohh, nice. Tim makes great points and of course tests, but we can work through all that.\n\nGreat work Matthew and thanks!\n\nWe already have a tool that recon\u0027s and brings back status/info. It even has an `--expirer` option but that only queries the cluster to get back when the expirers where last run:\n\n\n    vagrant@saio8:~$ swift-recon --expirer\n    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n    --\u003e Starting reconnaissance on 4 hosts (object)\n    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n    [2023-09-07 02:07:37] Checking on expirers\n    [object_expiration_pass] - No hosts returned valid data.\n    [expired_last_pass] - No hosts returned valid data.\n    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nI wonder if we should think about extending an existing stats gathering tool to do more then it currently does. Maybe add something like:\n\n\n    swift-recon --expirer-queue\n\nJust thinking out loud now. Just a thought not a blocker.","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"fefcf149bb16e09de7db1009894f7626c484cf66","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c7928e44_9cf6698c","in_reply_to":"3f82a03d_38c5eb67","updated":"2023-09-08 13:23:34.000000000","message":"I\u0027m happy to adjust the name if we can agree on a better one. Naming things is hard :)\n\nswift-expirer-status or swift-expirer-info both seem good to me. I think adding this functionality to swift-recon instead might be a bit beyond me...","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6ffd586bba753b1a81034eee1df4fc0803b9c52f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3f82a03d_38c5eb67","in_reply_to":"e7cc203a_f3bacad8","updated":"2023-09-07 02:12:13.000000000","message":"I don\u0027t mind to name, but always happy to talk naming ;)\n\nWe do have swift-{account,container,object}-info but that works because we have swift-container-* for swift container services etc. But could use the same kind of naming:\n\n    swift-expirer-info\n\nOr to keep the same pattern:\n\n    swift-object-expirer-info\n\nBut the other info tools takes in an object on disk.. so they\u0027re not really the same thing. swift-recon already has a --expirer option. I wonder if we should extend that or add a new one for stats.\nrecon at the moment tends to only interigate the recon middleware on every node, but we could extend it to be the tool to quiery swift health maybe. \n\n    swift-recon --expirer-queue?","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"fefcf149bb16e09de7db1009894f7626c484cf66","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"03c8f979_a763c43a","updated":"2023-09-08 13:23:34.000000000","message":"Hi,\nThanks for all the feedback! I think I\u0027ve done most of the suggested changes.","commit_id":"a2fd891b8cc2a8ab00dfc0e7237a3247f841274d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"bfe0f9272c1bb24320d3fcf5a8345b3df6c4e395","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"897e8fe5_e702f522","updated":"2023-09-08 15:02:27.000000000","message":"Sorry if I\u0027m not paying attention, but does the docstring say where to run this thing? Options are:\n\n 1. administrator\u0027s workstation (accessing cluster through API)\n 1a. does this need access to back-end over IP through firewalls?\n 2. a proxy\n 3. same node where expirers are configured to run\n 3a. any one, all of them?\n\nOr is this too obvious?","commit_id":"c88992460a846bc1c100f38652468b301889514d"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"42276690471074731c33224839699a1209888cd9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c4a60439_d678715b","updated":"2023-09-08 15:54:24.000000000","message":"recheck","commit_id":"c88992460a846bc1c100f38652468b301889514d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"fdb4b62fde10de2cee322d0c666c275b4d907a26","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1947607b_17882617","in_reply_to":"2a62183c_924ba848","updated":"2023-09-08 15:44:27.000000000","message":"Thanks, should we document it?","commit_id":"c88992460a846bc1c100f38652468b301889514d"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"ea6599c65dd0ecc2e8710a627996e7b6805b52eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2a62183c_924ba848","in_reply_to":"897e8fe5_e702f522","updated":"2023-09-08 15:14:07.000000000","message":"It uses the InternalClient, which I think means it must be run from any node within the swift cluster (object store or proxy).","commit_id":"c88992460a846bc1c100f38652468b301889514d"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"c35cd49e50b0646eb712ceeeb5be1c50fbd0e522","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8820af58_4371f91b","updated":"2025-02-18 18:05:43.000000000","message":"It works per my testing. Lacks the support of grace period, but that can be added in the follow up.","commit_id":"ba9b462dd10295026bbdf4df6f81d156d196b482"}],"swift/cli/expired_status.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbff7a19ae57ab01358fb363b5f327cecea88818","unresolved":true,"context_lines":[{"line_number":72,"context_line":"def main():"},{"line_number":73,"context_line":"    args \u003d parser.parse_args()"},{"line_number":74,"context_line":"    now \u003d time.time()"},{"line_number":75,"context_line":"    t_now \u003d Timestamp.now()"},{"line_number":76,"context_line":"    expiring_account \u003d \u0027.expiring_objects\u0027"},{"line_number":77,"context_line":"    conf \u003d ConfigString(ic_conf_body)"},{"line_number":78,"context_line":"    swift \u003d InternalClient(conf, \u0027swift-expirer-status\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ae5017c7_00fd0274","line":75,"updated":"2023-09-06 20:24:11.000000000","message":"Might be better to do something like\n```\nt_now \u003d Timestamp.now()\nnow \u003d float(t_now)\n```\nor\n```\nnow \u003d time.time()\nt_now \u003d Timestamp(now)\n```\nso we don\u0027t get a small skew between these two \"now\"s.","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"fefcf149bb16e09de7db1009894f7626c484cf66","unresolved":false,"context_lines":[{"line_number":72,"context_line":"def main():"},{"line_number":73,"context_line":"    args \u003d parser.parse_args()"},{"line_number":74,"context_line":"    now \u003d time.time()"},{"line_number":75,"context_line":"    t_now \u003d Timestamp.now()"},{"line_number":76,"context_line":"    expiring_account \u003d \u0027.expiring_objects\u0027"},{"line_number":77,"context_line":"    conf \u003d ConfigString(ic_conf_body)"},{"line_number":78,"context_line":"    swift \u003d InternalClient(conf, \u0027swift-expirer-status\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d858dfdc_16fa5bfe","line":75,"in_reply_to":"ae5017c7_00fd0274","updated":"2023-09-08 13:23:34.000000000","message":"Done","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbff7a19ae57ab01358fb363b5f327cecea88818","unresolved":true,"context_lines":[{"line_number":74,"context_line":"    now \u003d time.time()"},{"line_number":75,"context_line":"    t_now \u003d Timestamp.now()"},{"line_number":76,"context_line":"    expiring_account \u003d \u0027.expiring_objects\u0027"},{"line_number":77,"context_line":"    conf \u003d ConfigString(ic_conf_body)"},{"line_number":78,"context_line":"    swift \u003d InternalClient(conf, \u0027swift-expirer-status\u0027, 1)"},{"line_number":79,"context_line":"    stats \u003d defaultdict(int)"},{"line_number":80,"context_line":"    for container_item in swift.iter_containers(expiring_account):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d1fcf74_2707d20a","line":77,"updated":"2023-09-06 20:24:11.000000000","message":"Even better would be if you could pass a config to use on the CLI, falling back to `/etc/swift/internal-client.conf` (if present) or *finally* the inlined ic_conf_body from container_sync.\n\nAt that point, we could probably even get a better default for `--container-divisor` by picking it out from the conf (or hunting it down on the proxy app once we\u0027ve instantiated the IC).","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"fefcf149bb16e09de7db1009894f7626c484cf66","unresolved":true,"context_lines":[{"line_number":74,"context_line":"    now \u003d time.time()"},{"line_number":75,"context_line":"    t_now \u003d Timestamp.now()"},{"line_number":76,"context_line":"    expiring_account \u003d \u0027.expiring_objects\u0027"},{"line_number":77,"context_line":"    conf \u003d ConfigString(ic_conf_body)"},{"line_number":78,"context_line":"    swift \u003d InternalClient(conf, \u0027swift-expirer-status\u0027, 1)"},{"line_number":79,"context_line":"    stats \u003d defaultdict(int)"},{"line_number":80,"context_line":"    for container_item in swift.iter_containers(expiring_account):"}],"source_content_type":"text/x-python","patch_set":2,"id":"b4246265_98eb7ec3","line":77,"in_reply_to":"6d1fcf74_2707d20a","updated":"2023-09-08 13:23:34.000000000","message":"I\u0027ve done the first of these (allowing config specified on CLI, or internal-client.conf if available, falling back to ic_conf_body).\n\nI\u0027d need some pointers on how to attempt the latter, I\u0027m afraid.","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbff7a19ae57ab01358fb363b5f327cecea88818","unresolved":true,"context_lines":[{"line_number":84,"context_line":"        try:"},{"line_number":85,"context_line":"            container \u003d int(container_item[\u0027name\u0027])"},{"line_number":86,"context_line":"        except ValueError:"},{"line_number":87,"context_line":"            continue"},{"line_number":88,"context_line":"        stats[\u0027total\u0027] +\u003d container_item[\u0027count\u0027]"},{"line_number":89,"context_line":"        if container \u003c now:"},{"line_number":90,"context_line":"            if not args.details:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff691825_989e3c64","line":87,"updated":"2023-09-06 20:24:11.000000000","message":"Given how we don\u0027t expect these containers to exist, it might be worth logging a warning of some kind.","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"fefcf149bb16e09de7db1009894f7626c484cf66","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        try:"},{"line_number":85,"context_line":"            container \u003d int(container_item[\u0027name\u0027])"},{"line_number":86,"context_line":"        except ValueError:"},{"line_number":87,"context_line":"            continue"},{"line_number":88,"context_line":"        stats[\u0027total\u0027] +\u003d container_item[\u0027count\u0027]"},{"line_number":89,"context_line":"        if container \u003c now:"},{"line_number":90,"context_line":"            if not args.details:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7721ee54_6d5b15af","line":87,"in_reply_to":"ff691825_989e3c64","updated":"2023-09-08 13:23:34.000000000","message":"Done","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbff7a19ae57ab01358fb363b5f327cecea88818","unresolved":true,"context_lines":[{"line_number":93,"context_line":"                else:"},{"line_number":94,"context_line":"                    stats[\u0027pending\u0027] +\u003d container_item[\u0027count\u0027]"},{"line_number":95,"context_line":"                continue"},{"line_number":96,"context_line":"            for object_item in swift.iter_objects("},{"line_number":97,"context_line":"                    expiring_account, container_item[\u0027name\u0027]):"},{"line_number":98,"context_line":"                if args.verbose:"},{"line_number":99,"context_line":"                    print(\u0027%(name)s: %(content_type)s\u0027 % object_item)"}],"source_content_type":"text/x-python","patch_set":2,"id":"55d5c99e_73da9038","line":96,"updated":"2023-09-06 20:24:11.000000000","message":"This might be a good place for us to add some concurrency -- if you\u0027ve got millions/billions for expiry queue entries, doing `--details` serially is going to take a while.\n\nFine for future work, though.","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"c35cd49e50b0646eb712ceeeb5be1c50fbd0e522","unresolved":true,"context_lines":[{"line_number":93,"context_line":"                else:"},{"line_number":94,"context_line":"                    stats[\u0027pending\u0027] +\u003d container_item[\u0027count\u0027]"},{"line_number":95,"context_line":"                continue"},{"line_number":96,"context_line":"            for object_item in swift.iter_objects("},{"line_number":97,"context_line":"                    expiring_account, container_item[\u0027name\u0027]):"},{"line_number":98,"context_line":"                if args.verbose:"},{"line_number":99,"context_line":"                    print(\u0027%(name)s: %(content_type)s\u0027 % object_item)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1eef23eb_c95d89af","line":96,"in_reply_to":"55d5c99e_73da9038","updated":"2025-02-18 18:05:43.000000000","message":"it took me ~15 minutes to finish scanning 1M entries with ``--details``, okay for a few millions, not billions for sure.\n```\n$ sudo /opt/ss/bin/python3 expired_status.py --container-divisor\u003d86440 --details\n  Total entries: 919360\nPending entries: 66\n  Stale entries: 918482\n```","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbff7a19ae57ab01358fb363b5f327cecea88818","unresolved":true,"context_lines":[{"line_number":98,"context_line":"                if args.verbose:"},{"line_number":99,"context_line":"                    print(\u0027%(name)s: %(content_type)s\u0027 % object_item)"},{"line_number":100,"context_line":"                delete_timestamp, _target_account, _target_container, \\"},{"line_number":101,"context_line":"                    _target_object \u003d parse_task_obj(object_item[\u0027name\u0027])"},{"line_number":102,"context_line":"                if t_now \u003e delete_timestamp:"},{"line_number":103,"context_line":"                    stats[\u0027stale\u0027] +\u003d 1"},{"line_number":104,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"a129b2d6_ba37ef48","line":101,"range":{"start_line":101,"start_character":37,"end_line":101,"end_character":51},"updated":"2023-09-06 20:24:11.000000000","message":"Should we try to tolerate this parsing failing, similar to how we tolerate container names that aren\u0027t ints?","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34175,"name":"Matthew Vernon","email":"mvernon@wikimedia.org","username":"mvernon"},"change_message_id":"fefcf149bb16e09de7db1009894f7626c484cf66","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                if args.verbose:"},{"line_number":99,"context_line":"                    print(\u0027%(name)s: %(content_type)s\u0027 % object_item)"},{"line_number":100,"context_line":"                delete_timestamp, _target_account, _target_container, \\"},{"line_number":101,"context_line":"                    _target_object \u003d parse_task_obj(object_item[\u0027name\u0027])"},{"line_number":102,"context_line":"                if t_now \u003e delete_timestamp:"},{"line_number":103,"context_line":"                    stats[\u0027stale\u0027] +\u003d 1"},{"line_number":104,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bbbdc28c_1946f9af","line":101,"range":{"start_line":101,"start_character":37,"end_line":101,"end_character":51},"in_reply_to":"a129b2d6_ba37ef48","updated":"2023-09-08 13:23:34.000000000","message":"Done","commit_id":"5a0cf11cf51c4e69307243db42b7708a51440c8e"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"c35cd49e50b0646eb712ceeeb5be1c50fbd0e522","unresolved":true,"context_lines":[{"line_number":42,"context_line":"The ``--container-divisor`` argument may be used to specify (in"},{"line_number":43,"context_line":"seconds) the window size for pending expirations (this is the same as"},{"line_number":44,"context_line":"the ``expiring_objects_container_divisor`` configuration parameter for"},{"line_number":45,"context_line":"the proxy and object servers, and defaults to 86440, one day). It is"},{"line_number":46,"context_line":"used here to classify containers as containing pending (if their name"},{"line_number":47,"context_line":"is less than ``--container-divisor`` seconds in the past) or stale (if"},{"line_number":48,"context_line":"their name is longer ago) entries. It has no effect if ``--details``"}],"source_content_type":"text/x-python","patch_set":5,"id":"15e64f8f_6e613b7b","line":45,"updated":"2025-02-18 18:05:43.000000000","message":"``86440`` is the default and not configurable anymore, but okay to have this argument to support legacy use case I guess.","commit_id":"ba9b462dd10295026bbdf4df6f81d156d196b482"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"c35cd49e50b0646eb712ceeeb5be1c50fbd0e522","unresolved":true,"context_lines":[{"line_number":128,"context_line":"                else:"},{"line_number":129,"context_line":"                    stats[\u0027pending\u0027] +\u003d 1"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    print(\u0027  Total entries: %(total)s\u0027 % stats)"},{"line_number":132,"context_line":"    print(\u0027Pending entries: %(pending)s\u0027 % stats)"},{"line_number":133,"context_line":"    print(\u0027  Stale entries: %(stale)s\u0027 % stats)"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"38693bf0_475b2695","line":131,"updated":"2025-02-18 18:05:43.000000000","message":"might be useful to output a line of ``Incoming entries`` which equals to ``Total entries - Pending entries - Stale entries ``\n```\nsudo /opt/ss/bin/python3 expired_status.py --container-divisor\u003d86440 --details\n  Total entries: 919360\nPending entries: 66\n  Stale entries: 918482\n```","commit_id":"ba9b462dd10295026bbdf4df6f81d156d196b482"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"287cdd5112fbfb0d82cca5f642e65730d22c0fe6","unresolved":true,"context_lines":[{"line_number":128,"context_line":"                else:"},{"line_number":129,"context_line":"                    stats[\u0027pending\u0027] +\u003d 1"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    print(\u0027  Total entries: %(total)s\u0027 % stats)"},{"line_number":132,"context_line":"    print(\u0027Pending entries: %(pending)s\u0027 % stats)"},{"line_number":133,"context_line":"    print(\u0027  Stale entries: %(stale)s\u0027 % stats)"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5ed7332e_c43ed3f7","line":131,"in_reply_to":"38693bf0_475b2695","updated":"2025-02-19 18:07:54.000000000","message":"Or `Waiting entries`? `Not-yet-active entries`?\n\nIt would also be interesting (especially when thinking about the rebalance tool https://review.opendev.org/c/openstack/swift/+/933373 wants to add) to see what the furthest-in-the-future expiration time currently is.","commit_id":"ba9b462dd10295026bbdf4df6f81d156d196b482"}]}
