)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a7582a738a1c44b2458098c69726d3f3398908c1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"each set the SO_REUSEPORT option."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"This feature have two usages. It loadbalances the traffic over"},{"line_number":19,"context_line":"multiple processes, usefull when the server is not multithreaded. It"},{"line_number":20,"context_line":"also helps to provide a zero-downtime restart by allowing that, at any time,"},{"line_number":21,"context_line":"there is always at least one process listening for incoming requests."},{"line_number":22,"context_line":"Zero-downtime restart is the main objective of that patch."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"da86d52c_dc1ba41a","line":19,"updated":"2015-02-07 02:06:10.000000000","message":"\"useful\"","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a7582a738a1c44b2458098c69726d3f3398908c1","unresolved":false,"context_lines":[{"line_number":21,"context_line":"there is always at least one process listening for incoming requests."},{"line_number":22,"context_line":"Zero-downtime restart is the main objective of that patch."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"The new configuration option DEFAULT/reuseport, available for"},{"line_number":25,"context_line":"account|container|object|proxy server, enables the socket option if"},{"line_number":26,"context_line":"the kernel is a Linux\u003e\u003d3.9. It is disabled by default."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"da86d52c_5cd7b423","line":24,"updated":"2015-02-07 02:06:10.000000000","message":"Why not keep it enabled at all times? What\u0027s the downside?","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a7582a738a1c44b2458098c69726d3f3398908c1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    /usr/bin/python /usr/bin/swift-proxy-server \\"},{"line_number":37,"context_line":"        /etc/swift/proxy-server.conf \\"},{"line_number":38,"context_line":"        --finish $(cat /var/run/swift/proxy-server.pid)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Change-Id: I3a6cd3635545402203fa8c5de0c43ede81fb7c0e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"da86d52c_fcef88e7","line":39,"updated":"2015-02-07 02:06:10.000000000","message":"Perhaps mention here that swift-init supports this too? I know the docs do that already.","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"}],"etc/account-server.conf-sample":[{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# disable_fallocate \u003d false"},{"line_number":11,"context_line":"#"},{"line_number":12,"context_line":"# Use the socket option SO_REUSEPORT when available. It is required to provide"},{"line_number":13,"context_line":"# a zero-downtime restart/reload of the server."},{"line_number":14,"context_line":"# reuseport \u003d no"},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# Use an integer to override the number of pre-forked processes that will"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"da86d52c_cf66c350","line":13,"updated":"2015-02-05 15:53:16.000000000","message":"probably good to mention here that the option requires \u003e\u003d 3.9 (and in the other sample files also)","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"}],"swift/common/manager.py":[{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":567,"context_line":"        args \u003d [self.cmd, conf_file]"},{"line_number":568,"context_line":"        if once:"},{"line_number":569,"context_line":"            args.append(\u0027once\u0027)"},{"line_number":570,"context_line":"        if finish:"},{"line_number":571,"context_line":"            args.append(\u0027--finish\u0027)"},{"line_number":572,"context_line":"            args.append(\u0027,\u0027.join([str(pid) for pid in finish]))"},{"line_number":573,"context_line":"        if terminate:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_4fabb488","line":570,"updated":"2015-02-05 15:53:16.000000000","message":"needs unit test code coverage","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a7582a738a1c44b2458098c69726d3f3398908c1","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        if already_started and not kwargs.get(\u0027reuseport_signal\u0027):"},{"line_number":662,"context_line":"            print _(\"%s already started...\") % self.server"},{"line_number":663,"context_line":"            return {}"},{"line_number":664,"context_line":"        elif kwargs.get(\u0027reuseport_signal\u0027) and old_pids:"},{"line_number":665,"context_line":"            kwargs[kwargs.get(\u0027reuseport_signal\u0027)] \u003d old_pids"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"        if self.server not in START_ONCE_SERVERS:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_b7a9aae1","line":664,"updated":"2015-02-07 02:06:10.000000000","message":"just if maybe","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            print _(\"%s already started...\") % self.server"},{"line_number":663,"context_line":"            return {}"},{"line_number":664,"context_line":"        elif kwargs.get(\u0027reuseport_signal\u0027) and old_pids:"},{"line_number":665,"context_line":"            kwargs[kwargs.get(\u0027reuseport_signal\u0027)] \u003d old_pids"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"        if self.server not in START_ONCE_SERVERS:"},{"line_number":668,"context_line":"            kwargs[\u0027once\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_af7a7021","line":665,"updated":"2015-02-05 15:53:16.000000000","message":"no unit test code coverage","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"}],"swift/common/utils.py":[{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":1542,"context_line":"        parser.add_option(\"--finish\", type\u003d\"string\","},{"line_number":1543,"context_line":"                          action\u003d\"callback\", callback\u003dpids_parser,"},{"line_number":1544,"context_line":"                          help\u003d\"Send FINISH signal to the specified pids \""},{"line_number":1545,"context_line":"                               \"after startup. The process which receive this \""},{"line_number":1546,"context_line":"                               \"signal will wait for all sessions to finish \""},{"line_number":1547,"context_line":"                               \"before exiting. Technically speaking, SIGHUP \""},{"line_number":1548,"context_line":"                               \"is sent.\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_cfda4416","line":1545,"updated":"2015-02-05 15:53:16.000000000","message":"/s/receive/receives","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":1549,"context_line":"        parser.add_option(\"--terminate\", type\u003d\"string\","},{"line_number":1550,"context_line":"                          action\u003d\"callback\", callback\u003dpids_parser,"},{"line_number":1551,"context_line":"                          help\u003d\"Send TERMINATE signal to the specified pids \""},{"line_number":1552,"context_line":"                               \"after startup. The process which receive this \""},{"line_number":1553,"context_line":"                               \"signal will immediately terminate, closing \""},{"line_number":1554,"context_line":"                               \"all active sessions. Technically speaking, \""},{"line_number":1555,"context_line":"                               \"SIGTERM is sent.\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_0f08dc90","line":1552,"updated":"2015-02-05 15:53:16.000000000","message":"/s/receive/receives","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b36e6384d2f1ebb95951b26f049a4df413c64b95","unresolved":false,"context_lines":[{"line_number":1539,"context_line":"                                  separated by commas"},{"line_number":1540,"context_line":"        \"\"\""},{"line_number":1541,"context_line":"        pids \u003d set()"},{"line_number":1542,"context_line":"        for pid in value.strip().split(\u0027,\u0027):"},{"line_number":1543,"context_line":"            if pid.strip():"},{"line_number":1544,"context_line":"                try:"},{"line_number":1545,"context_line":"                    pids.add(int(pid.strip()))"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_76dde3df","line":1542,"updated":"2015-02-24 23:41:03.000000000","message":"You probably don\u0027t need to strip here if you strip each pid individually below anyway. There\u0027s also list_from_csv() below.","commit_id":"84328950c9a019fa7ad58c4e6dc7a5f68c169cb5"}],"swift/common/wsgi.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"382cbd9d919a6b3bdd6ce223c1b27551ec7f3df4","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            sock \u003d socket.socket(address_family, socket.SOCK_STREAM)"},{"line_number":171,"context_line":"            if platform.system() !\u003d \u0027Windows\u0027:"},{"line_number":172,"context_line":"                sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)"},{"line_number":173,"context_line":"            if config_true_value(conf.get(\u0027reuseport\u0027, \u0027no\u0027)):"},{"line_number":174,"context_line":"                if hasattr(socket, \u0027SO_REUSEPORT\u0027):"},{"line_number":175,"context_line":"                    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)"},{"line_number":176,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_c58c9e31","line":173,"updated":"2014-12-05 21:24:07.000000000","message":"do you think it would be reasonable to always use this option when it\u0027s available or is it dangerous if not used correctly with the terminate/finish arguments?","commit_id":"5e94c68afaa4a2ef24121ebf3bb20e231815b62a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"382cbd9d919a6b3bdd6ce223c1b27551ec7f3df4","unresolved":false,"context_lines":[{"line_number":473,"context_line":"    capture_stdio(logger)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    # If instructed, finish/terminate old process. with reuseport\u003dTrue,"},{"line_number":476,"context_line":"    # it ensures a zero-downtime reload/restart"},{"line_number":477,"context_line":"    if kwargs.get(\u0027finish\u0027):"},{"line_number":478,"context_line":"        try:"},{"line_number":479,"context_line":"            logger.debug(\u0027Sending SIGHUP to %d\u0027 % kwargs.get(\u0027finish\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_a5a792a6","line":476,"updated":"2014-12-05 21:24:07.000000000","message":"what\u0027s the expected behavior of these options if reuseport \u003d false?","commit_id":"5e94c68afaa4a2ef24121ebf3bb20e231815b62a"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    while not sock and time.time() \u003c retry_until:"},{"line_number":169,"context_line":"        try:"},{"line_number":170,"context_line":"            sock \u003d socket.socket(address_family, socket.SOCK_STREAM)"},{"line_number":171,"context_line":"            if platform.system() !\u003d \u0027Windows\u0027:"},{"line_number":172,"context_line":"                sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)"},{"line_number":173,"context_line":"            if config_true_value(conf.get(\u0027reuseport\u0027, \u0027no\u0027)):"},{"line_number":174,"context_line":"                if hasattr(socket, \u0027SO_REUSEPORT\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_5238bcd2","line":171,"updated":"2015-02-05 15:53:16.000000000","message":"so just a question here as my network knowledge isn\u0027t that great - before this was unconditionally set and now you have it set only for non-windows.  What are the implications here and is this part of your change or just an extra \u0027thing\u0027 you noticed?","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                if hasattr(socket, \u0027SO_REUSEPORT\u0027):"},{"line_number":175,"context_line":"                    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)"},{"line_number":176,"context_line":"                else:"},{"line_number":177,"context_line":"                    reuseport_warning_message \u003d _(\u0027SO_REUSEPORT is not \u0027"},{"line_number":178,"context_line":"                                                  \u0027available on your \u0027"},{"line_number":179,"context_line":"                                                  \u0027platform. It is only \u0027"},{"line_number":180,"context_line":"                                                  \u0027available on Linux \u003e\u003d 3.9\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_af08afda","line":177,"updated":"2015-02-05 15:53:16.000000000","message":"else clause not covered in unit tesdt","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a7582a738a1c44b2458098c69726d3f3398908c1","unresolved":false,"context_lines":[{"line_number":180,"context_line":"                                                  \u0027available on Linux \u003e\u003d 3.9\u0027)"},{"line_number":181,"context_line":"                    get_logger(conf).warn(reuseport_warning_message)"},{"line_number":182,"context_line":"                    print(reuseport_warning_message)"},{"line_number":183,"context_line":"            # in my experience, sockets can hang around forever without"},{"line_number":184,"context_line":"            # keepalive"},{"line_number":185,"context_line":"            sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)"},{"line_number":186,"context_line":"            sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_17e6f644","line":183,"updated":"2015-02-07 02:06:10.000000000","message":"Can we not drag keepalives into this patch? It\u0027s probably something that deserves a separate bugfix, so it at least it could be bisected.","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"0dba1f41d1c8f075d2308013fc6a3bd5c1665d1e","unresolved":false,"context_lines":[{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    # If instructed, finish/terminate old process. with reuseport\u003dTrue,"},{"line_number":476,"context_line":"    # it ensures a zero-downtime reload/restart"},{"line_number":477,"context_line":"    if kwargs.get(\u0027finish\u0027):"},{"line_number":478,"context_line":"        for pid in kwargs.get(\u0027finish\u0027):"},{"line_number":479,"context_line":"            logger.debug(\u0027Sending SIGHUP to %d\u0027 % pid)"},{"line_number":480,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_efdc6748","line":477,"updated":"2015-02-05 15:53:16.000000000","message":"no unit test code coverage","commit_id":"d2d336f2df49d91f6528f0294e3b93ceb5aaf835"}],"test/unit/common/test_wsgi.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"382cbd9d919a6b3bdd6ce223c1b27551ec7f3df4","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        # SO_REUSEPORT is only available on Linux \u003e\u003d 3.9"},{"line_number":308,"context_line":"        if platform.system() !\u003d \u0027Linux\u0027 \\"},{"line_number":309,"context_line":"                or LooseVersion(platform.release()) \u003c LooseVersion(\u00273.9\u0027):"},{"line_number":310,"context_line":"            raise SkipTest"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        # stubs"},{"line_number":313,"context_line":"        conf_1st \u003d {\u0027bind_ip\u0027: \u0027127.0.0.1\u0027, \u0027bind_port\u0027: 0}"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_65f20a9d","line":310,"updated":"2014-12-05 21:24:07.000000000","message":"FWIW I\u0027m in favor of the stronger functional test that gets skipped on older distros like precise than just trying to mock out socket and assert the right flags get passed in - although technically this may mean if someone is developing on an older platform they may not know they broke the feature until the test runs in the gate...","commit_id":"5e94c68afaa4a2ef24121ebf3bb20e231815b62a"}]}
