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;
   }

Reply via email to