public ClusterTierEntityConfiguration decodeClusteredStoreConfiguration(byte[] configuration) { StructDecoder<Void> decoder = clusteredStoreConfigurationStruct.decoder(wrap(configuration)); String managerIdentifier = decoder.string(IDENTIFIER); if (managerIdentifier == null) { throw new IllegalArgumentException("Payload is an invalid content"); } String storeIdentifier = decoder.string(SERVER_STORE_NAME_FIELD); ServerStoreConfiguration serverStoreConfiguration = configCodec.decodeServerStoreConfiguration(decoder); return new ClusterTierEntityConfiguration(managerIdentifier, storeIdentifier, serverStoreConfiguration); } public byte[] encode(ClusterTierManagerConfiguration configuration) {
public byte[] encode(ClusterTierEntityConfiguration configuration) { StructEncoder<Void> encoder = clusteredStoreConfigurationStruct.encoder(); encoder.string(IDENTIFIER, configuration.getManagerIdentifier()) .string(SERVER_STORE_NAME_FIELD, configuration.getStoreIdentifier()); configCodec.encodeServerStoreConfiguration(encoder, configuration.getConfiguration()); return encoder.encode().array(); }
@Override public ClusterTierPassiveEntity createPassiveEntity(ServiceRegistry registry, byte[] configuration) throws ConfigurationException { ClusterTierEntityConfiguration c = new EntityConfigurationCodec(new CommonConfigCodec()).decodeClusteredStoreConfiguration(configuration); ClusterTierPassiveEntity passiveEntity = delegate.createPassiveEntity(registry, configuration); List<ClusterTierPassiveEntity> existing = servedPassiveEntities.putIfAbsent(c.getStoreIdentifier(), new ArrayList<>(singleton(passiveEntity))); if (existing != null) { existing.add(passiveEntity); } return passiveEntity; }
@Override public ClusterTierActiveEntity createActiveEntity(ServiceRegistry registry, byte[] configuration) throws ConfigurationException { ClusterTierEntityConfiguration c = new EntityConfigurationCodec(new CommonConfigCodec()).decodeClusteredStoreConfiguration(configuration); ClusterTierActiveEntity activeEntity = delegate.createActiveEntity(registry, configuration); List<ClusterTierActiveEntity> existing = servedActiveEntities.putIfAbsent(c.getStoreIdentifier(), new ArrayList<>(singleton(activeEntity))); if (existing != null) { existing.add(activeEntity); } return activeEntity; }
public ClusterTierPassiveEntity(ServiceRegistry registry, ClusterTierEntityConfiguration config, KeySegmentMapper defaultMapper) throws ConfigurationException { if (config == null) { throw new ConfigurationException("ClusterTierManagerConfiguration cannot be null"); } storeIdentifier = config.getStoreIdentifier(); configuration = config.getConfiguration(); managerIdentifier = config.getManagerIdentifier(); try { stateService = registry.getService(new EhcacheStoreStateServiceConfig(config.getManagerIdentifier(), defaultMapper)); messageHandler = registry.getService(new OOOMessageHandlerConfiguration<>(managerIdentifier + "###" + storeIdentifier, ClusterTierActiveEntity::isTrackedMessage, defaultMapper.getSegments() + 1, new MessageToTrackerSegmentFunction(clusterTierConcurrency(defaultMapper)))); } catch (ServiceException e) { throw new ConfigurationException("Unable to retrieve service: " + e.getMessage()); } if (stateService == null) { throw new AssertionError("Server failed to retrieve EhcacheStateService."); } management = new ClusterTierManagement(registry, stateService, false, storeIdentifier, config.getManagerIdentifier()); }
while (true) { try { entityRef.create(new ClusterTierEntityConfiguration(clusterTierManagerIdentifier, storeIdentifier, clientStoreConfiguration)); } catch (EntityAlreadyExistsException e) {
@SuppressWarnings("unchecked") public ClusterTierActiveEntity(ServiceRegistry registry, ClusterTierEntityConfiguration entityConfiguration, KeySegmentMapper defaultMapper) throws ConfigurationException { if (entityConfiguration == null) { throw new ConfigurationException("ClusteredStoreEntityConfiguration cannot be null"); } storeIdentifier = entityConfiguration.getStoreIdentifier(); configuration = entityConfiguration.getConfiguration(); managerIdentifier = entityConfiguration.getManagerIdentifier(); try { clientCommunicator = registry.getService(new CommunicatorServiceConfiguration()); stateService = registry.getService(new EhcacheStoreStateServiceConfig(entityConfiguration.getManagerIdentifier(), defaultMapper)); entityMessenger = registry.getService(new BasicServiceConfiguration<>(IEntityMessenger.class)); messageHandler = registry.getService(new OOOMessageHandlerConfiguration<>(managerIdentifier + "###" + storeIdentifier, ClusterTierActiveEntity::isTrackedMessage, defaultMapper.getSegments() + 1, new MessageToTrackerSegmentFunction(clusterTierConcurrency(defaultMapper)))); } catch (ServiceException e) { throw new ConfigurationException("Unable to retrieve service: " + e.getMessage()); } if (entityMessenger == null) { throw new AssertionError("Server failed to retrieve IEntityMessenger service."); } management = new ClusterTierManagement(registry, stateService, true, storeIdentifier, entityConfiguration.getManagerIdentifier()); chainCompactionLimit = Integer.getInteger(CHAIN_COMPACTION_THRESHOLD_PROP, DEFAULT_CHAIN_COMPACTION_THRESHOLD); if (configuration.isLoaderWriterConfigured()) { lockManager = new LockManagerImpl(); } else { lockManager = new NoopLockManager(); } }
@Test public void testCreateSharedServerStoreExisting() throws Exception { defaultRegistry.addSharedPool(defaultSharedPool, MemoryUnit.MEGABYTES.toBytes(2), defaultResource); ServerStoreConfiguration storeConfiguration = new ServerStoreConfigBuilder() .shared(defaultSharedPool) .build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); activeEntity.createNew(); ClusterTierActiveEntity otherEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); try { otherEntity.createNew(); fail("Duplicate creation should fail with an exception"); } catch (ConfigurationException e) { assertThat(e.getMessage(), containsString("already exists")); } }
public byte[] encode(ClusterTierEntityConfiguration configuration) { StructEncoder<Void> encoder = clusteredStoreConfigurationStruct.encoder(); encoder.string(IDENTIFIER, configuration.getManagerIdentifier()) .string(SERVER_STORE_NAME_FIELD, configuration.getStoreIdentifier()); configCodec.encodeServerStoreConfiguration(encoder, configuration.getConfiguration()); return encoder.encode().array(); }
@Test public void testCreateSharedServerStore() throws Exception { defaultRegistry.addSharedPool(defaultSharedPool, MemoryUnit.MEGABYTES.toBytes(2), defaultResource); ServerStoreConfiguration storeConfiguration = new ServerStoreConfigBuilder().shared(defaultSharedPool).build(); ClusterTierPassiveEntity passiveEntity = new ClusterTierPassiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); passiveEntity.createNew(); assertThat(defaultRegistry.getStoreManagerService().getStores(), containsInAnyOrder(defaultStoreName)); assertThat(defaultRegistry.getStoreManagerService() .getSharedResourcePoolIds(), containsInAnyOrder(defaultSharedPool)); assertThat(defaultRegistry.getStoreManagerService().getDedicatedResourcePoolIds(), is(empty())); assertThat(defaultRegistry.getResource(defaultResource).getUsed(), is(MemoryUnit.MEGABYTES.toBytes(2L))); }
@Test public void testCreateUnknownServerResource() throws Exception { ServerStoreConfiguration storeConfiguration = new ServerStoreConfigBuilder() .dedicated("unknown", 2, MemoryUnit.MEGABYTES) .build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); try { activeEntity.createNew(); fail("Creation with non-existent shared pool should have failed"); } catch (ConfigurationException e) { assertThat(e.getMessage(), containsString("Non-existent server side resource")); } }
@Test public void testCreateNonExistentSharedPool() throws Exception { ServerStoreConfiguration storeConfiguration = new ServerStoreConfigBuilder() .shared(defaultSharedPool) .build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); try { activeEntity.createNew(); fail("Creation with non-existent shared pool should have failed"); } catch (ConfigurationException e) { assertThat(e.getMessage(), containsString("undefined")); } }
@Test public void testCreateSharedServerStore() throws Exception { defaultRegistry.addSharedPool(defaultSharedPool, MemoryUnit.MEGABYTES.toBytes(2), defaultResource); ServerStoreConfiguration storeConfiguration = new ServerStoreConfigBuilder() .shared(defaultSharedPool) .build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); activeEntity.createNew(); assertThat(defaultRegistry.getStoreManagerService().getStores(), containsInAnyOrder(defaultStoreName)); assertThat(defaultRegistry.getStoreManagerService().getSharedResourcePoolIds(), containsInAnyOrder(defaultSharedPool)); assertThat(defaultRegistry.getStoreManagerService().getDedicatedResourcePoolIds(), empty()); assertThat(defaultRegistry.getResource(defaultResource).getUsed(), is(MemoryUnit.MEGABYTES.toBytes(2L))); }
@Before public void setUp() { defaultRegistry = new OffHeapIdentifierRegistry(); defaultRegistry.addResource(defaultResource, 10, MemoryUnit.MEGABYTES); defaultStoreConfiguration = new ServerStoreConfigBuilder().dedicated(defaultResource, 1024, MemoryUnit.KILOBYTES).build(); defaultConfiguration = new ClusterTierEntityConfiguration(identifier, defaultStoreName, defaultStoreConfiguration); }
@Before public void setUp() { defaultRegistry = new OffHeapIdentifierRegistry(); defaultRegistry.addResource(defaultResource, 10, MemoryUnit.MEGABYTES); defaultStoreConfiguration = new ServerStoreConfigBuilder().dedicated(defaultResource, 1024, MemoryUnit.KILOBYTES).build(); defaultConfiguration = new ClusterTierEntityConfiguration(identifier, defaultStoreName, defaultStoreConfiguration); }
@Test public void testValidateSharedServerStore() throws Exception { defaultRegistry.addSharedPool(defaultSharedPool, MemoryUnit.MEGABYTES.toBytes(2), defaultResource); ServerStoreConfiguration storeConfiguration = new ServerStoreConfigBuilder() .shared(defaultSharedPool) .build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); activeEntity.createNew(); TestInvokeContext context = new TestInvokeContext(); activeEntity.connected(context.getClientDescriptor()); assertSuccess(activeEntity.invokeActive(context, new LifecycleMessage.ValidateServerStore(defaultStoreName, storeConfiguration))); assertThat(activeEntity.getConnectedClients(), contains(context.getClientDescriptor())); }
@Test public void testValidateServerStore_DifferentSharedPools() throws Exception { defaultRegistry.addSharedPool(defaultSharedPool, MemoryUnit.MEGABYTES.toBytes(2), defaultResource); ServerStoreConfiguration storeConfiguration = new ServerStoreConfigBuilder() .shared(defaultSharedPool) .build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, storeConfiguration), DEFAULT_MAPPER); activeEntity.createNew(); TestInvokeContext context = new TestInvokeContext(); activeEntity.connected(context.getClientDescriptor()); ServerStoreConfiguration otherConfiguration = new ServerStoreConfigBuilder() .shared("other") .build(); String expectedMessageContent = "Existing ServerStore configuration is not compatible with the desired configuration: " + "\n\t" + "resourcePoolType existing: " + storeConfiguration.getPoolAllocation() + ", desired: " + otherConfiguration.getPoolAllocation(); assertFailure(activeEntity.invokeActive(context, new LifecycleMessage.ValidateServerStore(defaultStoreName, otherConfiguration)),InvalidServerStoreConfigurationException.class,expectedMessageContent); }
.build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, serverStoreConfiguration), DEFAULT_MAPPER); activeEntity.createNew();
.build(); ClusterTierActiveEntity activeEntity = new ClusterTierActiveEntity(defaultRegistry, new ClusterTierEntityConfiguration(identifier, defaultStoreName, serverStoreConfiguration), DEFAULT_MAPPER); activeEntity.createNew();
public ClusterTierEntityConfiguration decodeClusteredStoreConfiguration(byte[] configuration) { StructDecoder<Void> decoder = clusteredStoreConfigurationStruct.decoder(wrap(configuration)); String managerIdentifier = decoder.string(IDENTIFIER); if (managerIdentifier == null) { throw new IllegalArgumentException("Payload is an invalid content"); } String storeIdentifier = decoder.string(SERVER_STORE_NAME_FIELD); ServerStoreConfiguration serverStoreConfiguration = configCodec.decodeServerStoreConfiguration(decoder); return new ClusterTierEntityConfiguration(managerIdentifier, storeIdentifier, serverStoreConfiguration); } public byte[] encode(ClusterTierManagerConfiguration configuration) {