)]}'
{"bin/nova-rpc-zmq-receiver":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e5ccf2ceeed95b1881bf6853e2f8589cd1817bff","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        utils.execute(\u0027chown\u0027, \"%s:%s\" % (os.getuid(), os.getgid()),"},{"line_number":61,"context_line":"                      ipc_dir, run_as_root\u003dTrue)"},{"line_number":62,"context_line":"        utils.execute(\u0027chmod\u0027, \u0027750\u0027, ipc_dir, run_as_root\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    with contextlib.closing(impl_zmq.ZmqProxy(flags.FLAGS)) as reactor:"},{"line_number":65,"context_line":"        consume_in \u003d \"tcp://%s:%s\" % \\"},{"line_number":66,"context_line":"            (FLAGS.rpc_zmq_bind_address,"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAHX%2F%2F5b8%3D","line":63,"updated":"2012-05-21 21:13:23.000000000","message":"Exceptions by utils.execute should be handled","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":48,"context_line":"    #utils.default_flagfile()"},{"line_number":49,"context_line":"    flags.FLAGS(sys.argv)"},{"line_number":50,"context_line":"    FLAGS.register_opts(rpc.rpc_opts)"},{"line_number":51,"context_line":"    impl_zmq.register_opts(flags.FLAGS)"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"AAAAHX%2F%2F4Z4%3D","line":48,"updated":"2012-05-23 21:53:20.000000000","message":"femtonit: I\u0027d prefer if you simply removed lines rather than commenting them out like this.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5c3db168c3fa0b6dd4fc04171a25666327916671","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import sys"},{"line_number":26,"context_line":"import time"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import zmq"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from nova import exception"},{"line_number":31,"context_line":"from nova import flags"}],"source_content_type":"application/octet-stream","patch_set":15,"id":"AAAAHX%2F%2F3wI%3D","line":28,"updated":"2012-05-24 21:54:36.000000000","message":"see HACKING about import order.  eventlet should be with zmq in this spot.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import sys"},{"line_number":26,"context_line":"import time"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import zmq"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from nova import exception"},{"line_number":31,"context_line":"from nova import flags"}],"source_content_type":"application/octet-stream","patch_set":15,"id":"AAAAHX%2F%2F3kM%3D","line":28,"in_reply_to":"AAAAHX%2F%2F3wI%3D","updated":"2012-05-25 18:31:02.000000000","message":"Here, we DO need to import eventlet and monkey_patch above stdlibs. Look at the other services in bin, you\u0027ll see the same.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, ipc_dir, run_as_root\u003dTrue)"},{"line_number":61,"context_line":"            utils.execute(\u0027chown\u0027, \"%s:%s\" % (os.getuid(), os.getgid()),"},{"line_number":62,"context_line":"                          ipc_dir, run_as_root\u003dTrue)"},{"line_number":63,"context_line":"            utils.execute(\u0027chmod\u0027, \u0027750\u0027, ipc_dir, run_as_root\u003dTrue)"},{"line_number":64,"context_line":"        except exception.ProcessExecutionError:"},{"line_number":65,"context_line":"            LOG.error(_(\"Could not create IPC socket directory.\"))"},{"line_number":66,"context_line":"            return"}],"source_content_type":"application/octet-stream","patch_set":15,"id":"AAAAHX%2F%2F33c%3D","line":63,"updated":"2012-05-24 19:09:28.000000000","message":"Please update the nova rootwrap filters with comments that add where these commands are called.  There are already filters that will allow it, but there are also a set of comments tracking where they get used.\n\nAlso, how should this service be handled with openstack-common?  Make every project that wants to use openstack-common rpc implement a similar service?  Maybe we can push as much of this code as possible into rpc so that it doesn\u0027t have to be duplicated as much?","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, ipc_dir, run_as_root\u003dTrue)"},{"line_number":61,"context_line":"            utils.execute(\u0027chown\u0027, \"%s:%s\" % (os.getuid(), os.getgid()),"},{"line_number":62,"context_line":"                          ipc_dir, run_as_root\u003dTrue)"},{"line_number":63,"context_line":"            utils.execute(\u0027chmod\u0027, \u0027750\u0027, ipc_dir, run_as_root\u003dTrue)"},{"line_number":64,"context_line":"        except exception.ProcessExecutionError:"},{"line_number":65,"context_line":"            LOG.error(_(\"Could not create IPC socket directory.\"))"},{"line_number":66,"context_line":"            return"}],"source_content_type":"application/octet-stream","patch_set":15,"id":"AAAAHX%2F%2F3zA%3D","line":63,"in_reply_to":"AAAAHX%2F%2F33c%3D","updated":"2012-05-24 20:33:30.000000000","message":"This was designed so that one instance of this service (per machine) would satisfy all projects, from a single instance of the daemon. I had thought this binary could go into openstack-common and would be used/run by all machines that intend to use it - at least in the short-term.\n\nThe only code reuse is that this is reimplemented in the unit tests. That was a late addition and I need to evaluate how much can be shared (especially since we do some hacks in the unit tests that don\u0027t apply here)","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":19,"context_line":"eventlet.monkey_patch()"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import gettext"},{"line_number":23,"context_line":"import os"},{"line_number":24,"context_line":"import string"},{"line_number":25,"context_line":"import sys"}],"source_content_type":"application/octet-stream","patch_set":18,"id":"AAAAHX%2F%2F3WY%3D","line":22,"updated":"2012-05-25 21:45:29.000000000","message":"not used.  Are you missing a:\n\ngettext.install(\u0027nova\u0027, unicode\u003d1)  ?","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import gettext"},{"line_number":23,"context_line":"import os"},{"line_number":24,"context_line":"import string"},{"line_number":25,"context_line":"import sys"},{"line_number":26,"context_line":"import time"},{"line_number":27,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":18,"id":"AAAAHX%2F%2F3Wg%3D","line":24,"updated":"2012-05-25 21:45:29.000000000","message":"not used.","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import os"},{"line_number":24,"context_line":"import string"},{"line_number":25,"context_line":"import sys"},{"line_number":26,"context_line":"import time"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import zmq"},{"line_number":29,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":18,"id":"AAAAHX%2F%2F3Wc%3D","line":26,"updated":"2012-05-25 21:45:29.000000000","message":"not used","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                          ipc_dir, run_as_root\u003dTrue)"},{"line_number":63,"context_line":"            utils.execute(\u0027chmod\u0027, \u0027750\u0027, ipc_dir, run_as_root\u003dTrue)"},{"line_number":64,"context_line":"        except exception.ProcessExecutionError:"},{"line_number":65,"context_line":"            LOG.error(_(\"Could not create IPC socket directory.\"))"},{"line_number":66,"context_line":"            return"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    with contextlib.closing(impl_zmq.ZmqProxy(flags.FLAGS)) as reactor:"}],"source_content_type":"application/octet-stream","patch_set":18,"id":"AAAAHX%2F%2F3WU%3D","line":65,"updated":"2012-05-25 21:45:29.000000000","message":"Missing a LOG \u003d somewhere near the top, I guess...","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"}],"nova/rpc/__init__.py":[{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    cfg.IntOpt(\u0027rpc_thread_pool_size\u0027,"},{"line_number":37,"context_line":"               default\u003d64,"},{"line_number":38,"context_line":"               help\u003d\u0027Size of RPC thread pool\u0027),"},{"line_number":39,"context_line":"    cfg.IntOpt(\u0027rpc_conn_pool_size\u0027,"},{"line_number":40,"context_line":"               default\u003d30,"},{"line_number":41,"context_line":"               help\u003d\u0027Size of RPC connection pool\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027rpc_response_timeout\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3kU%3D","line":39,"updated":"2012-05-25 18:31:02.000000000","message":"Should I also comment that this does not apply to the zeromq driver?","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               help\u003d\u0027Seconds to wait for a response from call or multicall\u0027),"},{"line_number":45,"context_line":"    cfg.IntOpt(\u0027rpc_cast_timeout\u0027,"},{"line_number":46,"context_line":"               default\u003d30,"},{"line_number":47,"context_line":"               help\u003d\u0027Seconds to wait before a cast expires.\u0027),"},{"line_number":48,"context_line":"    cfg.ListOpt(\u0027allowed_rpc_exception_modules\u0027,"},{"line_number":49,"context_line":"               default\u003d[\u0027nova.exception\u0027],"},{"line_number":50,"context_line":"               help\u003d\u0027Modules of exceptions that are permitted to be recreated\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F33I%3D","line":47,"updated":"2012-05-24 19:09:28.000000000","message":"This option isn\u0027t going to make any sense with the AMQP drivers.  It should at least be documented as something that only applies to zeromq.\n\nWe could look into using message TTLs in AMQP, but I\u0027d rather not mess with all that in this patch.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               help\u003d\u0027Seconds to wait for a response from call or multicall\u0027),"},{"line_number":45,"context_line":"    cfg.IntOpt(\u0027rpc_cast_timeout\u0027,"},{"line_number":46,"context_line":"               default\u003d30,"},{"line_number":47,"context_line":"               help\u003d\u0027Seconds to wait before a cast expires.\u0027),"},{"line_number":48,"context_line":"    cfg.ListOpt(\u0027allowed_rpc_exception_modules\u0027,"},{"line_number":49,"context_line":"               default\u003d[\u0027nova.exception\u0027],"},{"line_number":50,"context_line":"               help\u003d\u0027Modules of exceptions that are permitted to be recreated\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3yo%3D","line":47,"in_reply_to":"AAAAHX%2F%2F33I%3D","updated":"2012-05-24 20:33:30.000000000","message":"During the design summit, the fact that we timeout in the zeromq driver was brought up as a concern. I did some analysis and realized that we really need TTLs in AMQP to avoid a thundering herd problem.\n\nI can either make this option zeromq-specific for now, or depend on getting a TTL patch in for AMQP (ASAP, preferably)","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               help\u003d\u0027Seconds to wait for a response from call or multicall\u0027),"},{"line_number":45,"context_line":"    cfg.IntOpt(\u0027rpc_cast_timeout\u0027,"},{"line_number":46,"context_line":"               default\u003d30,"},{"line_number":47,"context_line":"               help\u003d\u0027Seconds to wait before a cast expires.\u0027),"},{"line_number":48,"context_line":"    cfg.ListOpt(\u0027allowed_rpc_exception_modules\u0027,"},{"line_number":49,"context_line":"               default\u003d[\u0027nova.exception\u0027],"},{"line_number":50,"context_line":"               help\u003d\u0027Modules of exceptions that are permitted to be recreated\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3kQ%3D","line":47,"in_reply_to":"AAAAHX%2F%2F3w0%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"d43c6a92f07d779301f06319e210d26955340817","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               help\u003d\u0027Seconds to wait for a response from call or multicall\u0027),"},{"line_number":45,"context_line":"    cfg.IntOpt(\u0027rpc_cast_timeout\u0027,"},{"line_number":46,"context_line":"               default\u003d30,"},{"line_number":47,"context_line":"               help\u003d\u0027Seconds to wait before a cast expires.\u0027),"},{"line_number":48,"context_line":"    cfg.ListOpt(\u0027allowed_rpc_exception_modules\u0027,"},{"line_number":49,"context_line":"               default\u003d[\u0027nova.exception\u0027],"},{"line_number":50,"context_line":"               help\u003d\u0027Modules of exceptions that are permitted to be recreated\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3w0%3D","line":47,"in_reply_to":"AAAAHX%2F%2F3xg%3D","updated":"2012-05-24 21:06:17.000000000","message":"Will do.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0fe03ac2ad1bac6e28e8d47f19b8c06d44e14e15","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               help\u003d\u0027Seconds to wait for a response from call or multicall\u0027),"},{"line_number":45,"context_line":"    cfg.IntOpt(\u0027rpc_cast_timeout\u0027,"},{"line_number":46,"context_line":"               default\u003d30,"},{"line_number":47,"context_line":"               help\u003d\u0027Seconds to wait before a cast expires.\u0027),"},{"line_number":48,"context_line":"    cfg.ListOpt(\u0027allowed_rpc_exception_modules\u0027,"},{"line_number":49,"context_line":"               default\u003d[\u0027nova.exception\u0027],"},{"line_number":50,"context_line":"               help\u003d\u0027Modules of exceptions that are permitted to be recreated\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3xg%3D","line":47,"in_reply_to":"AAAAHX%2F%2F3yo%3D","updated":"2012-05-24 20:59:39.000000000","message":"You don\u0027t need to move it.  Just document that it is only applicable to zeromq (for now).","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"}],"nova/rpc/impl_fake.py":[{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    for consumer in CONSUMERS.get(topic, []):"},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            consumer.call(context, version, method, args, None)"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pass"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F33E%3D","line":176,"updated":"2012-05-24 19:09:28.000000000","message":"Nice catch.  Ideally this would be fixed in a separate patch since it\u0027s not related to the zeromq driver.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    for consumer in CONSUMERS.get(topic, []):"},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            consumer.call(context, version, method, args, None)"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pass"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3yk%3D","line":176,"in_reply_to":"AAAAHX%2F%2F33E%3D","updated":"2012-05-24 20:33:30.000000000","message":"True. I caught this late when I extending unit tests coverage. I felt weird rolling it into this patch, but I really wanted the extra unit coverage... If you prefer, I can make a separate patch for the unit tests.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    for consumer in CONSUMERS.get(topic, []):"},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            consumer.call(context, version, method, args, None)"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pass"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3kY%3D","line":176,"in_reply_to":"AAAAHX%2F%2F3v8%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5c3db168c3fa0b6dd4fc04171a25666327916671","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    for consumer in CONSUMERS.get(topic, []):"},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            consumer.call(context, version, method, args, None)"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pass"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3v8%3D","line":176,"in_reply_to":"AAAAHX%2F%2F3w4%3D","updated":"2012-05-24 21:54:36.000000000","message":"+1 on breaking it out too.. thnx!","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"d43c6a92f07d779301f06319e210d26955340817","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    for consumer in CONSUMERS.get(topic, []):"},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            consumer.call(context, version, method, args, None)"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pass"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3w4%3D","line":176,"in_reply_to":"AAAAHX%2F%2F3xc%3D","updated":"2012-05-24 21:06:17.000000000","message":"Right. I\u0027ll have this broken out in a short bit.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0fe03ac2ad1bac6e28e8d47f19b8c06d44e14e15","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    for consumer in CONSUMERS.get(topic, []):"},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            consumer.call(context, version, method, args, None)"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pass"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3xc%3D","line":176,"in_reply_to":"AAAAHX%2F%2F3yk%3D","updated":"2012-05-24 20:59:39.000000000","message":"Extra coverage is good.  It\u0027s just nice to split up changes into logical pieces.  This is a standalone bug fix, so I would prefer it went in on its own.  It can go in first if you have other code that needs it.  Make your zeromq patch a commit on top of it and gerrit will track dependencies.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"}],"nova/rpc/impl_zmq.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e5ccf2ceeed95b1881bf6853e2f8589cd1817bff","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            self.sock.bind(addr)"},{"line_number":155,"context_line":"        else:"},{"line_number":156,"context_line":"            self.sock.connect(addr)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def socket_s(self):"},{"line_number":159,"context_line":"        \"\"\"Get socket type as string\"\"\""},{"line_number":160,"context_line":"        t_enum \u003d (\u0027PUSH\u0027, \u0027PULL\u0027, \u0027PUB\u0027, \u0027SUB\u0027, \u0027REP\u0027, \u0027REQ\u0027, \u0027ROUTER\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F5b0%3D","line":157,"updated":"2012-05-21 21:13:23.000000000","message":"Lack of exception handling of socket","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"7afbd3c2fb79ec60e2f1c76bb96081ab7dae50e9","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            self.sock.bind(addr)"},{"line_number":155,"context_line":"        else:"},{"line_number":156,"context_line":"            self.sock.connect(addr)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def socket_s(self):"},{"line_number":159,"context_line":"        \"\"\"Get socket type as string\"\"\""},{"line_number":160,"context_line":"        t_enum \u003d (\u0027PUSH\u0027, \u0027PULL\u0027, \u0027PUB\u0027, \u0027SUB\u0027, \u0027REP\u0027, \u0027REQ\u0027, \u0027ROUTER\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F5aY%3D","line":157,"in_reply_to":"AAAAHX%2F%2F5b0%3D","updated":"2012-05-21 21:34:07.000000000","message":"I can log an error, but if there is an exception, there isn\u0027t much we can do at this point to provide rescue. I can potentially reraise as a common exception to-be-defined in common.py so that ZeroMQ exceptions don\u0027t raise up.","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e5ccf2ceeed95b1881bf6853e2f8589cd1817bff","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        # Linger -1 prevents lost/dropped messages"},{"line_number":186,"context_line":"        if not self.sock.closed:"},{"line_number":187,"context_line":"            self.sock.close(linger\u003d-1)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        self.sock \u003d None"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def recv(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F5bw%3D","line":188,"updated":"2012-05-21 21:13:23.000000000","message":"Lack of socket exception handling","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e5ccf2ceeed95b1881bf6853e2f8589cd1817bff","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    for resp in responses:"},{"line_number":589,"context_line":"        if isinstance(resp, types.DictType) and \u0027exc\u0027 in resp:"},{"line_number":590,"context_line":"            raise rpc_common.deserialize_remote_exception(FLAGS, resp[\u0027exc\u0027])"},{"line_number":591,"context_line":"        all_data.append(resp)"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"    return \"call\", topic, all_data[-1]"},{"line_number":594,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F5bs%3D","line":591,"updated":"2012-05-21 21:13:23.000000000","message":"This code will ignore some response when exception is occured.\nLet\u0027s say there are repsponse A,B and C.\nAnd B is an remote exception.  C will not be property handled.","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"7afbd3c2fb79ec60e2f1c76bb96081ab7dae50e9","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    for resp in responses:"},{"line_number":589,"context_line":"        if isinstance(resp, types.DictType) and \u0027exc\u0027 in resp:"},{"line_number":590,"context_line":"            raise rpc_common.deserialize_remote_exception(FLAGS, resp[\u0027exc\u0027])"},{"line_number":591,"context_line":"        all_data.append(resp)"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"    return \"call\", topic, all_data[-1]"},{"line_number":594,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F5ao%3D","line":591,"in_reply_to":"AAAAHX%2F%2F5bs%3D","updated":"2012-05-21 21:34:07.000000000","message":"If an exception occurs, we\u0027re going to raise it. We won\u0027t raise more than once exception at a time. I don\u0027t see how finishing the loop will be beneficial.","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"97641928a163b9bcc2b00efdd615262cd0504a90","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        try:"},{"line_number":173,"context_line":"            self.sock.setsockopt(zmq.SUBSCRIBE, msg_filter)"},{"line_number":174,"context_line":"        except Exception:"},{"line_number":175,"context_line":"            return"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        self.subscriptions.append(msg_filter)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAHX%2F%2F5YE%3D","line":174,"updated":"2012-05-21 22:42:30.000000000","message":"Is this OK for do nothing on Exception? At least you should warn exceptions","commit_id":"1f6ec64ceb08c04b9356b854827f9e3eb25be3ab"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"fe31fbdc18eab297b61b8beabfe01f0d476f25c8","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        try:"},{"line_number":173,"context_line":"            self.sock.setsockopt(zmq.SUBSCRIBE, msg_filter)"},{"line_number":174,"context_line":"        except Exception:"},{"line_number":175,"context_line":"            return"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        self.subscriptions.append(msg_filter)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAHX%2F%2F5W4%3D","line":174,"in_reply_to":"AAAAHX%2F%2F5YE%3D","updated":"2012-05-21 23:00:38.000000000","message":"I\u0027m not sure warning is going to give us anything. I\u0027ve made sure that we error if the socket can\u0027t do subscriptions (see above assert). The only reason we\u0027d get here is if we hit a thread-safety issue, and we\u0027d error elsewhere anyway, if there was serious problem with the socket.","commit_id":"1f6ec64ceb08c04b9356b854827f9e3eb25be3ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"97641928a163b9bcc2b00efdd615262cd0504a90","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        try:"},{"line_number":201,"context_line":"            self.sock.close(linger\u003d-1)"},{"line_number":202,"context_line":"        except Exception:"},{"line_number":203,"context_line":"            pass"},{"line_number":204,"context_line":"        self.sock \u003d None"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def recv(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAHX%2F%2F5YA%3D","line":203,"updated":"2012-05-21 22:42:30.000000000","message":"At least, you should warn Exception","commit_id":"1f6ec64ceb08c04b9356b854827f9e3eb25be3ab"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"fe31fbdc18eab297b61b8beabfe01f0d476f25c8","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        try:"},{"line_number":201,"context_line":"            self.sock.close(linger\u003d-1)"},{"line_number":202,"context_line":"        except Exception:"},{"line_number":203,"context_line":"            pass"},{"line_number":204,"context_line":"        self.sock \u003d None"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def recv(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAHX%2F%2F5Wc%3D","line":203,"in_reply_to":"AAAAHX%2F%2F5YA%3D","updated":"2012-05-21 23:00:38.000000000","message":"I don\u0027t think so. I check if the socket is closed, if not, we try to close. If we reach an exception here, the socket must already closed... which is the expected behavior anyway.  For this to even trigger, there would have to be a thread-safety issue (which shouldn\u0027t happen), or a critical error inside ZeroMQ (which transparently reopens sockets and won\u0027t just close a socket like standard BSD sockets).  I think this is already overly cautious, to be honest.","commit_id":"1f6ec64ceb08c04b9356b854827f9e3eb25be3ab"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"zmq_opts \u003d ["},{"line_number":53,"context_line":"    # ZeroMQ bind \u0027host\u0027 should be a wildcard (*),"},{"line_number":54,"context_line":"    # an ethernet interface, or an IP."},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027rpc_zmq_bind_address\u0027, default\u003d\u0027*\u0027,"},{"line_number":56,"context_line":"        help\u003d\u0027ZeroMQ bind address\u0027),"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4Z0%3D","line":54,"updated":"2012-05-23 21:53:20.000000000","message":"This comment would be helpful as a component of the help string; is it possible to put it in there?","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        help\u003d\u0027Allow fallback to pickle, if JSON serialization fails. \u0027"},{"line_number":76,"context_line":"             \u0027JSON cannot encode Python objects, which should not be \u0027"},{"line_number":77,"context_line":"             \u0027passed into this driver, except as the result of a \u0027"},{"line_number":78,"context_line":"             \u0027regression\u0027)"},{"line_number":79,"context_line":"    ]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4Zw%3D","line":78,"updated":"2012-05-23 21:53:20.000000000","message":"I don\u0027t think that \"except as the result of a regression\" is necessary here…","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"afa3144fe37a6a0073334aa71102df0f50fd1ec5","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        help\u003d\u0027Allow fallback to pickle, if JSON serialization fails. \u0027"},{"line_number":76,"context_line":"             \u0027JSON cannot encode Python objects, which should not be \u0027"},{"line_number":77,"context_line":"             \u0027passed into this driver, except as the result of a \u0027"},{"line_number":78,"context_line":"             \u0027regression\u0027)"},{"line_number":79,"context_line":"    ]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4QM%3D","line":78,"in_reply_to":"AAAAHX%2F%2F4Zw%3D","updated":"2012-05-24 03:50:19.000000000","message":"This option\u0027s sole existence is to provide additional permissiveness in the face of regressions.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":98,"context_line":"    except TypeError:"},{"line_number":99,"context_line":"        if conf.rpc_zmq_fallback_pickle:"},{"line_number":100,"context_line":"            LOG.warn(_(\"JSON serialization failed.\\nFalling back to Pickle.\\n\""},{"line_number":101,"context_line":"                       \"Pickle fallback can be disabled\""},{"line_number":102,"context_line":"                       \"per option rpc_zmq_fallback_pickle\"))"},{"line_number":103,"context_line":"            return pickle.dumps(data, protocol\u003d2)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4Zg%3D","line":100,"updated":"2012-05-23 21:53:20.000000000","message":"I\u0027d prefer to omit the newlines here.  Perhaps this could be rewritten as:\n\n    \"JSON serialization failed, falling back to pickle.  Pickle fallback can be \"\n    \"disabled by setting the option rpc_zmq_fallback_pickle to False\"","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"class ConsumerBase(object):"},{"line_number":302,"context_line":"    \"\"\" Base Consumer \"\"\""},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def __init__(self):"},{"line_number":305,"context_line":"        self.private_ctx \u003d InternalContext(None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4ZQ%3D","line":302,"updated":"2012-05-23 21:53:20.000000000","message":"I believe you\u0027ll get an error from the test suite on this, because of the blank spaces between the quotes and the text.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"class ZmqBaseReactor(ConsumerBase):"},{"line_number":340,"context_line":"    \"\"\""},{"line_number":341,"context_line":"     A consumer class implementing a"},{"line_number":342,"context_line":"     centralized casting broker (PULL-PUSH)"},{"line_number":343,"context_line":"     for RoundRobin requests."},{"line_number":344,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4ZM%3D","line":341,"updated":"2012-05-23 21:53:20.000000000","message":"This block is indented one space too far…","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"class Connection(nova.rpc.common.Connection):"},{"line_number":503,"context_line":"    \"\"\" Manages connections and threads. \"\"\""},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def __init__(self, conf):"},{"line_number":506,"context_line":"        self.conf \u003d conf"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4ZE%3D","line":503,"updated":"2012-05-23 21:53:20.000000000","message":"Again, spaces between the quotes and the docstring…","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    # Messages arriving async."},{"line_number":584,"context_line":"    # TODO(ewindisch): have reply consumer with dynamic subscription mgmt"},{"line_number":585,"context_line":"    with \\"},{"line_number":586,"context_line":"        contextlib.closing(ZmqSocket("},{"line_number":587,"context_line":"            \"ipc://%s/zmq_topic_zmq_replies\" % FLAGS.rpc_zmq_ipc_dir,"},{"line_number":588,"context_line":"            zmq.SUB, subscribe\u003dmsg_id, bind\u003dFalse"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4Y8%3D","line":585,"updated":"2012-05-23 21:53:20.000000000","message":"I\u0027d prefer if you disposed of this backslash and placed the following line on the same line with the \u0027with\u0027.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"afa3144fe37a6a0073334aa71102df0f50fd1ec5","unresolved":false,"context_lines":[{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    # Messages arriving async."},{"line_number":584,"context_line":"    # TODO(ewindisch): have reply consumer with dynamic subscription mgmt"},{"line_number":585,"context_line":"    with \\"},{"line_number":586,"context_line":"        contextlib.closing(ZmqSocket("},{"line_number":587,"context_line":"            \"ipc://%s/zmq_topic_zmq_replies\" % FLAGS.rpc_zmq_ipc_dir,"},{"line_number":588,"context_line":"            zmq.SUB, subscribe\u003dmsg_id, bind\u003dFalse"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4QU%3D","line":585,"in_reply_to":"AAAAHX%2F%2F4Y8%3D","updated":"2012-05-24 03:50:19.000000000","message":"I only did this because it appeared more readable, given the multiple withs...","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":589,"context_line":"        )) as msg_waiter, \\"},{"line_number":590,"context_line":"        Timeout("},{"line_number":591,"context_line":"            timeout_response, exception\u003dnova.rpc.common.Timeout"},{"line_number":592,"context_line":"        ) as t_call:"},{"line_number":593,"context_line":"            LOG.debug(_(\"Sending cast\"))"},{"line_number":594,"context_line":"            _cast(addr, context, msg_id, topic, payload)"},{"line_number":595,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4Y4%3D","line":592,"updated":"2012-05-23 21:53:20.000000000","message":"It turns out that Python 2.6 does not support multiple \u0027with\u0027s:\n\n    \u003e\u003e\u003e class Context(object):\n    ...     def __init__(self, value):\n    ...             self.value \u003d value\n    ...     def __enter__(self):\n    ...             return self.value\n    ...     def __exit__(self, exc_type, exc_value, exc_tb):\n    ...             return False\n    ... \n    \u003e\u003e\u003e with Context(\u0027foo\u0027) as foo, Context(\u0027bar\u0027) as bar:\n      File \"\u003cstdin\u003e\", line 1\n        with Context(\u0027foo\u0027) as foo, Context(\u0027bar\u0027) as bar:\n                                  ^\n    SyntaxError: invalid syntax","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"afa3144fe37a6a0073334aa71102df0f50fd1ec5","unresolved":false,"context_lines":[{"line_number":589,"context_line":"        )) as msg_waiter, \\"},{"line_number":590,"context_line":"        Timeout("},{"line_number":591,"context_line":"            timeout_response, exception\u003dnova.rpc.common.Timeout"},{"line_number":592,"context_line":"        ) as t_call:"},{"line_number":593,"context_line":"            LOG.debug(_(\"Sending cast\"))"},{"line_number":594,"context_line":"            _cast(addr, context, msg_id, topic, payload)"},{"line_number":595,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4QQ%3D","line":592,"in_reply_to":"AAAAHX%2F%2F4Y4%3D","updated":"2012-05-24 03:50:19.000000000","message":"True. Unfortunately, Python 2.6 only supports this through a hack, which has bugs. I\u0027m not sure what the commitment is to 2.6 -- but I can have this block check the version and run an alternative code path.\n\n(I\u0027m not sure if manually nesting would work bug-free - but contextlib.nested is certainly very buggy)","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"8fe88ca3bbc923a377314542e2832cfaabbb1336","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"zmq_opts \u003d ["},{"line_number":54,"context_line":"    cfg.StrOpt(\u0027rpc_zmq_bind_address\u0027, default\u003d\u0027*\u0027,"},{"line_number":55,"context_line":"        help\u003d\u0027ZeroMQ bind address. Should be a wildcar (*), \u0027"},{"line_number":56,"context_line":"             \u0027an ethernet interface, or IP. \u0027"},{"line_number":57,"context_line":"             \u0027The \"host\" option should point or resolve to this address.\u0027),"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAHX%2F%2F36s%3D","line":55,"updated":"2012-05-24 18:00:32.000000000","message":"I\u0027d love to have a wild car, but I think you meant \"wildcard\" :)","commit_id":"e6c89fd05e9a35fb514242c5f88fb279b289851d"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# Eventlet/monkey_patch is an exception to HACKING"},{"line_number":18,"context_line":"import eventlet"},{"line_number":19,"context_line":"import greenlet"},{"line_number":20,"context_line":"eventlet.monkey_patch()"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F33Y%3D","line":20,"updated":"2012-05-24 19:09:28.000000000","message":"This should not be needed.  It is done in every service when it starts up.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# Eventlet/monkey_patch is an exception to HACKING"},{"line_number":18,"context_line":"import eventlet"},{"line_number":19,"context_line":"import greenlet"},{"line_number":20,"context_line":"eventlet.monkey_patch()"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3lA%3D","line":20,"in_reply_to":"AAAAHX%2F%2F33Y%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# Eventlet/monkey_patch is an exception to HACKING"},{"line_number":18,"context_line":"import eventlet"},{"line_number":19,"context_line":"import greenlet"},{"line_number":20,"context_line":"eventlet.monkey_patch()"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3yc%3D","line":20,"in_reply_to":"AAAAHX%2F%2F33Y%3D","updated":"2012-05-24 20:33:30.000000000","message":"I can test and potentially remove. I think there was a reason at some point. (I also remember moving or removing it in a previous code review to bad results)","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5c3db168c3fa0b6dd4fc04171a25666327916671","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# Eventlet/monkey_patch is an exception to HACKING"},{"line_number":18,"context_line":"import eventlet"},{"line_number":19,"context_line":"import greenlet"},{"line_number":20,"context_line":"eventlet.monkey_patch()"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3v0%3D","line":20,"in_reply_to":"AAAAHX%2F%2F3yc%3D","updated":"2012-05-24 21:54:36.000000000","message":"It tends to be needed if you run \u0027nosetests\u0027 on a test file... because it won\u0027t pull in the monkey patch from nova/test.py.  That\u0027s may what you saw..  \n\nOtherwise, all of the services do already monkey patch in their bin/*  files and we shouldn\u0027t monkey patch again here.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e4a9bf1ad9fb489fe9a0a0f2f1db7bf2aefcd89c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import greenlet"},{"line_number":20,"context_line":"eventlet.monkey_patch()"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F318%3D","line":22,"updated":"2012-05-24 19:14:41.000000000","message":"unused import","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import greenlet"},{"line_number":20,"context_line":"eventlet.monkey_patch()"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3yg%3D","line":22,"in_reply_to":"AAAAHX%2F%2F318%3D","updated":"2012-05-24 20:33:30.000000000","message":"D\u0027oh. That just happened ;-)  Kevin made me remove the Python2.7\u0027isms.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import greenlet"},{"line_number":20,"context_line":"eventlet.monkey_patch()"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3k8%3D","line":22,"in_reply_to":"AAAAHX%2F%2F3yg%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e4a9bf1ad9fb489fe9a0a0f2f1db7bf2aefcd89c","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":"import pprint"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F32Q%3D","line":24,"updated":"2012-05-24 19:14:41.000000000","message":"unused import","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":"import pprint"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3yY%3D","line":24,"in_reply_to":"AAAAHX%2F%2F32Q%3D","updated":"2012-05-24 20:33:30.000000000","message":"Thanks. The code was moved to matchmaker.py.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import contextlib"},{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":"import pprint"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3k4%3D","line":24,"in_reply_to":"AAAAHX%2F%2F3yY%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e4a9bf1ad9fb489fe9a0a0f2f1db7bf2aefcd89c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":"import pprint"},{"line_number":28,"context_line":"import string"},{"line_number":29,"context_line":"import sys"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F32M%3D","line":26,"updated":"2012-05-24 19:14:41.000000000","message":"unused import","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":"import pprint"},{"line_number":28,"context_line":"import string"},{"line_number":29,"context_line":"import sys"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3yQ%3D","line":26,"in_reply_to":"AAAAHX%2F%2F32M%3D","updated":"2012-05-24 20:33:30.000000000","message":"Moved to matchmaker.py","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import cPickle as pickle"},{"line_number":24,"context_line":"import itertools"},{"line_number":25,"context_line":"import json"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":"import pprint"},{"line_number":28,"context_line":"import string"},{"line_number":29,"context_line":"import sys"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3k0%3D","line":26,"in_reply_to":"AAAAHX%2F%2F3yQ%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e4a9bf1ad9fb489fe9a0a0f2f1db7bf2aefcd89c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"from eventlet import greenpool"},{"line_number":36,"context_line":"from eventlet import timeout as eventlet_timeout"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"import nova"},{"line_number":39,"context_line":"from nova import context"},{"line_number":40,"context_line":"from nova import flags"},{"line_number":41,"context_line":"from nova.openstack.common import cfg"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F32A%3D","line":38,"updated":"2012-05-24 19:14:41.000000000","message":"I don\u0027t think this is needed if you change the uses of nova.rpc.common.Timeout.  It will have to go away before this code can get moved to openstack-common.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":35,"context_line":"from eventlet import greenpool"},{"line_number":36,"context_line":"from eventlet import timeout as eventlet_timeout"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"import nova"},{"line_number":39,"context_line":"from nova import context"},{"line_number":40,"context_line":"from nova import flags"},{"line_number":41,"context_line":"from nova.openstack.common import cfg"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3ks%3D","line":38,"in_reply_to":"AAAAHX%2F%2F32A%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"import nova"},{"line_number":39,"context_line":"from nova import context"},{"line_number":40,"context_line":"from nova import flags"},{"line_number":41,"context_line":"from nova.openstack.common import cfg"},{"line_number":42,"context_line":"from nova.openstack.common import importutils"},{"line_number":43,"context_line":"from nova.rpc import common as rpc_common"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F32w%3D","line":40,"updated":"2012-05-24 19:09:28.000000000","message":"This needs to be removed.  It\u0027s not used directly by any other rpc code.  I think it\u0027s as simple as just removing the import.  I don\u0027t see it used directly in the code anymore.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"import nova"},{"line_number":39,"context_line":"from nova import context"},{"line_number":40,"context_line":"from nova import flags"},{"line_number":41,"context_line":"from nova.openstack.common import cfg"},{"line_number":42,"context_line":"from nova.openstack.common import importutils"},{"line_number":43,"context_line":"from nova.rpc import common as rpc_common"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3yM%3D","line":40,"in_reply_to":"AAAAHX%2F%2F32w%3D","updated":"2012-05-24 20:33:30.000000000","message":"Yeah, obsolete.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"import nova"},{"line_number":39,"context_line":"from nova import context"},{"line_number":40,"context_line":"from nova import flags"},{"line_number":41,"context_line":"from nova.openstack.common import cfg"},{"line_number":42,"context_line":"from nova.openstack.common import importutils"},{"line_number":43,"context_line":"from nova.rpc import common as rpc_common"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3kw%3D","line":40,"in_reply_to":"AAAAHX%2F%2F3yM%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    We prefer using JSON, but it cannot encode all types."},{"line_number":94,"context_line":"    If rpc_zmq_fallback_pickle is true, fallback to Pickle."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    #TODO(ewindisch): verify if we can eliminate this and ONLY use JSON"},{"line_number":97,"context_line":"    try:"},{"line_number":98,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":99,"context_line":"    except TypeError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F33U%3D","line":96,"updated":"2012-05-24 19:09:28.000000000","message":"Doing both json and pickle seems kind of scary.  It\u0027s a real bug in the code elsewhere if json fails, so I\u0027d rather this code only do json.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    We prefer using JSON, but it cannot encode all types."},{"line_number":94,"context_line":"    If rpc_zmq_fallback_pickle is true, fallback to Pickle."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    #TODO(ewindisch): verify if we can eliminate this and ONLY use JSON"},{"line_number":97,"context_line":"    try:"},{"line_number":98,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":99,"context_line":"    except TypeError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3x4%3D","line":96,"in_reply_to":"AAAAHX%2F%2F33U%3D","updated":"2012-05-24 20:33:30.000000000","message":"I agree. It is disabled by default.  I left this in because I\u0027m paranoid. I didn\u0027t want people testing against AMQP, submitting a regression, and then having users complain that the ZeroMQ driver was broken. Maybe the better solution is to do type checking at the abstraction layer?","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"5da40197d4862ddefcae33b50cc2e4e40bf9e2de","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    We prefer using JSON, but it cannot encode all types."},{"line_number":94,"context_line":"    If rpc_zmq_fallback_pickle is true, fallback to Pickle."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    #TODO(ewindisch): verify if we can eliminate this and ONLY use JSON"},{"line_number":97,"context_line":"    try:"},{"line_number":98,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":99,"context_line":"    except TypeError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3dQ%3D","line":96,"in_reply_to":"AAAAHX%2F%2F3ko%3D","updated":"2012-05-25 18:37:10.000000000","message":"Solution to what problem?  If something makes it here that isn\u0027t a primitive type, it should break the other drivers, too.  This code isn\u0027t in a worse position than the others.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    We prefer using JSON, but it cannot encode all types."},{"line_number":94,"context_line":"    If rpc_zmq_fallback_pickle is true, fallback to Pickle."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    #TODO(ewindisch): verify if we can eliminate this and ONLY use JSON"},{"line_number":97,"context_line":"    try:"},{"line_number":98,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":99,"context_line":"    except TypeError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3ko%3D","line":96,"in_reply_to":"AAAAHX%2F%2F3vE%3D","updated":"2012-05-25 18:31:02.000000000","message":"I agree with both of you. I would like that we make sure that ZeroMQ isn\u0027t the only rpc driver that fails if an RPC call cannot be JSON serialized... or, at least, that we can catch those errors early through unit tests.\n\nI\u0027m removing this for now, but I would still like to find a reasonable solution that won\u0027t break this driver.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0fe03ac2ad1bac6e28e8d47f19b8c06d44e14e15","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    We prefer using JSON, but it cannot encode all types."},{"line_number":94,"context_line":"    If rpc_zmq_fallback_pickle is true, fallback to Pickle."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    #TODO(ewindisch): verify if we can eliminate this and ONLY use JSON"},{"line_number":97,"context_line":"    try:"},{"line_number":98,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":99,"context_line":"    except TypeError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3xY%3D","line":96,"in_reply_to":"AAAAHX%2F%2F3x4%3D","updated":"2012-05-24 20:59:39.000000000","message":"I know it\u0027s disabled by default, but enabling gives people an excuse to move on and not fix the real bug.  That\u0027s why I don\u0027t like having the option there at all.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5c3db168c3fa0b6dd4fc04171a25666327916671","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    We prefer using JSON, but it cannot encode all types."},{"line_number":94,"context_line":"    If rpc_zmq_fallback_pickle is true, fallback to Pickle."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    #TODO(ewindisch): verify if we can eliminate this and ONLY use JSON"},{"line_number":97,"context_line":"    try:"},{"line_number":98,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":99,"context_line":"    except TypeError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3vE%3D","line":96,"in_reply_to":"AAAAHX%2F%2F3xE%3D","updated":"2012-05-24 21:54:36.000000000","message":"I really don\u0027t like pickle here, either.  Opens the door to potential security issues.  And I\u0027m not sure we should tie ourselves to python-only workers, anyway.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"d43c6a92f07d779301f06319e210d26955340817","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    We prefer using JSON, but it cannot encode all types."},{"line_number":94,"context_line":"    If rpc_zmq_fallback_pickle is true, fallback to Pickle."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    #TODO(ewindisch): verify if we can eliminate this and ONLY use JSON"},{"line_number":97,"context_line":"    try:"},{"line_number":98,"context_line":"        return str(json.dumps(data, ensure_ascii\u003dTrue))"},{"line_number":99,"context_line":"    except TypeError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3xE%3D","line":96,"in_reply_to":"AAAAHX%2F%2F3xY%3D","updated":"2012-05-24 21:06:17.000000000","message":"I agree. However, unless the ZeroMQ driver is the default, or extremely popular, this may only prove to be a burden... unless it also fails JSON-style serialization in Rabbit and Qpid.\n\nI don\u0027t want the ZeroMQ driver to be non-functional just because we agree that everything *should* be, but *isn\u0027t* actually JSON serializable, while the other drivers don\u0027t hit this problem at all. We have no coverage of this, at the moment.\n\nMaybe there is something we can improve in our unit tests...","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e4a9bf1ad9fb489fe9a0a0f2f1db7bf2aefcd89c","unresolved":false,"context_lines":[{"line_number":547,"context_line":"    timeout_cast \u003d timeout or FLAGS.rpc_cast_timeout"},{"line_number":548,"context_line":"    payload \u003d [RpcContext.marshal(context), msg]"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    with Timeout(timeout_cast, exception\u003dnova.rpc.common.Timeout) as t:"},{"line_number":551,"context_line":"        try:"},{"line_number":552,"context_line":"            conn \u003d ZmqClient(addr)"},{"line_number":553,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F32I%3D","line":550,"updated":"2012-05-24 19:14:41.000000000","message":"can be rpc_common.Timeout.  There are a few other instances of this.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":547,"context_line":"    timeout_cast \u003d timeout or FLAGS.rpc_cast_timeout"},{"line_number":548,"context_line":"    payload \u003d [RpcContext.marshal(context), msg]"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    with Timeout(timeout_cast, exception\u003dnova.rpc.common.Timeout) as t:"},{"line_number":551,"context_line":"        try:"},{"line_number":552,"context_line":"            conn \u003d ZmqClient(addr)"},{"line_number":553,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3kk%3D","line":550,"in_reply_to":"AAAAHX%2F%2F32I%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import cPickle as pickle"},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"import pprint"},{"line_number":20,"context_line":"import string"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3YQ%3D","line":17,"updated":"2012-05-25 21:45:29.000000000","message":"unused import now.  integrating pyflakes w/ vim is very helpful in catching these, assuming you use vim! :)","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        if data[\u0027method\u0027][0] \u003d\u003d \u0027-\u0027:"},{"line_number":294,"context_line":"            # For reply / process_reply"},{"line_number":295,"context_line":"            method \u003d method[1:]"},{"line_number":296,"context_line":"            iproxy \u003d self.private_ctx"},{"line_number":297,"context_line":"            if method \u003d\u003d \u0027reply\u0027:"},{"line_number":298,"context_line":"                self.private_ctx.reply(ctx, proxy, **data[\u0027args\u0027])"},{"line_number":299,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3XM%3D","line":296,"updated":"2012-05-25 21:45:29.000000000","message":"unused it appears.","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":514,"context_line":"    timeout_cast \u003d timeout or FLAGS.rpc_cast_timeout"},{"line_number":515,"context_line":"    payload \u003d [RpcContext.marshal(context), msg]"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    with Timeout(timeout_cast, exception\u003drpc_common.Timeout) as t:"},{"line_number":518,"context_line":"        try:"},{"line_number":519,"context_line":"            conn \u003d ZmqClient(addr)"},{"line_number":520,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3XE%3D","line":517,"updated":"2012-05-25 21:45:29.000000000","message":"\u0027as t\u0027 appears unused.","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    # The msg_id is used to track replies."},{"line_number":535,"context_line":"    msg_id \u003d str(uuid.uuid4().hex)"},{"line_number":536,"context_line":"    base_topic \u003d topic.split(\u0027.\u0027, 1)[0]"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    # Replies always come into the reply service."},{"line_number":539,"context_line":"    # We require that FLAGS.host is a FQDN, IP, or resolvable hostname."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3XA%3D","line":536,"updated":"2012-05-25 21:45:29.000000000","message":"unused","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    # Messages arriving async."},{"line_number":558,"context_line":"    # TODO(ewindisch): have reply consumer with dynamic subscription mgmt"},{"line_number":559,"context_line":"    with Timeout(timeout, exception\u003drpc_common.Timeout) as t_call:"},{"line_number":560,"context_line":"        try:"},{"line_number":561,"context_line":"            msg_waiter \u003d ZmqSocket("},{"line_number":562,"context_line":"                \"ipc://%s/zmq_topic_zmq_replies\" % FLAGS.rpc_zmq_ipc_dir,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3W8%3D","line":559,"updated":"2012-05-25 21:45:29.000000000","message":"t_call unused.","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":669,"context_line":"    \"\"\"Clean up resources in use by implementation.\"\"\""},{"line_number":670,"context_line":"    matchmaker \u003d None"},{"line_number":671,"context_line":"    zmq_term(ZMQ_CTX)"},{"line_number":672,"context_line":"    ZMQ_CTX \u003d None"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"def register_opts(conf):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3Wk%3D","line":672,"updated":"2012-05-25 21:45:29.000000000","message":"these all need \u0027global\u0027.  I also don\u0027t see zmq_term defined.  Must not be exercised by tests.","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"4417b13864a6f47574ae76b17173d82c28373e1a","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def __init__(self, **kwargs):"},{"line_number":205,"context_line":"        self.replies \u003d []"},{"line_number":206,"context_line":"        super(RpcContext, self).__init__(**kwargs)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def reply(self, reply\u003dNone, failure\u003dNone, ending\u003dFalse):"},{"line_number":209,"context_line":"        if ending:"},{"line_number":210,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAHn%2F%2F%2Bxk%3D","line":207,"updated":"2012-05-31 20:38:58.000000000","message":"Due to a change that just landed in trunk, you\u0027ll need to define a \u0027deepcopy\u0027 method in here.  You can see trunk for examples in amqp.py and impl_fake.py.\n\nThe deepcopy method will get invoked when any worker does a context.elevated() (see CommonRpcContext).","commit_id":"a1b82388e84444c6fdea7150b9472f9ba8c99615"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"c7dea92370251a3ab010bfcdf1b0fab650930dd1","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def __init__(self, **kwargs):"},{"line_number":205,"context_line":"        self.replies \u003d []"},{"line_number":206,"context_line":"        super(RpcContext, self).__init__(**kwargs)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def reply(self, reply\u003dNone, failure\u003dNone, ending\u003dFalse):"},{"line_number":209,"context_line":"        if ending:"},{"line_number":210,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAHn%2F%2F%2BHk%3D","line":207,"in_reply_to":"AAAAHn%2F%2F%2Bfk%3D","updated":"2012-06-02 01:42:34.000000000","message":"The one in CommonRpcContext is fine unless you have data in your derived class that needs to get copied, as well.  When code calls elevated(), does self.replies need to get copied to the new context?  If not, it looks like this is fine.","commit_id":"a1b82388e84444c6fdea7150b9472f9ba8c99615"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"e802d033ac74f8fa7ba7cd16c6b78e65e0ed55a0","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def __init__(self, **kwargs):"},{"line_number":205,"context_line":"        self.replies \u003d []"},{"line_number":206,"context_line":"        super(RpcContext, self).__init__(**kwargs)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def reply(self, reply\u003dNone, failure\u003dNone, ending\u003dFalse):"},{"line_number":209,"context_line":"        if ending:"},{"line_number":210,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAHn%2F%2F%2Bfk%3D","line":207,"in_reply_to":"AAAAHn%2F%2F%2Bxk%3D","updated":"2012-06-01 14:49:42.000000000","message":"The unit tests (including test_context_passed) still work. The deep_copy in CommonRpcContext might be sufficient here? Might need functional testing?","commit_id":"a1b82388e84444c6fdea7150b9472f9ba8c99615"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee389758389a1f2656a4f23b336317782f48afc7","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def subscribe(self, msg_filter):"},{"line_number":141,"context_line":"        \"\"\"Subscribe.\"\"\""},{"line_number":142,"context_line":"        assert self.can_sub, \"Cannot subscribe on this socket.\""},{"line_number":143,"context_line":"        LOG.debug(_(\"Subscribing to %s\"), msg_filter)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAHn%2F%2F8PI%3D","line":142,"updated":"2012-06-06 17:30:34.000000000","message":"Can we raise a specific exception here, instead of a generic AssertionError?","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"cf0ed47fdc7c025da7eb20d0f3608ef914e65d7b","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def subscribe(self, msg_filter):"},{"line_number":141,"context_line":"        \"\"\"Subscribe.\"\"\""},{"line_number":142,"context_line":"        assert self.can_sub, \"Cannot subscribe on this socket.\""},{"line_number":143,"context_line":"        LOG.debug(_(\"Subscribing to %s\"), msg_filter)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAIH%2F%2F%2F%2BY%3D","line":142,"in_reply_to":"AAAAHn%2F%2F8PI%3D","updated":"2012-06-06 17:52:16.000000000","message":"I had left this as an assert because it was more concise and this is  checking a usage error, and thus was for my own debugging purposes.\n\nI\u0027ve changed it to an RPCException.","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee389758389a1f2656a4f23b336317782f48afc7","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    def unsubscribe(self, msg_filter):"},{"line_number":153,"context_line":"        \"\"\"Unsubscribe.\"\"\""},{"line_number":154,"context_line":"        if msg_filter not in self.subscriptions:"},{"line_number":155,"context_line":"            return None"},{"line_number":156,"context_line":"        self.sock.setsockopt(zmq.UNSUBSCRIBE, msg_filter)"},{"line_number":157,"context_line":"        self.subscriptions.remove(msg_filter)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAHn%2F%2F8Og%3D","line":155,"updated":"2012-06-06 17:30:34.000000000","message":"You can probably just drop the \"None\" here…","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"cf0ed47fdc7c025da7eb20d0f3608ef914e65d7b","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    def unsubscribe(self, msg_filter):"},{"line_number":153,"context_line":"        \"\"\"Unsubscribe.\"\"\""},{"line_number":154,"context_line":"        if msg_filter not in self.subscriptions:"},{"line_number":155,"context_line":"            return None"},{"line_number":156,"context_line":"        self.sock.setsockopt(zmq.UNSUBSCRIBE, msg_filter)"},{"line_number":157,"context_line":"        self.subscriptions.remove(msg_filter)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAIH%2F%2F%2F9w%3D","line":155,"in_reply_to":"AAAAHn%2F%2F8Og%3D","updated":"2012-06-06 17:52:16.000000000","message":"Done","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee389758389a1f2656a4f23b336317782f48afc7","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        self.subscriptions.remove(msg_filter)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def close(self):"},{"line_number":160,"context_line":"        if self.sock \u003d\u003d None or self.sock.closed:"},{"line_number":161,"context_line":"            return"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # We must unsubscribe, or we\u0027ll leak descriptors."}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAHn%2F%2F8OQ%3D","line":160,"updated":"2012-06-06 17:30:34.000000000","message":"Use \"is\" for comparison to None; I believe this now gives pep8 errors.","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"cf0ed47fdc7c025da7eb20d0f3608ef914e65d7b","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        self.subscriptions.remove(msg_filter)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def close(self):"},{"line_number":160,"context_line":"        if self.sock \u003d\u003d None or self.sock.closed:"},{"line_number":161,"context_line":"            return"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # We must unsubscribe, or we\u0027ll leak descriptors."}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAIH%2F%2F%2F90%3D","line":160,"in_reply_to":"AAAAHn%2F%2F8OQ%3D","updated":"2012-06-06 17:52:16.000000000","message":"Done","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee389758389a1f2656a4f23b336317782f48afc7","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def process(self, style, target, proxy, ctx, data):"},{"line_number":289,"context_line":"        # Method starting with - are"},{"line_number":290,"context_line":"        # processed internally. (non-valid method name)"},{"line_number":291,"context_line":"        #proxy \u003d self.proxy"},{"line_number":292,"context_line":"        method \u003d data[\u0027method\u0027]"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        # Internal method"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAHn%2F%2F8OI%3D","line":291,"updated":"2012-06-06 17:30:34.000000000","message":"I\u0027m a little confused here.  You\u0027ve commented out this line, but you use the \"proxy\" variable at the bottom, calling its dispatch() method…if you need this line, uncomment it; if you don\u0027t, please remove it…","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"cf0ed47fdc7c025da7eb20d0f3608ef914e65d7b","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def process(self, style, target, proxy, ctx, data):"},{"line_number":289,"context_line":"        # Method starting with - are"},{"line_number":290,"context_line":"        # processed internally. (non-valid method name)"},{"line_number":291,"context_line":"        #proxy \u003d self.proxy"},{"line_number":292,"context_line":"        method \u003d data[\u0027method\u0027]"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        # Internal method"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAIH%2F%2F%2F98%3D","line":291,"in_reply_to":"AAAAHn%2F%2F8OI%3D","updated":"2012-06-06 17:52:16.000000000","message":"This changed implementing the dispatcher and I forgot to prune this line.","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee389758389a1f2656a4f23b336317782f48afc7","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        LOG.info(_(\"Registering reactor\"))"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        assert (zmq_type_in in (zmq.PULL, zmq.SUB)), \"Bad input socktype\""},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # Items push in."},{"line_number":337,"context_line":"        inq \u003d ZmqSocket(in_addr, zmq_type_in, bind\u003din_bind,"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAHn%2F%2F8OA%3D","line":334,"updated":"2012-06-06 17:30:34.000000000","message":"I really would prefer that we raise some specific exception instead of an AssertionError here.  You use assert to check invariants, but it looks like you\u0027re just checking for usage errors…","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"cf0ed47fdc7c025da7eb20d0f3608ef914e65d7b","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        LOG.info(_(\"Registering reactor\"))"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        assert (zmq_type_in in (zmq.PULL, zmq.SUB)), \"Bad input socktype\""},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # Items push in."},{"line_number":337,"context_line":"        inq \u003d ZmqSocket(in_addr, zmq_type_in, bind\u003din_bind,"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAIH%2F%2F%2F9Y%3D","line":334,"in_reply_to":"AAAAHn%2F%2F8OA%3D","updated":"2012-06-06 17:52:16.000000000","message":"Done","commit_id":"e442630b9a550ab99ed65e6ad9bc193b326d1389"}],"nova/rpc/matchmaker.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"\"\"\""},{"line_number":41,"context_line":"The MatchMaker classes should except a Topic or Fanout exchange key and"},{"line_number":42,"context_line":"return keys for direct exchanges, per (approximate) AMQP parlance."},{"line_number":43,"context_line":"\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4Yg%3D","line":42,"updated":"2012-05-23 21:53:20.000000000","message":"I *think* module docstrings need to be the first expression in the file, i.e., this should be before any of the imports.  Even if that\u0027s not the case, I\u0027d very much prefer that this docstring be moved there…","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":43,"context_line":"\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class MatchMakerException(exception.NovaException):"},{"line_number":47,"context_line":"    \"\"\"Signified a match could not be found.\"\"\""},{"line_number":48,"context_line":"    message \u003d _(\"Match not found by MatchMaker.\")"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4Yo%3D","line":46,"updated":"2012-05-23 21:53:20.000000000","message":"We generally prefer that exceptions be in exception.py unless there\u0027s a very good reason they\u0027re not.  Can you explain that reason here?","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"afa3144fe37a6a0073334aa71102df0f50fd1ec5","unresolved":false,"context_lines":[{"line_number":43,"context_line":"\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class MatchMakerException(exception.NovaException):"},{"line_number":47,"context_line":"    \"\"\"Signified a match could not be found.\"\"\""},{"line_number":48,"context_line":"    message \u003d _(\"Match not found by MatchMaker.\")"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4QI%3D","line":46,"in_reply_to":"AAAAHX%2F%2F4Yo%3D","updated":"2012-05-24 03:50:19.000000000","message":"This code and everything else in nova.rpc is intended to be moved into openstack-common within Folsom.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.bindings.append((binding, rule, False, last))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    #def add_negate_binding(self, binding, rule, last\u003dTrue):"},{"line_number":85,"context_line":"    #    self.bindings.append((binding, rule, True, last))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def queues(self, key):"},{"line_number":88,"context_line":"        workers \u003d []"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4YY%3D","line":85,"updated":"2012-05-23 21:53:20.000000000","message":"I\u0027d much prefer that methods simply be removed rather than commented out…","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"afa3144fe37a6a0073334aa71102df0f50fd1ec5","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.bindings.append((binding, rule, False, last))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    #def add_negate_binding(self, binding, rule, last\u003dTrue):"},{"line_number":85,"context_line":"    #    self.bindings.append((binding, rule, True, last))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def queues(self, key):"},{"line_number":88,"context_line":"        workers \u003d []"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4QA%3D","line":85,"in_reply_to":"AAAAHX%2F%2F4YY%3D","updated":"2012-05-24 03:50:19.000000000","message":"This is a \"good intention\". This method itself works, but it relies on something not yet implemented. I wanted to leave it as documentation for what it would look like.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class DirectBinding(Binding):"},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":"        Specifies a host in the key via a \u0027.\u0027 character"},{"line_number":105,"context_line":"        Although dots are used in the key, the behavior here is"},{"line_number":106,"context_line":"        that it maps directly to a host, thus direct."},{"line_number":107,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4YU%3D","line":104,"updated":"2012-05-23 21:53:20.000000000","message":"Too heavily indented.  Multiline docstrings like this should be indented so that they line up with the first quote, i.e.:\n\n    \"\"\"\n    Specifies a host in the key via a \u0027.\u0027 character\n    …\n    \"\"\"","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"}],"nova/tests/fake_flags.py":[{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":45,"context_line":"flags.DECLARE(\u0027compute_scheduler_driver\u0027, \u0027nova.scheduler.multi\u0027)"},{"line_number":46,"context_line":"FLAGS.set_default(\u0027api_paste_config\u0027, \u0027$state_path/etc/nova/api-paste.ini\u0027)"},{"line_number":47,"context_line":"FLAGS.set_default(\u0027rpc_response_timeout\u0027, 5)"},{"line_number":48,"context_line":"FLAGS.set_default(\u0027rpc_cast_timeout\u0027, 5)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F33A%3D","line":48,"updated":"2012-05-24 19:09:28.000000000","message":"why?","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"flags.DECLARE(\u0027compute_scheduler_driver\u0027, \u0027nova.scheduler.multi\u0027)"},{"line_number":46,"context_line":"FLAGS.set_default(\u0027api_paste_config\u0027, \u0027$state_path/etc/nova/api-paste.ini\u0027)"},{"line_number":47,"context_line":"FLAGS.set_default(\u0027rpc_response_timeout\u0027, 5)"},{"line_number":48,"context_line":"FLAGS.set_default(\u0027rpc_cast_timeout\u0027, 5)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3x0%3D","line":48,"in_reply_to":"AAAAHX%2F%2F33A%3D","updated":"2012-05-24 20:33:30.000000000","message":"Because the default timeout is long for testing purposes. If we\u0027re testing if rpc.call() works, we don\u0027t need to wait 60 seconds to know if there is a problem. Actually, this isn\u0027t as necessary as before -- when I added this, the timeout was over 10 minutes.\n\nI can remove this or roll into another patch, if it concerns you.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0fe03ac2ad1bac6e28e8d47f19b8c06d44e14e15","unresolved":false,"context_lines":[{"line_number":45,"context_line":"flags.DECLARE(\u0027compute_scheduler_driver\u0027, \u0027nova.scheduler.multi\u0027)"},{"line_number":46,"context_line":"FLAGS.set_default(\u0027api_paste_config\u0027, \u0027$state_path/etc/nova/api-paste.ini\u0027)"},{"line_number":47,"context_line":"FLAGS.set_default(\u0027rpc_response_timeout\u0027, 5)"},{"line_number":48,"context_line":"FLAGS.set_default(\u0027rpc_cast_timeout\u0027, 5)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3xU%3D","line":48,"in_reply_to":"AAAAHX%2F%2F3x0%3D","updated":"2012-05-24 20:59:39.000000000","message":"That makes sense ... the code that tests call timeouts already sets it to be a very low timeout though.  I guess this still applies and is helpful if there is a bug in some other test to get it to fail faster.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"d43c6a92f07d779301f06319e210d26955340817","unresolved":false,"context_lines":[{"line_number":45,"context_line":"flags.DECLARE(\u0027compute_scheduler_driver\u0027, \u0027nova.scheduler.multi\u0027)"},{"line_number":46,"context_line":"FLAGS.set_default(\u0027api_paste_config\u0027, \u0027$state_path/etc/nova/api-paste.ini\u0027)"},{"line_number":47,"context_line":"FLAGS.set_default(\u0027rpc_response_timeout\u0027, 5)"},{"line_number":48,"context_line":"FLAGS.set_default(\u0027rpc_cast_timeout\u0027, 5)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3w8%3D","line":48,"in_reply_to":"AAAAHX%2F%2F3xU%3D","updated":"2012-05-24 21:06:17.000000000","message":"Yeah, the timeout one fails faster than this, so there isn\u0027t a conflict. When doing debugging via the test-suite, this is invaluable, because I can get LOGS from the test, even if the failure is Timeout.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"}],"nova/tests/rpc/test_zmq.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e5ccf2ceeed95b1881bf6853e2f8589cd1817bff","unresolved":false,"context_lines":[{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class _RpcZmqBaseTestCase(common.BaseRpcTestCase):"},{"line_number":42,"context_line":"    def setUp(self, topic\u003d\u0027test\u0027, topic_nested\u003d\u0027nested\u0027):"},{"line_number":43,"context_line":"        if not impl_zmq:"},{"line_number":44,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F5bk%3D","line":41,"updated":"2012-05-21 21:13:23.000000000","message":"We should have at least test for cast in this test.\nHopefully, it is good to have some test list with test_kombu.","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"7afbd3c2fb79ec60e2f1c76bb96081ab7dae50e9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class _RpcZmqBaseTestCase(common.BaseRpcTestCase):"},{"line_number":42,"context_line":"    def setUp(self, topic\u003d\u0027test\u0027, topic_nested\u003d\u0027nested\u0027):"},{"line_number":43,"context_line":"        if not impl_zmq:"},{"line_number":44,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F5aQ%3D","line":41,"in_reply_to":"AAAAHX%2F%2F5bk%3D","updated":"2012-05-21 21:34:07.000000000","message":"The calls are implemented as casts, so they\u0027re implicitly tested. If you look at BaseRpcTestCase, you\u0027ll see that this code tests the use of calls, timeouts, exceptions, etc.","commit_id":"64709944ed42d4383d8b59c4fb3a9d3c3ef43afb"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3c096644a6436c737f30c7abe76bea6ecebb6216","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        super(_RpcZmqBaseTestCase, self).tearDown()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test.skip_if(zmq is None, \"Test requires zmq\")"},{"line_number":93,"context_line":"    def __getattr__(self, name):"},{"line_number":94,"context_line":"        super(_RpcZmqBaseTestCase, self).getattr(name)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4X0%3D","line":93,"updated":"2012-05-23 21:53:20.000000000","message":"I\u0027m not sure I understand what you\u0027re trying to accomplish here; __getattr__() isn\u0027t a test, so @test.skip_if() is meaningless when applied to it.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"48d9ceba1655713f13a7fd45ad9c95d3a1b91b32","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        super(_RpcZmqBaseTestCase, self).tearDown()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test.skip_if(zmq is None, \"Test requires zmq\")"},{"line_number":93,"context_line":"    def __getattr__(self, name):"},{"line_number":94,"context_line":"        super(_RpcZmqBaseTestCase, self).getattr(name)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F3%2Bg%3D","line":93,"in_reply_to":"AAAAHX%2F%2F4EA%3D","updated":"2012-05-24 16:46:41.000000000","message":"Yes, I did some testing and you\u0027re kind of right. The getattr was broken, but it was never actually called. The @test.skip_if /was/ working as I planned, however... It is strange and I\u0027m not sure how it worked (while being clearly broken).  Regardless...\n\nI found an easier fix. I\u0027m decorating setUp instead. This seems to work and is cleaner.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"924afe44643ea7dc56c07e6515a95ad80004563e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        super(_RpcZmqBaseTestCase, self).tearDown()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test.skip_if(zmq is None, \"Test requires zmq\")"},{"line_number":93,"context_line":"    def __getattr__(self, name):"},{"line_number":94,"context_line":"        super(_RpcZmqBaseTestCase, self).getattr(name)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4EA%3D","line":93,"in_reply_to":"AAAAHX%2F%2F4P4%3D","updated":"2012-05-24 14:49:29.000000000","message":"But this can\u0027t possibly work, as far as I know.  The function you\u0027re decorating is __getattr__(), not the test methods.  Unfortunately, you\u0027re stuck somehow decorating all those methods, or coming up with something more clever and likely less readable :)","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"afa3144fe37a6a0073334aa71102df0f50fd1ec5","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        super(_RpcZmqBaseTestCase, self).tearDown()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test.skip_if(zmq is None, \"Test requires zmq\")"},{"line_number":93,"context_line":"    def __getattr__(self, name):"},{"line_number":94,"context_line":"        super(_RpcZmqBaseTestCase, self).getattr(name)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAHX%2F%2F4P4%3D","line":93,"in_reply_to":"AAAAHX%2F%2F4X0%3D","updated":"2012-05-24 03:50:19.000000000","message":"However, the methods of common.BaseRpcTestCase *are* tests. Because the methods don\u0027t exist in this class, but in the superclass, __getattr__ is called.\n\nThis is a hack so that we can do the @test.skip_if against all the methods in nova.tests.rpc.common, as they would otherwise fail if the system was missing libzmq.","commit_id":"b28695bb5349a900ab20e33ae6c0029675df67ce"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"8fe88ca3bbc923a377314542e2832cfaabbb1336","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class _RpcZmqBaseTestCase(common.BaseRpcTestCase):"},{"line_number":45,"context_line":"    @test.skip_if(zmq is None, \"Test requires zmq\")"},{"line_number":46,"context_line":"    def setUp(self, topic\u003d\u0027test\u0027, topic_nested\u003d\u0027nested\u0027):"},{"line_number":47,"context_line":"        if not impl_zmq:"},{"line_number":48,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAHX%2F%2F36c%3D","line":45,"updated":"2012-05-24 18:00:32.000000000","message":"Eh.  Still doesn\u0027t seem quite right, but if it works, I\u0027ll just deal :)  You confirmed that this worked under both Python 2.6 and Python 2.7?","commit_id":"e6c89fd05e9a35fb514242c5f88fb279b289851d"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"802589613da64cfc82edfcb1eb2c95a0059798bb","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                return"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"            if not os.path.isdir(ipc_dir):"},{"line_number":79,"context_line":"                utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, ipc_dir)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            self.reactor \u003d impl_zmq.ZmqProxy(FLAGS)"},{"line_number":82,"context_line":"            consume_in \u003d \"tcp://%s:%s\" % \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F320%3D","line":79,"updated":"2012-05-24 19:09:28.000000000","message":"If you\u0027re not having to use run_as_root, it would be nice to just use the Python equivalent instead of shelling out.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"5dfeb9194ce791b68ececaf565333379e6ff15d5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                return"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"            if not os.path.isdir(ipc_dir):"},{"line_number":79,"context_line":"                utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, ipc_dir)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            self.reactor \u003d impl_zmq.ZmqProxy(FLAGS)"},{"line_number":82,"context_line":"            consume_in \u003d \"tcp://%s:%s\" % \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3xw%3D","line":79,"in_reply_to":"AAAAHX%2F%2F320%3D","updated":"2012-05-24 20:33:30.000000000","message":"Ah, yes. I clearly just stole the code from the service and removed the run as root.","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"82ce25c0b6f9f3190f45c26609192f11a633cc76","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                return"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"            if not os.path.isdir(ipc_dir):"},{"line_number":79,"context_line":"                utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, ipc_dir)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            self.reactor \u003d impl_zmq.ZmqProxy(FLAGS)"},{"line_number":82,"context_line":"            consume_in \u003d \"tcp://%s:%s\" % \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAHX%2F%2F3kc%3D","line":79,"in_reply_to":"AAAAHX%2F%2F3xw%3D","updated":"2012-05-25 18:31:02.000000000","message":"Done","commit_id":"65e48c2f2f6599c76288569d1136e24dd365e319"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Unit Tests for remote procedure calls using zeromq"},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import socket"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3WE%3D","line":21,"updated":"2012-05-25 21:45:29.000000000","message":"unused","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"9b752ef66edcee41c7290cc0edb21e1ebfc1a85d","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import socket"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from nova import exception"},{"line_number":26,"context_line":"from nova import flags"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAHX%2F%2F3WA%3D","line":23,"updated":"2012-05-25 21:45:29.000000000","message":"unused","commit_id":"afab3dcf7cee15cb3ec6d49ca486c05befced03c"}],"tools/test-requires":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"19645dc8ff0f279656acaac3c3fa0ba7ce0c02f4","unresolved":false,"context_lines":[{"line_number":8,"context_line":"openstack.nose_plugin"},{"line_number":9,"context_line":"pep8\u003d\u003d1.1"},{"line_number":10,"context_line":"sphinx\u003e\u003d1.1.2"},{"line_number":11,"context_line":"#MySQL-python"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"AAAAHX%2F%2F35k%3D","line":11,"updated":"2012-05-24 18:09:03.000000000","message":"Hrm...why have you commented MySQL-python out of test-requires?","commit_id":"9fec76b5d16c8618040d87ab2f0ab9e382773b2b"}]}
