nix-oss opened a new issue, #1862:
URL: https://github.com/apache/cloudberry/issues/1862

   ### Apache Cloudberry version
   
   2.1.0-incubating
   
   ### What happened
   
   Location: `src/backend/commands/resgroupcmds.c`
   Function `getCpuSetByRole()`
   Lines: 1618–1649.
   
   The `getCpuSetByRole()` function in `src/backend/commands/resgroupcmds.c` 
was returning cpuset values for the wrong roles.
   
   ```c
    * Seperate cpuset by coordinator and segment
    * Return as splitcpuset
    *
    * ex:
    * cpuset = "1;4"
    * then we should assign '1' to corrdinator and '4' to segment
    * 
    * cpuset = "1"
    * assign '1' to both coordinator and segment
    */
   extern char *
   getCpuSetByRole(const char *cpuset)
   {
        char *splitcpuset = NULL;
   
        if (cpuset == NULL)
        {
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                errmsg("Unexpected cpuset invalid in 
getCpuSetByRole")));
        }
   
        char *first = strchr(cpuset, ';');
        if (first == NULL)
                splitcpuset = (char *)cpuset;
        else
        {
                char *scpu = 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;
                }
        }
   
        return splitcpuset;
   }
   ```
   
   This bug manifests in heterogeneous Cloudberry clusters where the 
coordinator and segment nodes have different numbers of CPU cores.
   The issue becomes visible only when the core counts differ; on homogeneous 
clusters the swapped values would be identical and the bug would go unnoticed.
   
   When the function receives a cpuset string formatted as 
"coordinator_cpus;segment_cpus" (e.g., "0-7;0-15" where coordinator has 8 cores 
and segments have 16 cores), it should return:
   
   - coordinator cpuset (first part) when called from the coordinator 
(dispatcher),
   - segment cpuset (second part) when called from segments.
   
   However, the logic was inverted – it returned the opposite value for each 
role, causing incorrect CPU affinity assignment.
   
   ### What you think should happen instead
   
   Currently, the assignments are inverted. The fix is to swap the logic so 
that the coordinator gets `mcpu `and the segment gets `scpu`:
   
   
   ```c
    * Seperate cpuset by coordinator and segment
    * Return as splitcpuset
    *
    * ex:
    * cpuset = "1;4"
    * then we should assign '1' to corrdinator and '4' to segment
    * 
    * cpuset = "1"
    * assign '1' to both coordinator and segment
    */
   extern char *
   getCpuSetByRole(const char *cpuset)
   {
        char *splitcpuset = NULL;
   
        if (cpuset == NULL)
        {
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                errmsg("Unexpected cpuset invalid in 
getCpuSetByRole")));
        }
   
        char *first = strchr(cpuset, ';');
        if (first == NULL)
                splitcpuset = (char *)cpuset;
        else
        {
                char *scpu = first + 1;
   
                /* Get result cpuset by IS_QUERY_DISPATCHER(), on master or 
segment */
                if (IS_QUERY_DISPATCHER())
                {
                        char *mcpu = (char *)palloc0(sizeof(char) * 
MaxCpuSetLength);
                        strncpy(mcpu, cpuset, first - cpuset);
                        splitcpuset = mcpu;
                }
                else
               splitcpuset = scpu;
        }
   
        return splitcpuset;
   }
   ```
   
   
   
   ### How to reproduce
   
   **Prerequisites**:
   A heterogeneous Cloudberry cluster with:
   
   - 1 coordinator node – 8 vCPUs (cores 0–7)
   - 2 segment nodes – 18 vCPUs each (cores 0–17)
   
   **Steps**:
   
   1. Connect to the coordinator node via psql.
   2. Create a resource group (or alter an existing one) with a cpuset that 
includes both coordinator and segment CPU ranges, separated by a semicolon: 
`ALTER RESOURCE GROUP rgroup1 SET CPUSET '4-7;9-17';`
   3. The command will fail with an error similar to: `cpu cores %s are 
unavailable on the system`
   
   I'm currently trying to fix it and rebuilding the code locally to verify the 
changes.
   
   I hope the details I've provided above (root cause, reproduction steps, and 
proposed fix) will be helpful
   
   
   ### Operating System
   
   Ubuntu 22.04
   
   ### Anything else
   
   _No response_
   
   ### Are you willing to submit PR?
   
   - [ ] Yes, I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's [Code of 
Conduct](https://github.com/apache/cloudberry/blob/main/CODE_OF_CONDUCT.md).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to