This is an automated email from the ASF dual-hosted git repository.

yjhjstz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/main by this push:
     new cff04912925 Fix inverted cpuset assignment in getCpuSetByRole()
cff04912925 is described below

commit cff04912925b404b09ff899e496301078b1b5b3e
Author: nix-oss <[email protected]>
AuthorDate: Sun Jul 26 09:28:39 2026 +0000

    Fix inverted cpuset assignment in getCpuSetByRole()
    
    Previously, the function returned the wrong cpuset for coordinator and
    segment roles when the cpuset string contained a semicolon separator
    (e.g., "0-7;0-15").
    
    - Coordinator now receives the first part (before ';')
    - Segment now receives the second part (after ';')
    - Added unit tests covering both branches with different values
    - Added Apache license header to the new test file
    
    Fixes #1862
---
 src/backend/commands/resgroupcmds.c           |  10 +-
 src/backend/commands/test/Makefile            |   5 +-
 src/backend/commands/test/resgroupcmds_test.c | 135 ++++++++++++++++++++++++++
 3 files changed, 146 insertions(+), 4 deletions(-)

diff --git a/src/backend/commands/resgroupcmds.c 
b/src/backend/commands/resgroupcmds.c
index 384675edb7f..3b325ba729c 100644
--- a/src/backend/commands/resgroupcmds.c
+++ b/src/backend/commands/resgroupcmds.c
@@ -1632,17 +1632,21 @@ getCpuSetByRole(const char *cpuset)
                splitcpuset = (char *)cpuset;
        else
        {
-               char *scpu = first + 1;
+               char *second = first + 1;
 
                /* Get result cpuset by IS_QUERY_DISPATCHER(), on master or 
segment */
                if (IS_QUERY_DISPATCHER())
-                       splitcpuset = scpu;
-               else
                {
                        char *mcpu = (char *)palloc0(sizeof(char) * 
MaxCpuSetLength);
                        strncpy(mcpu, cpuset, first - cpuset);
                        splitcpuset = mcpu;
                }
+               else
+               {
+                       char *scpu = (char *)palloc0(sizeof(char) * 
MaxCpuSetLength);
+                       strlcpy(scpu, second, MaxCpuSetLength);
+                       splitcpuset = scpu;
+               }
        }
 
        return splitcpuset;
diff --git a/src/backend/commands/test/Makefile 
b/src/backend/commands/test/Makefile
index 83bd803a23a..5ef9fed8894 100644
--- a/src/backend/commands/test/Makefile
+++ b/src/backend/commands/test/Makefile
@@ -2,7 +2,7 @@ subdir=src/backend/commands
 top_builddir=../../../..
 include $(top_builddir)/src/Makefile.global
 
-TARGETS=tablecmds
+TARGETS=tablecmds resgroupcmds
 
 include $(top_srcdir)/src/backend/mock.mk
 
@@ -10,3 +10,6 @@ tablecmds.t: \
        $(MOCK_DIR)/backend/access/aocs/aocs_compaction_mock.o \
        $(MOCK_DIR)/backend/access/hash/hash_mock.o \
        $(MOCK_DIR)/backend/utils/fmgr/fmgr_mock.o
+
+resgroupcmds.t: \
+       $(MOCK_DIR)/backend/utils/fmgr/fmgr_mock.o
diff --git a/src/backend/commands/test/resgroupcmds_test.c 
b/src/backend/commands/test/resgroupcmds_test.c
new file mode 100644
index 00000000000..2e7250104e4
--- /dev/null
+++ b/src/backend/commands/test/resgroupcmds_test.c
@@ -0,0 +1,135 @@
+/*-------------------------------------------------------------------------
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ * resgroupcmds_test.c
+ *
+ * IDENTIFICATION
+ *       src/backend/commands/test/resgroupcmds_test.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include "cmockery.h"
+
+#include "../resgroupcmds.c"
+
+/*
+ * Helper: simulate running on the coordinator (dispatcher).
+ */
+static void
+set_role_coordinator(void)
+{
+       GpIdentity.segindex = MASTER_CONTENT_ID;
+}
+
+/*
+ * Helper: simulate running on a segment.
+ */
+static void
+set_role_segment(void)
+{
+       GpIdentity.segindex = 0;
+}
+
+/*
+ * NULL input must raise an ERROR.
+ */
+static void
+test__getCpuSetByRole_null_input(void **state)
+{
+       PG_TRY();
+       {
+               getCpuSetByRole(NULL);
+               fail_msg("expected ereport(ERROR) for NULL cpuset");
+       }
+       PG_CATCH();
+       {
+               FlushErrorState();
+       }
+       PG_END_TRY();
+}
+
+/*
+ * cpuset without a separator: same value must be returned
+ * regardless of the role.
+ */
+static void
+test__getCpuSetByRole_no_separator(void **state)
+{
+       const char *input = "0-7";
+       char *result;
+
+       set_role_coordinator();
+       result = getCpuSetByRole(input);
+       assert_string_equal(result, "0-7");
+
+       set_role_segment();
+       result = getCpuSetByRole(input);
+       assert_string_equal(result, "0-7");
+}
+
+/*
+ * cpuset with a separator, called as coordinator:
+ * must return the part BEFORE the ';'.
+ */
+static void
+test__getCpuSetByRole_with_separator_as_coordinator(void **state)
+{
+       const char *input = "0-7;0-15";
+       char *result;
+
+       set_role_coordinator();
+       result = getCpuSetByRole(input);
+       assert_string_equal(result, "0-7");
+}
+
+/*
+ * cpuset with a separator, called as segment:
+ * must return the part AFTER the ';'.
+ */
+static void
+test__getCpuSetByRole_with_separator_as_segment(void **state)
+{
+       const char *input = "0-7;0-15";
+       char *result;
+
+       set_role_segment();
+       result = getCpuSetByRole(input);
+       assert_string_equal(result, "0-15");
+}
+
+int
+main(int argc, char *argv[])
+{
+       cmockery_parse_arguments(argc, argv);
+
+       const UnitTest tests[] = {
+               unit_test(test__getCpuSetByRole_null_input),
+               unit_test(test__getCpuSetByRole_no_separator),
+               unit_test(test__getCpuSetByRole_with_separator_as_coordinator),
+               unit_test(test__getCpuSetByRole_with_separator_as_segment)
+       };
+
+       MemoryContextInit();
+
+       return run_tests(tests);
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to