Skip to content

Commit

Permalink
WFLY-6778 Each Undertow server should expose a distinct SessionIdenti…
Browse files Browse the repository at this point in the history
…fierCodec
  • Loading branch information
pferraro committed Apr 5, 2017
1 parent 1d7bdc2 commit a744734
Show file tree
Hide file tree
Showing 44 changed files with 610 additions and 684 deletions.
@@ -1,6 +1,6 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2015, Red Hat, Inc., and individual contributors
* Copyright 2017, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
Expand All @@ -20,16 +20,27 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.jboss.as.clustering.controller;

import org.wildfly.clustering.spi.DistributedCacheBuilderProvider;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.value.Value;
import org.wildfly.clustering.service.SimpleBuilder;

/**
* @author Paul Ferraro
*/
public class DistributedRouteCacheGroupBuilderProvider extends RouteCacheGroupBuilderProvider implements DistributedCacheBuilderProvider {
public class SimpleCapabilityServiceBuilder<T> extends SimpleBuilder<T> implements CapabilityServiceBuilder<T> {

public DistributedRouteCacheGroupBuilderProvider() {
super(DistributedCacheBuilderProvider.class);
public SimpleCapabilityServiceBuilder(ServiceName name, T value) {
super(name, value);
}

public SimpleCapabilityServiceBuilder(ServiceName name, Value<T> value) {
super(name, value);
}

public SimpleCapabilityServiceBuilder(ServiceName name, Service<T> service) {
super(name, service);
}
}
Expand Up @@ -21,73 +21,68 @@
*/
package org.wildfly.clustering.web.infinispan.session;

import java.util.stream.Stream;

import org.infinispan.Cache;
import org.infinispan.remoting.transport.Address;
import org.jboss.as.clustering.controller.CapabilityServiceBuilder;
import org.jboss.as.controller.capability.CapabilityServiceSupport;
import org.jboss.msc.service.ServiceBuilder;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.ServiceTarget;
import org.jboss.msc.service.ValueService;
import org.jboss.msc.value.InjectedValue;
import org.jboss.msc.value.Value;
import org.wildfly.clustering.group.NodeFactory;
import org.wildfly.clustering.infinispan.spi.InfinispanCacheRequirement;
import org.wildfly.clustering.registry.Registry;
import org.wildfly.clustering.service.Builder;
import org.wildfly.clustering.service.InjectedValueDependency;
import org.wildfly.clustering.service.ValueDependency;
import org.wildfly.clustering.spi.ClusteringCacheRequirement;
import org.wildfly.clustering.web.session.RouteLocator;

/**
* Service providing an Infinispan-based {@link RouteLocator}.
* @author Paul Ferraro
*/
public class InfinispanRouteLocatorBuilder implements Builder<RouteLocator>, Value<RouteLocator>, InfinispanRouteLocatorConfiguration {

private static ServiceName getServiceName(String deploymentName) {
return ServiceName.JBOSS.append("clustering", "web", "locator", deploymentName);
}

public static ServiceName getCacheServiceAlias(String deploymentName) {
return getServiceName(deploymentName).append("cache");
}

public static ServiceName getNodeFactoryServiceAlias(String deploymentName) {
return getServiceName(deploymentName).append("nodes");
}

public static ServiceName getRegistryServiceAlias(String deploymentName) {
return getServiceName(deploymentName).append("registry");
}
public class InfinispanRouteLocatorBuilder implements CapabilityServiceBuilder<RouteLocator>, InfinispanRouteLocatorConfiguration {

private final String containerName = InfinispanSessionManagerFactoryBuilder.DEFAULT_CACHE_CONTAINER;
private final String serverName;
private final String deploymentName;

@SuppressWarnings("rawtypes")
private final InjectedValue<NodeFactory> factory = new InjectedValue<>();
private volatile ValueDependency<NodeFactory> factory;
@SuppressWarnings("rawtypes")
private final InjectedValue<Registry> registry = new InjectedValue<>();
private volatile ValueDependency<Registry> registry;
@SuppressWarnings("rawtypes")
private final InjectedValue<Cache> cache = new InjectedValue<>();
private volatile ValueDependency<Cache> cache;

public InfinispanRouteLocatorBuilder(String deploymentName) {
public InfinispanRouteLocatorBuilder(String serverName, String deploymentName) {
this.serverName = serverName;
this.deploymentName = deploymentName;
}

@Override
public ServiceName getServiceName() {
return getServiceName(this.deploymentName);
return ServiceName.JBOSS.append("clustering", "web", "locator", this.deploymentName);
}

@Override
public ServiceBuilder<RouteLocator> build(ServiceTarget target) {
return target.addService(this.getServiceName(), new ValueService<>(this))
.addDependency(getNodeFactoryServiceAlias(this.deploymentName), NodeFactory.class, this.factory)
.addDependency(getRegistryServiceAlias(this.deploymentName), Registry.class, this.registry)
.addDependency(getCacheServiceAlias(this.deploymentName), Cache.class, this.cache)
.setInitialMode(ServiceController.Mode.ON_DEMAND)
;
public Builder<RouteLocator> configure(CapabilityServiceSupport support) {
this.factory = new InjectedValueDependency<>(ClusteringCacheRequirement.NODE_FACTORY.getServiceName(support, this.containerName, this.serverName), NodeFactory.class);
this.registry = new InjectedValueDependency<>(ClusteringCacheRequirement.REGISTRY.getServiceName(support, this.containerName, this.serverName), Registry.class);
this.cache = new InjectedValueDependency<>(InfinispanCacheRequirement.CACHE.getServiceName(support, this.containerName, this.deploymentName), Cache.class);
return this;
}

@Override
public RouteLocator getValue() {
return new InfinispanRouteLocator(this);
public ServiceBuilder<RouteLocator> build(ServiceTarget target) {
Value<RouteLocator> value = () -> new InfinispanRouteLocator(this);
ServiceBuilder<RouteLocator> builder = target.addService(this.getServiceName(), new ValueService<>(value));
Stream.of(this.factory, this.registry, this.cache).forEach(dependency -> dependency.register(builder));
return builder.setInitialMode(ServiceController.Mode.ON_DEMAND);
}

@Override
Expand Down
Expand Up @@ -21,26 +21,58 @@
*/
package org.wildfly.clustering.web.infinispan.session;

import org.jboss.msc.value.Value;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.function.Supplier;

import org.infinispan.configuration.cache.CacheMode;
import org.jboss.as.clustering.controller.CapabilityServiceBuilder;
import org.jboss.msc.service.ServiceName;
import org.kohsuke.MetaInfServices;
import org.wildfly.clustering.service.Builder;
import org.wildfly.clustering.infinispan.spi.InfinispanCacheRequirement;
import org.wildfly.clustering.infinispan.spi.service.CacheBuilder;
import org.wildfly.clustering.infinispan.spi.service.TemplateConfigurationBuilder;
import org.wildfly.clustering.service.ValueDependency;
import org.wildfly.clustering.spi.CacheBuilderProvider;
import org.wildfly.clustering.spi.ClusteringCacheRequirement;
import org.wildfly.clustering.spi.DistributedCacheBuilderProvider;
import org.wildfly.clustering.spi.ServiceNameRegistry;
import org.wildfly.clustering.web.session.RouteLocator;
import org.wildfly.clustering.web.session.RouteLocatorBuilderProvider;

/**
* Builds a {@link RouteLocator} service.
* Provides a builder for a {@link RouteLocator} service.
* @author Paul Ferraro
*/
@MetaInfServices(RouteLocatorBuilderProvider.class)
public class InfinispanRouteLocatorBuilderProvider implements RouteLocatorBuilderProvider {

@Override
public Builder<RouteLocator> getRouteLocatorBuilder(String deploymentName) {
return new InfinispanRouteLocatorBuilder(deploymentName);
public CapabilityServiceBuilder<RouteLocator> getRouteLocatorBuilder(String serverName, String deploymentName) {
return new InfinispanRouteLocatorBuilder(serverName, deploymentName);
}

@Override
public Builder<?> getRouteLocatorConfigurationBuilder(Value<? extends Value<String>> route) {
return new RouteRegistryEntryProviderBuilder(route);
public Collection<CapabilityServiceBuilder<?>> getRouteLocatorConfigurationBuilders(String serverName, Supplier<ValueDependency<String>> routeDependencyProvider) {
String containerName = InfinispanSessionManagerFactoryBuilder.DEFAULT_CACHE_CONTAINER;

List<CapabilityServiceBuilder<?>> builders = new LinkedList<>();

builders.add(new RouteRegistryEntryProviderBuilder(serverName, routeDependencyProvider.get()));
builders.add(new TemplateConfigurationBuilder(ServiceName.parse(InfinispanCacheRequirement.CONFIGURATION.resolve(containerName, serverName)), containerName, serverName, null, builder -> {
CacheMode mode = builder.clustering().cacheMode();
builder.clustering().cacheMode(mode.isClustered() ? CacheMode.REPL_SYNC : CacheMode.LOCAL);
builder.clustering().l1().disable();
builder.persistence().clearStores();
}));
builders.add(new CacheBuilder<>(ServiceName.parse(InfinispanCacheRequirement.CACHE.resolve(containerName, serverName)), containerName, serverName));
ServiceNameRegistry<ClusteringCacheRequirement> registry = requirement -> ServiceName.parse(requirement.resolve(containerName, serverName));
for (CacheBuilderProvider provider : ServiceLoader.load(DistributedCacheBuilderProvider.class, DistributedCacheBuilderProvider.class.getClassLoader())) {
builders.addAll(provider.getBuilders(registry, containerName, serverName));
}

return builders;
}
}
Expand Up @@ -21,9 +21,10 @@
*/
package org.wildfly.clustering.web.infinispan.session;

import java.util.stream.Stream;

import org.infinispan.Cache;
import org.infinispan.remoting.transport.Address;
import org.jboss.as.clustering.controller.BinaryRequirementAliasBuilder;
import org.jboss.as.clustering.controller.CapabilityServiceBuilder;
import org.jboss.as.controller.capability.CapabilityServiceSupport;
import org.jboss.msc.service.ServiceBuilder;
Expand All @@ -50,21 +51,19 @@
import org.wildfly.clustering.web.session.SessionManagerFactoryConfiguration;
import org.wildfly.clustering.web.session.SessionManagerFactory;

public class InfinispanSessionManagerFactoryBuilder<C extends Marshallability> implements CapabilityServiceBuilder<SessionManagerFactory<TransactionBatch>>, Value<SessionManagerFactory<TransactionBatch>>, InfinispanSessionManagerFactoryConfiguration<C> {
public class InfinispanSessionManagerFactoryBuilder<C extends Marshallability> implements CapabilityServiceBuilder<SessionManagerFactory<TransactionBatch>>, InfinispanSessionManagerFactoryConfiguration<C> {
public static final String DEFAULT_CACHE_CONTAINER = "web";

@SuppressWarnings("rawtypes")
private final InjectedValue<Cache> cache = new InjectedValue<>();
@SuppressWarnings("rawtypes")
private final InjectedValue<NodeFactory> nodeFactory = new InjectedValue<>();

private final SessionManagerFactoryConfiguration<C> configuration;
private final String containerName;
private final CapabilityServiceBuilder<?> configurationBuilder;
private final CapabilityServiceBuilder<?> cacheBuilder;
private final CapabilityServiceBuilder<?> nodeFactoryBuilder;
private final CapabilityServiceBuilder<?> registryBuilder;

@SuppressWarnings("rawtypes")
private volatile ValueDependency<NodeFactory> nodeFactory;
private volatile ValueDependency<KeyAffinityServiceFactory> affinityFactory;
private volatile ValueDependency<CommandDispatcherFactory> dispatcherFactory;

Expand All @@ -83,9 +82,6 @@ public InfinispanSessionManagerFactoryBuilder(SessionManagerFactoryConfiguration

this.configurationBuilder = new TemplateConfigurationBuilder(ServiceName.parse(InfinispanCacheRequirement.CONFIGURATION.resolve(this.containerName, cacheName)), this.containerName, cacheName, templateCacheName);
this.cacheBuilder = new CacheBuilder<>(ServiceName.parse(InfinispanCacheRequirement.CACHE.resolve(this.containerName, cacheName)), this.containerName, cacheName);

this.nodeFactoryBuilder = new BinaryRequirementAliasBuilder<>(InfinispanRouteLocatorBuilder.getNodeFactoryServiceAlias(cacheName), ClusteringCacheRequirement.NODE_FACTORY, this.containerName, RouteCacheGroupBuilderProvider.CACHE_NAME, ClusteringCacheRequirement.NODE_FACTORY.getType());
this.registryBuilder = new BinaryRequirementAliasBuilder<>(InfinispanRouteLocatorBuilder.getRegistryServiceAlias(cacheName), ClusteringCacheRequirement.REGISTRY, this.containerName, RouteCacheGroupBuilderProvider.CACHE_NAME, ClusteringCacheRequirement.REGISTRY.getType());
}

@Override
Expand All @@ -97,38 +93,27 @@ public ServiceName getServiceName() {
public Builder<SessionManagerFactory<TransactionBatch>> configure(CapabilityServiceSupport support) {
this.configurationBuilder.configure(support);
this.cacheBuilder.configure(support);
this.nodeFactoryBuilder.configure(support);
this.registryBuilder.configure(support);

this.affinityFactory = new InjectedValueDependency<>(InfinispanRequirement.KEY_AFFINITY_FACTORY.getServiceName(support, this.containerName), KeyAffinityServiceFactory.class);
this.dispatcherFactory = new InjectedValueDependency<>(ClusteringRequirement.COMMAND_DISPATCHER_FACTORY.getServiceName(support, this.containerName), CommandDispatcherFactory.class);
this.nodeFactory = new InjectedValueDependency<>(ClusteringCacheRequirement.NODE_FACTORY.getServiceName(support, this.containerName, this.configuration.getServerName()), NodeFactory.class);
return this;
}

@Override
public ServiceBuilder<SessionManagerFactory<TransactionBatch>> build(ServiceTarget target) {
String cacheName = this.configuration.getDeploymentName();

this.configurationBuilder.build(target).install();
this.cacheBuilder.build(target).addAliases(InfinispanRouteLocatorBuilder.getCacheServiceAlias(cacheName)).install();
this.nodeFactoryBuilder.build(target).install();
this.registryBuilder.build(target).install();
this.cacheBuilder.build(target).install();

ServiceBuilder<SessionManagerFactory<TransactionBatch>> builder = target.addService(this.getServiceName(), new ValueService<>(this))
Value<SessionManagerFactory<TransactionBatch>> value = () -> new InfinispanSessionManagerFactory<>(this);
ServiceBuilder<SessionManagerFactory<TransactionBatch>> builder = target.addService(this.getServiceName(), new ValueService<>(value))
.addDependency(this.cacheBuilder.getServiceName(), Cache.class, this.cache)
.addDependency(this.nodeFactoryBuilder.getServiceName(), NodeFactory.class, this.nodeFactory)
.setInitialMode(ServiceController.Mode.ON_DEMAND)
;
this.affinityFactory.register(builder);
this.dispatcherFactory.register(builder);
;
Stream.of(this.nodeFactory, this.affinityFactory, this.dispatcherFactory).forEach(dependency -> dependency.register(builder));
return builder;
}

@Override
public SessionManagerFactory<TransactionBatch> getValue() {
return new InfinispanSessionManagerFactory<>(this);
}

@Override
public SessionManagerFactoryConfiguration<C> getSessionManagerFactoryConfiguration() {
return this.configuration;
Expand Down

This file was deleted.

0 comments on commit a744734

Please sign in to comment.