Skip to content

Commit

Permalink
Switch to a striped lock for better concurrency.
Browse files Browse the repository at this point in the history
  • Loading branch information
brendanburns committed Sep 9, 2020
1 parent 5ff0c86 commit 6cbcfa7
Showing 1 changed file with 33 additions and 8 deletions.
41 changes: 33 additions & 8 deletions util/src/main/java/io/kubernetes/client/util/ModelMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import com.google.common.base.Strings;
import com.google.common.reflect.ClassPath;
import com.google.common.util.concurrent.Striped;
import io.kubernetes.client.Discovery;
import io.kubernetes.client.apimachinery.GroupVersionKind;
import io.kubernetes.client.apimachinery.GroupVersionResource;
Expand All @@ -29,6 +30,7 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
Expand Down Expand Up @@ -366,18 +368,41 @@ private static Pair<String, String> getApiVersion(String name) {
static class BiDirectionalMap<K, V> {
private Map<K, V> kvMap = new HashMap<>();
private Map<V, K> vkMap = new HashMap<>();

synchronized void add(K k, V v) {
kvMap.put(k, v);
vkMap.put(v, k);
private Striped<ReadWriteLock> lock =
Striped.readWriteLock(Runtime.getRuntime().availableProcessors() * 4);

void add(K k, V v) {
ReadWriteLock keyLock = lock.get(k);
ReadWriteLock valueLock = lock.get(v);
keyLock.writeLock().lock();
valueLock.writeLock().lock();
try {
kvMap.put(k, v);
vkMap.put(v, k);
} finally {
keyLock.writeLock().unlock();
valueLock.writeLock().unlock();
}
}

synchronized V getByK(K k) {
return kvMap.get(k);
V getByK(K k) {
ReadWriteLock l = lock.get(k);
l.readLock().lock();
try {
return kvMap.get(k);
} finally {
l.readLock().unlock();
}
}

synchronized K getByV(V v) {
return vkMap.get(v);
K getByV(V v) {
ReadWriteLock l = lock.get(v);
l.readLock().lock();
try {
return vkMap.get(v);
} finally {
l.readLock().unlock();
}
}
}
}

0 comments on commit 6cbcfa7

Please sign in to comment.