)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e882101ced93421719b577e8b3e340ab0c9605d7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Jim Rollenhagen \u003cjim@jimrollenhagen.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-29 16:24:49 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Ironic: experimentally allow multiple compute services"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This lifts some hash ring code from ironic (to be put into oslo"},{"line_number":10,"context_line":"soon), to be used to do consistent hashing of ironic nodes among"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_02169bf0","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":22},"updated":"2016-07-29 18:30:08.000000000","message":"I kinda think we should try to avoid the word \"experimentally\". We tell everyone else that we don\u0027t merge experimental features (i.e. before they\u0027re ready, or that may be removed). Can we just hedge with a different word? :)\n\nJust removing that word from what you have is probably fine, and making it clear in the release note that this is new, optional behavior.","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"44a177c554618fb3b28fb5590431dafd0dac5b92","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Jim Rollenhagen \u003cjim@jimrollenhagen.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-29 16:24:49 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Ironic: experimentally allow multiple compute services"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This lifts some hash ring code from ironic (to be put into oslo"},{"line_number":10,"context_line":"soon), to be used to do consistent hashing of ironic nodes among"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_7870e6dc","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":22},"in_reply_to":"bacf61ea_02169bf0","updated":"2016-07-29 21:15:53.000000000","message":"+1","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"bfb90b3c21b9126d75393da781e9e6e2d7ee08bf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Jim Rollenhagen \u003cjim@jimrollenhagen.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-29 16:24:49 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Ironic: experimentally allow multiple compute services"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This lifts some hash ring code from ironic (to be put into oslo"},{"line_number":10,"context_line":"soon), to be used to do consistent hashing of ironic nodes among"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_6caaa81a","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":22},"in_reply_to":"bacf61ea_7870e6dc","updated":"2016-08-01 15:23:51.000000000","message":"Sure, will do","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"44a177c554618fb3b28fb5590431dafd0dac5b92","unresolved":false,"context_lines":[{"line_number":25,"context_line":"also adds its own compute service into this list. The list of all"},{"line_number":26,"context_line":"hostnames in this list is what is used to instantiate the hash ring."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"As nova-compute services are brough up or down, the ring will"},{"line_number":29,"context_line":"re-balance. It\u0027s important to note that this re-balance does not"},{"line_number":30,"context_line":"occur at the same time on all compute services, so for some amount"},{"line_number":31,"context_line":"of time, an ironic node may be managed by more than one compute"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_b8affe28","line":28,"range":{"start_line":28,"start_character":29,"end_line":28,"end_character":35},"updated":"2016-07-29 21:15:53.000000000","message":"typo \u0027brought\u0027","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43738c3e4876f3b8f85611dc750f09b7a8647219","unresolved":false,"context_lines":[{"line_number":57,"context_line":"service; spinning up more invokes the hard bits. As such,"},{"line_number":58,"context_line":"the release note for this change clarifies that this feature"},{"line_number":59,"context_line":"is experimental for running with multiple compute services."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Change-Id: I852f62b29f1faedf7ff19b42bbfb966f61d95c6e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_b894d78a","line":60,"updated":"2016-08-01 15:51:56.000000000","message":"Doesn\u0027t this resolve blueprint ironic-multiple-compute-hosts ? Even though I think this is a different direction from the original spec:\n\nhttp://specs.openstack.org/openstack/nova-specs/specs/newton/approved/ironic-multiple-compute-hosts.html\n\nWe should be clear about what this is for, which probably also means amending the spec at some point.","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"babc0cc8a32a2fa0b4ecdfc7f8178e8ff8bd31b3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This lifts some hash ring code from ironic (to be put into oslo"},{"line_number":10,"context_line":"soon), to be used to do consistent hashing of ironic nodes among"},{"line_number":11,"context_line":"multiple nova-compute services. The hash ring is used within the"},{"line_number":12,"context_line":"driver itself, and is refreshed at each resource tracker."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"get_available_nodes() will now return a subset of nodes,"},{"line_number":15,"context_line":"determined by the following rules:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bacf61ea_da15039c","line":12,"range":{"start_line":12,"start_character":15,"end_line":12,"end_character":56},"updated":"2016-08-02 16:02:14.000000000","message":"Assuming you meant update_available_resources interval in the RT?","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2bf93250487829323c2043d6df0a0a994eb2ac5e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This lifts some hash ring code from ironic (to be put into oslo"},{"line_number":10,"context_line":"soon), to be used to do consistent hashing of ironic nodes among"},{"line_number":11,"context_line":"multiple nova-compute services. The hash ring is used within the"},{"line_number":12,"context_line":"driver itself, and is refreshed at each resource tracker."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"get_available_nodes() will now return a subset of nodes,"},{"line_number":15,"context_line":"determined by the following rules:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bacf61ea_ce50a50d","line":12,"range":{"start_line":12,"start_character":15,"end_line":12,"end_character":56},"in_reply_to":"bacf61ea_da15039c","updated":"2016-08-02 16:53:49.000000000","message":"Yeah, will fix, I meant to say \"each resource tracker run\"","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"babc0cc8a32a2fa0b4ecdfc7f8178e8ff8bd31b3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"service; spinning up more invokes the hard bits. As such,"},{"line_number":58,"context_line":"the release note for this change clarifies that this feature"},{"line_number":59,"context_line":"is new and untested for running with multiple compute services."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Implements: blueprint ironic-multiple-compute-hosts"},{"line_number":62,"context_line":"Change-Id: I852f62b29f1faedf7ff19b42bbfb966f61d95c6e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bacf61ea_da07c37f","line":60,"updated":"2016-08-02 16:02:14.000000000","message":"Doesn\u0027t this need to depend on the g-r bump for python-ironicclient\u003e\u003d1.6.0?","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2bf93250487829323c2043d6df0a0a994eb2ac5e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"service; spinning up more invokes the hard bits. As such,"},{"line_number":58,"context_line":"the release note for this change clarifies that this feature"},{"line_number":59,"context_line":"is new and untested for running with multiple compute services."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Implements: blueprint ironic-multiple-compute-hosts"},{"line_number":62,"context_line":"Change-Id: I852f62b29f1faedf7ff19b42bbfb966f61d95c6e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bacf61ea_ae4a9153","line":60,"in_reply_to":"bacf61ea_da07c37f","updated":"2016-08-02 16:53:49.000000000","message":"No, that\u0027s for the resource_class thing, which is separate from this.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"24c3a246ea2ccea2923dd0da2720701aa28e0e8f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This lifts some hash ring code from ironic (to be put into oslo"},{"line_number":10,"context_line":"soon), to be used to do consistent hashing of ironic nodes among"},{"line_number":11,"context_line":"multiple nova-compute services. The hash ring is used within the"},{"line_number":12,"context_line":"driver itself, and is refreshed at each resource tracker."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"get_available_nodes() will now return a subset of nodes,"},{"line_number":15,"context_line":"determined by the following rules:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"bacf61ea_b8753ecc","line":12,"updated":"2016-08-04 15:52:21.000000000","message":"Note I\u0027m basically not reviewing the hash ring code. It\u0027s pre-existing and moving to oslo soon, so I\u0027m just skimming for major offenses.","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"24c3a246ea2ccea2923dd0da2720701aa28e0e8f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"also adds its own compute service into this list. The list of all"},{"line_number":26,"context_line":"hostnames in this list is what is used to instantiate the hash ring."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"As nova-compute services are brough up or down, the ring will"},{"line_number":29,"context_line":"re-balance. It\u0027s important to note that this re-balance does not"},{"line_number":30,"context_line":"occur at the same time on all compute services, so for some amount"},{"line_number":31,"context_line":"of time, an ironic node may be managed by more than one compute"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"bacf61ea_78b8e675","line":28,"range":{"start_line":28,"start_character":29,"end_line":28,"end_character":35},"updated":"2016-08-04 15:52:21.000000000","message":"brought","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"}],"nova/conf/hash_ring.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"291e15dbef73274a25bccd7fd29a12020c474951","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               \u0027smooth in most cases. The default is suitable for up \u0027"},{"line_number":40,"context_line":"               \u0027to a few hundred services. Too many partitions has a \u0027"},{"line_number":41,"context_line":"               \u0027CPU impact.\u0027)),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027distribution_replicas\u0027,"},{"line_number":43,"context_line":"        default\u003d1,"},{"line_number":44,"context_line":"        help\u003d_(\u0027[Experimental Feature] \u0027"},{"line_number":45,"context_line":"               \u0027Number of objects to map onto each hash partition. \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_e27f4064","line":42,"updated":"2016-07-28 18:43:32.000000000","message":"you can probably remove this option. I don\u0027t think it\u0027s useful in Nova, because we will never want to set it to a value \u003e1","commit_id":"fede06bdcd7d58c65b208e25de5d7232ab537d81"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"533edc3520892870424ed87f3b4bbb74a6289063","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               \u0027smooth in most cases. The default is suitable for up \u0027"},{"line_number":40,"context_line":"               \u0027to a few hundred services. Too many partitions has a \u0027"},{"line_number":41,"context_line":"               \u0027CPU impact.\u0027)),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027distribution_replicas\u0027,"},{"line_number":43,"context_line":"        default\u003d1,"},{"line_number":44,"context_line":"        help\u003d_(\u0027[Experimental Feature] \u0027"},{"line_number":45,"context_line":"               \u0027Number of objects to map onto each hash partition. \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_898f84cb","line":42,"in_reply_to":"bacf61ea_e27f4064","updated":"2016-07-28 22:03:08.000000000","message":"Just saw your comments. I agree, but my original plan was to lift this into oslo, so I just dropped it here as is for a POC.\n\nThat said, I think for newton we want to drop the code in with hardcoded configs (as an experimental thing), as the default should work fine for most people. In Ocata we\u0027ll yank this into oslo and move both Nova and Ironic to use that.","commit_id":"fede06bdcd7d58c65b208e25de5d7232ab537d81"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"291e15dbef73274a25bccd7fd29a12020c474951","unresolved":false,"context_lines":[{"line_number":47,"context_line":"               \u0027services to handle each object, which may be either useful \u0027"},{"line_number":48,"context_line":"               \u0027or detrimental, depending if operations are idempotent and \u0027"},{"line_number":49,"context_line":"               \u0027multiple ongoing operations on the same object is okay.\u0027)),"},{"line_number":50,"context_line":"    cfg.IntOpt(\u0027reset_interval\u0027,"},{"line_number":51,"context_line":"        default\u003d180,"},{"line_number":52,"context_line":"        help\u003d_(\u0027Interval (in seconds) between hash ring resets.\u0027)),"},{"line_number":53,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_825644d0","line":50,"updated":"2016-07-28 18:43:32.000000000","message":"what is this option going to be used for?","commit_id":"fede06bdcd7d58c65b208e25de5d7232ab537d81"}],"nova/hash_ring.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"44a177c554618fb3b28fb5590431dafd0dac5b92","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            ignore_hosts \u003d set()"},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            ignore_hosts \u003d set(ignore_hosts)"},{"line_number":111,"context_line":"            ignore_hosts.intersection_update(self.hosts)"},{"line_number":112,"context_line":"        partition \u003d self._get_partition(data)"},{"line_number":113,"context_line":"        for replica in range(0, self.replicas):"},{"line_number":114,"context_line":"            if len(hosts) + len(ignore_hosts) \u003d\u003d len(self.hosts):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_6e7660a5","line":111,"updated":"2016-07-29 21:15:53.000000000","message":"I think this should be assigning the return value?\n\n ignore_hosts \u003d ignore_hosts.intersection_update(self.hosts)","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1f487891f983ece1d3826f442a296a032df90cc2","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            ignore_hosts \u003d set()"},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            ignore_hosts \u003d set(ignore_hosts)"},{"line_number":111,"context_line":"            ignore_hosts.intersection_update(self.hosts)"},{"line_number":112,"context_line":"        partition \u003d self._get_partition(data)"},{"line_number":113,"context_line":"        for replica in range(0, self.replicas):"},{"line_number":114,"context_line":"            if len(hosts) + len(ignore_hosts) \u003d\u003d len(self.hosts):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_24dac717","line":111,"in_reply_to":"bacf61ea_6e7660a5","updated":"2016-07-29 21:20:36.000000000","message":"I misread the documentation and see now this does mutate the set on its own. Sorry for the noise.","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"44a177c554618fb3b28fb5590431dafd0dac5b92","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        for replica in range(0, self.replicas):"},{"line_number":114,"context_line":"            if len(hosts) + len(ignore_hosts) \u003d\u003d len(self.hosts):"},{"line_number":115,"context_line":"                # prevent infinite loop - cannot allocate more fallbacks."},{"line_number":116,"context_line":"                break"},{"line_number":117,"context_line":"            # Linear probing: partition N, then N+1 etc."},{"line_number":118,"context_line":"            host \u003d self._get_host(partition)"},{"line_number":119,"context_line":"            while host in hosts or host in ignore_hosts:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_04ed03ef","line":116,"updated":"2016-07-29 21:15:53.000000000","message":"If there is indeed an issue at L111, then I think this could potentially exclude hosts the data maps onto from the returned list. We should add a test for that scenario.","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1f487891f983ece1d3826f442a296a032df90cc2","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        for replica in range(0, self.replicas):"},{"line_number":114,"context_line":"            if len(hosts) + len(ignore_hosts) \u003d\u003d len(self.hosts):"},{"line_number":115,"context_line":"                # prevent infinite loop - cannot allocate more fallbacks."},{"line_number":116,"context_line":"                break"},{"line_number":117,"context_line":"            # Linear probing: partition N, then N+1 etc."},{"line_number":118,"context_line":"            host \u003d self._get_host(partition)"},{"line_number":119,"context_line":"            while host in hosts or host in ignore_hosts:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_64067f87","line":116,"in_reply_to":"bacf61ea_04ed03ef","updated":"2016-07-29 21:20:36.000000000","message":"Nevermind (above)","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5df8027a82c151a2704c2125e4ef8cd3d727b6de","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                hashed_key \u003d self._hash2int(key_hash)"},{"line_number":69,"context_line":"                self._host_hashes[hashed_key] \u003d host"},{"line_number":70,"context_line":"        # Gather the (possibly colliding) resulting hashes into a bisectable"},{"line_number":71,"context_line":"        # list."},{"line_number":72,"context_line":"        self._partitions \u003d sorted(self._host_hashes.keys())"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _hash2int(self, key_hash):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bacf61ea_28287c32","line":71,"updated":"2016-08-02 06:20:28.000000000","message":"In the event of a collision, a host in the _host_hashes dict may be overwritten by the colliding one, reducing the balance. I assume it\u0027s expected/okay to have some possibility of that with our choice of PARTITION_EXPONENT ideally resulting in 32 appearances of each host in the ring.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"}],"nova/objects/service.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e882101ced93421719b577e8b3e340ab0c9605d7","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        db_services \u003d db.service_get_all_computes_by_hv_type("},{"line_number":453,"context_line":"            context, hv_type, include_disabled\u003dFalse)"},{"line_number":454,"context_line":"        return base.obj_make_list(context, cls(context), objects.Service,"},{"line_number":455,"context_line":"                                  db_services)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_7f70d0dc","line":455,"updated":"2016-07-29 18:30:08.000000000","message":"This is querying for Service objects and joining ComputeNode to get hv_type. This feels more like you should be querying for ComputeNode objects that have a matching nova-compute service. Thus, this would go on ComputeNodeList.\n\nWhat do you think?\n\nThen again, we need to ask the ServiceGroup API about up-ness. So, maybe nevermind.","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"}],"nova/tests/unit/objects/test_service.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"44a177c554618fb3b28fb5590431dafd0dac5b92","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        self.mox.StubOutWithMock(db, \u0027service_get_all_computes_by_hv_type\u0027)"},{"line_number":279,"context_line":"        db.service_get_all_computes_by_hv_type(self.context, \u0027hv-type\u0027,"},{"line_number":280,"context_line":"            include_disabled\u003dFalse).AndReturn([fake_service])"},{"line_number":281,"context_line":"        self.mox.ReplayAll()"},{"line_number":282,"context_line":"        services \u003d service.ServiceList.get_all_computes_by_hv_type("},{"line_number":283,"context_line":"            self.context, \u0027hv-type\u0027)"},{"line_number":284,"context_line":"        self.assertEqual(1, len(services))"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_ae97b838","line":281,"updated":"2016-07-29 21:15:53.000000000","message":"Can we please not use mox in a new test and use mock instead?","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"bfb90b3c21b9126d75393da781e9e6e2d7ee08bf","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        self.mox.StubOutWithMock(db, \u0027service_get_all_computes_by_hv_type\u0027)"},{"line_number":279,"context_line":"        db.service_get_all_computes_by_hv_type(self.context, \u0027hv-type\u0027,"},{"line_number":280,"context_line":"            include_disabled\u003dFalse).AndReturn([fake_service])"},{"line_number":281,"context_line":"        self.mox.ReplayAll()"},{"line_number":282,"context_line":"        services \u003d service.ServiceList.get_all_computes_by_hv_type("},{"line_number":283,"context_line":"            self.context, \u0027hv-type\u0027)"},{"line_number":284,"context_line":"        self.assertEqual(1, len(services))"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_ccb8f477","line":281,"in_reply_to":"bacf61ea_ae97b838","updated":"2016-08-01 15:23:51.000000000","message":"++ this was lazy copy/paste","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"08c531eafb9fb9f2c4cba5e77bfcbd1a6a150f6d","unresolved":false,"context_lines":[{"line_number":1795,"context_line":"        self.driver.virtapi \u003d fake.FakeVirtAPI()"},{"line_number":1796,"context_line":"        self.ctx \u003d nova_context.get_admin_context()"},{"line_number":1797,"context_line":""},{"line_number":1798,"context_line":"        self.mock_refresh_hr \u003d mock_hash_ring"},{"line_number":1799,"context_line":"        self.host \u003d \u0027host1\u0027"},{"line_number":1800,"context_line":"        self.flags(host\u003dself.host)"},{"line_number":1801,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"bacf61ea_76a103f8","line":1798,"updated":"2016-08-04 23:25:45.000000000","message":"I don\u0027t really love how this works where we mock the class, instantiate a copy, and then hold onto the mock. It means that the class goes back to the original definition after we exit here, but the instance of the object we created is mocked. It works, and may be more compact than having to mock a thing and clean it up later, but.. I think it\u0027s potentially confusing.","commit_id":"79880a36a349b3bdec4c8446b19e0b0845c5e269"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d03a4776bdccb6dbe4198bb2b95ac347748e7b95","unresolved":false,"context_lines":[{"line_number":1795,"context_line":"        self.driver.virtapi \u003d fake.FakeVirtAPI()"},{"line_number":1796,"context_line":"        self.ctx \u003d nova_context.get_admin_context()"},{"line_number":1797,"context_line":""},{"line_number":1798,"context_line":"        self.mock_refresh_hr \u003d mock_hash_ring"},{"line_number":1799,"context_line":"        self.host \u003d \u0027host1\u0027"},{"line_number":1800,"context_line":"        self.flags(host\u003dself.host)"},{"line_number":1801,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"bacf61ea_967ab7ef","line":1798,"in_reply_to":"bacf61ea_76a103f8","updated":"2016-08-04 23:49:44.000000000","message":"Yeah, now that I read it again, this is totally doing it wrong... the assertion on the calls in the tests are actually seeing the calls from IronicDriver.__init__, not _refresh_cache. Will fix.","commit_id":"79880a36a349b3bdec4c8446b19e0b0845c5e269"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2cc5e5fe38fb008efef8a02b0ee4e960d2bc80fe","unresolved":false,"context_lines":[{"line_number":1788,"context_line":""},{"line_number":1789,"context_line":"class NodeCacheTestCase(test.NoDBTestCase):"},{"line_number":1790,"context_line":"    # @mock.patch.object(ironic_driver.IronicDriver, \u0027_refresh_hash_ring\u0027)"},{"line_number":1791,"context_line":"    # def setUp(self, mock_hash_ring):"},{"line_number":1792,"context_line":"    def setUp(self):"},{"line_number":1793,"context_line":"        super(NodeCacheTestCase, self).setUp()"},{"line_number":1794,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_d6ceef2b","line":1791,"updated":"2016-08-04 23:50:28.000000000","message":"Oops.","commit_id":"9936d4b6100ef47290affe4874047341a9cc523f"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e882101ced93421719b577e8b3e340ab0c9605d7","unresolved":false,"context_lines":[{"line_number":536,"context_line":"        self.hash_ring \u003d hash_ring.HashRing(services)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    def _get_our_instances(self, ctxt):"},{"line_number":539,"context_line":"        instances \u003d objects.InstanceList.get_by_host(ctxt, CONF.host)"},{"line_number":540,"context_line":"        return [instance.uuid for instance in instances]"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def _refresh_cache(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_e2df0767","line":539,"updated":"2016-07-29 18:30:08.000000000","message":"This is a fairly heavy operation, especially if every service calls it every five minutes. We end up sending all (non-deleted) instance objects over the wire every five minutes. That seems like a lot of traffic. Can we do this once at init and then trim the list as we spawn/delete things?\n\nWhen we need to do this on libvirt, we ask the hypervisor:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L746-L751\n\nCan we do that with ironic? Make some call that returns just the nodes (and instance uuids) that are owned by us?\n\nIf we absolutely have to do this, it would be better to put a new method on InstanceList that just returns uuids or something.","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"bfb90b3c21b9126d75393da781e9e6e2d7ee08bf","unresolved":false,"context_lines":[{"line_number":536,"context_line":"        self.hash_ring \u003d hash_ring.HashRing(services)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    def _get_our_instances(self, ctxt):"},{"line_number":539,"context_line":"        instances \u003d objects.InstanceList.get_by_host(ctxt, CONF.host)"},{"line_number":540,"context_line":"        return [instance.uuid for instance in instances]"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def _refresh_cache(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_ac98201d","line":539,"in_reply_to":"bacf61ea_e2df0767","updated":"2016-08-01 15:23:51.000000000","message":"Yeah, Ironic doesn\u0027t know which instances map to which compute, so we can only ask ironic for all instances.\n\nI\u0027m open to tracking it during spawn/delete, though I fear that\u0027ll get out of sync with reality.\n\nI think a method that only returns UUIDs is probably best, then at least we aren\u0027t doing extra serialization and RPC traffic.","commit_id":"5a624adf0e4575f08658f9b70d953dde8dbab062"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"24c3a246ea2ccea2923dd0da2720701aa28e0e8f","unresolved":false,"context_lines":[{"line_number":535,"context_line":""},{"line_number":536,"context_line":"        self.hash_ring \u003d hash_ring.HashRing(services)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    def _get_our_instances(self, ctxt):"},{"line_number":539,"context_line":"        instances \u003d objects.InstanceList.get_uuids_by_host(ctxt, CONF.host)"},{"line_number":540,"context_line":"        return instances"},{"line_number":541,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_78df463a","line":538,"updated":"2016-08-04 15:52:21.000000000","message":"This might be a tad superfluous at this point :)","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ab23ca86a994a93565dc9744a5e9bbc81a273646","unresolved":false,"context_lines":[{"line_number":535,"context_line":""},{"line_number":536,"context_line":"        self.hash_ring \u003d hash_ring.HashRing(services)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    def _get_our_instances(self, ctxt):"},{"line_number":539,"context_line":"        instances \u003d objects.InstanceList.get_uuids_by_host(ctxt, CONF.host)"},{"line_number":540,"context_line":"        return instances"},{"line_number":541,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_2a01f106","line":538,"in_reply_to":"bacf61ea_78df463a","updated":"2016-08-04 17:20:32.000000000","message":"Touche, will inline it.","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"24c3a246ea2ccea2923dd0da2720701aa28e0e8f","unresolved":false,"context_lines":[{"line_number":539,"context_line":"        instances \u003d objects.InstanceList.get_uuids_by_host(ctxt, CONF.host)"},{"line_number":540,"context_line":"        return instances"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def _refresh_cache(self):"},{"line_number":543,"context_line":"        # NOTE(lucasagomes): limit \u003d\u003d 0 is an indicator to continue"},{"line_number":544,"context_line":"        # pagination until there\u0027re no more values to be returned."},{"line_number":545,"context_line":"        ctxt \u003d nova_context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_b887feb3","line":542,"updated":"2016-08-04 15:52:21.000000000","message":"I don\u0027t actually see a test for this. It\u0027s mocked out early in the test init and thus never actually exercised, AFAICT.","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ab23ca86a994a93565dc9744a5e9bbc81a273646","unresolved":false,"context_lines":[{"line_number":539,"context_line":"        instances \u003d objects.InstanceList.get_uuids_by_host(ctxt, CONF.host)"},{"line_number":540,"context_line":"        return instances"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def _refresh_cache(self):"},{"line_number":543,"context_line":"        # NOTE(lucasagomes): limit \u003d\u003d 0 is an indicator to continue"},{"line_number":544,"context_line":"        # pagination until there\u0027re no more values to be returned."},{"line_number":545,"context_line":"        ctxt \u003d nova_context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_4a042517","line":542,"in_reply_to":"bacf61ea_2e0108b0","updated":"2016-08-04 17:20:32.000000000","message":"Will add some things.","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c48abc538e8db0b1550ec3c737aa1811258e683b","unresolved":false,"context_lines":[{"line_number":539,"context_line":"        instances \u003d objects.InstanceList.get_uuids_by_host(ctxt, CONF.host)"},{"line_number":540,"context_line":"        return instances"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def _refresh_cache(self):"},{"line_number":543,"context_line":"        # NOTE(lucasagomes): limit \u003d\u003d 0 is an indicator to continue"},{"line_number":544,"context_line":"        # pagination until there\u0027re no more values to be returned."},{"line_number":545,"context_line":"        ctxt \u003d nova_context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_2e0108b0","line":542,"in_reply_to":"bacf61ea_b887feb3","updated":"2016-08-04 16:21:21.000000000","message":"+1","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"24c3a246ea2ccea2923dd0da2720701aa28e0e8f","unresolved":false,"context_lines":[{"line_number":558,"context_line":"            # Note that this means nodes with an instance that was deleted in"},{"line_number":559,"context_line":"            # nova while the service was down, and not yet reaped, will not be"},{"line_number":560,"context_line":"            # reported until the periodic task cleans it up."},{"line_number":561,"context_line":"            elif (CONF.host in self.hash_ring.get_hosts(node.uuid)"},{"line_number":562,"context_line":"                  and not node.instance_uuid):"},{"line_number":563,"context_line":"                node_cache[node.uuid] \u003d node"},{"line_number":564,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_d8f91282","line":561,"range":{"start_line":561,"start_character":31,"end_line":561,"end_character":66},"updated":"2016-08-04 15:52:21.000000000","message":"This is not free, right? Any reason not to grab that ahead of time and just use it here to test for membership?","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"9ce9887e6a8d6e277d50f164577a1acc428409db","unresolved":false,"context_lines":[{"line_number":558,"context_line":"            # Note that this means nodes with an instance that was deleted in"},{"line_number":559,"context_line":"            # nova while the service was down, and not yet reaped, will not be"},{"line_number":560,"context_line":"            # reported until the periodic task cleans it up."},{"line_number":561,"context_line":"            elif (CONF.host in self.hash_ring.get_hosts(node.uuid)"},{"line_number":562,"context_line":"                  and not node.instance_uuid):"},{"line_number":563,"context_line":"                node_cache[node.uuid] \u003d node"},{"line_number":564,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_cd794f84","line":561,"range":{"start_line":561,"start_character":31,"end_line":561,"end_character":66},"in_reply_to":"bacf61ea_0a0ead3a","updated":"2016-08-04 17:22:58.000000000","message":"Dan suggested in IRC to check the instance_uuid first to avoid some extra hash ring checks, I\u0027ll do that.","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1f91ce55ec4b4c7072ed6899d09fcd527138e79f","unresolved":false,"context_lines":[{"line_number":558,"context_line":"            # Note that this means nodes with an instance that was deleted in"},{"line_number":559,"context_line":"            # nova while the service was down, and not yet reaped, will not be"},{"line_number":560,"context_line":"            # reported until the periodic task cleans it up."},{"line_number":561,"context_line":"            elif (CONF.host in self.hash_ring.get_hosts(node.uuid)"},{"line_number":562,"context_line":"                  and not node.instance_uuid):"},{"line_number":563,"context_line":"                node_cache[node.uuid] \u003d node"},{"line_number":564,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_0ddfe769","line":561,"range":{"start_line":561,"start_character":31,"end_line":561,"end_character":66},"in_reply_to":"bacf61ea_0a0ead3a","updated":"2016-08-04 17:23:56.000000000","message":"Sorry, I was reading this as passing self.host, but it\u0027s node.uuid, which changes in the loop. So, yeah, nevermind :)\n\nHowever, I think if you swap the order of this and statement, you\u0027ll avoid the hash calculation for nodes that are already used, deferring it until only when absolutely necessary.","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c48abc538e8db0b1550ec3c737aa1811258e683b","unresolved":false,"context_lines":[{"line_number":558,"context_line":"            # Note that this means nodes with an instance that was deleted in"},{"line_number":559,"context_line":"            # nova while the service was down, and not yet reaped, will not be"},{"line_number":560,"context_line":"            # reported until the periodic task cleans it up."},{"line_number":561,"context_line":"            elif (CONF.host in self.hash_ring.get_hosts(node.uuid)"},{"line_number":562,"context_line":"                  and not node.instance_uuid):"},{"line_number":563,"context_line":"                node_cache[node.uuid] \u003d node"},{"line_number":564,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_eefa50bc","line":561,"range":{"start_line":561,"start_character":31,"end_line":561,"end_character":66},"in_reply_to":"bacf61ea_d8f91282","updated":"2016-08-04 16:21:21.000000000","message":"+1\n\nOn len546, would it make sense to turn return the response to get_hosts, and not store the hash_ring?","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ab23ca86a994a93565dc9744a5e9bbc81a273646","unresolved":false,"context_lines":[{"line_number":558,"context_line":"            # Note that this means nodes with an instance that was deleted in"},{"line_number":559,"context_line":"            # nova while the service was down, and not yet reaped, will not be"},{"line_number":560,"context_line":"            # reported until the periodic task cleans it up."},{"line_number":561,"context_line":"            elif (CONF.host in self.hash_ring.get_hosts(node.uuid)"},{"line_number":562,"context_line":"                  and not node.instance_uuid):"},{"line_number":563,"context_line":"                node_cache[node.uuid] \u003d node"},{"line_number":564,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_0a0ead3a","line":561,"range":{"start_line":561,"start_character":31,"end_line":561,"end_character":66},"in_reply_to":"bacf61ea_eefa50bc","updated":"2016-08-04 17:20:32.000000000","message":"get_hosts takes a piece of data (string) and finds the host it maps to. It definitely isn\u0027t free. But we have to run it once for each node regardless, not sure where we could grab it ahead of time.","commit_id":"7dbc0a62eef380a03c404c2ccbf259e2e95c07a0"}],"releasenotes/notes/ironic-driver-hash-ring-7d763d87b9236e5d.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ec95efb2176c9420ae27f01c379df5a04583ab6b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_bd4da9c6","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"updated":"2016-08-02 16:04:15.000000000","message":"We might want to consider logging a warning when someone adds more nova-compute services (if we detect that) that it\u0027s an experimental feature.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d947b26cb9a2c69cb232d1381f30dcd6af54a8e9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_a9da8b15","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"in_reply_to":"bacf61ea_2e6ce107","updated":"2016-08-02 17:10:15.000000000","message":"I think we can use feature classification to say if its fully tested or not, eventually. I like just logging warnings where we know there are issues, and the user has a concrete action they can take.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fee7bbb6e56bf58e7fd94beaded8af3694c024ff","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_2e6ce107","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"in_reply_to":"bacf61ea_2ed061c9","updated":"2016-08-02 16:57:10.000000000","message":"I\u0027d rather not say this is experimental, personally. It\u0027s hard for us to test upstream and will be for some time. Saying it\u0027s experimental might keep people from testing it in their own environments, especially if we emit it on every startup.\n\nWe do that for cells, because we know there are broken or incomplete pieces and we\u0027re not going to fix those.\n\nWe think this works, we want people to use it, and we want to fix issues if and when we find them. Warning them about lack of testing (due to the expense and complexity in the gate) is fair and honest, but I\u0027d rather we consider this the expected norm, personally.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"f0d632d2dc962b8aa3bc81be127da850707ee436","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_8f82dd50","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"in_reply_to":"bacf61ea_90ca114e","updated":"2016-08-03 23:38:45.000000000","message":"There is a very significant caveat we need to put in the release notes here: We have no support whatsoever for reducing the number of nova-compute workers. If you spin up 10 workers, and you end up with instances assigned to each, you can never reduce the number of workers without DB manipulation or deleting those instances.\n\nI think this is fine to land as-is, but we need to make sure this limitation is documented before someone goes crazy with a large number of n-cpu workers.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"9166b7f4382d9e9f25191bb9a841c8ac4e9c93da","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_90ca114e","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"in_reply_to":"bacf61ea_a9928bf4","updated":"2016-08-03 15:17:14.000000000","message":"Other than \"don\u0027t use it\", I don\u0027t think there is something concrete.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6dd5c15b26653632a3e67dc212dccd986ed2675e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_a9928bf4","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"in_reply_to":"bacf61ea_a9da8b15","updated":"2016-08-02 17:15:15.000000000","message":"Right, and this would not be a case where there is something concrete for them to do, correct?","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2bf93250487829323c2043d6df0a0a994eb2ac5e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_ce638540","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"in_reply_to":"bacf61ea_bd4da9c6","updated":"2016-08-02 16:53:49.000000000","message":"Hm, I was told not to talk about experimental things :)","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d1192af6e5a6123d9cc9db25aa362a8c2e3a1d3d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    running. If more compute services are brought online, the bigger changes"},{"line_number":26,"context_line":"    come into play."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Note that this is tested when running with only one nova-compute service,"},{"line_number":29,"context_line":"    but not more than one. As such, this should be used with caution for"},{"line_number":30,"context_line":"    multiple compute hosts until it is properly tested in CI."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bacf61ea_2ed061c9","line":30,"range":{"start_line":28,"start_character":4,"end_line":30,"end_character":61},"in_reply_to":"bacf61ea_ce638540","updated":"2016-08-02 16:54:34.000000000","message":"I should say, I\u0027m not opposed to emitting a warning if we know multiple compute services are running... it\u0027d be a warning per compute per RT run, I assume that\u0027s okay.","commit_id":"332ca66dfec4a9d4d4c79ddf982db028a6f58087"}]}
