Skip to content

Commit

Permalink
WFLY-8906 Don't retain references to Infinispan ConfigurationBuilder …
Browse files Browse the repository at this point in the history
…instances.
  • Loading branch information
pferraro committed Jun 8, 2017
1 parent 9ab224a commit 5bf205c
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 82 deletions.
Expand Up @@ -25,8 +25,6 @@
import static org.jboss.as.clustering.infinispan.subsystem.BackupForResourceDefinition.Attribute.CACHE; import static org.jboss.as.clustering.infinispan.subsystem.BackupForResourceDefinition.Attribute.CACHE;
import static org.jboss.as.clustering.infinispan.subsystem.BackupForResourceDefinition.Attribute.SITE; import static org.jboss.as.clustering.infinispan.subsystem.BackupForResourceDefinition.Attribute.SITE;


import java.util.Optional;

import org.infinispan.configuration.cache.BackupForConfiguration; import org.infinispan.configuration.cache.BackupForConfiguration;
import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.jboss.as.clustering.dmr.ModelNodes; import org.jboss.as.clustering.dmr.ModelNodes;
Expand All @@ -42,23 +40,26 @@
*/ */
public class BackupForBuilder extends ComponentBuilder<BackupForConfiguration> { public class BackupForBuilder extends ComponentBuilder<BackupForConfiguration> {


private volatile org.infinispan.configuration.cache.BackupForBuilder builder = new ConfigurationBuilder().sites().backupFor(); private volatile String site;
private volatile String cache;


BackupForBuilder(PathAddress cacheAddress) { BackupForBuilder(PathAddress cacheAddress) {
super(CacheComponent.BACKUP_FOR, cacheAddress); super(CacheComponent.BACKUP_FOR, cacheAddress);
} }


@Override @Override
public Builder<BackupForConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<BackupForConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
Optional<String> site = ModelNodes.optionalString(SITE.resolveModelAttribute(context, model)); this.site = ModelNodes.optionalString(SITE.resolveModelAttribute(context, model)).orElse(null);
if (site.isPresent()) { this.cache = CACHE.resolveModelAttribute(context, model).asString();
this.builder.remoteSite(site.get()).remoteCache(CACHE.resolveModelAttribute(context, model).asString());
}
return this; return this;
} }


