From f04ac8d38018ce5a72d737b99fc3717f47878feb Mon Sep 17 00:00:00 2001 From: Alberto Rios Date: Thu, 30 Jan 2020 18:01:04 +0100 Subject: [PATCH] Replacing InMemory Map data structure To avoid blocking from time to time: #313 this commit replaces the Map implementation by a ConcurrentSkipListMap, it might not be the most efficient way to store this information, but, considering the order of magnitude we are dealing with and, the fact that the reading time is around logaritmic, should be good enough for this use case. [Finishes #313] --- ...moryServiceInstanceBindingStateRepository.java | 15 +++++++++------ .../InMemoryServiceInstanceStateRepository.java | 4 ++-- ...ServiceInstanceBindingStateRepositoryTest.java | 3 --- ...nMemoryServiceInstanceStateRepositoryTest.java | 3 --- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepository.java b/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepository.java index 25cb21b..67f7eaf 100644 --- a/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepository.java +++ b/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepository.java @@ -20,18 +20,15 @@ import java.sql.Timestamp; import java.time.Instant; import java.util.Map; import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; import reactor.core.publisher.Mono; import org.springframework.cloud.servicebroker.model.instance.OperationState; -/** - * @author Roy Clarkson - */ public class InMemoryServiceInstanceBindingStateRepository implements ServiceInstanceBindingStateRepository { - private final Map states = new ConcurrentHashMap<>(); + private final Map states = new ConcurrentSkipListMap<>(); @Override public Mono saveState(String serviceInstanceId, String bindingId, OperationState state, @@ -76,7 +73,7 @@ public class InMemoryServiceInstanceBindingStateRepository implements ServiceIns return Mono.fromCallable(() -> this.states.containsKey(bindingKey)); } - private static class BindingKey { + private static class BindingKey implements Comparable { private final String serviceInstanceId; @@ -121,6 +118,12 @@ public class InMemoryServiceInstanceBindingStateRepository implements ServiceIns '}'; } + @Override + public int compareTo(BindingKey other) { + int compare = this.serviceInstanceId.compareTo(other.serviceInstanceId); + return compare == 0 ? this.bindingId.compareTo(other.bindingId) : compare; + } + } } diff --git a/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepository.java b/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepository.java index 72bf3b9..3bdf0f1 100644 --- a/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepository.java +++ b/spring-cloud-app-broker-core/src/main/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepository.java @@ -19,7 +19,7 @@ package org.springframework.cloud.appbroker.state; import java.sql.Timestamp; import java.time.Instant; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; import reactor.core.publisher.Mono; @@ -27,7 +27,7 @@ import org.springframework.cloud.servicebroker.model.instance.OperationState; public class InMemoryServiceInstanceStateRepository implements ServiceInstanceStateRepository { - private final Map states = new ConcurrentHashMap<>(); + private final Map states = new ConcurrentSkipListMap<>(); @Override public Mono saveState(String serviceInstanceId, OperationState state, String description) { diff --git a/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepositoryTest.java b/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepositoryTest.java index 0a1f904..9cfeb36 100644 --- a/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepositoryTest.java +++ b/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceBindingStateRepositoryTest.java @@ -19,7 +19,6 @@ package org.springframework.cloud.appbroker.state; import java.util.Calendar; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; @@ -29,8 +28,6 @@ import org.springframework.cloud.servicebroker.model.instance.OperationState; import static org.assertj.core.api.Assertions.assertThat; -@Disabled -// See https://github.com/spring-cloud/spring-cloud-app-broker/issues/313 class InMemoryServiceInstanceBindingStateRepositoryTest { private InMemoryServiceInstanceBindingStateRepository stateRepository; diff --git a/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepositoryTest.java b/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepositoryTest.java index 0cca5a0..793830a 100644 --- a/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepositoryTest.java +++ b/spring-cloud-app-broker-core/src/test/java/org/springframework/cloud/appbroker/state/InMemoryServiceInstanceStateRepositoryTest.java @@ -19,7 +19,6 @@ package org.springframework.cloud.appbroker.state; import java.util.Calendar; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; @@ -29,8 +28,6 @@ import org.springframework.cloud.servicebroker.model.instance.OperationState; import static org.assertj.core.api.Assertions.assertThat; -@Disabled -// See https://github.com/spring-cloud/spring-cloud-app-broker/issues/313 class InMemoryServiceInstanceStateRepositoryTest { private InMemoryServiceInstanceStateRepository stateRepository;