This is an automated email from the ASF dual-hosted git repository.
aokolnychyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/master by this push:
new 9ecd9bfbc4 Core: Use regular map for partition wrappers in
DeleteFileIndex (#8264)
9ecd9bfbc4 is described below
commit 9ecd9bfbc493db07d4d06ea0e6344022f125f66a
Author: Anton Okolnychyi <[email protected]>
AuthorDate: Fri Aug 11 17:11:41 2023 -0700
Core: Use regular map for partition wrappers in DeleteFileIndex (#8264)
---
.../main/java/org/apache/iceberg/DeleteFileIndex.java | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/core/src/main/java/org/apache/iceberg/DeleteFileIndex.java
b/core/src/main/java/org/apache/iceberg/DeleteFileIndex.java
index 63fde28e3c..bf7bd89179 100644
--- a/core/src/main/java/org/apache/iceberg/DeleteFileIndex.java
+++ b/core/src/main/java/org/apache/iceberg/DeleteFileIndex.java
@@ -93,7 +93,7 @@ class DeleteFileIndex {
ImmutableMap.Builder<Integer, Types.StructType> builder =
ImmutableMap.builder();
specs.forEach((specId, spec) -> builder.put(specId, spec.partitionType()));
this.partitionTypeById = builder.build();
- this.wrapperById = Maps.newConcurrentMap();
+ this.wrapperById = wrappers(specs);
this.globalDeletes = globalDeletes;
this.deletesByPartition = deletesByPartition;
this.isEmpty = globalDeletes == null && deletesByPartition.isEmpty();
@@ -117,13 +117,20 @@ class DeleteFileIndex {
return deleteFiles;
}
- private StructLikeWrapper newWrapper(int specId) {
- return StructLikeWrapper.forType(partitionTypeById.get(specId));
+ // use HashMap with precomputed values instead of thread-safe collections
loaded on demand
+ // as the cache is being accessed for each data file and the lookup speed is
critical
+ private Map<Integer, ThreadLocal<StructLikeWrapper>> wrappers(Map<Integer,
PartitionSpec> specs) {
+ Map<Integer, ThreadLocal<StructLikeWrapper>> wrappers = Maps.newHashMap();
+ specs.forEach((specId, spec) -> wrappers.put(specId, newWrapper(specId)));
+ return wrappers;
+ }
+
+ private ThreadLocal<StructLikeWrapper> newWrapper(int specId) {
+ return ThreadLocal.withInitial(() ->
StructLikeWrapper.forType(partitionTypeById.get(specId)));
}
private Pair<Integer, StructLikeWrapper> partition(int specId, StructLike
struct) {
- ThreadLocal<StructLikeWrapper> wrapper =
- wrapperById.computeIfAbsent(specId, id -> ThreadLocal.withInitial(()
-> newWrapper(id)));
+ ThreadLocal<StructLikeWrapper> wrapper = wrapperById.get(specId);
return Pair.of(specId, wrapper.get().set(struct));
}