@Override @Override
public BackupForConfiguration getValue() { public BackupForConfiguration getValue() {
return this.builder.create(); org.infinispan.configuration.cache.BackupForBuilder builder = new ConfigurationBuilder().sites().backupFor();
if (this.site != null) {
builder.remoteSite(this.site).remoteCache(this.cache);
}
return builder.create();
} }
} }
Expand Up @@ -42,9 +42,8 @@
*/ */
public class EvictionBuilder extends ComponentBuilder<EvictionConfiguration> { public class EvictionBuilder extends ComponentBuilder<EvictionConfiguration> {


private final EvictionConfigurationBuilder builder = new ConfigurationBuilder().eviction();

private volatile EvictionStrategy strategy; private volatile EvictionStrategy strategy;
private volatile long maxEntries;


EvictionBuilder(PathAddress cacheAddress) { EvictionBuilder(PathAddress cacheAddress) {
super(CacheComponent.EVICTION, cacheAddress); super(CacheComponent.EVICTION, cacheAddress);
Expand All @@ -53,16 +52,19 @@ public class EvictionBuilder extends ComponentBuilder<EvictionConfiguration> {
@Override @Override
public Builder<EvictionConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<EvictionConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
this.strategy = ModelNodes.asEnum(STRATEGY.resolveModelAttribute(context, model), EvictionStrategy.class); this.strategy = ModelNodes.asEnum(STRATEGY.resolveModelAttribute(context, model), EvictionStrategy.class);
// Use MANUAL instead of NONE to silence log WARNs on cache configuration validation this.maxEntries = MAX_ENTRIES.resolveModelAttribute(context, model).asLong();
this.builder.strategy(this.strategy.isEnabled() ? this.strategy : EvictionStrategy.MANUAL);
if (this.strategy.isEnabled()) {
this.builder.type(EvictionType.COUNT).size(MAX_ENTRIES.resolveModelAttribute(context, model).asLong());
}
return this; return this;
} }


@Override @Override
public EvictionConfiguration getValue() { public EvictionConfiguration getValue() {
return this.builder.create(); EvictionConfigurationBuilder builder = new ConfigurationBuilder().eviction()
// Use MANUAL instead of NONE to silence log WARNs on cache configuration validation
.strategy(this.strategy.isEnabled() ? this.strategy : EvictionStrategy.MANUAL)
;
if (this.strategy.isEnabled()) {
builder.type(EvictionType.COUNT).size(this.maxEntries);
}
return builder.create();
} }
} }
Expand Up @@ -28,7 +28,6 @@


import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.ExpirationConfiguration; import org.infinispan.configuration.cache.ExpirationConfiguration;
import org.infinispan.configuration.cache.ExpirationConfigurationBuilder;
import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathAddress;
Expand All @@ -40,22 +39,28 @@
*/ */
public class ExpirationBuilder extends ComponentBuilder<ExpirationConfiguration> { public class ExpirationBuilder extends ComponentBuilder<ExpirationConfiguration> {


private final ExpirationConfigurationBuilder builder = new ConfigurationBuilder().expiration(); private volatile long interval;
private volatile long lifespan;
private volatile long maxIdle;


ExpirationBuilder(PathAddress cacheAddress) { ExpirationBuilder(PathAddress cacheAddress) {
super(CacheComponent.EXPIRATION, cacheAddress); super(CacheComponent.EXPIRATION, cacheAddress);
} }


@Override @Override
public Builder<ExpirationConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<ExpirationConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
this.builder.wakeUpInterval(INTERVAL.resolveModelAttribute(context, model).asLong()); this.interval = INTERVAL.resolveModelAttribute(context, model).asLong();
this.builder.lifespan(LIFESPAN.resolveModelAttribute(context, model).asLong()); this.lifespan = LIFESPAN.resolveModelAttribute(context, model).asLong();
this.builder.maxIdle(MAX_IDLE.resolveModelAttribute(context, model).asLong()); this.maxIdle = MAX_IDLE.resolveModelAttribute(context, model).asLong();
return this; return this;
} }


@Override @Override
public ExpirationConfiguration getValue() { public ExpirationConfiguration getValue() {
return this.builder.create(); return new ConfigurationBuilder().expiration()
.wakeUpInterval(this.interval)
.lifespan(this.lifespan)
.maxIdle(this.maxIdle)
.create();
} }
} }
Expand Up @@ -29,7 +29,6 @@


