Sreeja created HDDS-15305:
-----------------------------

             Summary: ozone admin container list --all returns duplicate 
containers due to sort/pagination key mismatch in SCM
                 Key: HDDS-15305
                 URL: https://issues.apache.org/jira/browse/HDDS-15305
             Project: Apache Ozone
          Issue Type: Bug
            Reporter: Sreeja
            Assignee: Sreeja


The *ozone admin container list --all* command produces duplicate container 
entries in its output. The duplicates are non-deterministic across runs, which 
containers are duplicated depends on the order in which the SCM returns them, 
which can vary.

Root Cause: 
The bug is a mismatch between the server-side sort key and the client-side 
pagination key Server side (SCMClientProtocolServer.listContainerInternal):The 
method filters containers by containerID >= startContainerID, then calls 
.sorted() which invokes ContainerInfo.compareTo(). That comparator is defined 
as:
 
{code:java}
private static final Comparator<ContainerInfo> COMPARATOR = 
Comparator.comparingLong(info -> info.getLastUsed().toEpochMilli());  {code}
So the batch is returned sorted by lastUsed timestamp, not by containerID.

Client side (ListSubcommand.listAllContainers): The pagination loop advances 
the cursor using the last returned element's container ID.
This assumes the last element of the batch has the highest container ID. That 
is only true if the batch is sorted by container ID. Since it is actually 
sorted by lastUsed, the last element can have a lower container ID than other 
elements already in the same batch.
 
Example: With batch size 40, a batch may return containers with IDs [..., 41, 
42, 44, 40] (sorted by lastUsed). The cursor is set to 40 + 1 = 41. The next 
batch fetches containers with containerID >= 41, returning [41, 42, 43, 44, 45, 
...] — re-fetching 41, 42, and 44.
 
Fix : 
In SCMClientProtocolServer.listContainerInternal, replace the lastUsed-based 
sort with a containerID-based sort, aligning the sort key with the pagination 
key:
{code:java}
.sorted(Comparator.comparing(ContainerInfo::containerID)){code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to