)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2d6301128c5b5e61144513b9c08f2d96f5c3a237","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"objects: add new field cpus_reserved in NUMACell"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"NUMA nodes should store the pCPUs used for reserved to allow drivers"},{"line_number":10,"context_line":"to use them and allow to compute NUMA topology resources usage."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"implements blueprint libvirt-emulator-threads-policy"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"ba5201f7_bf23f1bb","line":9,"updated":"2017-01-06 17:54:06.000000000","message":"s/pCPUs used for reserved to allow drivers to use them/pCPUs reserved for the hypervisor/","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"}],"nova/objects/instance_numa_topology.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5f22d80044c5a187b8bb8d35354b016c8841774","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":40,"context_line":"        if target_version \u003c (1, 4):"},{"line_number":41,"context_line":"            primitive.pop(\u0027cpus_overhead\u0027, None)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":44,"context_line":"            primitive.pop(\u0027cpu_policy\u0027, None)"},{"line_number":45,"context_line":"            primitive.pop(\u0027cpu_thread_policy\u0027, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_cf2fee9f","line":42,"updated":"2016-11-23 12:07:58.000000000","message":"nit: can you remove this extra space here","commit_id":"c11a3bf5d6c16aeedf543ae66073cf2789955dc9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5f22d80044c5a187b8bb8d35354b016c8841774","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    # Version 1.3: Add cpu_policy and cpu_thread_policy fields"},{"line_number":33,"context_line":"    # Version 1.4: Add cpus_overhead field"},{"line_number":34,"context_line":"    VERSION \u003d \u00271.4\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":37,"context_line":"        super(InstanceNUMACell, self).obj_make_compatible(primitive,"},{"line_number":38,"context_line":"                                                        target_version)"},{"line_number":39,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":40,"context_line":"        if target_version \u003c (1, 4):"},{"line_number":41,"context_line":"            primitive.pop(\u0027cpus_overhead\u0027, None)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":44,"context_line":"            primitive.pop(\u0027cpu_policy\u0027, None)"},{"line_number":45,"context_line":"            primitive.pop(\u0027cpu_thread_policy\u0027, None)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_efa74a4d","line":45,"range":{"start_line":35,"start_character":0,"end_line":45,"end_character":52},"updated":"2016-11-23 12:07:58.000000000","message":"Hmm, maybe you can ignore my comment on the prevent patch in this series - I could have sworn fields came first. Oh well","commit_id":"c11a3bf5d6c16aeedf543ae66073cf2789955dc9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5f22d80044c5a187b8bb8d35354b016c8841774","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_0f9566e3","line":58,"range":{"start_line":58,"start_character":9,"end_line":58,"end_character":22},"updated":"2016-11-23 12:07:58.000000000","message":"Could we call this \u0027cpuset_overhead\u0027 to tie it in as an extension of \u0027cpuset\u0027, which it is","commit_id":"c11a3bf5d6c16aeedf543ae66073cf2789955dc9"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"3b11b0e6b1169acf352457268b376b050dacbe80","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_cd136d5b","line":58,"in_reply_to":"5a74a57a_0f9566e3","updated":"2016-11-23 15:08:31.000000000","message":"I prefer cpus_overhead","commit_id":"c11a3bf5d6c16aeedf543ae66073cf2789955dc9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5f22d80044c5a187b8bb8d35354b016c8841774","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __init__(self, **kwargs):"},{"line_number":64,"context_line":"        super(InstanceNUMACell, self).__init__(**kwargs)"},{"line_number":65,"context_line":"        if \u0027pagesize\u0027 not in kwargs:"},{"line_number":66,"context_line":"            self.pagesize \u003d None"},{"line_number":67,"context_line":"            self.obj_reset_changes([\u0027pagesize\u0027])"},{"line_number":68,"context_line":"        if \u0027cpu_topology\u0027 not in kwargs:"},{"line_number":69,"context_line":"            self.cpu_topology \u003d None"},{"line_number":70,"context_line":"            self.obj_reset_changes([\u0027cpu_topology\u0027])"},{"line_number":71,"context_line":"        if \u0027cpu_pinning\u0027 not in kwargs:"},{"line_number":72,"context_line":"            self.cpu_pinning \u003d None"},{"line_number":73,"context_line":"            self.obj_reset_changes([\u0027cpu_pinning_raw\u0027])"},{"line_number":74,"context_line":"        if \u0027cpu_policy\u0027 not in kwargs:"},{"line_number":75,"context_line":"            self.cpu_policy \u003d None"},{"line_number":76,"context_line":"            self.obj_reset_changes([\u0027cpu_policy\u0027])"},{"line_number":77,"context_line":"        if \u0027cpu_thread_policy\u0027 not in kwargs:"},{"line_number":78,"context_line":"            self.cpu_thread_policy \u003d None"},{"line_number":79,"context_line":"            self.obj_reset_changes([\u0027cpu_thread_policy\u0027])"},{"line_number":80,"context_line":"        if \u0027cpus_overhead\u0027 not in kwargs:"},{"line_number":81,"context_line":"            self.cpus_overhead \u003d None"},{"line_number":82,"context_line":"            self.obj_reset_changes([\u0027cpus_overhead\u0027])"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def __len__(self):"},{"line_number":85,"context_line":"        return len(self.cpuset)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_8f0c1644","line":82,"range":{"start_line":65,"start_character":0,"end_line":82,"end_character":53},"updated":"2016-11-23 12:07:58.000000000","message":"side note: this is starting to become something that should be done in a loop","commit_id":"c11a3bf5d6c16aeedf543ae66073cf2789955dc9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46d953cc154c9183ce5878db46e3d2e32f07e263","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027cpu_topology\u0027: obj_fields.ObjectField(\u0027VirtCPUTopology\u0027,"},{"line_number":53,"context_line":"                                               nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027cpu_pinning_raw\u0027: obj_fields.DictOfIntegersField(nullable\u003dTrue),"},{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_6668d0bb","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":27},"updated":"2016-12-01 12:38:24.000000000","message":"Per comments on the previous patch, \u0027cpu_overhead_policy\u0027 should be stored here if we\u0027re being consistent for the sake of consistency (but only in that case - it might not even be necessary)","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f5eceb91e1c43714f724b573de8fea7856b6607f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \u0027cpu_pinning_raw\u0027: obj_fields.DictOfIntegersField(nullable\u003dTrue),"},{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_4a97d5eb","line":57,"in_reply_to":"3a71b18c_30f36375","updated":"2016-12-05 12:31:01.000000000","message":"Yup, when I think on it more that makes sense. No point in being foolishly consistent","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"829236f472a318c17111a96286d4241ee99a9a61","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \u0027cpu_pinning_raw\u0027: obj_fields.DictOfIntegersField(nullable\u003dTrue),"},{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_30f36375","line":57,"in_reply_to":"3a71b18c_6668d0bb","updated":"2016-12-01 15:23:22.000000000","message":"The reason why cpu_emulator_policy is stored in InstanceNUMATopolgy it\u0027s because it\u0027s a property related to the whole topology, we are not going to allow emulator threads to be isolated on certain NUMA nodes. (You can refer yourself at the spec). - In an other way to say that: It does not make any sense to duplicate that property for every guest NUMA nodes.","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"25303d302e874e7c60ce92bdcb4e1c7d1c1de051","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_4ef8bbc3","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":70},"updated":"2016-12-05 16:48:28.000000000","message":"Also, if we do end up keeping this, according to the spec there will only ever be one CPU for emulator threads. This being the case, this seems like it should be a nullable IntegerField rather than a SetOfIntegersField","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46d953cc154c9183ce5878db46e3d2e32f07e263","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_663a90cf","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":70},"updated":"2016-12-01 12:38:24.000000000","message":"I\u0027ve looked at this with fresh eyes too and I don\u0027t think we need/want to do this. In PS1, I suggested renaming this to \u0027cpuset_overhead\u0027, but in reality there\u0027s no need for a new field at all and we could simply squash this into \u0027cpuset\u0027 instead.\n\nThere is precedent for doing the above: it\u0027s exactly what we do for the \u0027isolate\u0027 CPU thread policy. In that case, all but one core of each thread sibling set on a HT-enabled host are not actually used by the instance but merely \u0027reserved\u0027 and tracked via the \u0027cpu_set\u0027 field. We take care to pin/unpin these \"reserved\" CPUs when we see the \u0027isolated\u0027 thread policy in effect, but from an accounting perspective the VM just used 2x as many cores (for an x86 platform) when \u0027isolate\u0027 is in effect. This also makes accounting a lot easier, as we don\u0027t need to account for new fields of any kind, essentially eliminating the need for 1/3 of the patches in this series. IMO, there\u0027s no reason *not* to do the exact same thing here.","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"616f9bd7d8eb9c4b0fb17d7b4d1d38876f2ea755","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_47a6e353","line":58,"in_reply_to":"3a71b18c_2551ead8","updated":"2016-12-05 15:59:59.000000000","message":"So what you want is to mix the pCPUs used to reserve emulator threads with the vCPUs of the topology by adding an additional vCPU in the index of cpuset. Basically for an instance requesting 4vCPUs to have 5vCPUs in the set. It not a good idea. a) You are going to break the topology since the topology should reflect the guest b) you are making wrong assumption saying that a vCPU is a pCPU. I\u0027m clearly against that idea.\n\nAbout your case with isolate thread policy, what you are saying is not really clear but I understand that you want to ensure that, using emulator threads is not going to break the rule of cpu_thread_policy\u003disolate. It\u0027s good point and I will keep in mind.","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"25303d302e874e7c60ce92bdcb4e1c7d1c1de051","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_a832270e","line":58,"in_reply_to":"3a71b18c_47a6e353","updated":"2016-12-05 16:48:28.000000000","message":"\u003e So what you want is to mix the pCPUs used to reserve emulator threads with the vCPUs of the topology by adding an additional vCPU in the index of cpuset. Basically for an instance requesting 4vCPUs to have 5vCPUs in the set. It not a good idea. a) You are going to break the topology since the topology should reflect the guest b) you are making wrong assumption saying that a vCPU is a pCPU. I\u0027m clearly against that idea.\n\nOh man, I was talking about the wrong field. Sorry :smacks head off wall: It\u0027s \u0027NUMACell.pinned_cpus\u0027 - not \u0027InstanceNUMACell.cpuset\u0027 - that I think could be storing the extra CPUs. It would look like this (untested!):\n\n    --- a/nova/virt/hardware.py\n    +++ b/nova/virt/hardware.py\n    @@ -1438,6 +1438,10 @@ def numa_usage_from_instances(host, instances, free\u003dFalse):\n                                 fields.CPUThreadAllocationPolicy.ISOLATE and\n                                 hostcell.siblings):\n                             cpu_usage_diff *\u003d max(map(len, hostcell.siblings))\n    +                    # emulator threads are always placed on instance node 0\n    +                    if (instance.isolate_emulator_threads\n    +                            and instance_cell.id \u003d\u003d 0):\n    +                        cpu_usage_diff +\u003d 1\n                         cpu_usage +\u003d sign * cpu_usage_diff\n\n                         if instancecell.pagesize and instancecell.pagesize \u003e 0:\n\nAssuming this would work, this would avoid having to change all our CPU accounting code, doesn\u0027t need new object versions, and is a really small change. The question is, do you think this could this work?","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f565cf9bb98599530846c79c8929f01745d8e0a4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_6c69e3f8","line":58,"in_reply_to":"3a71b18c_4ef8bbc3","updated":"2016-12-06 08:35:00.000000000","message":"Again, in your first comment you are making a wrong assumption which is to mix vCPUs and pCPUs. that fields pinned_cpus is to store the pCPUs which will be pinned to the vCPUs of the guest. Also, the code your are providing is to compute the usage whereas that field is needed to let the driver layer to know about where to pin the emulator threads...\n\nAbout your second point, it\u0027s not what we want since that field will be used to also store the pCPU used for I/O threads.","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"829236f472a318c17111a96286d4241ee99a9a61","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_8341533c","line":58,"in_reply_to":"3a71b18c_663a90cf","updated":"2016-12-01 15:23:22.000000000","message":"You made a wrong suggestion, the field \u0027cpuset\u0027 in InstanceNUMACell is intended to store the index of vCPUs used for a particular guest NUMA nodes whereas the field cpus_overheads are pCPUs.\n\nWhen need that field because the driver will have to pin the emulators threads on a free pCPUs which does not take part of the vCPUs.\n\n(You can refer yourself at the spec if you need more information)","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2cd5ac865a773fc4eb9ccfce0cf42e9c61405467","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_75a7e2bc","line":58,"in_reply_to":"3a71b18c_6c69e3f8","updated":"2016-12-06 09:25:40.000000000","message":"\u003e Again, in your first comment you are making a wrong assumption which is to mix vCPUs and pCPUs. that fields pinned_cpus is to store the pCPUs which will be pinned to the vCPUs of the guest.\n\nBut it\u0027s not just the pCPUs used as vCPUs that are stored here - we also stores vCPUs for the \u0027isolate\u0027 policy that aren\u0027t actually used by the guest, for example (i.e. they\u0027re not vCPUs)\n\n  https://github.com/openstack/nova/blob/427e0994/nova/objects/numa.py#L98-L110\n\nPerhaps you\u0027re thinking of InstanceNUMACell.cpuset? \n\n \u003e Also, the code your are providing is to compute the usage whereas that field is needed to let the driver layer to know about where to pin the emulator threads...\n\nThat\u0027s taken care of in a later patch (the one where you modify the \u0027_get_pinning\u0027 function.\n\nMaybe it would be easier for me to draft this up and show you?","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"8cf2222e6f9261042b97b8dda4c59cdb467f04dc","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_06cda684","line":58,"in_reply_to":"3a71b18c_75a7e2bc","updated":"2016-12-06 10:28:37.000000000","message":"I think it was clear enough on my last comment... What you are saying is that you want to store in that field an additional pCPU on the reserved pCPUs for the guest NUMA Topology (pinned or not to a vCPUs) then by some hacks pick one for the emulator thread. It\u0027s a totally bad design. \n\na) again and again we don\u0027t want to mix pCPUs related to vCPUs even more if they are reserved for any rules.\nb) you want to introduce hack to identify and pick one pCPUs on that field.\n\nCan we stay reasonable and stop losing time ? we use the concept of cpus overhead introduced in the driver, we are not going then to make it mixed to the guest topology. If that would have been the case, the spec would have defined that; requesting 5 vCPUs from the flavor so 4 vCPUs are going to be exposed to the guest and 1 \"vCPU\" for the emulator threads. And for that behavior I -2.","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f5eceb91e1c43714f724b573de8fea7856b6607f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_2551ead8","line":58,"in_reply_to":"3a71b18c_8341533c","updated":"2016-12-05 12:31:01.000000000","message":"\u003e You made a wrong suggestion, the field \u0027cpuset\u0027 in InstanceNUMACell is intended to store the index of vCPUs used for a particular guest NUMA nodes whereas the field cpus_overheads are pCPUs.\n \u003e When need that field because the driver will have to pin the emulators threads on a free pCPUs which does not take part of the vCPUs.\n\nI get what you\u0027re saying, but for the \u0027isolate\u0027 case I mentioned this isn\u0027t true. Take the following topology - a four core, single-socket, hyperthreaded CPU:\n\n  [ [0] [4] ]\n  [ [1] [5] ]\n  [ [2] [6] ]\n  [ [3] [7] ]\n\nIf I boot a instance with \u0027hw:cpu_thread_policy\u003disolate\u0027 and four CPUs, four of these pCPUs (0-3) will be used by the guest as vCPUs, while the other four pCPUs (4-7) will be reserved but not actually used by this or any other guest. The actual pinning is done by this code:\n\n  https://github.com/openstack/nova/blob/474c2ef/nova/objects/numa.py#L98-L110\n\nIs there a reason we couldn\u0027t adopt the same approach here?","commit_id":"46d8a81c7712aa43d45a0224b0aac94c90ce869e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"183927974c449186a89666ae1d92e4fbef563f3c","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            self.obj_reset_changes([\u0027cpu_thread_policy\u0027])"},{"line_number":80,"context_line":"        if \u0027cpus_overhead\u0027 not in kwargs:"},{"line_number":81,"context_line":"            self.cpus_overhead \u003d None"},{"line_number":82,"context_line":"            self.obj_reset_changes([\u0027cpus_overhead\u0027])"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def __len__(self):"},{"line_number":85,"context_line":"        return len(self.cpuset)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_53002266","line":82,"updated":"2016-12-06 20:02:51.000000000","message":"I would really like to see a patch to remove this non-standard behavior from this object. I objected to this when it was first added, and it\u0027s one of the reasons a previous attempt to automatically generate object history failed -- this behavior is drastically different from all the other DB-backed objects :(","commit_id":"b4b3cd3f2ebc9ea3e55b7b740837fac7835045af"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b82e227c29e4a84f03ec69b20f237d790c1053a9","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            self.obj_reset_changes([\u0027cpu_thread_policy\u0027])"},{"line_number":80,"context_line":"        if \u0027cpus_overhead\u0027 not in kwargs:"},{"line_number":81,"context_line":"            self.cpus_overhead \u003d None"},{"line_number":82,"context_line":"            self.obj_reset_changes([\u0027cpus_overhead\u0027])"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def __len__(self):"},{"line_number":85,"context_line":"        return len(self.cpuset)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_ffde3a3c","line":82,"in_reply_to":"3a71b18c_53002266","updated":"2016-12-07 09:54:32.000000000","message":"Dan, sure, let me try to work on it","commit_id":"b4b3cd3f2ebc9ea3e55b7b740837fac7835045af"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"beb4c39ed7455055ea7b167be527cbc1a14ec691","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da4df55a_997a1676","line":58,"updated":"2016-12-26 20:43:24.000000000","message":"At a minimum, I\u0027d like to see a code comment explaining what precisely this new field shall contain. Is it the number of physical CPU cores that will be used for the emulator threads?","commit_id":"92d3f80acd49b17de4e8d99fb5ff2d5d5391e637"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7eb53c4d330e8662a22a00d38305ac5dc3fcd5be","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027cpus_overhead\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da4df55a_916acab1","line":58,"in_reply_to":"da4df55a_997a1676","updated":"2016-12-28 08:34:01.000000000","message":"Exactly Jay, we should keep trace of the pCPU used to isolate emulator threads. But in future we will probably store here the pCPUs used of O/I threads. So I choose to use that generic term which is in relation in what we have in driver \u0027estimate_instance_overhead\u0027.","commit_id":"92d3f80acd49b17de4e8d99fb5ff2d5d5391e637"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2d6301128c5b5e61144513b9c08f2d96f5c3a237","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        # Field intended to store overhead pCPUs consumed by drivers"},{"line_number":59,"context_line":"        # (see: driver.estimate_instance_overhead)."},{"line_number":60,"context_line":"        \u0027cpus_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":61,"context_line":"    }"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_71537d17","line":59,"updated":"2017-01-06 17:54:06.000000000","message":"s/Field intended to store overhead pCPUs consumed by drivers/These physical CPUs are reserved for use by the hypervisor/","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9282a1a42f63f5bcda3d594af61ed47e5896fd11","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        # Field intended to store overhead pCPUs consumed by drivers"},{"line_number":59,"context_line":"        # (see: driver.estimate_instance_overhead)."},{"line_number":60,"context_line":"        \u0027cpus_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":61,"context_line":"    }"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_08f54682","line":59,"in_reply_to":"ba5201f7_71537d17","updated":"2017-01-10 10:36:06.000000000","message":"Done","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"433d0742918e122ceb0c0e65fe38965d32713c85","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    # Version 1.1: Takes into account pagesize"},{"line_number":152,"context_line":"    # Version 1.2: InstanceNUMACell 1.2"},{"line_number":153,"context_line":"    # Version 1.3: Add emulator threads policy"},{"line_number":154,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":157,"context_line":"        super(InstanceNUMATopology, self).obj_make_compatible(primitive,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_e9ee8f20","line":154,"updated":"2017-01-08 09:43:26.000000000","message":"I\u0027m not sure. Should we bump this version because of  InstanceNUMACell update?","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9282a1a42f63f5bcda3d594af61ed47e5896fd11","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    # Version 1.1: Takes into account pagesize"},{"line_number":152,"context_line":"    # Version 1.2: InstanceNUMACell 1.2"},{"line_number":153,"context_line":"    # Version 1.3: Add emulator threads policy"},{"line_number":154,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":157,"context_line":"        super(InstanceNUMATopology, self).obj_make_compatible(primitive,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_c8025e6f","line":154,"in_reply_to":"ba5201f7_e9ee8f20","updated":"2017-01-10 10:36:06.000000000","message":"We do not have to do such things since the concept of version manifest","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"eb1e3a3de4fa8322f527a627b95161ba9e610163","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":59,"context_line":"        \u0027cpus_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_bad271fe","line":59,"range":{"start_line":59,"start_character":9,"end_line":59,"end_character":22},"updated":"2017-01-11 16:07:37.000000000","message":"I wonder if \u0027cpuset_reserved\u0027 would make more sense here, given that we have cpuset above?","commit_id":"e9c5a241435d150ef0b1ae95d45e1b66fd740e19"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"2030722ddaa4052a8a9ed84c34b66764a9cfce50","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":59,"context_line":"        \u0027cpus_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a57fde8_55fc7c3e","line":59,"in_reply_to":"ba5201f7_bad271fe","updated":"2017-01-12 08:58:37.000000000","message":"I do not have strong opinion, cpus_reserved has been proposed by Jay and seems quite understandable. I don\u0027t want to lost engineering time on this so feel free to rework all the serie if you prefer cpuset.","commit_id":"e9c5a241435d150ef0b1ae95d45e1b66fd740e19"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"0a5069c24cda8ee75f37f91a01db120b07263c8b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":59,"context_line":"        \u0027cpus_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a3c09a3_42aaf4d5","line":59,"range":{"start_line":59,"start_character":9,"end_line":59,"end_character":22},"in_reply_to":"ba5201f7_bad271fe","updated":"2017-01-13 07:38:02.000000000","message":"Think the same, even reserved_cpuset IMO.","commit_id":"e9c5a241435d150ef0b1ae95d45e1b66fd740e19"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9a9999710fc4d524e335199dfc8194f4fc4e1e3f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":57,"context_line":"            nullable\u003dTrue),"},{"line_number":58,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":59,"context_line":"        \u0027cpus_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue),"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    cpu_pinning \u003d obj_fields.DictProxyField(\u0027cpu_pinning_raw\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a3905b3_416467e4","line":59,"updated":"2017-01-20 13:25:26.000000000","message":"Stephen had mentioned on a previous patchset possibly naming this cpuset_reserved in order to align with the cpuset field. If you respin, I think that\u0027s a good suggestion actually.","commit_id":"7b88c33628e02dcd84102f62c6b31d04595b6b38"}],"nova/tests/unit/objects/test_instance_numa_topology.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5f22d80044c5a187b8bb8d35354b016c8841774","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            ])"},{"line_number":190,"context_line":"        self.assertEqual(set([3, 7]), topology.cells[0].cpus_overhead)"},{"line_number":191,"context_line":"        self.assertEqual(set([9, 12]), topology.cells[1].cpus_overhead)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"class TestInstanceNUMATopology(test_objects._LocalTest,"},{"line_number":195,"context_line":"                               _TestInstanceNUMATopology):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_4fb03ede","line":192,"updated":"2016-11-23 12:07:58.000000000","message":"obj_make_compatible tests missing","commit_id":"c11a3bf5d6c16aeedf543ae66073cf2789955dc9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2d6301128c5b5e61144513b9c08f2d96f5c3a237","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            cells\u003d["},{"line_number":195,"context_line":"                objects.InstanceNUMACell("},{"line_number":196,"context_line":"                    id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512, pagesize\u003d2048,"},{"line_number":197,"context_line":"                    cpus_overhead\u003dset([3, 7])),"},{"line_number":198,"context_line":"                objects.InstanceNUMACell("},{"line_number":199,"context_line":"                    id\u003d1, cpuset\u003dset([3, 4]), memory\u003d512, pagesize\u003d2048,"},{"line_number":200,"context_line":"                    cpus_overhead\u003dset([9, 12]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_5177599f","line":197,"updated":"2017-01-06 17:54:06.000000000","message":"oops, wrong field name here :)","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"48dde9ed7b2c6cf8c1c28bba61981a249d8d49a4","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            cells\u003d["},{"line_number":195,"context_line":"                objects.InstanceNUMACell("},{"line_number":196,"context_line":"                    id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512, pagesize\u003d2048,"},{"line_number":197,"context_line":"                    cpus_overhead\u003dset([3, 7])),"},{"line_number":198,"context_line":"                objects.InstanceNUMACell("},{"line_number":199,"context_line":"                    id\u003d1, cpuset\u003dset([3, 4]), memory\u003d512, pagesize\u003d2048,"},{"line_number":200,"context_line":"                    cpus_overhead\u003dset([9, 12]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_99e6e6e6","line":197,"in_reply_to":"ba5201f7_083c662e","updated":"2017-01-10 11:26:25.000000000","message":"Really, __init__ accepts any kwargs due VersionedObject implementation. I thought it had some validation, but no.","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"433d0742918e122ceb0c0e65fe38965d32713c85","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            cells\u003d["},{"line_number":195,"context_line":"                objects.InstanceNUMACell("},{"line_number":196,"context_line":"                    id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512, pagesize\u003d2048,"},{"line_number":197,"context_line":"                    cpus_overhead\u003dset([3, 7])),"},{"line_number":198,"context_line":"                objects.InstanceNUMACell("},{"line_number":199,"context_line":"                    id\u003d1, cpuset\u003dset([3, 4]), memory\u003d512, pagesize\u003d2048,"},{"line_number":200,"context_line":"                    cpus_overhead\u003dset([9, 12]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_a9e1e72b","line":197,"in_reply_to":"ba5201f7_5177599f","updated":"2017-01-08 09:43:26.000000000","message":"+1","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9282a1a42f63f5bcda3d594af61ed47e5896fd11","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            cells\u003d["},{"line_number":195,"context_line":"                objects.InstanceNUMACell("},{"line_number":196,"context_line":"                    id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512, pagesize\u003d2048,"},{"line_number":197,"context_line":"                    cpus_overhead\u003dset([3, 7])),"},{"line_number":198,"context_line":"                objects.InstanceNUMACell("},{"line_number":199,"context_line":"                    id\u003d1, cpuset\u003dset([3, 4]), memory\u003d512, pagesize\u003d2048,"},{"line_number":200,"context_line":"                    cpus_overhead\u003dset([9, 12]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_083c662e","line":197,"in_reply_to":"ba5201f7_a9e1e72b","updated":"2017-01-10 10:36:06.000000000","message":"Weird to see the assertions to pass here..","commit_id":"2c085b6effcf08dce205ca5e49c11a3f6a8cd075"}]}