import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.LockingConfiguration; import org.infinispan.configuration.cache.LockingConfiguration;
import org.infinispan.configuration.cache.LockingConfigurationBuilder;
import org.infinispan.util.concurrent.IsolationLevel; import org.infinispan.util.concurrent.IsolationLevel;
import org.jboss.as.clustering.dmr.ModelNodes; import org.jboss.as.clustering.dmr.ModelNodes;
import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationContext;
Expand All @@ -43,23 +42,31 @@
*/ */
public class LockingBuilder extends ComponentBuilder<LockingConfiguration> { public class LockingBuilder extends ComponentBuilder<LockingConfiguration> {


private final LockingConfigurationBuilder builder = new ConfigurationBuilder().locking(); private volatile long timeout;
private volatile int concurrency;
private volatile IsolationLevel isolation;
private volatile boolean striping;


LockingBuilder(PathAddress cacheAddress) { LockingBuilder(PathAddress cacheAddress) {
super(CacheComponent.LOCKING, cacheAddress); super(CacheComponent.LOCKING, cacheAddress);
} }


@Override @Override
public LockingConfiguration getValue() { public LockingConfiguration getValue() {
return this.builder.create(); return new ConfigurationBuilder().locking()
.lockAcquisitionTimeout(this.timeout)
.concurrencyLevel(this.concurrency)
.isolationLevel(this.isolation)
.useLockStriping(this.striping)
.create();
} }


@Override @Override
public Builder<LockingConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<LockingConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
this.builder.lockAcquisitionTimeout(ACQUIRE_TIMEOUT.resolveModelAttribute(context, model).asLong()); this.timeout = ACQUIRE_TIMEOUT.resolveModelAttribute(context, model).asLong();
this.builder.concurrencyLevel(CONCURRENCY.resolveModelAttribute(context, model).asInt()); this.concurrency = CONCURRENCY.resolveModelAttribute(context, model).asInt();
this.builder.isolationLevel(ModelNodes.asEnum(ISOLATION.resolveModelAttribute(context, model), IsolationLevel.class)); this.isolation = ModelNodes.asEnum(ISOLATION.resolveModelAttribute(context, model), IsolationLevel.class);
this.builder.useLockStriping(STRIPING.resolveModelAttribute(context, model).asBoolean()); this.striping = STRIPING.resolveModelAttribute(context, model).asBoolean();
return this; return this;
} }
} }
Expand Up @@ -26,7 +26,6 @@


import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.PartitionHandlingConfiguration; import org.infinispan.configuration.cache.PartitionHandlingConfiguration;
import org.infinispan.configuration.cache.PartitionHandlingConfigurationBuilder;
import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathAddress;
Expand All @@ -39,20 +38,22 @@
*/ */
public class PartitionHandlingBuilder extends ComponentBuilder<PartitionHandlingConfiguration> { public class PartitionHandlingBuilder extends ComponentBuilder<PartitionHandlingConfiguration> {


private final PartitionHandlingConfigurationBuilder builder = new ConfigurationBuilder().clustering().partitionHandling(); private volatile boolean enabled;


PartitionHandlingBuilder(PathAddress cacheAddress) { PartitionHandlingBuilder(PathAddress cacheAddress) {
super(CacheComponent.PARTITION_HANDLING, cacheAddress); super(CacheComponent.PARTITION_HANDLING, cacheAddress);
} }


@Override @Override
public PartitionHandlingConfiguration getValue() { public PartitionHandlingConfiguration getValue() {
return this.builder.create(); return new ConfigurationBuilder().clustering().partitionHandling()
.enabled(this.enabled)
.create();
} }


@Override @Override
public Builder<PartitionHandlingConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<PartitionHandlingConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
this.builder.enabled(ENABLED.resolveModelAttribute(context, model).asBoolean()); this.enabled = ENABLED.resolveModelAttribute(context, model).asBoolean();
return this; return this;
} }
} }
Expand Up @@ -27,7 +27,6 @@


import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.StateTransferConfiguration; import org.infinispan.configuration.cache.StateTransferConfiguration;
import org.infinispan.configuration.cache.StateTransferConfigurationBuilder;
import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathAddress;
Expand All @@ -39,23 +38,26 @@
*/ */
public class StateTransferBuilder extends ComponentBuilder<StateTransferConfiguration> { public class StateTransferBuilder extends ComponentBuilder<StateTransferConfiguration> {


private final StateTransferConfigurationBuilder builder = new ConfigurationBuilder().clustering().stateTransfer(); private volatile int chunkSize;
private volatile long timeout;


StateTransferBuilder(PathAddress cacheAddress) { StateTransferBuilder(PathAddress cacheAddress) {
super(CacheComponent.STATE_TRANSFER, cacheAddress); super(CacheComponent.STATE_TRANSFER, cacheAddress);
} }


@Override @Override
public StateTransferConfiguration getValue() { public StateTransferConfiguration getValue() {
return this.builder.create(); return new ConfigurationBuilder().clustering().stateTransfer()
.chunkSize(this.chunkSize)
.fetchInMemoryState(true)
.timeout(this.timeout)
.create();
} }


@Override @Override
public Builder<StateTransferConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<StateTransferConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
this.builder.chunkSize(CHUNK_SIZE.resolveModelAttribute(context, model).asInt()) this.chunkSize = CHUNK_SIZE.resolveModelAttribute(context, model).asInt();
.fetchInMemoryState(true) this.timeout = TIMEOUT.resolveModelAttribute(context, model).asLong();
.timeout(TIMEOUT.resolveModelAttribute(context, model).asLong())
;
return this; return this;
} }
} }
Expand Up @@ -25,7 +25,6 @@
import static org.jboss.as.clustering.infinispan.subsystem.StoreWriteBehindResourceDefinition.Attribute.*; import static org.jboss.as.clustering.infinispan.subsystem.StoreWriteBehindResourceDefinition.Attribute.*;


