This is an automated email from the ASF dual-hosted git repository.
blue 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 d1fd2a7 Make CharSequenceSet thread safe (#1165)
d1fd2a7 is described below
commit d1fd2a780b2847d2cbd6f09dfdfa690716a43ba6
Author: Ryan Blue <[email protected]>
AuthorDate: Mon Jul 6 10:59:35 2020 -0700
Make CharSequenceSet thread safe (#1165)
---
.../main/java/org/apache/iceberg/util/CharSequenceSet.java | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/api/src/main/java/org/apache/iceberg/util/CharSequenceSet.java
b/api/src/main/java/org/apache/iceberg/util/CharSequenceSet.java
index 96d39f8..5148191 100644
--- a/api/src/main/java/org/apache/iceberg/util/CharSequenceSet.java
+++ b/api/src/main/java/org/apache/iceberg/util/CharSequenceSet.java
@@ -29,6 +29,9 @@ import
org.apache.iceberg.relocated.com.google.common.collect.Iterators;
import org.apache.iceberg.relocated.com.google.common.collect.Sets;
public class CharSequenceSet implements Set<CharSequence>, Serializable {
+ private static final ThreadLocal<CharSequenceWrapper> wrappers =
ThreadLocal.withInitial(
+ () -> CharSequenceWrapper.wrap(null));
+
public static Set<CharSequence> of(Iterable<CharSequence> charSequences) {
return new CharSequenceSet(charSequences);
}
@@ -38,7 +41,6 @@ public class CharSequenceSet implements Set<CharSequence>,
Serializable {
}
private final Set<CharSequenceWrapper> wrapperSet;
- private final CharSequenceWrapper containsWrapper =
CharSequenceWrapper.wrap(null);
private CharSequenceSet(Iterable<CharSequence> charSequences) {
this.wrapperSet = Sets.newHashSet(Iterables.transform(charSequences,
CharSequenceWrapper::wrap));
@@ -57,7 +59,10 @@ public class CharSequenceSet implements Set<CharSequence>,
Serializable {
@Override
public boolean contains(Object obj) {
if (obj instanceof CharSequence) {
- return wrapperSet.contains(containsWrapper.set((CharSequence) obj));
+ CharSequenceWrapper wrapper = wrappers.get();
+ boolean result = wrapperSet.contains(wrapper.set((CharSequence) obj));
+ wrapper.set(null); // don't hold a reference to the value
+ return result;
}
return false;
}
@@ -102,7 +107,10 @@ public class CharSequenceSet implements Set<CharSequence>,
Serializable {
@Override
public boolean remove(Object obj) {
if (obj instanceof CharSequence) {
- return wrapperSet.remove(containsWrapper.set((CharSequence) obj));
+ CharSequenceWrapper wrapper = wrappers.get();
+ boolean result = wrapperSet.remove(wrapper.set((CharSequence) obj));
+ wrapper.set(null); // don't hold a reference to the value
+ return result;
}
return false;
}