-
Notifications
You must be signed in to change notification settings - Fork 587
HDDS-8913. ContainerManagerImpl: reduce processing while locked #4967
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
...hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
Show resolved
Hide resolved
| return haManager; | ||
| } | ||
|
|
||
| private static List<ContainerID> filterSortAndLimit( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this could be made more efficient. The current algorithm takes the set, forms a new list of all elements. Then filters, sorted and returns the range.
Using an adaption of the priorityQueue technique here - https://www.baeldung.com/java-array-top-elements
We could avoid the copy from set to list, and the potentially large sort.
for (contaienrID cid : set) {
if (id > startID)
maxHeap.add(number);
if (maxHeap.size() > count) {
maxHeap.poll();
}
}
});
return new ArrayList<>(maxHeap);
// Might need reversed, I am not sure
I think this would be more memory efficient on large container sets, and should perform better than the full sort
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the suggestion, I'll update the patch with it.
FYI there is a bug in that solution due to PriorityQueue#iterator():
The iterator does not return the elements in any particular order.
so new ArrayList<>(maxHeap) randomizes the result.
It seems to work for (small?) Integers, but not for any random Comparable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder how many people have not noticed that issue, and just implemented the linked solution as is!
sodonnel
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM - Nice work making the topN generic for future usage!
|
Thanks @siddhantsangwan, @sodonnel for the review. |
* master: HDDS-8555. [Snapshot] When snapshot feature is disabled, block OM startup if there are still snapshots in the system (apache#4994) HDDS-8782. Improve Volume Scanner Health checks. (apache#4867) HDDS-8447. Datanodes should not process container deletes for failed volumes. (apache#4901) HDDS-5869. Added support for stream on S3Gateway write path (apache#4970) HDDS-8859. [Snapshot] Return failure message to client for a failed snapshot diff jobs (apache#4993) HDDS-8939. [Snapshot] isBlockLocationSame check should be skipped if object is not OmKeyInfo. (apache#4991) HDDS-8923. Expose XceiverClient cache stats as metrics (apache#4979) HDDS-8913. ContainerManagerImpl: reduce processing while locked (apache#4967) HDDS-8935. [Snapshot] Fallback to full diff if getDetlaFiles from compaction DAG fails (apache#4986) HDDS-8911. Update Hadoop to 3.3.6 (apache#4985) HDDS-8931. Allow EC PipelineChoosingPolicy to be defined separately from Ratis (apache#4983) HDDS-8895. Support dynamic change of ozone.readonly.administrators in SCM (apache#4977) HDDS-6814. Make OM service ID optional for `ozone s3` commands if only one is defined in config (apache#4953) HDDS-8925. BaseFreonGenerator may not complete if last attempts fail (apache#4975) HDDS-7100. Container scanner incorrectly marks containers unhealthy when DN is shutdown (apache#4951) HDDS-8919. Allow EC pipelines to be created and then added to PipelineManager in two steps (apache#4968) HDDS-8901. Enable mTLS for InterSCMGrpcProtocol. (apache#4964) Conflicts: hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Container.java hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainerCheck.java hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/ContainerTestUtils.java
What changes were proposed in this pull request?
ContainerManagerImpllock is intended only for write operations (see comment onlock).ContainerStateManagerImplhas its own read/write lock. EarlierConcurrentModificationException(HDDS-6314) happened becauseContainerStateManagerImplreturns an unmodifiable view of its internal sets. These are not thread-safe, only protect against changing the set. Replaced these withImmutableSet.copyOf.ContainerID: 0.getContainers(LifeCycleState), was missing previously.deleteContainer.Further improvement is possible, as some of the container sets are already sorted (to be done separately in HDDS-6315).
https://issues.apache.org/jira/browse/HDDS-8913
How was this patch tested?
CI:
https://github.com/adoroszlai/hadoop-ozone/actions/runs/5356645847