import org.infinispan.configuration.cache.AsyncStoreConfiguration; import org.infinispan.configuration.cache.AsyncStoreConfiguration;
import org.infinispan.configuration.cache.AsyncStoreConfigurationBuilder;
import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationFailedException;
Expand All @@ -38,21 +37,25 @@
*/ */
public class StoreWriteBehindBuilder extends ComponentBuilder<AsyncStoreConfiguration> { public class StoreWriteBehindBuilder extends ComponentBuilder<AsyncStoreConfiguration> {


private final AsyncStoreConfigurationBuilder<?> builder = new ConfigurationBuilder().persistence().addSingleFileStore().async(); private volatile int queueSize;
private volatile int poolSize;


StoreWriteBehindBuilder(PathAddress cacheAddress) { StoreWriteBehindBuilder(PathAddress cacheAddress) {
super(CacheComponent.STORE_WRITE, cacheAddress); super(CacheComponent.STORE_WRITE, cacheAddress);
} }


@Override @Override
public AsyncStoreConfiguration getValue() { public AsyncStoreConfiguration getValue() {
return this.builder.create(); return new ConfigurationBuilder().persistence().addSingleFileStore().async()
.modificationQueueSize(this.queueSize)
.threadPoolSize(this.poolSize)
.create();
} }


@Override @Override
public Builder<AsyncStoreConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<AsyncStoreConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
this.builder.modificationQueueSize(MODIFICATION_QUEUE_SIZE.resolveModelAttribute(context, model).asInt()); this.queueSize = MODIFICATION_QUEUE_SIZE.resolveModelAttribute(context, model).asInt();
this.builder.threadPoolSize(THREAD_POOL_SIZE.resolveModelAttribute(context, model).asInt()); this.poolSize = THREAD_POOL_SIZE.resolveModelAttribute(context, model).asInt();
return this; return this;
} }
} }
Expand Up @@ -22,15 +22,19 @@


package org.jboss.as.clustering.infinispan.subsystem; package org.jboss.as.clustering.infinispan.subsystem;


import static org.jboss.as.clustering.infinispan.subsystem.TableResourceDefinition.ColumnAttribute.*;
import static org.jboss.as.clustering.infinispan.subsystem.TableResourceDefinition.Attribute.*; import static org.jboss.as.clustering.infinispan.subsystem.TableResourceDefinition.Attribute.*;
import static org.jboss.as.clustering.infinispan.subsystem.TableResourceDefinition.ColumnAttribute.*;

import java.util.AbstractMap;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Map;


