)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1184ffcbca52738634f9e475c2b39943e5a3186e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"hardware: Tweak the \u0027cpu_realtime_mask\u0027 handling slightly"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the end-user specifies a cpu_realtime_mask that does not begin"},{"line_number":10,"context_line":"with a carat (i.e. it is not a purely-exclusion mask) it\u0027s likely"},{"line_number":11,"context_line":"that they\u0027re expecting us to use the exact mask that they have"},{"line_number":12,"context_line":"specified, not realizing that we default to all-vCPUs-are-RT."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"bf51134e_18ff81ab","line":10,"range":{"start_line":10,"start_character":7,"end_line":10,"end_character":12},"updated":"2020-07-10 13:27:11.000000000","message":"caret. carat is the measurement of gold.","commit_id":"9fc63c764429c10f9041e6b53659e0cbd595bf6b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"956b2eaf566876679716955b141da56abc63eb87","unresolved":false,"context_lines":[{"line_number":7,"context_line":"hardware: Tweak the \u0027cpu_realtime_mask\u0027 handling slightly"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the end-user specifies a cpu_realtime_mask that does not begin"},{"line_number":10,"context_line":"with a carat (i.e. it is not a purely-exclusion mask) it\u0027s likely"},{"line_number":11,"context_line":"that they\u0027re expecting us to use the exact mask that they have"},{"line_number":12,"context_line":"specified, not realizing that we default to all-vCPUs-are-RT."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"bf51134e_ddcde65d","line":10,"range":{"start_line":10,"start_character":7,"end_line":10,"end_character":12},"in_reply_to":"bf51134e_18ff81ab","updated":"2020-07-13 11:13:16.000000000","message":"TIL","commit_id":"9fc63c764429c10f9041e6b53659e0cbd595bf6b"}],"doc/source/user/flavors.rst":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1184ffcbca52738634f9e475c2b39943e5a3186e","unresolved":false,"context_lines":[{"line_number":645,"context_line":""},{"line_number":646,"context_line":"  .. versionchanged:: 22.0.0 (Victoria)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"     Previously, the leading carat was necessary and omitting it would be"},{"line_number":649,"context_line":"     equivalent to not setting the mask, resulting in a failure to spawn"},{"line_number":650,"context_line":"     the instance."},{"line_number":651,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"bf51134e_d827c911","line":648,"range":{"start_line":648,"start_character":29,"end_line":648,"end_character":34},"updated":"2020-07-10 13:27:11.000000000","message":"caret","commit_id":"9fc63c764429c10f9041e6b53659e0cbd595bf6b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d417be5dac9221eb3e2664e16c48c87096a720b0","unresolved":false,"context_lines":[{"line_number":645,"context_line":""},{"line_number":646,"context_line":"  .. versionchanged:: 22.0.0 (Victoria)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"     Previously, the leading carat was necessary and omitting it would be"},{"line_number":649,"context_line":"     equivalent to not setting the mask, resulting in a failure to spawn"},{"line_number":650,"context_line":"     the instance."},{"line_number":651,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"bf51134e_dd24c60f","line":648,"range":{"start_line":648,"start_character":29,"end_line":648,"end_character":34},"in_reply_to":"bf51134e_d827c911","updated":"2020-07-13 11:16:29.000000000","message":"Done in a follow-up https://review.opendev.org/740670","commit_id":"9fc63c764429c10f9041e6b53659e0cbd595bf6b"}],"nova/api/validation/extra_specs/hw.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"12358f7c561c4dab67d48b792476c9f1b2befa8b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        ),"},{"line_number":37,"context_line":"        value\u003d{"},{"line_number":38,"context_line":"            \u0027type\u0027: str,"},{"line_number":39,"context_line":"            \u0027pattern\u0027: r\u0027(\\^)?\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":40,"context_line":"        },"},{"line_number":41,"context_line":"    ),"},{"line_number":42,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_1dcb4c53","line":39,"updated":"2020-07-06 07:01:35.000000000","message":"so we needn\u0027t this check anymore https://review.opendev.org/#/c/461456/17/nova/virt/hardware.py@1715 ?","commit_id":"5d56f44ee9338d9a76358042f1c6bde282f8a89f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"44203a4de9713b8ac4528d1ab1046d6cde9eda7b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        ),"},{"line_number":37,"context_line":"        value\u003d{"},{"line_number":38,"context_line":"            \u0027type\u0027: str,"},{"line_number":39,"context_line":"            \u0027pattern\u0027: r\u0027(\\^)?\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":40,"context_line":"        },"},{"line_number":41,"context_line":"    ),"},{"line_number":42,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_9401aa09","line":39,"in_reply_to":"bf51134e_1dcb4c53","updated":"2020-07-09 17:17:23.000000000","message":"We still need that check since it\u0027s changing behavior depending on whether this is specified or not","commit_id":"5d56f44ee9338d9a76358042f1c6bde282f8a89f"}],"nova/tests/unit/virt/test_hardware.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"90245c2941dd9e51072fbd6239f5e0f07ae0f20d","unresolved":false,"context_lines":[{"line_number":2921,"context_line":"        self.assertEqual(set([1, 2]), rt)"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"    def test_success_image_leading_space(self):"},{"line_number":2924,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d3, memory_mb\u003d2048,"},{"line_number":2925,"context_line":"                                extra_specs\u003d{})"},{"line_number":2926,"context_line":"        image \u003d objects.ImageMeta.from_dict("},{"line_number":2927,"context_line":"            {\"properties\": {\"hw_cpu_realtime_mask\": \" ^1\"}})"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_796ee32f","line":2924,"updated":"2017-05-22 13:52:50.000000000","message":"What would happen if flavor is requesting only 2 vCPUs here? I would say the test case it still going to pass which it\u0027s something we don\u0027t want.","commit_id":"00211da27f79e13daaba934389b28bb06fb9fdb2"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"d4da9724c788cf999b04117a81e5e9ca17fbd277","unresolved":false,"context_lines":[{"line_number":2921,"context_line":"        self.assertEqual(set([1, 2]), rt)"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"    def test_success_image_leading_space(self):"},{"line_number":2924,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d3, memory_mb\u003d2048,"},{"line_number":2925,"context_line":"                                extra_specs\u003d{})"},{"line_number":2926,"context_line":"        image \u003d objects.ImageMeta.from_dict("},{"line_number":2927,"context_line":"            {\"properties\": {\"hw_cpu_realtime_mask\": \" ^1\"}})"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_9d06ee51","line":2924,"in_reply_to":"ff0f0b1f_796ee32f","updated":"2017-05-24 15:56:04.000000000","message":"If the flavor is created with \"vcpus\u003d2\", the test fails because \"rt\" will be set([0]).\n\nIn the test below it would be possible for it to pass if the flavor only specifies 2 vCPUs because we don\u0027t validate the result of parse_cpu_spec() relative to flavor.vcpus.....but that\u0027d be easy to add if desired.","commit_id":"00211da27f79e13daaba934389b28bb06fb9fdb2"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"845008606d51ec23c6ebe1aa5c0849e7919d11c4","unresolved":false,"context_lines":[{"line_number":2921,"context_line":"        self.assertEqual(set([1, 2]), rt)"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"    def test_success_image_leading_space(self):"},{"line_number":2924,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d3, memory_mb\u003d2048,"},{"line_number":2925,"context_line":"                                extra_specs\u003d{})"},{"line_number":2926,"context_line":"        image \u003d objects.ImageMeta.from_dict("},{"line_number":2927,"context_line":"            {\"properties\": {\"hw_cpu_realtime_mask\": \" ^1\"}})"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_d0e2f29f","line":2924,"in_reply_to":"ff0f0b1f_9d06ee51","updated":"2017-05-25 09:13:13.000000000","message":"My comment was not really clear and more of that I was talking about the test \u0027test_success_image_no_exclusion\u0027. The problem I see is that it will be possible to have 0 non-RT vCPUs configured. but looking little bit more it\u0027s not really about your add and we have the same problem with the original implementation.","commit_id":"00211da27f79e13daaba934389b28bb06fb9fdb2"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7c9933aba5ee7097fafe27345f3f9a9876a4c585","unresolved":false,"context_lines":[{"line_number":2947,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d3, memory_mb\u003d2048,"},{"line_number":2948,"context_line":"                                extra_specs\u003d{})"},{"line_number":2949,"context_line":"        image \u003d objects.ImageMeta.from_dict("},{"line_number":2950,"context_line":"            {\"properties\": {\"hw_cpu_realtime_mask\": \"1-2\"}})"},{"line_number":2951,"context_line":"        rt \u003d hw.vcpus_realtime_topology(flavor, image)"},{"line_number":2952,"context_line":"        self.assertEqual(set([1, 2]), rt)"},{"line_number":2953,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_9cfb60bc","line":2950,"updated":"2017-10-03 11:31:17.000000000","message":"This test should not work","commit_id":"3dfb82825c4b78028cb68793a51e12c5c53a335b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7c9933aba5ee7097fafe27345f3f9a9876a4c585","unresolved":false,"context_lines":[{"line_number":2963,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d3, memory_mb\u003d2048,"},{"line_number":2964,"context_line":"                                extra_specs\u003d{})"},{"line_number":2965,"context_line":"        image \u003d objects.ImageMeta.from_dict("},{"line_number":2966,"context_line":"            {\"properties\": {\"hw_cpu_realtime_mask\": \"1-2,^1\"}})"},{"line_number":2967,"context_line":"        rt \u003d hw.vcpus_realtime_topology(flavor, image)"},{"line_number":2968,"context_line":"        self.assertEqual(set([2]), rt)"},{"line_number":2969,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_bc005cac","line":2966,"updated":"2017-10-03 11:31:17.000000000","message":"ditto","commit_id":"3dfb82825c4b78028cb68793a51e12c5c53a335b"}],"nova/virt/hardware.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"90245c2941dd9e51072fbd6239f5e0f07ae0f20d","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1257,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1258,"context_line":"    else:"},{"line_number":1259,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1260,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1261,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1262,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_995e5774","line":1259,"updated":"2017-05-22 13:52:50.000000000","message":"I don\u0027t think we want this, please consider my comment on test_hardware.py","commit_id":"00211da27f79e13daaba934389b28bb06fb9fdb2"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"7c366729442d87e5cac1c118e693294b7fbcef23","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1257,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1258,"context_line":"    else:"},{"line_number":1259,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1260,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1261,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1262,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_cb4fca32","line":1259,"in_reply_to":"ff0f0b1f_2b23ffa8","updated":"2017-05-25 23:13:09.000000000","message":"a) This isn\u0027t a problem with the original code since extra spaces are handled already.  It\u0027s only an issue in the context of my addition.\nb) This is a valid point, I\u0027m adding a followup patch to add validation.\nc) I would suggest that \"mask\" simply means \"bitmask\".  Thus \"hw_cpu_realtime_mask\" is reasonably interpreted as a bitmask of which vCPUs should be RT.  See for example the \"taskset\" command where \"mask\" is used to specify which CPUs a task can run on.","commit_id":"00211da27f79e13daaba934389b28bb06fb9fdb2"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"845008606d51ec23c6ebe1aa5c0849e7919d11c4","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1257,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1258,"context_line":"    else:"},{"line_number":1259,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1260,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1261,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1262,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_2b23ffa8","line":1259,"in_reply_to":"ff0f0b1f_7d5d5a45","updated":"2017-05-25 09:13:13.000000000","message":"I think we have 3 different problems here:\n\na) to strip the mask which is fixed by your change\nb) to ensure that when using RT, at least we have 1vCPU for RT and 1 for non-RT.\nc) discussing about to use a range instead of a mask. From my POV if that was the desire we would have called the option \"hw_cpu_realtime_set\" but if that is the only problem perhaps we could use your suggestion...\n\nWhat do you think about to push 3 different patches so it will be easy to review and discuss of them?","commit_id":"00211da27f79e13daaba934389b28bb06fb9fdb2"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"d4da9724c788cf999b04117a81e5e9ca17fbd277","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1257,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1258,"context_line":"    else:"},{"line_number":1259,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1260,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1261,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1262,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_7d5d5a45","line":1259,"in_reply_to":"ff0f0b1f_995e5774","updated":"2017-05-24 15:56:04.000000000","message":"You mean the change in general?  Is the issue that we don\u0027t validate that the resulting vcpus_rt is within the range of 0 to flavor.vcpus-1?  Because if so, the solution to that would be to add some validation.\n\nAs it stands, there is an implicit undocumented assumption that the specified mask is an exclusion mask.  This is what I\u0027m trying to fix, and I\u0027m open to any suggestions on how to accomplish it.","commit_id":"00211da27f79e13daaba934389b28bb06fb9fdb2"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7059d40076d58f03c006649e29116b191b0d9712","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1258,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1259,"context_line":"    else:"},{"line_number":1260,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1261,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1262,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bf091321_335c784a","line":1260,"updated":"2017-06-08 08:17:42.000000000","message":"In that patch you should just strip the mask, even if i\u0027m not sure that should be done here. probably we need to strip any value added to a flavor extra spec.\n\nThe part you have added to support different kinds of \"mask\" should be proposed in a separate patch.","commit_id":"47f6795dea03f7c81a9b0bea00527ee7ab49843b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"22fef1d1750fd659dfed357d39bb27faa65f5f99","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1258,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1259,"context_line":"    else:"},{"line_number":1260,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1261,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1262,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f201791_1a459943","line":1260,"in_reply_to":"5f201791_10839055","updated":"2017-06-25 07:50:33.000000000","message":"I understand that parse_cpu_spec() is going to strip the mask anyway.\n\nMy point is I think we should fix Nova to strip values added in flavor extra-specs instead of having a lot of \u0027strip()\u0027 everywhere. The other point is that I don\u0027t think we want the line 1260, we want only a mask on the set of the guest vCPUs.\n\nThat is why I asked you to put that patch at the end of the serie.\n\nBasically I think firstly we should fix Nova to strip every values added in extra-spec, then fix the validation of the mask to ensure that at least there is 1vCPU for best effort and then think about your proposal.","commit_id":"47f6795dea03f7c81a9b0bea00527ee7ab49843b"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"96b97b6e1bcee1cd0f468e52174cd0a98a2c999c","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1258,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1259,"context_line":"    else:"},{"line_number":1260,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1261,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1262,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f201791_72693af7","line":1260,"in_reply_to":"5f201791_1a459943","updated":"2017-06-26 16:30:26.000000000","message":"I\u0027ve moved the validation check to come before this...there\u0027s no reason for the validation code to depend on the stripping of extra-spec values.\n\nI suppose it could make sense for this patch to come after any global strip-extra-spec-values patch in order to avoid adding the strip here and then removing it again.  On the other hand we\u0027ll have to remove a number of calls to strip() so what\u0027s one more...\n\nAs for line 1260, I don\u0027t think it\u0027s at all obvious to end users that there is an implied \"all cpus are realtime, so exclude the ones you want to be non-realtime\".  To me \"hw:cpu_realtime_mask\" looks like it should mean \"specify the bitmask of the vCPUs that you want to be realtime\".\n\nIt is exactly analogous to the \"taskset\" command where you specify a bitmask of CPUs for a task to run on, or /proc/irq/0/smp_affinity which is a bitmask of which CPUs an interrupt can be handled on.\n\nIf we wanted it to mean \"exclude the cpus you want to be non-realtime\" then it should have been named \"hw:cpu_realtime_exclusion_mask\".","commit_id":"47f6795dea03f7c81a9b0bea00527ee7ab49843b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9d5362e6ad764e3e9bd058950e32ad321d75c12c","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1258,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1259,"context_line":"    else:"},{"line_number":1260,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1261,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1262,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f201791_931c8a78","line":1260,"in_reply_to":"5f201791_72693af7","updated":"2017-06-28 15:25:56.000000000","message":"I would say it\u0027s better to fix the current implementation before to add more complexity.","commit_id":"47f6795dea03f7c81a9b0bea00527ee7ab49843b"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"636017d35986aa23966087991bb6d733d0866b7b","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1258,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1259,"context_line":"    else:"},{"line_number":1260,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1261,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1262,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f201791_393c75df","line":1260,"in_reply_to":"5f201791_931c8a78","updated":"2017-06-28 16:20:52.000000000","message":"Can I get a review of the validation patch?  That should be uncontroversial.","commit_id":"47f6795dea03f7c81a9b0bea00527ee7ab49843b"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"d1d6d1ebb27297500c9fa3d96aa8749a4606e6e0","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1258,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1259,"context_line":"    else:"},{"line_number":1260,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1261,"context_line":"    if len(vcpus_rt) \u003c 1:"},{"line_number":1262,"context_line":"        raise exception.RealtimeMaskNotFoundOrInvalid()"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f201791_10839055","line":1260,"in_reply_to":"bf091321_335c784a","updated":"2017-06-21 20:15:53.000000000","message":"This code needs to strip the mask to see if it starts with \"^\" in order to decide how to handle it.\n\nparse_cpu_spec() already strips everything internally so there\u0027s no need to strip the mask that we pass it.  This *is* the patch to support different kinds of \"mask\".","commit_id":"47f6795dea03f7c81a9b0bea00527ee7ab49843b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"12b297e2171620344170c51464451058828c570f","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1259,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1260,"context_line":"    else:"},{"line_number":1261,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1262,"context_line":""},{"line_number":1263,"context_line":"    vcpus_set \u003d set(range(flavor.vcpus))"},{"line_number":1264,"context_line":"    vcpus_std \u003d vcpus_set - vcpus_rt"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_9c700042","line":1261,"updated":"2017-10-03 11:38:58.000000000","message":"The mask should be confined to the set of vCPUs, that set of vCPUs should *only* be provided by Nova. The only have the possibility to apply on mask on that set.","commit_id":"3dfb82825c4b78028cb68793a51e12c5c53a335b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f72d98f2ef80d3f2345b93636aebefb421734891","unresolved":false,"context_lines":[{"line_number":1717,"context_line":"    if mask.strip().startswith(\u0027^\u0027):"},{"line_number":1718,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"0-%d,%s\" % (flavor.vcpus - 1, mask))"},{"line_number":1719,"context_line":"    else:"},{"line_number":1720,"context_line":"        vcpus_rt \u003d parse_cpu_spec(\"%s\" % (mask))"},{"line_number":1721,"context_line":""},{"line_number":1722,"context_line":"    vcpus_set \u003d set(range(flavor.vcpus))"},{"line_number":1723,"context_line":"    vcpus_std \u003d vcpus_set - vcpus_rt"}],"source_content_type":"text/x-python","patch_set":7,"id":"df33271e_c72464c9","line":1720,"range":{"start_line":1720,"start_character":8,"end_line":1720,"end_character":48},"updated":"2020-03-26 03:20:59.000000000","message":"we change the syntax a little here. But I think those are invalid syntax. Like the flavor(vcpus\u003d3), the user set mask as \"0-1\", but the user got all the vcpus as realtime. so it is more like a bug. So we are good to change this.","commit_id":"b73fb401461cbb9cde1ae7913b447ec5662a659c"}]}
