Skip to content

Commit f965490

Browse files
authored
Merge pull request ehcache#3230 from ehcache/feature/arc
ARC for Heap, OffHeap and Disk Resources
2 parents 561af43 + cd2d431 commit f965490

File tree

209 files changed

+8729
-3879
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

209 files changed

+8729
-3879
lines changed

clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ public int rank(Set<ResourceType<?>> resourceTypes, Collection<ServiceConfigurat
345345
}
346346

347347
@Override
348-
public int rankAuthority(ResourceType<?> authorityResource, Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
348+
public int rankAuthority(Set<ResourceType<?>> authorityResource, Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
349349
int parentRank = super.rankAuthority(authorityResource, serviceConfigs);
350350
if (parentRank == 0 || serviceConfigs.stream().noneMatch(CacheLoaderWriterConfiguration.class::isInstance)) {
351351
return 0;

clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/DelegatingLoaderWriterStore.java

Lines changed: 0 additions & 143 deletions
This file was deleted.

clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/DelegatingLoaderWriterStoreProvider.java

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,33 @@
1717

1818
import org.ehcache.clustered.client.service.ClusteringService;
1919
import org.ehcache.clustered.client.service.ClusteringService.ClusteredCacheIdentifier;
20-
import org.ehcache.config.ResourceType;
2120
import org.ehcache.core.spi.store.AbstractWrapperStoreProvider;
2221
import org.ehcache.core.spi.store.Store;
2322
import org.ehcache.spi.loaderwriter.CacheLoaderWriterConfiguration;
2423
import org.ehcache.spi.loaderwriter.CacheLoaderWriterProvider;
2524
import org.ehcache.spi.service.ServiceConfiguration;
2625
import org.ehcache.spi.service.ServiceDependencies;
27-
import java.util.Collection;
28-
import java.util.Set;
29-
30-
import static org.ehcache.core.spi.service.ServiceUtils.findSingletonAmongst;
3126

3227
@ServiceDependencies({CacheLoaderWriterProvider.class, ClusteringService.class})
3328
public class DelegatingLoaderWriterStoreProvider extends AbstractWrapperStoreProvider {
3429

30+
@SuppressWarnings({"rawtypes", "unchecked"})
31+
public DelegatingLoaderWriterStoreProvider() {
32+
super((Class) CacheLoaderWriterConfiguration.class, ClusteredCacheIdentifier.class);
33+
}
34+
3535
@Override
36-
protected <K, V> Store<K, V> wrap(Store<K, V> store, Store.Configuration<K, V> storeConfig, ServiceConfiguration<?, ?>... serviceConfigs) {
37-
DelegatingLoaderWriterStore<K, V> loaderWriterStore = new DelegatingLoaderWriterStore<>(store);
38-
return loaderWriterStore;
36+
protected int wrapperRank() {
37+
return 2;
3938
}
4039

4140
@Override
42-
public int rank(Set<ResourceType<?>> resourceTypes, Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
43-
throw new UnsupportedOperationException("Its a Wrapper store provider, does not support regular ranking");
41+
protected int wrapperPriority() {
42+
return super.wrapperPriority() + 1;
4443
}
4544

4645
@Override
47-
public int wrapperStoreRank(Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
48-
CacheLoaderWriterConfiguration<?> loaderWriterConfiguration = findSingletonAmongst(CacheLoaderWriterConfiguration.class, serviceConfigs);
49-
ClusteredCacheIdentifier clusteredCacheIdentifier = findSingletonAmongst(ClusteredCacheIdentifier.class, serviceConfigs);
50-
if (clusteredCacheIdentifier != null && loaderWriterConfiguration != null) {
51-
return 3;
52-
}
53-
return 0;
46+
protected <K, V> Store<K, V> wrap(Store<K, V> store, Store.Configuration<K, V> storeConfig, ServiceConfiguration<?, ?>... serviceConfigs) {
47+
return store;
5448
}
5549
}

clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ public int rank(Set<ResourceType<?>> resourceTypes, Collection<ServiceConfigurat
320320
}
321321

322322
@Override
323-
public int rankAuthority(ResourceType<?> authorityResource, Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
323+
public int rankAuthority(Set<ResourceType<?>> authorityResource, Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
324324
int parentRank = super.rankAuthority(authorityResource, serviceConfigs);
325325
if (parentRank == 0 || serviceConfigs.stream().noneMatch(WriteBehindConfiguration.class::isInstance)) {
326326
return 0;

clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/service/ClusteredStateHolder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,8 @@ public V putIfAbsent(final K key, final V value) {
9090
return valueCodec.decode(response);
9191
}
9292

93+
@Override
94+
public boolean remove(final K key, final V value) {
95+
return (Boolean) getResponse(messageFactory.removeMessage(keyCodec.encode(key), valueCodec.encode(value)), true);
96+
}
9397
}

clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/service/DefaultClusteringService.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import org.ehcache.clustered.client.service.EntityService;
3636
import org.ehcache.clustered.common.Consistency;
3737
import org.ehcache.clustered.common.internal.ServerStoreConfiguration;
38-
import org.ehcache.config.CacheConfiguration;
38+
import org.ehcache.config.ResourcePool;
3939
import org.ehcache.config.ResourceType;
4040
import org.ehcache.core.spi.store.Store;
4141
import org.ehcache.spi.persistence.StateRepository;
@@ -65,6 +65,8 @@ public class DefaultClusteringService implements ClusteringService, EntityServic
6565

6666
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultClusteringService.class);
6767

68+
static final String CACHE_MANAGER_SHARED_RESOURCES = "CacheManagerSharedResources";
69+
6870
static final String CONNECTION_PREFIX = "Ehcache:";
6971

7072
private final ClusteringServiceConfiguration configuration;
@@ -169,7 +171,16 @@ public boolean handlesResourceType(ResourceType<?> resourceType) {
169171
}
170172

171173
@Override
172-
public PersistenceSpaceIdentifier<?> getPersistenceSpaceIdentifier(String name, CacheConfiguration<?, ?> config) {
174+
public PersistenceSpaceIdentifier<ClusteringService> getPersistenceSpaceIdentifier(String name, ResourcePool resource) {
175+
return getPersistenceSpaceIdentifier(name);
176+
}
177+
178+
@Override
179+
public PersistenceSpaceIdentifier<ClusteringService> getSharedPersistenceSpaceIdentifier(ResourcePool resource) {
180+
return getPersistenceSpaceIdentifier(CACHE_MANAGER_SHARED_RESOURCES);
181+
}
182+
183+
private PersistenceSpaceIdentifier<ClusteringService> getPersistenceSpaceIdentifier(String name) {
173184
ClusteredSpace clusteredSpace = knownPersistenceSpaces.get(name);
174185
if(clusteredSpace != null) {
175186
return clusteredSpace.identifier;

clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/store/ClusteredStore.java

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@
6666
import org.ehcache.expiry.ExpiryPolicy;
6767
import org.ehcache.impl.store.DefaultStoreEventDispatcher;
6868
import org.ehcache.impl.store.HashUtils;
69-
import org.ehcache.spi.persistence.StateRepository;
70-
import org.ehcache.spi.serialization.Serializer;
71-
import org.ehcache.spi.serialization.StatefulSerializer;
7269
import org.ehcache.spi.service.OptionalServiceDependencies;
7370
import org.ehcache.spi.service.Service;
7471
import org.ehcache.spi.service.ServiceConfiguration;
@@ -757,17 +754,6 @@ private void initStoreInternal(Store<?, ?> resource) throws CachePersistenceExce
757754
CompletableFuture.runAsync(reconnectTask, executionService.getUnorderedExecutor(null, new LinkedBlockingQueue<>()));
758755
});
759756
clusteredStore.setStoreProxy(reconnectingServerStoreProxy);
760-
761-
Serializer<?> keySerializer = clusteredStore.codec.getKeySerializer();
762-
if (keySerializer instanceof StatefulSerializer) {
763-
StateRepository stateRepository = clusteringService.getStateRepositoryWithin(cacheIdentifier, cacheIdentifier.getId() + "-Key");
764-
((StatefulSerializer) keySerializer).init(stateRepository);
765-
}
766-
Serializer<?> valueSerializer = clusteredStore.codec.getValueSerializer();
767-
if (valueSerializer instanceof StatefulSerializer) {
768-
StateRepository stateRepository = clusteringService.getStateRepositoryWithin(cacheIdentifier, cacheIdentifier.getId() + "-Value");
769-
((StatefulSerializer) valueSerializer).init(stateRepository);
770-
}
771757
} finally {
772758
connectLock.unlock();
773759
}
@@ -883,12 +869,8 @@ public int rank(final Set<ResourceType<?>> resourceTypes, final Collection<Servi
883869
}
884870

885871
@Override
886-
public int rankAuthority(ResourceType<?> authorityResource, Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
887-
if (clusteringService == null) {
888-
return 0;
889-
} else {
890-
return CLUSTER_RESOURCES.contains(authorityResource) ? 1 : 0;
891-
}
872+
public int rankAuthority(Set<ResourceType<?>> authorityResource, Collection<ServiceConfiguration<?, ?>> serviceConfigs) {
873+
return rank(authorityResource, serviceConfigs);
892874
}
893875

894876
@Override
@@ -915,7 +897,7 @@ public void stop() {
915897
}
916898

917899
@Override
918-
public <K, V> AuthoritativeTier<K, V> createAuthoritativeTier(Configuration<K, V> storeConfig, ServiceConfiguration<?, ?>... serviceConfigs) {
900+
public <K, V> AuthoritativeTier<K, V> createAuthoritativeTier(Set<ResourceType<?>> resourceTypes, Configuration<K, V> storeConfig, ServiceConfiguration<?, ?>... serviceConfigs) {
919901
ClusteredStore<K, V> authoritativeTier = createStoreInternal(storeConfig, serviceConfigs);
920902

921903
tierOperationStatistics.put(authoritativeTier, new OperationStatistic<?>[] {

clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStoreProviderTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,14 @@ public void testAuthoritativeRank() {
6565
ServiceLocator serviceLocator = dependencySet().with(mock(ClusteringService.class)).build();
6666
provider.start(serviceLocator);
6767

68-
assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED,
68+
assertThat(provider.rankAuthority(Collections.singleton(ClusteredResourceType.Types.DEDICATED),
6969
Collections.singletonList(cacheLoaderWriterConfiguration)),
70-
is(2));
71-
assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED, Collections.emptyList()),
70+
is(3));
71+
assertThat(provider.rankAuthority(Collections.singleton(ClusteredResourceType.Types.DEDICATED),
72+
Collections.emptyList()),
7273
is(0));
73-
assertThat(provider.rankAuthority(new ClusteredStoreProviderTest.UnmatchedResourceType(), Collections.singletonList(cacheLoaderWriterConfiguration)),
74+
assertThat(provider.rankAuthority(Collections.singleton(new ClusteredStoreProviderTest.UnmatchedResourceType()),
75+
Collections.singletonList(cacheLoaderWriterConfiguration)),
7476
is(0));
7577
}
7678
}

clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStoreProviderTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ public void testAuthoritativeRank() {
6868
ServiceLocator serviceLocator = dependencySet().with(mock(ClusteringService.class)).build();
6969
provider.start(serviceLocator);
7070

71-
assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED,
71+
assertThat(provider.rankAuthority(Collections.singleton(ClusteredResourceType.Types.DEDICATED),
7272
Arrays.asList(cacheLoaderWriterConfiguration, writeBehindConfiguration)),
73-
is(3));
74-
assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED,
73+
is(5));
74+
assertThat(provider.rankAuthority(Collections.singleton(ClusteredResourceType.Types.DEDICATED),
7575
Collections.singletonList(writeBehindConfiguration)),
7676
is(0));
77-
assertThat(provider.rankAuthority(new ClusteredStoreProviderTest.UnmatchedResourceType(), Arrays.asList(cacheLoaderWriterConfiguration,
78-
writeBehindConfiguration)),
77+
assertThat(provider.rankAuthority(Collections.singleton(new ClusteredStoreProviderTest.UnmatchedResourceType()),
78+
Arrays.asList(cacheLoaderWriterConfiguration, writeBehindConfiguration)),
7979
is(0));
8080
}
8181
}

clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/service/ClusterStateRepositoryReplicationTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.ehcache.clustered.client.internal.service;
1818

19+
import org.ehcache.clustered.client.config.ClusteredResourceType;
1920
import org.ehcache.clustered.client.config.ClusteringServiceConfiguration;
2021
import org.ehcache.clustered.client.config.builders.ClusteringServiceConfigurationBuilder;
2122
import org.ehcache.clustered.client.internal.ClusterTierManagerClientEntityService;
@@ -30,6 +31,7 @@
3031
import org.ehcache.clustered.lock.server.VoltronReadWriteLockServerEntityService;
3132
import org.ehcache.clustered.server.ClusterTierManagerServerEntityService;
3233
import org.ehcache.clustered.server.store.ClusterTierServerEntityService;
34+
import org.ehcache.config.ResourcePools;
3335
import org.ehcache.impl.config.BaseCacheConfiguration;
3436
import org.ehcache.core.store.StoreConfigurationImpl;
3537
import org.ehcache.spi.persistence.StateHolder;
@@ -98,10 +100,11 @@ public void testClusteredStateRepositoryReplication() throws Exception {
98100

99101
service.start(null);
100102
try {
103+
ResourcePools resourcePools = newResourcePoolsBuilder().with(clusteredDedicated("test", 2, org.ehcache.config.units.MemoryUnit.MB)).build();
101104
BaseCacheConfiguration<Long, String> config = new BaseCacheConfiguration<>(Long.class, String.class, noAdvice(), null, noExpiration(),
102-
newResourcePoolsBuilder().with(clusteredDedicated("test", 2, org.ehcache.config.units.MemoryUnit.MB)).build());
105+
resourcePools);
103106
ClusteringService.ClusteredCacheIdentifier spaceIdentifier = (ClusteringService.ClusteredCacheIdentifier) service.getPersistenceSpaceIdentifier("test",
104-
config);
107+
resourcePools.getPoolForResource(ClusteredResourceType.Types.DEDICATED));
105108

106109
ServerStoreProxy serverStoreProxy = service.getServerStoreProxy(spaceIdentifier, new StoreConfigurationImpl<>(config, 1, null, null), Consistency.STRONG, mock(ServerCallback.class));
107110

@@ -134,10 +137,11 @@ public void testClusteredStateRepositoryReplicationWithSerializableKV() throws E
134137

135138
service.start(null);
136139
try {
140+
ResourcePools resourcePools = newResourcePoolsBuilder().with(clusteredDedicated("test", 2, org.ehcache.config.units.MemoryUnit.MB)).build();
137141
BaseCacheConfiguration<Long, String> config = new BaseCacheConfiguration<>(Long.class, String.class, noAdvice(), null, noExpiration(),
138-
newResourcePoolsBuilder().with(clusteredDedicated("test", 2, org.ehcache.config.units.MemoryUnit.MB)).build());
142+
resourcePools);
139143
ClusteringService.ClusteredCacheIdentifier spaceIdentifier = (ClusteringService.ClusteredCacheIdentifier) service.getPersistenceSpaceIdentifier("test",
140-
config);
144+
resourcePools.getPoolForResource(ClusteredResourceType.Types.DEDICATED));
141145

142146
ServerStoreProxy serverStoreProxy = service.getServerStoreProxy(spaceIdentifier, new StoreConfigurationImpl<>(config, 1, null, null), Consistency.STRONG, mock(ServerCallback.class));
143147

0 commit comments

Comments
 (0)