import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfigurationBuilder; import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfigurationBuilder;
import org.infinispan.persistence.jdbc.configuration.TableManipulationConfiguration; import org.infinispan.persistence.jdbc.configuration.TableManipulationConfiguration;
import org.infinispan.persistence.jdbc.configuration.TableManipulationConfigurationBuilder;
import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfigurationBuilder.StringTableManipulationConfigurationBuilder;
import org.jboss.as.clustering.controller.Attribute; import org.jboss.as.clustering.controller.Attribute;
import org.jboss.as.clustering.infinispan.subsystem.TableResourceDefinition.ColumnAttribute;
import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathAddress;
Expand All @@ -43,7 +47,11 @@
public class TableBuilder extends ComponentBuilder<TableManipulationConfiguration> { public class TableBuilder extends ComponentBuilder<TableManipulationConfiguration> {


private final Attribute prefixAttribute; private final Attribute prefixAttribute;
private final TableManipulationConfigurationBuilder<JdbcStringBasedStoreConfigurationBuilder, StringTableManipulationConfigurationBuilder> builder = new ConfigurationBuilder().persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class).table(); private final Map<ColumnAttribute, Map.Entry<String, String>> columns = new EnumMap<>(ColumnAttribute.class);

private volatile int batchSize;
private volatile int fetchSize;
private volatile String prefix;


public TableBuilder(Attribute prefixAttribute, CacheComponent component, PathAddress cacheAddress) { public TableBuilder(Attribute prefixAttribute, CacheComponent component, PathAddress cacheAddress) {
super(component, cacheAddress); super(component, cacheAddress);
Expand All @@ -52,25 +60,31 @@ public TableBuilder(Attribute prefixAttribute, CacheComponent component, PathAdd


@Override @Override
public Builder<TableManipulationConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException { public Builder<TableManipulationConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
ModelNode idModel = ID.resolveModelAttribute(context, model); for (ColumnAttribute column : EnumSet.allOf(ColumnAttribute.class)) {
ModelNode dataModel = DATA.resolveModelAttribute(context, model); ModelNode columnModel = column.resolveModelAttribute(context, model);
ModelNode timestampModel = TIMESTAMP.resolveModelAttribute(context, model); String name = column.getColumnName().resolveModelAttribute(context, columnModel).asString();
String type = column.getColumnType().resolveModelAttribute(context, columnModel).asString();
this.columns.put(column, new AbstractMap.SimpleImmutableEntry<>(name, type));
}


this.builder.idColumnName(ID.getColumnName().resolveModelAttribute(context, idModel).asString()) this.batchSize = BATCH_SIZE.resolveModelAttribute(context, model).asInt();
.idColumnType(ID.getColumnType().resolveModelAttribute(context, idModel).asString()) this.fetchSize = FETCH_SIZE.resolveModelAttribute(context, model).asInt();
.dataColumnName(DATA.getColumnName().resolveModelAttribute(context, dataModel).asString()) this.prefix = this.prefixAttribute.resolveModelAttribute(context, model).asString();
.dataColumnType(DATA.getColumnType().resolveModelAttribute(context, dataModel).asString())
.timestampColumnName(TIMESTAMP.getColumnName().resolveModelAttribute(context, timestampModel).asString())
.timestampColumnType(TIMESTAMP.getColumnType().resolveModelAttribute(context, timestampModel).asString())
.batchSize(BATCH_SIZE.resolveModelAttribute(context, model).asInt())
.fetchSize(FETCH_SIZE.resolveModelAttribute(context, model).asInt())
.tableNamePrefix(this.prefixAttribute.resolveModelAttribute(context, model).asString())
;
return this; return this;
} }


@Override @Override
public TableManipulationConfiguration getValue() { public TableManipulationConfiguration getValue() {
return this.builder.create(); return new ConfigurationBuilder().persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class).table()
.idColumnName(this.columns.get(ID).getKey())
.idColumnType(this.columns.get(ID).getValue())
.dataColumnName(this.columns.get(DATA).getKey())
.dataColumnType(this.columns.get(DATA).getValue())
.timestampColumnName(this.columns.get(TIMESTAMP).getKey())
.timestampColumnType(this.columns.get(TIMESTAMP).getValue())
.batchSize(this.batchSize)
.fetchSize(this.fetchSize)
.tableNamePrefix(this.prefix)
.create();
} }
} }

0 comments on commit 5bf205c

Please sign in to comment.