)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"347d9ee23ef8d1ec7bef63fc35105abcd33f2ddc","unresolved":false,"context_lines":[{"line_number":12,"context_line":"large number of object-expirers will be able to run on a large swift"},{"line_number":13,"context_line":"cluster at the same time."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"After this patch, enqueue target of expiring tssks are automatically changed to"},{"line_number":16,"context_line":"general task queue. Dequeue target of expiring tasks can be choosen by operator"},{"line_number":17,"context_line":"from legacy (\u003dthe task queue used before this patch) or general task queue."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"bf659307_e17b1525","line":15,"range":{"start_line":15,"start_character":44,"end_line":15,"end_character":50},"updated":"2018-03-30 09:05:51.000000000","message":"tasks","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"897b8921431f2fc8ee08921cdc95b723defee4f7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"large number of object-expirers will be able to run on a large swift"},{"line_number":13,"context_line":"cluster at the same time."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"After this patch, enqueue target of expiring tssks are automatically changed to"},{"line_number":16,"context_line":"general task queue. Dequeue target of expiring tasks can be choosen by operator"},{"line_number":17,"context_line":"from legacy (\u003dthe task queue used before this patch) or general task queue."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"bf659307_4955e6f9","line":15,"range":{"start_line":15,"start_character":44,"end_line":15,"end_character":50},"in_reply_to":"bf659307_e17b1525","updated":"2018-04-05 12:56:25.000000000","message":"Done","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"}],"bin/swift-object-expirer":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    parser \u003d OptionParser(\"%prog CONFIG [options]\")"},{"line_number":24,"context_line":"    parser.add_option(\u0027--execute-legacy-task\u0027, dest\u003d\u0027execute_legacy_task\u0027,"},{"line_number":25,"context_line":"                      help\u003d\"The flag to execute legacy style expirer tasks. \""},{"line_number":26,"context_line":"                      \"The default is false.\")"},{"line_number":27,"context_line":"    parser.add_option(\u0027--processes\u0027, dest\u003d\u0027processes\u0027,"},{"line_number":28,"context_line":"                      help\u003d\"Number of processes to use to do the work, don\u0027t \""},{"line_number":29,"context_line":"                      \"use this option to do all the work in one process. This\""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_f1be59d3","line":26,"updated":"2018-01-18 09:11:11.000000000","message":"I\u0027m confused because this option is in conf file.\n\nCurious, processes and process are, too though.\n\nI\u0027m not sure if they are defined both in conf and options, which parameter is used in the actual process...","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    parser \u003d OptionParser(\"%prog CONFIG [options]\")"},{"line_number":24,"context_line":"    parser.add_option(\u0027--execute-legacy-task\u0027, dest\u003d\u0027execute_legacy_task\u0027,"},{"line_number":25,"context_line":"                      help\u003d\"The flag to execute legacy style expirer tasks. \""},{"line_number":26,"context_line":"                      \"The default is false.\")"},{"line_number":27,"context_line":"    parser.add_option(\u0027--processes\u0027, dest\u003d\u0027processes\u0027,"},{"line_number":28,"context_line":"                      help\u003d\"Number of processes to use to do the work, don\u0027t \""},{"line_number":29,"context_line":"                      \"use this option to do all the work in one process. This\""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_f9169ea7","line":26,"in_reply_to":"7f96bb07_f1be59d3","updated":"2018-01-24 12:03:41.000000000","message":"Done.\nI added explanation about behavior when both of conf and options are defined.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                      dest\u003d\u0027dequeue_from_legacy\u0027,"},{"line_number":26,"context_line":"                      help\u003d\"The flag to execute legacy style expirer tasks. \""},{"line_number":27,"context_line":"                      \"If this value is provided via this option, the config \""},{"line_number":28,"context_line":"                      \"value will be overridden by the option value.\")"},{"line_number":29,"context_line":"    parser.add_option(\u0027--processes\u0027, dest\u003d\u0027processes\u0027,"},{"line_number":30,"context_line":"                      help\u003d\"Number of processes to use to do the work, don\u0027t \""},{"line_number":31,"context_line":"                      \"use this option to do all the work in one process. This\""}],"source_content_type":"application/octet-stream","patch_set":42,"id":"dfbec78f_d7497e60","line":28,"updated":"2019-05-03 15:40:30.000000000","message":"slightly surprised this isn\u0027t action\u003dstore_true but maybe it\u0027s not so easy for daemons to do that...\n\nhrm... it looks like it should work :shrug:","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"doc/manpages/object-server.conf.5":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"abb219d3221714bfd8acb58b7abb1f28bdd5c90d","unresolved":false,"context_lines":[{"line_number":86,"context_line":"Disable pre-allocate disk space for a file. The default is false."},{"line_number":87,"context_line":".IP \\fBexpiring_objects_container_divisor\\fR"},{"line_number":88,"context_line":"Divisor value for rounding delete-at timestamp to get task container name."},{"line_number":89,"context_line":"The default is 86400 seconds (\u003d 1 hour)."},{"line_number":90,"context_line":".IP \\fBexpiring_objects_account_name\\fR"},{"line_number":91,"context_line":"Account name used for legacy style expirer task queue."},{"line_number":92,"context_line":"The default is expiring_objects."}],"source_content_type":"text/troff","patch_set":3,"id":"bf8cb3f7_17c35fef","line":89,"range":{"start_line":89,"start_character":15,"end_line":89,"end_character":20},"updated":"2017-12-22 03:33:55.000000000","message":"This is actually seconds in a day","commit_id":"638242bdbf0bde0dcce517785d465a6efc84106c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"661a602c9ccc3bbae8ff69f1ca35f08321b4c21b","unresolved":false,"context_lines":[{"line_number":86,"context_line":"Disable pre-allocate disk space for a file. The default is false."},{"line_number":87,"context_line":".IP \\fBexpiring_objects_container_divisor\\fR"},{"line_number":88,"context_line":"Divisor value for rounding delete-at timestamp to get task container name."},{"line_number":89,"context_line":"The default is 86400 seconds (\u003d 1 hour)."},{"line_number":90,"context_line":".IP \\fBexpiring_objects_account_name\\fR"},{"line_number":91,"context_line":"Account name used for legacy style expirer task queue."},{"line_number":92,"context_line":"The default is expiring_objects."}],"source_content_type":"text/troff","patch_set":3,"id":"bf8cb3f7_68976c92","line":89,"range":{"start_line":89,"start_character":15,"end_line":89,"end_character":20},"in_reply_to":"bf8cb3f7_17c35fef","updated":"2017-12-22 07:28:52.000000000","message":"Done","commit_id":"638242bdbf0bde0dcce517785d465a6efc84106c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9f0b639edcaaacb3ea9b87d4c9c24de51ce3dfe","unresolved":false,"context_lines":[{"line_number":627,"context_line":"Ignored if IOPRIO_CLASS_IDLE is set."},{"line_number":628,"context_line":".IP \\fBinternal_client_conf_path\\fR"},{"line_number":629,"context_line":"Internal client config file path. The default is"},{"line_number":630,"context_line":"/etc/swift/internal-client.conf"},{"line_number":631,"context_line":".RE"},{"line_number":632,"context_line":".PD"},{"line_number":633,"context_line":""}],"source_content_type":"text/troff","patch_set":6,"id":"7f96bb07_85d60fc3","line":630,"updated":"2018-01-15 23:24:57.000000000","message":"We probably need to add back the process and processes but make sure they state used only in legacy mode.","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"02f19635fb4d2a7d96c2aa25ef8c28e1db3297df","unresolved":false,"context_lines":[{"line_number":627,"context_line":"Ignored if IOPRIO_CLASS_IDLE is set."},{"line_number":628,"context_line":".IP \\fBinternal_client_conf_path\\fR"},{"line_number":629,"context_line":"Internal client config file path. The default is"},{"line_number":630,"context_line":"/etc/swift/internal-client.conf"},{"line_number":631,"context_line":".RE"},{"line_number":632,"context_line":".PD"},{"line_number":633,"context_line":""}],"source_content_type":"text/troff","patch_set":6,"id":"7f96bb07_ef71c277","line":630,"in_reply_to":"7f96bb07_85d60fc3","updated":"2018-01-17 10:04:27.000000000","message":"Done by squashing Matthew\u0027s patch.","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"}],"doc/source/overview_expiring_objects.rst":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"abb219d3221714bfd8acb58b7abb1f28bdd5c90d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"``swift-object-expirer`` daemon count in a cluster used to be suggested to one."},{"line_number":30,"context_line":"However, ``swift-object-expirer`` daemons run in all object servers now."},{"line_number":31,"context_line":"Expiration tasks are shared by ``swift-object-expirer`` daemons. Task"},{"line_number":32,"context_line":"assignation is defined by partition numbers."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"An expiration task is executed by only one ``swift-object-expirer``. This isn\u0027t"},{"line_number":35,"context_line":"exactly automatic failover high availability, but if this daemon doesn\u0027t run"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bf8cb3f7_f275a999","line":32,"updated":"2017-12-22 03:33:55.000000000","message":"hmm, maybe we can reword this paragraph to something like:\n\nIn the past it was suggested to make the number of ``swift-object-expirer`` daemons running in a cluster and then manually control concurrency as required. However, now the ``swift-object-expirer`` daemons run on all object servers so expiration tasks are shared and will scale with the cluster automatically.","commit_id":"638242bdbf0bde0dcce517785d465a6efc84106c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"661a602c9ccc3bbae8ff69f1ca35f08321b4c21b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"``swift-object-expirer`` daemon count in a cluster used to be suggested to one."},{"line_number":30,"context_line":"However, ``swift-object-expirer`` daemons run in all object servers now."},{"line_number":31,"context_line":"Expiration tasks are shared by ``swift-object-expirer`` daemons. Task"},{"line_number":32,"context_line":"assignation is defined by partition numbers."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"An expiration task is executed by only one ``swift-object-expirer``. This isn\u0027t"},{"line_number":35,"context_line":"exactly automatic failover high availability, but if this daemon doesn\u0027t run"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bf8cb3f7_48e38834","line":32,"in_reply_to":"bf8cb3f7_f275a999","updated":"2017-12-22 07:28:52.000000000","message":"Done","commit_id":"638242bdbf0bde0dcce517785d465a6efc84106c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b015f5302fd44fd70c665f6cc5f1e52c40205b0","unresolved":false,"context_lines":[{"line_number":57,"context_line":"Deployment"},{"line_number":58,"context_line":"----------"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Expiring object support is enabled by running ``swift-object-expierer``"},{"line_number":61,"context_line":"daemons in *all* object servers."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":".. note::"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7f96bb07_6a453c17","line":60,"range":{"start_line":60,"start_character":61,"end_line":60,"end_character":69},"updated":"2018-01-11 04:30:08.000000000","message":"typo","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"b47f91f556b7865913557388353bf03315239935","unresolved":false,"context_lines":[{"line_number":57,"context_line":"Deployment"},{"line_number":58,"context_line":"----------"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Expiring object support is enabled by running ``swift-object-expierer``"},{"line_number":61,"context_line":"daemons in *all* object servers."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":".. note::"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7f96bb07_5b5931fc","line":60,"range":{"start_line":60,"start_character":61,"end_line":60,"end_character":69},"in_reply_to":"7f96bb07_6a453c17","updated":"2018-01-15 09:16:39.000000000","message":"Done","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9f0b639edcaaacb3ea9b87d4c9c24de51ce3dfe","unresolved":false,"context_lines":[{"line_number":76,"context_line":"\"legacy style\". ``swift-object-expirer`` daemons don\u0027t execute the legacy style"},{"line_number":77,"context_line":"tasks by default. If you want ``swift-object-expirer`` to execute not only"},{"line_number":78,"context_line":"current style tasks but also legacy style tasks, set ``execute_legacy_task`` to"},{"line_number":79,"context_line":"``true`` in [object-expirer] section of some object-server.conf files."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":".. note::"},{"line_number":82,"context_line":"    If you set ``execute_legacy_task`` to ``true``, take care of count of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7f96bb07_a5b8eb75","line":79,"updated":"2018-01-15 23:24:57.000000000","message":"We should talk about processes and process here seeing as we are keeping them for legacy tuning.","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"02f19635fb4d2a7d96c2aa25ef8c28e1db3297df","unresolved":false,"context_lines":[{"line_number":76,"context_line":"\"legacy style\". ``swift-object-expirer`` daemons don\u0027t execute the legacy style"},{"line_number":77,"context_line":"tasks by default. If you want ``swift-object-expirer`` to execute not only"},{"line_number":78,"context_line":"current style tasks but also legacy style tasks, set ``execute_legacy_task`` to"},{"line_number":79,"context_line":"``true`` in [object-expirer] section of some object-server.conf files."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":".. note::"},{"line_number":82,"context_line":"    If you set ``execute_legacy_task`` to ``true``, take care of count of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7f96bb07_af673ab7","line":79,"in_reply_to":"7f96bb07_a5b8eb75","updated":"2018-01-17 10:04:27.000000000","message":"Done by squashing Matthew\u0027s patch.","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    [filter:catch_errors]"},{"line_number":76,"context_line":"    use \u003d egg:swift#catch_errors"},{"line_number":77,"context_line":"    # See proxy-server.conf-sample for options"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"The daemon needs to run on a machine with access to all the backend servers in"},{"line_number":80,"context_line":"the cluster, but does not need proxy server or public access. The daemon will"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7f96bb07_9186f5b8","side":"PARENT","line":77,"updated":"2018-01-18 09:11:11.000000000","message":"Hmm... maybe we may leave those information for now with \"this is legacy and it will be deprecated\" comment.\n\nOIC, this is moved to the bottom in the Deployment section.","commit_id":"d707fc7b6d0ceb4556dddfc258c5de8c4baff05c"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    will never deleted by ``swift-object-expirer``."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"--------------------------------------------------------------------------"},{"line_number":72,"context_line":"How to make object-expirers compatible with legacy style expiration tasks?"},{"line_number":73,"context_line":"--------------------------------------------------------------------------"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Object servers used to record expiration tasks in a hidden"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7f96bb07_51014d05","line":72,"range":{"start_line":72,"start_character":73,"end_line":72,"end_character":74},"updated":"2018-01-18 09:11:11.000000000","message":"I don\u0027t think we need \"?\" for the explanation title.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    will never deleted by ``swift-object-expirer``."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"--------------------------------------------------------------------------"},{"line_number":72,"context_line":"How to make object-expirers compatible with legacy style expiration tasks?"},{"line_number":73,"context_line":"--------------------------------------------------------------------------"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Object servers used to record expiration tasks in a hidden"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7f96bb07_391c06c0","line":72,"range":{"start_line":72,"start_character":73,"end_line":72,"end_character":74},"in_reply_to":"7f96bb07_51014d05","updated":"2018-01-24 12:03:41.000000000","message":"Done","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":82,"context_line":".. note::"},{"line_number":83,"context_line":"    Be careful not to enable ``execute_legacy_task`` on too many servers as all"},{"line_number":84,"context_line":"    legacy tasks are stored in a single hidden account and the same hidden"},{"line_number":85,"context_line":"    containers. On a large cluster one may inadvertently DDOS oneself."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"If there isn\u0027t too many legacy expiring objects out there, simply enabling"},{"line_number":88,"context_line":"``execute_legacy_task`` on one expirer would eventually get around to cleaning"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7f96bb07_f11c1979","line":85,"range":{"start_line":85,"start_character":56,"end_line":85,"end_character":70},"updated":"2018-01-18 09:11:11.000000000","message":"it may be actually DDOS but i don\u0027t like to employ the negative word here. And actually, it can be controlled via process/processes configuration, isn\u0027t it?","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":82,"context_line":".. note::"},{"line_number":83,"context_line":"    Be careful not to enable ``execute_legacy_task`` on too many servers as all"},{"line_number":84,"context_line":"    legacy tasks are stored in a single hidden account and the same hidden"},{"line_number":85,"context_line":"    containers. On a large cluster one may inadvertently DDOS oneself."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"If there isn\u0027t too many legacy expiring objects out there, simply enabling"},{"line_number":88,"context_line":"``execute_legacy_task`` on one expirer would eventually get around to cleaning"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7f96bb07_d962c216","line":85,"range":{"start_line":85,"start_character":56,"end_line":85,"end_character":70},"in_reply_to":"7f96bb07_f11c1979","updated":"2018-01-24 12:03:41.000000000","message":"Done.\nI updated the explanation.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"15294de9ab24458a4d70875e59841746bc26905b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"cluster."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The daemon\u0027s configuration is located in the ``[object-expirer]`` section of"},{"line_number":50,"context_line":"the object-server.conf file. Update the section if you want to controll"},{"line_number":51,"context_line":"object-expirers\u0027 behavior."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"The daemon needs to run on a machine with access to all the backend servers in"}],"source_content_type":"text/x-rst","patch_set":22,"id":"bf659307_82c35e89","line":50,"updated":"2018-04-11 05:26:37.000000000","message":"\"control\"","commit_id":"3aae6e384b6eeee0f53a8c78bd783d05c54221a7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"88477240217e2e3e8c123f3f5676198413c3043f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"cluster."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The daemon\u0027s configuration is located in the ``[object-expirer]`` section of"},{"line_number":50,"context_line":"the object-server.conf file. Update the section if you want to controll"},{"line_number":51,"context_line":"object-expirers\u0027 behavior."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"The daemon needs to run on a machine with access to all the backend servers in"}],"source_content_type":"text/x-rst","patch_set":22,"id":"bf659307_814499b9","line":50,"in_reply_to":"bf659307_82c35e89","updated":"2018-04-17 09:44:26.000000000","message":"Done","commit_id":"3aae6e384b6eeee0f53a8c78bd783d05c54221a7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"``swift-object-expirer`` to handle later. In this case, ``ring-name`` is the"},{"line_number":28,"context_line":"ring\u0027s name for the expiring object\u0027s storage policy (e.g. ``object``,"},{"line_number":29,"context_line":"``object-1``, ``object-2``) and ``partition`` is the partition number for the"},{"line_number":30,"context_line":"expiring object."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"In the past it was suggested to choose a number of ``swift-object-expirer``"},{"line_number":33,"context_line":"daemons running in a cluster and then manually control concurrency as required."}],"source_content_type":"text/x-rst","patch_set":41,"id":"dfbec78f_120acd25","line":30,"updated":"2019-05-03 15:40:30.000000000","message":"this should mention enqueue_expiring_objects_to_legacy_queue in proxy-server.conf","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":27,"context_line":"``swift-object-expirer`` to handle later. In this case, ``ring-name`` is the"},{"line_number":28,"context_line":"ring\u0027s name for the expiring object\u0027s storage policy (e.g. ``object``,"},{"line_number":29,"context_line":"``object-1``, ``object-2``) and ``partition`` is the partition number for the"},{"line_number":30,"context_line":"expiring object."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"In the past it was suggested to choose a number of ``swift-object-expirer``"},{"line_number":33,"context_line":"daemons running in a cluster and then manually control concurrency as required."}],"source_content_type":"text/x-rst","patch_set":41,"id":"dfbec78f_3df559cc","line":30,"in_reply_to":"dfbec78f_120acd25","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":46,"context_line":"enough to delete expiring objects in a timely fashion for a particular Swift"},{"line_number":47,"context_line":"cluster."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"It is possible to run multiple daemons to do different parts of the work if a"},{"line_number":50,"context_line":"single process with a concurrency of more than 1 is not enough (see the sample"},{"line_number":51,"context_line":"config file for details)."},{"line_number":52,"context_line":""}],"source_content_type":"text/x-rst","patch_set":41,"id":"dfbec78f_72a0e9a6","line":49,"updated":"2019-05-03 15:40:30.000000000","message":"How could we clarify if \"different parts\" here applies to .task-\u003cring-name\u003e-\u003c_part_\u003e or only the legacy queue?","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":46,"context_line":"enough to delete expiring objects in a timely fashion for a particular Swift"},{"line_number":47,"context_line":"cluster."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"It is possible to run multiple daemons to do different parts of the work if a"},{"line_number":50,"context_line":"single process with a concurrency of more than 1 is not enough (see the sample"},{"line_number":51,"context_line":"config file for details)."},{"line_number":52,"context_line":""}],"source_content_type":"text/x-rst","patch_set":41,"id":"dfbec78f_3d1eb90c","line":49,"in_reply_to":"dfbec78f_72a0e9a6","updated":"2019-05-04 10:44:37.000000000","message":"Done.\nI added explanation about ``general queue mode`` and ``legacy queue mode``.","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":".. note::"},{"line_number":83,"context_line":"    The new task-queue system has not been completed yet. So an expirer\u0027s with"},{"line_number":84,"context_line":"    ``dequeue_from_legacy_queue`` set to ``False`` will currently do nothing."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"By default ``dequeue_from_legacy_queue`` will be ``False``, it is necessary to"},{"line_number":87,"context_line":"be set to ``True`` explicitly while migrating from the old expiring queue."}],"source_content_type":"text/x-rst","patch_set":41,"id":"dfbec78f_32dcb145","line":84,"updated":"2019-05-03 15:40:30.000000000","message":"Can this be removed?","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":".. note::"},{"line_number":83,"context_line":"    The new task-queue system has not been completed yet. So an expirer\u0027s with"},{"line_number":84,"context_line":"    ``dequeue_from_legacy_queue`` set to ``False`` will currently do nothing."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"By default ``dequeue_from_legacy_queue`` will be ``False``, it is necessary to"},{"line_number":87,"context_line":"be set to ``True`` explicitly while migrating from the old expiring queue."}],"source_content_type":"text/x-rst","patch_set":41,"id":"dfbec78f_bdd70924","line":84,"in_reply_to":"dfbec78f_32dcb145","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    ..."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"If only one legacy expirer is required ``processes`` and ``process`` can be"},{"line_number":233,"context_line":"omitted or both equal to 0."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":".. note::"},{"line_number":236,"context_line":"    When running legacy expirers, the daemon needs to run on a machine with"}],"source_content_type":"text/x-rst","patch_set":41,"id":"dfbec78f_d29af56c","line":233,"updated":"2019-05-03 15:40:30.000000000","message":"This example is a HUGE improvement to the existing docs for these options we had before.  KUDOS!","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"}],"etc/object-server.conf-sample":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9f0b639edcaaacb3ea9b87d4c9c24de51ce3dfe","unresolved":false,"context_lines":[{"line_number":470,"context_line":"# ionice_priority \u003d"},{"line_number":471,"context_line":"#"},{"line_number":472,"context_line":"# Internal client config file path"},{"line_number":473,"context_line":"# internal_client_conf_path \u003d /etc/swift/internal-client.conf"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"# Note: Put it at the beginning of the pipleline to profile all middleware. But"},{"line_number":476,"context_line":"# it is safer to put this after healthcheck."}],"source_content_type":"application/octet-stream","patch_set":6,"id":"7f96bb07_a56d4b05","line":473,"updated":"2018-01-15 23:24:57.000000000","message":"again legacy processes and process should be mentioned.","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"02f19635fb4d2a7d96c2aa25ef8c28e1db3297df","unresolved":false,"context_lines":[{"line_number":470,"context_line":"# ionice_priority \u003d"},{"line_number":471,"context_line":"#"},{"line_number":472,"context_line":"# Internal client config file path"},{"line_number":473,"context_line":"# internal_client_conf_path \u003d /etc/swift/internal-client.conf"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"# Note: Put it at the beginning of the pipleline to profile all middleware. But"},{"line_number":476,"context_line":"# it is safer to put this after healthcheck."}],"source_content_type":"application/octet-stream","patch_set":6,"id":"7f96bb07_4f06b6d0","line":473,"in_reply_to":"7f96bb07_a56d4b05","updated":"2018-01-17 10:04:27.000000000","message":"Done by squashing Matthew\u0027s patch.","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# expiring_objects_account_name \u003d expiring_objects"},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# This value is for general task queue"},{"line_number":17,"context_line":"# task_account_prefix \u003d task"},{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"# Use an integer to override the number of pre-forked processes that will"},{"line_number":20,"context_line":"# accept connections.  NOTE: if servers_per_port is set, this setting is"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_be9d000b","line":17,"updated":"2018-01-18 09:11:11.000000000","message":"I\u0027m not sure how many operators sets the account name config for the queue but this change seems to make regression, operator cannot have the chance to customize the queue name.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# expiring_objects_account_name \u003d expiring_objects"},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# This value is for general task queue"},{"line_number":17,"context_line":"# task_account_prefix \u003d task"},{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"# Use an integer to override the number of pre-forked processes that will"},{"line_number":20,"context_line":"# accept connections.  NOTE: if servers_per_port is set, this setting is"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_0e73fb17","line":17,"in_reply_to":"7f96bb07_be9d000b","updated":"2018-01-24 12:03:41.000000000","message":"Done.\nI added config value to customize prefix of expirer\u0027s task container.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":435,"context_line":"# to 86400 (1 day)."},{"line_number":436,"context_line":"# rsync_tempfile_timeout \u003d auto"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"[object-expirer]"},{"line_number":439,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"},{"line_number":440,"context_line":"# log_name \u003d object-expirer"},{"line_number":441,"context_line":"# log_facility \u003d LOG_LOCAL0"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_d1f47df3","line":438,"updated":"2018-01-18 09:11:11.000000000","message":"This is moved from object-expirer.conf.\n\nI think that is because object-expierer now requires the listening ip and ports to find the assigned task account (queue name).\n\nAnd probably this is an upgrade impact because it would be \"no section error\" when attempting to read the config, isn\u0027t it?","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":435,"context_line":"# to 86400 (1 day)."},{"line_number":436,"context_line":"# rsync_tempfile_timeout \u003d auto"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"[object-expirer]"},{"line_number":439,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"},{"line_number":440,"context_line":"# log_name \u003d object-expirer"},{"line_number":441,"context_line":"# log_facility \u003d LOG_LOCAL0"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_3dc38b59","line":438,"in_reply_to":"7f96bb07_d1f47df3","updated":"2018-01-24 12:03:41.000000000","message":"I see. The upgrade impact problem will be discussed in the following etherpad page.\nhttps://etherpad.openstack.org/p/swift_general_task_queue","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":447,"context_line":"# This value is for legacy expirer task queue"},{"line_number":448,"context_line":"# execute_legacy_task \u003d false"},{"line_number":449,"context_line":"#"},{"line_number":450,"context_line":"# processes can only be used in conjunction with `execute_legacy_task`."},{"line_number":451,"context_line":"# processes is how many parts to divide the legacy work into, one part per"},{"line_number":452,"context_line":"# process that will be doing the work"},{"line_number":453,"context_line":"# processes set 0 means that a single legacy process will be doing all the work"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_110bc5d5","line":450,"updated":"2018-01-18 09:11:11.000000000","message":"Perhaps, adding a word \"this option is ignored if ececute_legacy_task\u003dfalse\" would help us.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":447,"context_line":"# This value is for legacy expirer task queue"},{"line_number":448,"context_line":"# execute_legacy_task \u003d false"},{"line_number":449,"context_line":"#"},{"line_number":450,"context_line":"# processes can only be used in conjunction with `execute_legacy_task`."},{"line_number":451,"context_line":"# processes is how many parts to divide the legacy work into, one part per"},{"line_number":452,"context_line":"# process that will be doing the work"},{"line_number":453,"context_line":"# processes set 0 means that a single legacy process will be doing all the work"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f96bb07_11bc7e04","line":450,"in_reply_to":"7f96bb07_110bc5d5","updated":"2018-01-24 12:03:41.000000000","message":"Done","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"347d9ee23ef8d1ec7bef63fc35105abcd33f2ddc","unresolved":false,"context_lines":[{"line_number":454,"context_line":"# This value is for legacy expirer task queue"},{"line_number":455,"context_line":"# The default is true. If you want expirer to execute tasks from general task"},{"line_number":456,"context_line":"# queue, set \u0027false\u0027 explicitly."},{"line_number":457,"context_line":"execute_legacy_task \u003d false"},{"line_number":458,"context_line":"#"},{"line_number":459,"context_line":"# processes can only be used in conjunction with `execute_legacy_task`. So this"},{"line_number":460,"context_line":"# option is ignored if execute_legacy_task\u003dfalse."}],"source_content_type":"application/octet-stream","patch_set":21,"id":"bf659307_64d8737a","line":457,"range":{"start_line":457,"start_character":0,"end_line":457,"end_character":27},"updated":"2018-03-30 09:05:51.000000000","message":"If you say \u0027default is true\u0027\n\nyou should make it as:\n\n# excecute_legacy_task \u003d true\n\nif you want to remove the comment out (#) here, it means false by default, i think.\n\nI\u0027m not sure if we should make it true by default tho.","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"897b8921431f2fc8ee08921cdc95b723defee4f7","unresolved":false,"context_lines":[{"line_number":454,"context_line":"# This value is for legacy expirer task queue"},{"line_number":455,"context_line":"# The default is true. If you want expirer to execute tasks from general task"},{"line_number":456,"context_line":"# queue, set \u0027false\u0027 explicitly."},{"line_number":457,"context_line":"execute_legacy_task \u003d false"},{"line_number":458,"context_line":"#"},{"line_number":459,"context_line":"# processes can only be used in conjunction with `execute_legacy_task`. So this"},{"line_number":460,"context_line":"# option is ignored if execute_legacy_task\u003dfalse."}],"source_content_type":"application/octet-stream","patch_set":21,"id":"bf659307_7033e663","line":457,"range":{"start_line":457,"start_character":0,"end_line":457,"end_character":27},"in_reply_to":"bf659307_64d8737a","updated":"2018-04-05 12:56:25.000000000","message":"I want to set default value `true` in object-server.conf and `false` in object-expirer.conf.\nBut I thought that we should choose only one default value, so I set default value `true` for backward compatibility of \u0027object-expirer.conf` and set `execute_legacy_task \u003d false` explicitly in object-server.conf.\n\nNow, I changed my opinion. The default value should be changed according to the conf file path. So,  the comment line is same as the default value.","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b7157d8855b7f98289261db4c398541fb9891f05","unresolved":false,"context_lines":[{"line_number":9,"context_line":"# mount_check \u003d true"},{"line_number":10,"context_line":"# disable_fallocate \u003d false"},{"line_number":11,"context_line":"#"},{"line_number":12,"context_line":"# enqueue_expiring_objects_to_legacy_queue \u003d true"},{"line_number":13,"context_line":"# expiring_objects_container_divisor \u003d 86400"},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":"# This value is for legacy expirer task queue"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"3f79a3b5_25397cd7","line":12,"updated":"2018-09-12 19:48:22.000000000","message":"OK. This is in DEFAULT section. That means perhaps, just sort of `queue_mode\u003dlegacy` or `queue_mode\u003dgeneral` might be better, isn\u0027t it?\n\nThat is because object-expirer is now referring the object-server.conf so that more generic mode name can be useful to read from both sections.","commit_id":"bde878d37311e2f74581adf0847e93173f3bb42c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"746d8f68c420ac4164702e6692cec1b4558a2775","unresolved":false,"context_lines":[{"line_number":9,"context_line":"# mount_check \u003d true"},{"line_number":10,"context_line":"# disable_fallocate \u003d false"},{"line_number":11,"context_line":"#"},{"line_number":12,"context_line":"# enqueue_expiring_objects_to_legacy_queue \u003d true"},{"line_number":13,"context_line":"# expiring_objects_container_divisor \u003d 86400"},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":"# This value is for legacy expirer task queue"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"3f79a3b5_4209fc28","line":12,"in_reply_to":"3f79a3b5_25397cd7","updated":"2018-09-13 18:10:32.000000000","message":"maybe \"expirer_queue_mode\" after all? Anything beyond expirer will always utilize the general task queue, and not legacy, right?","commit_id":"bde878d37311e2f74581adf0847e93173f3bb42c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"0559bfe5ed65a6afad698782c0ed5ece780c9e25","unresolved":false,"context_lines":[{"line_number":9,"context_line":"# mount_check \u003d true"},{"line_number":10,"context_line":"# disable_fallocate \u003d false"},{"line_number":11,"context_line":"#"},{"line_number":12,"context_line":"# enqueue_expiring_objects_to_legacy_queue \u003d true"},{"line_number":13,"context_line":"# expiring_objects_container_divisor \u003d 86400"},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":"# This value is for legacy expirer task queue"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"3f79a3b5_2962a0da","line":12,"in_reply_to":"3f79a3b5_4209fc28","updated":"2018-09-13 21:28:42.000000000","message":"In conclusion of discussion with romain, the enqueueing mode and dequeueing mode configuration should be separated.\nSo I leave this parameter as it is now.\nPlease romain\u0027s upgrading process comment too.","commit_id":"bde878d37311e2f74581adf0847e93173f3bb42c"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"347d9ee23ef8d1ec7bef63fc35105abcd33f2ddc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# key_file \u003d /etc/swift/proxy.key"},{"line_number":37,"context_line":"#"},{"line_number":38,"context_line":"# expirer_task_container_prefix \u003d expirer"},{"line_number":39,"context_line":"# expiring_objects_container_divisor \u003d 86400"},{"line_number":40,"context_line":"#"},{"line_number":41,"context_line":"# This value is for general task queue"},{"line_number":42,"context_line":"# task_account_prefix \u003d task"}],"source_content_type":"application/octet-stream","patch_set":21,"id":"bf659307_e471e377","line":39,"updated":"2018-03-30 09:05:51.000000000","message":"hmmm.....  not sure but... using similar name space (i.e. expiring_objects_xxx) would be nice to mean which component needs this option, maybe?\n\nOff topic:\nAnd then, I incline to move those into a middleware (middlewares) to make expirer and general task queue options explicitly.","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"897b8921431f2fc8ee08921cdc95b723defee4f7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# key_file \u003d /etc/swift/proxy.key"},{"line_number":37,"context_line":"#"},{"line_number":38,"context_line":"# expirer_task_container_prefix \u003d expirer"},{"line_number":39,"context_line":"# expiring_objects_container_divisor \u003d 86400"},{"line_number":40,"context_line":"#"},{"line_number":41,"context_line":"# This value is for general task queue"},{"line_number":42,"context_line":"# task_account_prefix \u003d task"}],"source_content_type":"application/octet-stream","patch_set":21,"id":"bf659307_b9872962","line":39,"in_reply_to":"bf659307_e471e377","updated":"2018-04-05 12:56:25.000000000","message":"Done.\nI replaced it by \u0027expiring_objects_task_prefix\u0027\n\n\u003e Off topic\n\nIt will be great. Umm, IMO, it should be done in another patch...?","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# cert_file \u003d /etc/swift/proxy.crt"},{"line_number":37,"context_line":"# key_file \u003d /etc/swift/proxy.key"},{"line_number":38,"context_line":"#"},{"line_number":39,"context_line":"# enqueue_expiring_objects_to_legacy_queue \u003d true"},{"line_number":40,"context_line":"# expiring_objects_container_divisor \u003d 86400"},{"line_number":41,"context_line":"#"},{"line_number":42,"context_line":"# this value is for legacy queue of object-expirer"}],"source_content_type":"application/octet-stream","patch_set":41,"id":"dfbec78f_728ea928","line":39,"updated":"2019-05-03 15:40:30.000000000","message":"Probably should comment that enabling this requires all nodes migration from expirer.conf to object-server.conf\n\nmaybe even something like...\n\nobject_node_configured_for_task_queue \u003d false\n\n... with some sort of warning this will default to true in a future release","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":118,"context_line":"# covered further below in the filter sections for authtoken and keystoneauth."},{"line_number":119,"context_line":"#pipeline \u003d catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk tempurl ratelimit authtoken keystoneauth copy container-quotas account-quotas slo dlo versioned_writes symlink proxy-logging proxy-server"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"[app:proxy-server]"},{"line_number":122,"context_line":"use \u003d egg:swift#proxy"},{"line_number":123,"context_line":"# You can override the default log routing for this app here:"},{"line_number":124,"context_line":"# set log_name \u003d proxy-server"}],"source_content_type":"application/octet-stream","patch_set":41,"id":"dfbec78f_55d02f51","line":121,"updated":"2019-05-03 15:40:30.000000000","message":"Would it be useful or more clear to move enqueue_expiring_objects_to_legacy to here from [DEFAULT]","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"159a1128325f25c0724b6d6f0485e161102ef890","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# cert_file \u003d /etc/swift/proxy.crt"},{"line_number":37,"context_line":"# key_file \u003d /etc/swift/proxy.key"},{"line_number":38,"context_line":"#"},{"line_number":39,"context_line":"# enqueue_expiring_objects_to_legacy_queue \u003d true"},{"line_number":40,"context_line":"# expiring_objects_container_divisor \u003d 86400"},{"line_number":41,"context_line":"#"},{"line_number":42,"context_line":"# this value is for legacy queue of object-expirer"}],"source_content_type":"application/octet-stream","patch_set":43,"id":"dfbec78f_c389b726","line":39,"updated":"2019-05-03 22:58:05.000000000","message":"operators like to \"opt-in\" - so we want \n\nuse_object_scaling_expirer_task_queue \u003d false\n\nthat you turn ON to opt-in\n\nALSO, this should have a reminder that you need to configure your [object-expirer] on the object-server.conf before turning this ON","commit_id":"59e541d41d3772393bf50d6631973c29df0ac59c"}],"swift/common/manager.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"347d9ee23ef8d1ec7bef63fc35105abcd33f2ddc","unresolved":false,"context_lines":[{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        \"\"\""},{"line_number":455,"context_line":"        # \u0027legacy-expirer.pid\u0027 is for expirer from object-expirer.conf"},{"line_number":456,"context_line":"        # \u0027object-expirer.pid\u0027 is for expirer from object-server.conf"},{"line_number":457,"context_line":"        return conf_file.replace("},{"line_number":458,"context_line":"            os.path.normpath(SWIFT_DIR), self.run_dir, 1).replace("},{"line_number":459,"context_line":"                \u0027object-expirer\u0027, \u0027legacy-expirer\u0027, 1).replace("}],"source_content_type":"text/x-python","patch_set":21,"id":"bf659307_c46dbf32","line":456,"updated":"2018-03-30 09:05:51.000000000","message":"Hmm.. i couldn\u0027t understand why this is needed. To think straight forward, perhaps, just \u0027read object-server.conf and then read object-expierer.conf only when no section found there\u0027?","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"897b8921431f2fc8ee08921cdc95b723defee4f7","unresolved":false,"context_lines":[{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        \"\"\""},{"line_number":455,"context_line":"        # \u0027legacy-expirer.pid\u0027 is for expirer from object-expirer.conf"},{"line_number":456,"context_line":"        # \u0027object-expirer.pid\u0027 is for expirer from object-server.conf"},{"line_number":457,"context_line":"        return conf_file.replace("},{"line_number":458,"context_line":"            os.path.normpath(SWIFT_DIR), self.run_dir, 1).replace("},{"line_number":459,"context_line":"                \u0027object-expirer\u0027, \u0027legacy-expirer\u0027, 1).replace("}],"source_content_type":"text/x-python","patch_set":21,"id":"bf659307_24f8d07a","line":456,"in_reply_to":"bf659307_c46dbf32","updated":"2018-04-05 12:56:25.000000000","message":"My original motivation is that coexistence of object-expirers from \u0027object-server.conf\u0027 and \u0027object-expirer.conf\u0027.\nIf we implement the motivation, we need two pid file name rules to avoid conflicting their pid file names.\n\nIn your plan, implementation will be simple, so it may be nice. But I worry about \u0027get_conf_file_name\u0027 method.\nIn your plan, we cannot know conf file name from pid file name, so get_conf_file_name cannot be implemented correctly.\nThis method is used to\n    Case A: filtering expirer number in \u0027pid_files\u0027 method\n    Case B: showing config file name info in \u0027status\u0027 and \u0027launch\u0027 method\nDo you have any good idea to implement your plan without behavior changes in Case A and B?","commit_id":"b76221d99cebf4f48aa138488fed0a6c66df8765"}],"swift/common/task_queue.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b015f5302fd44fd70c665f6cc5f1e52c40205b0","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    \"\"\""},{"line_number":112,"context_line":"    if divisor \u003c\u003d 0:"},{"line_number":113,"context_line":"        raise ValueError("},{"line_number":114,"context_line":"            \u0027Cannot use non-positive divisor value for task container\u0027)"},{"line_number":115,"context_line":"    rounded_reservation_time \u003d\\"},{"line_number":116,"context_line":"        normalize_task_timestamp(int(reservation_time) / divisor * divisor)"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_eafe2cad","line":114,"range":{"start_line":114,"start_character":13,"end_line":114,"end_character":70},"updated":"2018-01-11 04:30:08.000000000","message":"We could turn this around and say:\n\n Must use positive divisor value for task container\n\nBut that\u0027s only really a NIT.","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"b47f91f556b7865913557388353bf03315239935","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    \"\"\""},{"line_number":112,"context_line":"    if divisor \u003c\u003d 0:"},{"line_number":113,"context_line":"        raise ValueError("},{"line_number":114,"context_line":"            \u0027Cannot use non-positive divisor value for task container\u0027)"},{"line_number":115,"context_line":"    rounded_reservation_time \u003d\\"},{"line_number":116,"context_line":"        normalize_task_timestamp(int(reservation_time) / divisor * divisor)"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_9bb7b9d9","line":114,"range":{"start_line":114,"start_character":13,"end_line":114,"end_character":70},"in_reply_to":"7f96bb07_eafe2cad","updated":"2018-01-15 09:16:39.000000000","message":"Done","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b015f5302fd44fd70c665f6cc5f1e52c40205b0","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    :param optional_info: an optional information string"},{"line_number":142,"context_line":"    :return: a task object name"},{"line_number":143,"context_line":"    \"\"\""},{"line_number":144,"context_line":"    # Replace slashes to use shash as delimiter between path and optional info"},{"line_number":145,"context_line":"    target_path \u003d quote(os.path.join("},{"line_number":146,"context_line":"        target_account, target_container, target_obj), safe\u003d\u0027\u0027)"},{"line_number":147,"context_line":"    reservation_time \u003d normalize_task_timestamp(int(reservation_time))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_2a917453","line":144,"range":{"start_line":144,"start_character":30,"end_line":144,"end_character":31},"updated":"2018-01-11 04:30:08.000000000","message":"l","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"b47f91f556b7865913557388353bf03315239935","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    :param optional_info: an optional information string"},{"line_number":142,"context_line":"    :return: a task object name"},{"line_number":143,"context_line":"    \"\"\""},{"line_number":144,"context_line":"    # Replace slashes to use shash as delimiter between path and optional info"},{"line_number":145,"context_line":"    target_path \u003d quote(os.path.join("},{"line_number":146,"context_line":"        target_account, target_container, target_obj), safe\u003d\u0027\u0027)"},{"line_number":147,"context_line":"    reservation_time \u003d normalize_task_timestamp(int(reservation_time))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_5bb131e1","line":144,"range":{"start_line":144,"start_character":30,"end_line":144,"end_character":31},"in_reply_to":"7f96bb07_2a917453","updated":"2018-01-15 09:16:39.000000000","message":"Done","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b015f5302fd44fd70c665f6cc5f1e52c40205b0","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    if optional_info:"},{"line_number":150,"context_line":"        return os.path.join(reservation_time, target_path, optional_info)"},{"line_number":151,"context_line":"    else:"},{"line_number":152,"context_line":"        return os.path.join(reservation_time, target_path)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def parse_task_obj(task_obj):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_4aaac085","line":152,"range":{"start_line":152,"start_character":15,"end_line":152,"end_character":27},"updated":"2018-01-11 04:30:08.000000000","message":"Using \u0027os.path.join\u0027 here will use a \u0027/\u0027 on posix systems and in parse_task_obj below your parsing by using \u0027/\u0027. So this all works. But if this ever gets ported to another system where the file join isn\u0027t \u0027/\u0027 (say windows) the parse will fail.\n\nSeeing as your hardcoding \u0027/\u0027 in the next method, maybe for future proofing we should use it here too?\n\n  \u0027/\u0027.join(...)","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"b47f91f556b7865913557388353bf03315239935","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    if optional_info:"},{"line_number":150,"context_line":"        return os.path.join(reservation_time, target_path, optional_info)"},{"line_number":151,"context_line":"    else:"},{"line_number":152,"context_line":"        return os.path.join(reservation_time, target_path)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def parse_task_obj(task_obj):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_3bcd455d","line":152,"range":{"start_line":152,"start_character":15,"end_line":152,"end_character":27},"in_reply_to":"7f96bb07_4aaac085","updated":"2018-01-15 09:16:39.000000000","message":"Done","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    :param task_obj: a task object name"},{"line_number":159,"context_line":"    :return: 5-tuples of (reservation_time, target_account, target_container,"},{"line_number":160,"context_line":"             target_obj, optional_info)"},{"line_number":161,"context_line":"             optional_info is None if it is not set in task_obj"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    reservation_time, target_path, optional_info \u003d\\"},{"line_number":164,"context_line":"        split_path(\u0027/\u0027 + task_obj, 2, 3, True)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_54c37b57","line":161,"updated":"2018-01-18 09:11:11.000000000","message":"what is optional_info? can any format be used?","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    :param task_obj: a task object name"},{"line_number":159,"context_line":"    :return: 5-tuples of (reservation_time, target_account, target_container,"},{"line_number":160,"context_line":"             target_obj, optional_info)"},{"line_number":161,"context_line":"             optional_info is None if it is not set in task_obj"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    reservation_time, target_path, optional_info \u003d\\"},{"line_number":164,"context_line":"        split_path(\u0027/\u0027 + task_obj, 2, 3, True)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_d1061687","line":161,"in_reply_to":"7f96bb07_54c37b57","updated":"2018-01-24 12:03:41.000000000","message":"This value will be used by auto-tiering feature.\nBut I think this value should be added in another patch now.\nSo I removed it from this patch.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    # Replace slashes to use slash as delimiter between path and optional info"},{"line_number":124,"context_line":"    target_path \u003d quote(os.path.join("},{"line_number":125,"context_line":"        target_account, target_container, target_obj), safe\u003d\u0027\u0027)"},{"line_number":126,"context_line":"    reservation_time \u003d normalize_delete_at_timestamp(int(reservation_time))"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    return \u0027/\u0027.join([reservation_time, target_path])"}],"source_content_type":"text/x-python","patch_set":40,"id":"dfbec78f_95d78724","line":125,"updated":"2019-05-03 15:40:30.000000000","message":"ok, yes I noted that the object names were quoted - apparently it\u0027s on purpose :)","commit_id":"9e90cec88105bc4745389ebcafcd2b20ec76c5ba"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"Task containers\u0027 naming rule is ``\u003ctask-type\u003e-\u003crounded-timestamp\u003e``."},{"line_number":49,"context_line":"``task-type`` is string to distinguish task executor daemon type. (e.g."},{"line_number":50,"context_line":"``expirer``). ``rounded-timestamp`` is unix timestamp of task reservation time"},{"line_number":51,"context_line":"which is rounded by a certain unit (e.g. 1 day)."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Task objects are zero-byte objects in task container. Task objects have task\u0027s"},{"line_number":54,"context_line":"information as the object\u0027s name. Task objects\u0027 name format is"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_57e10ffe","line":51,"updated":"2019-05-03 15:40:30.000000000","message":"something about mixing task types w/i the accounts bug me.  I can\u0027t quite formulate an objective argument but it seems like it ought be:\n\n.task-\u003cring-name\u003e-\u003ctask-type\u003e/\u003cpartition\u003e-\u003crounded-timestamp\u003e\n\n... or something\n\nDoes tiering or other-usecases have a need for the \u003crounded-timestamp\u003e part of the convention?  That strikes me as somewhat expirer specific\n\nlike it might be:\n\n.task-\u003cring-name\u003e-\u003ctask-type\u003e/\u003cwhatever-the-type-needs-for-account-prefix-listing-to-be-useful\u003e-\u003cpartition\u003e","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":59,"context_line":"the ``task-type``."},{"line_number":60,"context_line":"``optional_info`` is not implemented yet. It will be implemented with"},{"line_number":61,"context_line":"``task-type`` which requires the ``optional_info``."},{"line_number":62,"context_line":"\"\"\""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"import os"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_dc7c44b7","line":62,"updated":"2019-05-03 15:40:30.000000000","message":"great doco!","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    :param task_container: a task container name"},{"line_number":104,"context_line":"    :return: 2-tuples of (task_type, rounded_reservation_time)"},{"line_number":105,"context_line":"    \"\"\""},{"line_number":106,"context_line":"    # rsplit is used because task_type can include \u0027-\u0027"},{"line_number":107,"context_line":"    task_type, rounded_reservation_time \u003d task_container.rsplit(\u0027-\u0027, 1)"},{"line_number":108,"context_line":"    rounded_reservation_time \u003d Timestamp(rounded_reservation_time)"},{"line_number":109,"context_line":"    return task_type, rounded_reservation_time"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_7c4bd886","line":106,"updated":"2019-05-03 15:40:30.000000000","message":"what a thoughtful comment!\n\nIf we could only add ONE line to the code base - would you prefer the comment, or something like this:\n\n\tdiff --git a/test/unit/common/test_task_queue.py b/test/unit/common/test_task_queue.py\n\tindex 79f0e02c4..da9c74e89 100644\n\t--- a/test/unit/common/test_task_queue.py\n\t+++ b/test/unit/common/test_task_queue.py\n\t@@ -54,6 +54,7 @@ class TestTaskQueue(unittest.TestCase):\n\t \n\t     def test_task_container(self):\n\t\t assert_args_list \u003d [\n\t+            (\u0027new-thing\u0027, 3600, 3600, \u0027new-thing-0000003600\u0027, 3600),\n\t\t     (\u0027expirer\u0027, 3600, 0, \u0027expirer-0000000000\u0027, 0),\n\t\t     (\u0027expirer\u0027, 3600, 3599, \u0027expirer-0000000000\u0027, 0),\n\t\t     (\u0027expirer\u0027, 3600, 3600, \u0027expirer-0000003600\u0027, 3600),","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    :param task_container: a task container name"},{"line_number":104,"context_line":"    :return: 2-tuples of (task_type, rounded_reservation_time)"},{"line_number":105,"context_line":"    \"\"\""},{"line_number":106,"context_line":"    # rsplit is used because task_type can include \u0027-\u0027"},{"line_number":107,"context_line":"    task_type, rounded_reservation_time \u003d task_container.rsplit(\u0027-\u0027, 1)"},{"line_number":108,"context_line":"    rounded_reservation_time \u003d Timestamp(rounded_reservation_time)"},{"line_number":109,"context_line":"    return task_type, rounded_reservation_time"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_e07f16a9","line":106,"in_reply_to":"dfbec78f_7c4bd886","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                             executed as soon as possible"},{"line_number":121,"context_line":"    :return: a task object name"},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    # Replace slashes to use slash as delimiter between path and optional info"},{"line_number":124,"context_line":"    target_path \u003d quote(os.path.join("},{"line_number":125,"context_line":"        target_account, target_container, target_obj), safe\u003d\u0027\u0027)"},{"line_number":126,"context_line":"    reservation_time \u003d normalize_delete_at_timestamp(int(reservation_time))"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_9c500c35","line":123,"updated":"2019-05-03 15:40:30.000000000","message":"the docs in this module are great.","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"swift/common/utils.py":[{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"0cca645285dae21ab239a6959c3af3c65cd073fe","unresolved":false,"context_lines":[{"line_number":3822,"context_line":"    return _quote(get_valid_utf8_str(value), safe)"},{"line_number":3823,"context_line":""},{"line_number":3824,"context_line":""},{"line_number":3825,"context_line":"def get_task_container(daemon, execution_time, divisor):"},{"line_number":3826,"context_line":"    \"\"\""},{"line_number":3827,"context_line":"    Returns a task object container name for given task execution time"},{"line_number":3828,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_43c3fded","line":3825,"updated":"2017-11-06 03:01:53.000000000","message":"Not all type of tasks will require an execution time (some tasks should be executed ASAP, eg: metadata indexation). execution_time should be optional","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"462b0ab5af2dacb0b8d9c1b77bb1cd8110998e38","unresolved":false,"context_lines":[{"line_number":3822,"context_line":"    return _quote(get_valid_utf8_str(value), safe)"},{"line_number":3823,"context_line":""},{"line_number":3824,"context_line":""},{"line_number":3825,"context_line":"def get_task_container(daemon, execution_time, divisor):"},{"line_number":3826,"context_line":"    \"\"\""},{"line_number":3827,"context_line":"    Returns a task object container name for given task execution time"},{"line_number":3828,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"bf8cb3f7_5be614eb","line":3825,"in_reply_to":"3f4b6375_43c3fded","updated":"2017-12-20 20:46:18.000000000","message":"Done","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"0cca645285dae21ab239a6959c3af3c65cd073fe","unresolved":false,"context_lines":[{"line_number":3830,"context_line":"        int(execution_time) * divisor / divisor)"},{"line_number":3831,"context_line":""},{"line_number":3832,"context_line":""},{"line_number":3833,"context_line":"def get_task_obj(execution_time, task_info):"},{"line_number":3834,"context_line":"    \"\"\""},{"line_number":3835,"context_line":"    Returns a task object name for given task execution time and task_info"},{"line_number":3836,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_e3b30997","line":3833,"updated":"2017-11-06 03:01:53.000000000","message":"execution_time should be optional (see above)","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"0559bfe5ed65a6afad698782c0ed5ece780c9e25","unresolved":false,"context_lines":[{"line_number":3830,"context_line":"        int(execution_time) * divisor / divisor)"},{"line_number":3831,"context_line":""},{"line_number":3832,"context_line":""},{"line_number":3833,"context_line":"def get_task_obj(execution_time, task_info):"},{"line_number":3834,"context_line":"    \"\"\""},{"line_number":3835,"context_line":"    Returns a task object name for given task execution time and task_info"},{"line_number":3836,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_4425815b","line":3833,"in_reply_to":"3f4b6375_af1f1959","updated":"2018-09-13 21:28:42.000000000","message":"In future plan, the metadata will be supported and it can be empty.\nBut in expirer implementation, metadata is not used, so it is not implemented in this patch.","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"041027f764edd15e707cb1a771abee972d393a5e","unresolved":false,"context_lines":[{"line_number":3830,"context_line":"        int(execution_time) * divisor / divisor)"},{"line_number":3831,"context_line":""},{"line_number":3832,"context_line":""},{"line_number":3833,"context_line":"def get_task_obj(execution_time, task_info):"},{"line_number":3834,"context_line":"    \"\"\""},{"line_number":3835,"context_line":"    Returns a task object name for given task execution time and task_info"},{"line_number":3836,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_af1f1959","line":3833,"in_reply_to":"3f4b6375_e3b30997","updated":"2018-09-13 16:38:36.000000000","message":"After discussion, we would go for\nget_task_obj(execution_time, object_path, metadata)\n    return \u0027%s/%s/%s\u0027 % (timestamp, object_path, metadata)\n\nmetadata could be empty (as object_path?)","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"462b0ab5af2dacb0b8d9c1b77bb1cd8110998e38","unresolved":false,"context_lines":[{"line_number":3830,"context_line":"        int(execution_time) * divisor / divisor)"},{"line_number":3831,"context_line":""},{"line_number":3832,"context_line":""},{"line_number":3833,"context_line":"def get_task_obj(execution_time, task_info):"},{"line_number":3834,"context_line":"    \"\"\""},{"line_number":3835,"context_line":"    Returns a task object name for given task execution time and task_info"},{"line_number":3836,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"bf8cb3f7_7bebd8af","line":3833,"in_reply_to":"3f4b6375_e3b30997","updated":"2017-12-20 20:46:18.000000000","message":"Done","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"15294de9ab24458a4d70875e59841746bc26905b","unresolved":false,"context_lines":[{"line_number":1182,"context_line":"    return Timestamp(delta.total_seconds())"},{"line_number":1183,"context_line":""},{"line_number":1184,"context_line":""},{"line_number":1185,"context_line":"# TODO This function will be renamed and moved to swift.common.task_queue"},{"line_number":1186,"context_line":"def normalize_delete_at_timestamp(timestamp):"},{"line_number":1187,"context_line":"    \"\"\""},{"line_number":1188,"context_line":"    Format a timestamp (string or numeric) into a standardized"}],"source_content_type":"text/x-python","patch_set":22,"id":"bf659307_ddbe1764","line":1185,"updated":"2018-04-11 05:26:37.000000000","message":"What? Why would you?","commit_id":"3aae6e384b6eeee0f53a8c78bd783d05c54221a7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"88477240217e2e3e8c123f3f5676198413c3043f","unresolved":false,"context_lines":[{"line_number":1182,"context_line":"    return Timestamp(delta.total_seconds())"},{"line_number":1183,"context_line":""},{"line_number":1184,"context_line":""},{"line_number":1185,"context_line":"# TODO This function will be renamed and moved to swift.common.task_queue"},{"line_number":1186,"context_line":"def normalize_delete_at_timestamp(timestamp):"},{"line_number":1187,"context_line":"    \"\"\""},{"line_number":1188,"context_line":"    Format a timestamp (string or numeric) into a standardized"}],"source_content_type":"text/x-python","patch_set":22,"id":"bf659307_046c17ce","line":1185,"in_reply_to":"bf659307_ddbe1764","updated":"2018-04-17 09:44:26.000000000","message":"Because the function will be used in some features which use general task queue (e.g. auto-tiering).\nSo I think the name should be renamed to general name such as \"normalize_task_timestamp\" and move into swift.common.task_queue.","commit_id":"3aae6e384b6eeee0f53a8c78bd783d05c54221a7"}],"swift/obj/expirer.py":[{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"0cca645285dae21ab239a6959c3af3c65cd073fe","unresolved":false,"context_lines":[{"line_number":38,"context_line":"MAX_OBJECTS_TO_CACHE \u003d 100000"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def get_local_policies_and_parts(devices):"},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    Get storage policies and partition numbers which are assigned to local"},{"line_number":44,"context_line":"    object server"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_03150549","line":41,"updated":"2017-11-06 03:01:53.000000000","message":"I think this method should also returns the replica/fragment number from the ring. it will allow to reproduce the \"process\" config variable.","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"462b0ab5af2dacb0b8d9c1b77bb1cd8110998e38","unresolved":false,"context_lines":[{"line_number":38,"context_line":"MAX_OBJECTS_TO_CACHE \u003d 100000"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def get_local_policies_and_parts(devices):"},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    Get storage policies and partition numbers which are assigned to local"},{"line_number":44,"context_line":"    object server"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf8cb3f7_dbd9c422","line":41,"in_reply_to":"3f4b6375_03150549","updated":"2017-12-20 20:46:18.000000000","message":"Done","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"0cca645285dae21ab239a6959c3af3c65cd073fe","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            self.logger.debug(\u0027Run begin\u0027)"},{"line_number":262,"context_line":"            self.execute_expiring_tasks(self.expiring_objects_account)"},{"line_number":263,"context_line":"            for policy, part in get_local_policies_and_parts(self.devices):"},{"line_number":264,"context_line":"                task_acc \u003d \u0027-\u0027.join(["},{"line_number":265,"context_line":"                    self.task_account_prefix, policy.ring_name, part])"},{"line_number":266,"context_line":"                self.execute_expiring_tasks(task_acc)"},{"line_number":267,"context_line":"            self.logger.debug(\u0027Run end\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_c35c8d4c","line":264,"updated":"2017-11-06 03:01:53.000000000","message":"given that a ring could contain dash (eg: object-1), would it be better to use dot or underscore as a separator? (eg: expiring.object-1.42)","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"462b0ab5af2dacb0b8d9c1b77bb1cd8110998e38","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            self.logger.debug(\u0027Run begin\u0027)"},{"line_number":262,"context_line":"            self.execute_expiring_tasks(self.expiring_objects_account)"},{"line_number":263,"context_line":"            for policy, part in get_local_policies_and_parts(self.devices):"},{"line_number":264,"context_line":"                task_acc \u003d \u0027-\u0027.join(["},{"line_number":265,"context_line":"                    self.task_account_prefix, policy.ring_name, part])"},{"line_number":266,"context_line":"                self.execute_expiring_tasks(task_acc)"},{"line_number":267,"context_line":"            self.logger.debug(\u0027Run end\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf8cb3f7_bbcba01c","line":264,"in_reply_to":"3f4b6375_c35c8d4c","updated":"2017-12-20 20:46:18.000000000","message":"I leave the separator as it is for now because we can get unique account name with \u0027-\u0027.","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"abb219d3221714bfd8acb58b7abb1f28bdd5c90d","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                policy.object_ring, self._myips, self._myport)"},{"line_number":222,"context_line":"            for (replica, part) in replicas_and_parts:"},{"line_number":223,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":224,"context_line":"                if replica \u003e\u003d 1:"},{"line_number":225,"context_line":"                    continue"},{"line_number":226,"context_line":"                yield get_task_account(self.task_account_prefix, policy, part)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def iter_cont_objs_to_expire(self, account):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf8cb3f7_b282c1c7","line":225,"range":{"start_line":224,"start_character":16,"end_line":225,"end_character":28},"updated":"2017-12-22 03:33:55.000000000","message":"I thought all object servers were doing the work.\n\nReplica 0 would do obj in container % 0\nReplica 1 would do obj in container % 1\n...\nReplica n would do obj in container % n\n\nThis way is further shards the work and will scale as replicas grow.","commit_id":"638242bdbf0bde0dcce517785d465a6efc84106c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"661a602c9ccc3bbae8ff69f1ca35f08321b4c21b","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                policy.object_ring, self._myips, self._myport)"},{"line_number":222,"context_line":"            for (replica, part) in replicas_and_parts:"},{"line_number":223,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":224,"context_line":"                if replica \u003e\u003d 1:"},{"line_number":225,"context_line":"                    continue"},{"line_number":226,"context_line":"                yield get_task_account(self.task_account_prefix, policy, part)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def iter_cont_objs_to_expire(self, account):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf8cb3f7_687d2c1b","line":225,"range":{"start_line":224,"start_character":16,"end_line":225,"end_character":28},"in_reply_to":"bf8cb3f7_b282c1c7","updated":"2017-12-22 07:28:52.000000000","message":"I updated the implementation, but I may misunderstand your opinion.\nPlease check that the implementation is correct for your opinion or not.","commit_id":"638242bdbf0bde0dcce517785d465a6efc84106c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b015f5302fd44fd70c665f6cc5f1e52c40205b0","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            replicas_and_parts \u003d \\"},{"line_number":218,"context_line":"                iter_local_replicas_and_parts(ring, self._myips, self._myport)"},{"line_number":219,"context_line":"            for (replica_index, part) in replicas_and_parts:"},{"line_number":220,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":221,"context_line":"                if replica_index !\u003d part % ring.replica_count:"},{"line_number":222,"context_line":"                    continue"},{"line_number":223,"context_line":"                yield get_task_account(self.task_account_prefix, policy, part)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def iter_cont_objs_to_expire(self, account):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_6a3f7cd6","line":222,"range":{"start_line":220,"start_character":16,"end_line":222,"end_character":28},"updated":"2018-01-11 04:30:08.000000000","message":"Maybe I just mis understood, or maybe I\u0027m missing something obivous.. which is very possible. But this is saying only replica 0 of the object servers will be responsible for deleting expired objects.\n\nThis would mean, even if there are more replicas in the cluster, it wouldn\u0027t actually scale, though more partitions would, which is still pretty cool.\n\nMy understanding was, each primary node for a partition would take part in expiring objects. i.e for 3x replicas each replica would clean up about a 1/3 of the objects. Meaning if the replicas were to increase, the object servers would also scale. In essence the number of replicas would be analogous to the legacy process and processes except automatic.\n\nSomething like: http://paste.openstack.org/show/642539/\nNoting, that the above code hasn\u0027t been run or tested. And you could probably do a cleaner job, but I figure a hack will better demonstrate then my bad Australian english ;)","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"b47f91f556b7865913557388353bf03315239935","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            replicas_and_parts \u003d \\"},{"line_number":218,"context_line":"                iter_local_replicas_and_parts(ring, self._myips, self._myport)"},{"line_number":219,"context_line":"            for (replica_index, part) in replicas_and_parts:"},{"line_number":220,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":221,"context_line":"                if replica_index !\u003d part % ring.replica_count:"},{"line_number":222,"context_line":"                    continue"},{"line_number":223,"context_line":"                yield get_task_account(self.task_account_prefix, policy, part)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def iter_cont_objs_to_expire(self, account):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_4307b883","line":222,"range":{"start_line":220,"start_character":16,"end_line":222,"end_character":28},"in_reply_to":"7f96bb07_6a3f7cd6","updated":"2018-01-15 09:16:39.000000000","message":"Your idea is pretty cool!\nOK. I implemented it and added unit tests for it.\nThank you!","commit_id":"e2d59d78b61ee1322fc8e62357936dd1d6f4a749"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f9f0b639edcaaacb3ea9b87d4c9c24de51ce3dfe","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                cache_key \u003d \u0027%s/%s\u0027 % (cust_account, cust_cont)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"                if self.processes \u003e 0:"},{"line_number":149,"context_line":"                    obj_process \u003d int("},{"line_number":150,"context_line":"                        hashlib.md5(\u0027%s/%s\u0027 % (container, obj))."},{"line_number":151,"context_line":"                        hexdigest(), 16)"},{"line_number":152,"context_line":"                    if obj_process % self.processes !\u003d self.process:"},{"line_number":153,"context_line":"                        continue"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7f96bb07_a50eab8a","line":151,"range":{"start_line":149,"start_character":20,"end_line":151,"end_character":40},"updated":"2018-01-15 23:24:57.000000000","message":"Now that we have \u0027assigned_replica_index\u0027 which does the same thing we should probably use it here too:\n\n  obj_process \u003d assigned_replica_index(\u0027%s/%s\u0027 % (container, obj, self.processes)\n  if obj_process !\u003d self.process:\n      continue","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"02f19635fb4d2a7d96c2aa25ef8c28e1db3297df","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                cache_key \u003d \u0027%s/%s\u0027 % (cust_account, cust_cont)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"                if self.processes \u003e 0:"},{"line_number":149,"context_line":"                    obj_process \u003d int("},{"line_number":150,"context_line":"                        hashlib.md5(\u0027%s/%s\u0027 % (container, obj))."},{"line_number":151,"context_line":"                        hexdigest(), 16)"},{"line_number":152,"context_line":"                    if obj_process % self.processes !\u003d self.process:"},{"line_number":153,"context_line":"                        continue"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7f96bb07_32163157","line":151,"range":{"start_line":149,"start_character":20,"end_line":151,"end_character":40},"in_reply_to":"7f96bb07_a50eab8a","updated":"2018-01-17 10:04:27.000000000","message":"Done","commit_id":"67295b2f469dffc205d32b64f772bdeb624fb466"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            for o in self.swift.iter_objects(account, container):"},{"line_number":259,"context_line":"                obj \u003d o[\u0027name\u0027].encode(\u0027utf8\u0027)"},{"line_number":260,"context_line":"                timestamp, cust_account, cust_cont, cust_obj, _junk \u003d \\"},{"line_number":261,"context_line":"                    parse_task_obj(obj)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":264,"context_line":"                if assigned_replica_index("}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_94c9035a","line":261,"updated":"2018-01-18 09:11:11.000000000","message":"If using the same name on the variables in the parse_task_obj, they seem target_account, target_cont, etc...","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            for o in self.swift.iter_objects(account, container):"},{"line_number":259,"context_line":"                obj \u003d o[\u0027name\u0027].encode(\u0027utf8\u0027)"},{"line_number":260,"context_line":"                timestamp, cust_account, cust_cont, cust_obj, _junk \u003d \\"},{"line_number":261,"context_line":"                    parse_task_obj(obj)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":264,"context_line":"                if assigned_replica_index("}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_715dc245","line":261,"in_reply_to":"7f96bb07_94c9035a","updated":"2018-01-24 12:03:41.000000000","message":"Done","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d3d9c5d806debd890850a1ef2b3f82c669f484da","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                    parse_task_obj(obj)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":264,"context_line":"                if assigned_replica_index("},{"line_number":265,"context_line":"                        join(cust_account, cust_cont, cust_obj),"},{"line_number":266,"context_line":"                        replica_count) !\u003d replica_index:"},{"line_number":267,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_4fe0c426","line":264,"updated":"2018-01-18 09:11:11.000000000","message":"Perhaps, assigned_replica_index is not a replica index but just mod of hash val. If you add the tests to assert the Romain Expierer algorithm for sure this skip can work, it would be helpful to understand.\n\nOr, considering to rename the func name would be better too. idk.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"be9ec447c35b166cfd5e1d0df3c7f7e046b1b588","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                    parse_task_obj(obj)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":264,"context_line":"                if assigned_replica_index("},{"line_number":265,"context_line":"                        join(cust_account, cust_cont, cust_obj),"},{"line_number":266,"context_line":"                        replica_count) !\u003d replica_index:"},{"line_number":267,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_77da9278","line":264,"in_reply_to":"7f96bb07_4fe0c426","updated":"2018-01-24 12:03:41.000000000","message":"Done.\nI renamed the function name.","commit_id":"9b13cfe5e27eb0bccba54a2d9f156aa6958867dc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        \"my_index\" is equal to the assigned index executes the task. Because"},{"line_number":225,"context_line":"        each expirer have different \"my_index\", task objects are executed by"},{"line_number":226,"context_line":"        only one expirer."},{"line_number":227,"context_line":"        \"\"\""},{"line_number":228,"context_line":"        if not self.dequeue_from_legacy:"},{"line_number":229,"context_line":"            for policy in POLICIES:"},{"line_number":230,"context_line":"                ring \u003d policy.object_ring"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_5cee1489","line":227,"updated":"2019-05-03 15:40:30.000000000","message":"This doc string does not seem obviously sufficient - the relationship between processes/process and replicas/replica_index deserves some elaboration.","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        \"my_index\" is equal to the assigned index executes the task. Because"},{"line_number":225,"context_line":"        each expirer have different \"my_index\", task objects are executed by"},{"line_number":226,"context_line":"        only one expirer."},{"line_number":227,"context_line":"        \"\"\""},{"line_number":228,"context_line":"        if not self.dequeue_from_legacy:"},{"line_number":229,"context_line":"            for policy in POLICIES:"},{"line_number":230,"context_line":"                ring \u003d policy.object_ring"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_ebe05799","line":227,"in_reply_to":"dfbec78f_5cee1489","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                for (replica_index, part) in replicas_and_parts:"},{"line_number":234,"context_line":"                    task_account \u003d get_task_account("},{"line_number":235,"context_line":"                        self.task_account_prefix, policy, part)"},{"line_number":236,"context_line":"                    yield task_account, replica_index, ring.replica_count"},{"line_number":237,"context_line":"        # for legacy task queue"},{"line_number":238,"context_line":"        elif self.processes \u003e 0:"},{"line_number":239,"context_line":"            yield self.expiring_objects_account, self.process, self.processes"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_7c62f818","line":236,"updated":"2019-05-03 15:40:30.000000000","message":"The prefactor in Change-Id: I907612f7c258495e9ccc53c1d57de4791b3e7ab7\n makes the change deceptively simple.\n\nThe carnality of iter_task_accounts_to_expire goes from 1 to HUGE","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                    \u0027%(obj_count)s possible objects\u0027) % {"},{"line_number":343,"context_line":"                    \u0027account\u0027: task_account,"},{"line_number":344,"context_line":"                    \u0027container_count\u0027: container_count,"},{"line_number":345,"context_line":"                    \u0027obj_count\u0027: obj_count})"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"                task_account_container_list \u003d \\"},{"line_number":348,"context_line":"                    [(task_account, task_container) for task_container in"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_7c9438e9","line":345,"updated":"2019-05-03 15:40:30.000000000","message":"we log this message for every task-\u003cring\u003e-\u003cpart\u003e account that we process.  After a cluster has been running awhile that\u0027ll be every node dropping part count [1] log info messages every interval\n\nthat\u0027s too much\n\nAlso the stats get slightly confusing since they\u0027re no longer in aggregate for each \"once\"\n\nWe probably need to lift this out of the account loop and drop the pre-calculated stats all together\n\n1. at least part count assigned to this node","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                    \u0027%(obj_count)s possible objects\u0027) % {"},{"line_number":343,"context_line":"                    \u0027account\u0027: task_account,"},{"line_number":344,"context_line":"                    \u0027container_count\u0027: container_count,"},{"line_number":345,"context_line":"                    \u0027obj_count\u0027: obj_count})"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"                task_account_container_list \u003d \\"},{"line_number":348,"context_line":"                    [(task_account, task_container) for task_container in"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_26ab06d7","line":345,"in_reply_to":"dfbec78f_7c9438e9","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"swift/obj/server.py":[{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"041027f764edd15e707cb1a771abee972d393a5e","unresolved":false,"context_lines":[{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        :param op: operation performed (ex: \u0027PUT\u0027, or \u0027DELETE\u0027)"},{"line_number":432,"context_line":"        :param request: a request which triggered the task"},{"line_number":433,"context_line":"        :param daemon: a daemon name which executes the task"},{"line_number":434,"context_line":"        :param execution_time: scheduled execution time in UNIX seconds, int"},{"line_number":435,"context_line":"        :param time_divisor: divisor to get container name for the task"},{"line_number":436,"context_line":"                             execution time will be rounded by divisor"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_efeab10c","line":433,"updated":"2018-09-13 16:38:36.000000000","message":"daemon is confusing. would prefer something like job_type?","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"0559bfe5ed65a6afad698782c0ed5ece780c9e25","unresolved":false,"context_lines":[{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        :param op: operation performed (ex: \u0027PUT\u0027, or \u0027DELETE\u0027)"},{"line_number":432,"context_line":"        :param request: a request which triggered the task"},{"line_number":433,"context_line":"        :param daemon: a daemon name which executes the task"},{"line_number":434,"context_line":"        :param execution_time: scheduled execution time in UNIX seconds, int"},{"line_number":435,"context_line":"        :param time_divisor: divisor to get container name for the task"},{"line_number":436,"context_line":"                             execution time will be rounded by divisor"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_640f5de0","line":433,"in_reply_to":"3f4b6375_efeab10c","updated":"2018-09-13 21:28:42.000000000","message":"Now, this impelementation is not in the latest patch set.\nSo I think it is not problem now.","commit_id":"e5e6b8b3c8f15a8be23840335f0c10c35bf1ca4c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                op, self.expiring_objects_account, delete_at_container,"},{"line_number":496,"context_line":"                \u0027%s-%s/%s/%s\u0027 % (delete_at, account, container, obj),"},{"line_number":497,"context_line":"                host, partition, contdevice, headers_out, objdevice,"},{"line_number":498,"context_line":"                policy)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    def _make_timeout_reader(self, file_like):"},{"line_number":501,"context_line":"        def timeout_reader():"}],"source_content_type":"text/x-python","patch_set":41,"id":"dfbec78f_75753398","side":"PARENT","line":498,"updated":"2019-05-03 15:40:30.000000000","message":"wow, it\u0027s a little gross that this formatting of the object name was just inline here in the object server...","commit_id":"3269a3c1e903ec97fbf48e6b2bbe411fcdfe3401"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                # object servers should perform the required update."},{"line_number":457,"context_line":"                return"},{"line_number":458,"context_line":"            delete_at_container \u003d headers_in.get(\u0027X-Delete-At-Container\u0027, None)"},{"line_number":459,"context_line":"            if not delete_at_container:"},{"line_number":460,"context_line":"                # older proxy servers did not send X-Delete-At-Container so for"},{"line_number":461,"context_line":"                # backwards compatibility calculate the value here, but also"},{"line_number":462,"context_line":"                # log a warning because this is prone to inconsistent"}],"source_content_type":"text/x-python","patch_set":41,"id":"dfbec78f_d5189f76","line":459,"updated":"2019-05-03 15:40:30.000000000","message":"I think it\u0027d be a huge upgrade jump to have a proxy or async pending old enough to have not send the delete_at_container","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":519,"context_line":"            self.expiring_objects_task_prefix)"},{"line_number":520,"context_line":"        if container_is_legacy_form:"},{"line_number":521,"context_line":"            task_acc \u003d self.expiring_objects_account"},{"line_number":522,"context_line":"            task_obj \u003d \u0027%s-%s/%s/%s\u0027 % (delete_at, account, container, obj)"},{"line_number":523,"context_line":"        else:"},{"line_number":524,"context_line":"            task_acc \u003d get_task_account("},{"line_number":525,"context_line":"                self.task_account_prefix, policy, objpart)"}],"source_content_type":"text/x-python","patch_set":41,"id":"dfbec78f_5574af99","line":522,"updated":"2019-05-03 15:40:30.000000000","message":"since we\u0027ll have to support this for awhile going forward I\u0027d not be adverse to moving the parsing/formatting of the legacy queue to the new common module (also a good warning for new contributors)","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":519,"context_line":"            self.expiring_objects_task_prefix)"},{"line_number":520,"context_line":"        if container_is_legacy_form:"},{"line_number":521,"context_line":"            task_acc \u003d self.expiring_objects_account"},{"line_number":522,"context_line":"            task_obj \u003d \u0027%s-%s/%s/%s\u0027 % (delete_at, account, container, obj)"},{"line_number":523,"context_line":"        else:"},{"line_number":524,"context_line":"            task_acc \u003d get_task_account("},{"line_number":525,"context_line":"                self.task_account_prefix, policy, objpart)"}],"source_content_type":"text/x-python","patch_set":41,"id":"dfbec78f_317a6224","line":522,"in_reply_to":"dfbec78f_5574af99","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"39077a22731aed5ba686fdc3a8ccd2b8dd269846"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        self.task_account_prefix \u003d self.auto_create_account_prefix + \\"},{"line_number":167,"context_line":"            (conf.get(\u0027task_account_prefix\u0027) or \u0027task\u0027)"},{"line_number":168,"context_line":"        self.expiring_objects_task_prefix \u003d \\"},{"line_number":169,"context_line":"            (conf.get(\u0027expiring_objects_task_prefix\u0027) or \u0027expirer\u0027)"},{"line_number":170,"context_line":"        self.expiring_objects_container_divisor \u003d \\"},{"line_number":171,"context_line":"            int(conf.get(\u0027expiring_objects_container_divisor\u0027) or 86400)"},{"line_number":172,"context_line":"        # Initialization was successful, so now apply the network chunk size"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_f73da32c","line":169,"updated":"2019-05-03 15:40:30.000000000","message":"I always worried that .expiring_objects was configurable\n\nlet\u0027s just say .task- is reserved and be done with it\n\nWHO\u0027S WITH ME!!!???","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            task_obj \u003d \u0027%s-%s/%s/%s\u0027 % (delete_at, account, container, obj)"},{"line_number":523,"context_line":"        else:"},{"line_number":524,"context_line":"            task_acc \u003d get_task_account("},{"line_number":525,"context_line":"                self.task_account_prefix, policy, objpart)"},{"line_number":526,"context_line":"            task_obj \u003d get_task_obj(account, container, obj, delete_at)"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        for host, contdevice in updates:"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_37349b4a","line":525,"updated":"2019-05-03 15:40:30.000000000","message":"So even though the proxy doesn\u0027t pass down the account name via headers and it\u0027s no longer *static* - it\u0027s still deterministic and we have everything we need to build it","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"swift/proxy/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        self.auto_create_account_prefix \u003d ("},{"line_number":222,"context_line":"            conf.get(\u0027auto_create_account_prefix\u0027) or \u0027.\u0027)"},{"line_number":223,"context_line":"        self.enqueue_expiring_objects_to_legacy_queue \u003d config_true_value("},{"line_number":224,"context_line":"            conf.get(\u0027enqueue_expiring_objects_to_legacy_queue\u0027, \u0027true\u0027))"},{"line_number":225,"context_line":"        self.expiring_objects_account \u003d self.auto_create_account_prefix + \\"},{"line_number":226,"context_line":"            (conf.get(\u0027expiring_objects_account_name\u0027) or \u0027expiring_objects\u0027)"},{"line_number":227,"context_line":"        self.task_account_prefix \u003d self.auto_create_account_prefix + \\"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_d7441fba","line":224,"updated":"2019-05-03 15:40:30.000000000","message":"this is an important option, you need to have configured your object-server.conf with [object-expirer] sections before you can start using this","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"test/probe/test_object_expirer.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"746d8f68c420ac4164702e6692cec1b4558a2775","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        conf_file \u003d conf_files[0]"},{"line_number":45,"context_line":"        self.client \u003d InternalClient(conf_file, \u0027probe-test\u0027, 3)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        super(BaseTestObjectExpirer, self).setUp()"},{"line_number":48,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"},{"line_number":49,"context_line":"        self.object_name \u003d \u0027object-%s\u0027 % uuid.uuid4()"},{"line_number":50,"context_line":"        self.brain \u003d BrainSplitter(self.url, self.token, self.container_name,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_18c3708c","line":47,"updated":"2018-09-13 18:10:32.000000000","message":"Wait, how is this supposed to work in a class that inherits from object? Even if does happen to work in subclasses, it\u0027s far from transparent. I mean, your subclass inherits from 2 mix-ins, which one supplies setUp?","commit_id":"bde878d37311e2f74581adf0847e93173f3bb42c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"0559bfe5ed65a6afad698782c0ed5ece780c9e25","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        conf_file \u003d conf_files[0]"},{"line_number":45,"context_line":"        self.client \u003d InternalClient(conf_file, \u0027probe-test\u0027, 3)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        super(BaseTestObjectExpirer, self).setUp()"},{"line_number":48,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"},{"line_number":49,"context_line":"        self.object_name \u003d \u0027object-%s\u0027 % uuid.uuid4()"},{"line_number":50,"context_line":"        self.brain \u003d BrainSplitter(self.url, self.token, self.container_name,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_a962303c","line":47,"in_reply_to":"3f79a3b5_18c3708c","updated":"2018-09-13 21:28:42.000000000","message":"I see.\nI updated setUp process to be unrelated with mix-in.","commit_id":"bde878d37311e2f74581adf0847e93173f3bb42c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                    self.enqueue_expiring_objects_to_legacy_queue"},{"line_number":50,"context_line":"            else:"},{"line_number":51,"context_line":"                set_enqueue_flag_to_proxy_server(app.app)"},{"line_number":52,"context_line":"        set_enqueue_flag_to_proxy_server(self.client.app)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"},{"line_number":55,"context_line":"        self.object_name \u003d \u0027object-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_b77f2baa","line":52,"updated":"2019-05-03 15:40:30.000000000","message":"little recursion to find the proxy app :+1:","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # make sure auto-created containers get in the account listing"},{"line_number":95,"context_line":"        Manager([\u0027container-updater\u0027]).once()"},{"line_number":96,"context_line":"        # this guy should no-op since it\u0027s unable to expire the object"},{"line_number":97,"context_line":"        self.expirer.once(additional_args\u003dself.expirer_running_options)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        self.brain.start_handoff_half()"},{"line_number":100,"context_line":"        self.get_to_final_state()"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_7719b386","line":97,"updated":"2019-05-03 15:40:30.000000000","message":"cool, additional_args came into the manager module with sharding - apparently mostly for use in probetests - thanks matt!","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def setUp(self):"},{"line_number":373,"context_line":"        super(TestObjectExpirerGeneralMode, self).setUp()"},{"line_number":374,"context_line":"        self._baseSetUp()"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"if __name__ \u003d\u003d \"__main__\":"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_d703bf0e","line":374,"updated":"2019-05-03 15:40:30.000000000","message":"parameter-ized BaseTestCase seems like a reasonable pattern here - kudos","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"test/unit/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            part2dev_id \u003d ["},{"line_number":277,"context_line":"                (x + part) % self.dev_count for part"},{"line_number":278,"context_line":"                in range(2 ** self.part_power)]"},{"line_number":279,"context_line":"            self._replica2part2dev_id.append(part2dev_id)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @property"},{"line_number":282,"context_line":"    def replica_count(self):"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_f7e2822f","line":279,"updated":"2019-05-03 15:40:30.000000000","message":"I don\u0027t think it\u0027s a good idea to populate this _replica2part2dev_id table if it\u0027s in no way related to the fake\u0027s _get_part_nodes method.\n\nWe have lots of different ring like things we can use in tests, could we use a FabricatedRing over in the expirer tests?","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            part2dev_id \u003d ["},{"line_number":277,"context_line":"                (x + part) % self.dev_count for part"},{"line_number":278,"context_line":"                in range(2 ** self.part_power)]"},{"line_number":279,"context_line":"            self._replica2part2dev_id.append(part2dev_id)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @property"},{"line_number":282,"context_line":"    def replica_count(self):"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_9413f70d","line":279,"in_reply_to":"dfbec78f_f7e2822f","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"test/unit/common/test_task_queue.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def test_iter_local_replicas_and_parts(self):"},{"line_number":125,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 10, 10)"},{"line_number":126,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 10, 0)"},{"line_number":127,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 10, 11)"},{"line_number":128,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 3, 10)"},{"line_number":129,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 20, 10)"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_f7112355","line":126,"updated":"2019-05-03 15:40:30.000000000","message":":mind_blown: what does part_power\u003d0 even *mean*!?\n\nThis test is whicked slow...\n\n\tvagrant@saio:~$ time nosetests swift/test/unit/common/test_task_queue.py:TestTaskQueue.test_iter_local_replicas_and_parts\n\t.\n\t----------------------------------------------------------------------\n\tRan 1 test in 0.754s\n\n\tOK\n\n\treal\t0m1.350s\n\tuser\t0m0.680s\n\tsys\t0m0.444s\n\nFor me this is better:\n\ndiff --git a/test/unit/common/test_task_queue.py b/test/unit/common/test_task_queue.py\nindex 79f0e02c4..40726a34f 100644\n--- a/test/unit/common/test_task_queue.py\n+++ b/test/unit/common/test_task_queue.py\n@@ -122,10 +122,10 @@ class TestTaskQueue(unittest.TestCase):\n             self.assertEqual(len(set(result_dict[part])), replicas)\n \n     def test_iter_local_replicas_and_parts(self):\n+        self.assert_iter_local_replicas_and_parts(3, 10, 6)\n+        self.assert_iter_local_replicas_and_parts(3, 10, 1)\n         self.assert_iter_local_replicas_and_parts(3, 10, 10)\n-        self.assert_iter_local_replicas_and_parts(3, 10, 0)\n-        self.assert_iter_local_replicas_and_parts(3, 10, 11)\n-        self.assert_iter_local_replicas_and_parts(3, 3, 10)\n-        self.assert_iter_local_replicas_and_parts(3, 20, 10)\n-        self.assert_iter_local_replicas_and_parts(1, 10, 10)\n-        self.assert_iter_local_replicas_and_parts(10, 10, 10)\n+        self.assert_iter_local_replicas_and_parts(3, 3, 6)\n+        self.assert_iter_local_replicas_and_parts(3, 20, 6)\n+        self.assert_iter_local_replicas_and_parts(1, 10, 6)\n+        self.assert_iter_local_replicas_and_parts(10, 10, 6)","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def test_iter_local_replicas_and_parts(self):"},{"line_number":125,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 10, 10)"},{"line_number":126,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 10, 0)"},{"line_number":127,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 10, 11)"},{"line_number":128,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 3, 10)"},{"line_number":129,"context_line":"        self.assert_iter_local_replicas_and_parts(3, 20, 10)"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_acd7d523","line":126,"in_reply_to":"dfbec78f_f7112355","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"746d8f68c420ac4164702e6692cec1b4558a2775","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from six.moves import urllib"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from swift.common import internal_client, utils, swob, storage_policy"},{"line_number":29,"context_line":"from swift.common.utils import Timestamp, quote"},{"line_number":30,"context_line":"from swift.obj import expirer"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_5896c840","line":29,"updated":"2018-09-13 18:10:32.000000000","message":"The swift/common/task_queue.py uses quote from six.moves.urllib.parse directly. The two are not generally compatible in the presence of unicode names (if someone wants to expire an object with a strange name). I think you need to be sure to stick to one of them in both places.","commit_id":"bde878d37311e2f74581adf0847e93173f3bb42c"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"0559bfe5ed65a6afad698782c0ed5ece780c9e25","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from six.moves import urllib"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from swift.common import internal_client, utils, swob, storage_policy"},{"line_number":29,"context_line":"from swift.common.utils import Timestamp, quote"},{"line_number":30,"context_line":"from swift.obj import expirer"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_6914184e","line":29,"in_reply_to":"3f79a3b5_5896c840","updated":"2018-09-13 21:28:42.000000000","message":"Done.\nI updated swift/common/task/queue.py","commit_id":"bde878d37311e2f74581adf0847e93173f3bb42c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":923,"context_line":"        self.conf[\u0027process\u0027] \u003d \u00271\u0027"},{"line_number":924,"context_line":"        x \u003d expirer.ObjectExpirer(self.conf, logger\u003dself.logger)"},{"line_number":925,"context_line":"        results \u003d [_ for _ in x.iter_task_accounts_to_expire()]"},{"line_number":926,"context_line":"        self.assertEqual(results, [(\u0027.expiring_objects\u0027, 1, 2)])"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":""},{"line_number":929,"context_line":"# Basically, ring\u0027s replicas \u003d 1 and part_power \u003d 0 to test behavior of tasks"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_b7fc0b3f","line":926,"updated":"2019-05-03 15:40:30.000000000","message":"haha, yes - historically the cardinality was 1","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"    #   |  6  | dev_id \u003d 2 | dev_id \u003d 3 | dev_id \u003d 0 |"},{"line_number":1017,"context_line":"    #   +-----+------------+------------+------------+"},{"line_number":1018,"context_line":"    #   |  7  | dev_id \u003d 3 | dev_id \u003d 0 | dev_id \u003d 1 |"},{"line_number":1019,"context_line":"    #   +-----+------------+------------+------------+"},{"line_number":1020,"context_line":"    @patch_policies([storage_policy.StoragePolicy(0, \u0027zero\u0027, True),"},{"line_number":1021,"context_line":"                     storage_policy.StoragePolicy(1, \u0027one\u0027)],"},{"line_number":1022,"context_line":"                    fake_ring_args\u003d["}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_77ef7387","line":1019,"updated":"2019-05-03 15:40:30.000000000","message":"nice ascii art!","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"                        {\u0027replicas\u0027: 3, \u0027part_power\u0027: 3,"},{"line_number":1042,"context_line":"                         \u0027ports_per_ip\u0027: 2, \u0027dev_count\u0027: 4},"},{"line_number":1043,"context_line":"                        {\u0027replicas\u0027: 3, \u0027part_power\u0027: 3,"},{"line_number":1044,"context_line":"                         \u0027ports_per_ip\u0027: 3, \u0027dev_count\u0027: 4}])"},{"line_number":1045,"context_line":"    def test_iter_task_accounts_to_expire_servers_per_port(self):"},{"line_number":1046,"context_line":"        servers_per_port_conf \u003d deepcopy(self.conf)"},{"line_number":1047,"context_line":"        servers_per_port_conf[\u0027servers_per_port\u0027] \u003d \u00271\u0027"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_775e92e7","line":1044,"updated":"2019-05-03 15:40:30.000000000","message":"As best I can tell this is the only test that uses ports_per_ip","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"            (\u0027.task-object-1-4\u0027, 1, 3), (\u0027.task-object-1-4\u0027, 2, 3),"},{"line_number":1066,"context_line":"            (\u0027.task-object-1-5\u0027, 0, 3), (\u0027.task-object-1-5\u0027, 1, 3),"},{"line_number":1067,"context_line":"            (\u0027.task-object-1-6\u0027, 0, 3), (\u0027.task-object-1-6\u0027, 2, 3),"},{"line_number":1068,"context_line":"            (\u0027.task-object-1-7\u0027, 1, 3), (\u0027.task-object-1-7\u0027, 2, 3),"},{"line_number":1069,"context_line":"        ]))"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_379edb07","line":1068,"updated":"2019-05-03 15:40:30.000000000","message":"... but the cardinality gets bigger quickly","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":7536,"context_line":"    def task_object("},{"line_number":7537,"context_line":"            self, delete_at_timestamp, target_acc, target_con, target_obj):"},{"line_number":7538,"context_line":"        return utils.normalize_delete_at_timestamp(delete_at_timestamp) + \\"},{"line_number":7539,"context_line":"            \u0027/\u0027 + \u0027%2F\u0027.join([target_acc, target_con, target_obj])"},{"line_number":7540,"context_line":""},{"line_number":7541,"context_line":""},{"line_number":7542,"context_line":"@patch_policies(test_policies)"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_77af7294","line":7539,"updated":"2019-05-03 15:40:30.000000000","message":"I don\u0027t think this is appropriate.  \n\nThere\u0027s 171 tests in the BaseTestObjectController\n\nOnly 25 at a maximum have anything to do with object expiration, we should pull those our to a BaseTestExpirerTestCase and dump just those otherwise it seems like overhead","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb8275232b3e44b3515f8111f3317d6d72b1038a","unresolved":false,"context_lines":[{"line_number":7536,"context_line":"    def task_object("},{"line_number":7537,"context_line":"            self, delete_at_timestamp, target_acc, target_con, target_obj):"},{"line_number":7538,"context_line":"        return utils.normalize_delete_at_timestamp(delete_at_timestamp) + \\"},{"line_number":7539,"context_line":"            \u0027/\u0027 + \u0027%2F\u0027.join([target_acc, target_con, target_obj])"},{"line_number":7540,"context_line":""},{"line_number":7541,"context_line":""},{"line_number":7542,"context_line":"@patch_policies(test_policies)"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_d49f2fb2","line":7539,"in_reply_to":"dfbec78f_77af7294","updated":"2019-05-04 10:44:37.000000000","message":"Done","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77d6623c5a96d3b2b74b73b97eeb3fa34b0e5ff5","unresolved":false,"context_lines":[{"line_number":5883,"context_line":"        with mock.patch.object("},{"line_number":5884,"context_line":"                self.app, \u0027enqueue_expiring_objects_to_legacy_queue\u0027, False):"},{"line_number":5885,"context_line":"            self._test_PUT_x_delete_at_with_fewer_container_replicas("},{"line_number":5886,"context_line":"                delete_at_container_func)"},{"line_number":5887,"context_line":""},{"line_number":5888,"context_line":""},{"line_number":5889,"context_line":"class BaseTestECObjectController(BaseTestObjectController):"}],"source_content_type":"text/x-python","patch_set":42,"id":"dfbec78f_d7d65ff2","line":5886,"updated":"2019-05-03 15:40:30.000000000","message":"these tests seem to roughly cover the association of the enqueue_expiring_objects_to_legacy_queue option and the expected container name functions\n\nI couldn\u0027t find anything in test.unit.proxy.controllers.test_obj that would have been more appropriate.\n\nI think these tests are pretty good.","commit_id":"d36ff26e2620a50e43aa194df48dff7748ae2a13"}]}
