Skip to content

Commit

Permalink
WFLY-7561 Make undertow statistics modifyable without requiring a reload
Browse files Browse the repository at this point in the history
  • Loading branch information
stuartwdouglas committed Nov 22, 2016
1 parent d4db74e commit 52a4551
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 5 deletions.
Expand Up @@ -28,7 +28,9 @@
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;


import io.undertow.UndertowOptions;
import io.undertow.server.HandlerWrapper; import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler; import io.undertow.server.HttpHandler;
import io.undertow.server.OpenListener; import io.undertow.server.OpenListener;
Expand Down Expand Up @@ -78,7 +80,7 @@ public abstract class ListenerService implements Service<UndertowListener>, Unde
protected volatile OpenListener openListener; protected volatile OpenListener openListener;
private volatile boolean enabled; private volatile boolean enabled;
private volatile boolean started; private volatile boolean started;

private Consumer<Boolean> statisticsChangeListener;


protected ListenerService(String name, OptionMap listenerOptions, OptionMap socketOptions) { protected ListenerService(String name, OptionMap listenerOptions, OptionMap socketOptions) {
this.name = name; this.name = name;
Expand Down Expand Up @@ -179,6 +181,13 @@ public void start(StartContext context) throws StartException {
throw UndertowLogger.ROOT_LOGGER.couldNotStartListener(name, e); throw UndertowLogger.ROOT_LOGGER.couldNotStartListener(name, e);
} }
} }
statisticsChangeListener = (enabled) -> {
OptionMap options = openListener.getUndertowOptions();
OptionMap.Builder builder = OptionMap.builder().addAll(options);
builder.set(UndertowOptions.ENABLE_STATISTICS, enabled);
openListener.setUndertowOptions(builder.getMap());
};
getUndertowService().registerStatisticsListener(statisticsChangeListener);
} }


protected abstract void cleanFailedStart(); protected abstract void cleanFailedStart();
Expand All @@ -191,6 +200,8 @@ public void stop(StopContext context) {
stopListening(); stopListening();
} }
unregisterBinding(); unregisterBinding();
getUndertowService().unregisterStatisticsListener(statisticsChangeListener);
statisticsChangeListener = null;
} }


void addWrapperHandler(HandlerWrapper wrapper){ void addWrapperHandler(HandlerWrapper wrapper){
Expand Down
Expand Up @@ -26,14 +26,19 @@
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;


import org.jboss.as.controller.AbstractWriteAttributeHandler;
import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathElement; import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.PersistentResourceDefinition; import org.jboss.as.controller.PersistentResourceDefinition;
import org.jboss.as.controller.ReloadRequiredRemoveStepHandler; import org.jboss.as.controller.ReloadRequiredRemoveStepHandler;
import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimpleAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SubsystemRegistration; import org.jboss.as.controller.SubsystemRegistration;
import org.jboss.as.controller.access.management.SensitiveTargetAccessConstraintDefinition; import org.jboss.as.controller.access.management.SensitiveTargetAccessConstraintDefinition;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.transform.description.DiscardAttributeChecker; import org.jboss.as.controller.transform.description.DiscardAttributeChecker;
import org.jboss.as.controller.transform.description.RejectAttributeChecker; import org.jboss.as.controller.transform.description.RejectAttributeChecker;
import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder; import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder;
Expand All @@ -42,6 +47,7 @@
import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType; import org.jboss.dmr.ModelType;
import org.jboss.dmr.ValueExpression; import org.jboss.dmr.ValueExpression;
import org.jboss.msc.service.ServiceController;
import org.jboss.security.SecurityConstants; import org.jboss.security.SecurityConstants;
import org.wildfly.extension.undertow.filters.FilterDefinitions; import org.wildfly.extension.undertow.filters.FilterDefinitions;
import org.wildfly.extension.undertow.handlers.HandlerDefinitions; import org.wildfly.extension.undertow.handlers.HandlerDefinitions;
Expand Down Expand Up @@ -173,4 +179,38 @@ private static void registerTransformers_EAP_7_0_0(SubsystemRegistration subsyst
TransformationDescription.Tools.register(builder.build(), subsystemRegistration, UndertowExtension.MODEL_VERSION_EAP7_0_0); TransformationDescription.Tools.register(builder.build(), subsystemRegistration, UndertowExtension.MODEL_VERSION_EAP7_0_0);
} }


@Override
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
ReloadRequiredWriteAttributeHandler handler = new ReloadRequiredWriteAttributeHandler(getAttributes());
for (AttributeDefinition attr : getAttributes()) {
if(attr == STATISTICS_ENABLED) {
resourceRegistration.registerReadWriteAttribute(attr, null, new AbstractWriteAttributeHandler<Void> () {
@Override
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName, ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder) throws OperationFailedException {
ServiceController<?> controller = context.getServiceRegistry(false).getService(UndertowService.UNDERTOW);
if(controller != null) {
UndertowService service = (UndertowService) controller.getService();
if(service != null) {
service.setStatisticsEnabled(resolvedValue.asBoolean());
}
}
return false;
}

@Override
protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName, ModelNode valueToRestore, ModelNode valueToRevert, Void handback) throws OperationFailedException {
ServiceController<?> controller = context.getServiceRegistry(false).getService(UndertowService.UNDERTOW);
if(controller != null) {
UndertowService service = (UndertowService) controller.getService();
if(service != null) {
service.setStatisticsEnabled(valueToRestore.asBoolean());
}
}
}
});
} else {
resourceRegistration.registerReadWriteAttribute(attr, null, handler);
}
}
}
} }
Expand Up @@ -23,10 +23,12 @@
package org.wildfly.extension.undertow; package org.wildfly.extension.undertow;


import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
import java.util.function.Consumer;
import javax.security.jacc.PolicyContext; import javax.security.jacc.PolicyContext;
import javax.security.jacc.PolicyContextException; import javax.security.jacc.PolicyContextException;


Expand Down Expand Up @@ -74,14 +76,15 @@ public class UndertowService implements Service<UndertowService> {
private final Set<Server> registeredServers = new CopyOnWriteArraySet<>(); private final Set<Server> registeredServers = new CopyOnWriteArraySet<>();
private final List<UndertowEventListener> listeners = Collections.synchronizedList(new LinkedList<UndertowEventListener>()); private final List<UndertowEventListener> listeners = Collections.synchronizedList(new LinkedList<UndertowEventListener>());
private volatile String instanceId;//todo this should be final and no setter should be exposed, currently mod cluster "wants it", this needs to change private volatile String instanceId;//todo this should be final and no setter should be exposed, currently mod cluster "wants it", this needs to change
private final boolean statistics; private volatile boolean statisticsEnabled;
private final Set<Consumer<Boolean>> statisticsChangeListenters = new HashSet<>();


protected UndertowService(String defaultContainer, String defaultServer, String defaultVirtualHost, String instanceId, boolean statistics) { protected UndertowService(String defaultContainer, String defaultServer, String defaultVirtualHost, String instanceId, boolean statisticsEnabled) {
this.defaultContainer = defaultContainer; this.defaultContainer = defaultContainer;
this.defaultServer = defaultServer; this.defaultServer = defaultServer;
this.defaultVirtualHost = defaultVirtualHost; this.defaultVirtualHost = defaultVirtualHost;
this.instanceId = instanceId; this.instanceId = instanceId;
this.statistics = statistics; this.statisticsEnabled = statisticsEnabled;
} }


public static ServiceName deploymentServiceName(final String serverName, final String virtualHost, final String contextPath) { public static ServiceName deploymentServiceName(final String serverName, final String virtualHost, final String contextPath) {
Expand Down Expand Up @@ -227,7 +230,22 @@ public void setInstanceId(String instanceId) {
} }


public boolean isStatisticsEnabled() { public boolean isStatisticsEnabled() {
return statistics; return statisticsEnabled;
}

public synchronized void setStatisticsEnabled(boolean statisticsEnabled) {
this.statisticsEnabled = statisticsEnabled;
for(Consumer<Boolean> listener: statisticsChangeListenters) {
listener.accept(statisticsEnabled);
}
}

public synchronized void registerStatisticsListener(Consumer<Boolean> listener) {
statisticsChangeListenters.add(listener);
}

public synchronized void unregisterStatisticsListener(Consumer<Boolean> listener) {
statisticsChangeListenters.remove(listener);
} }


/** /**
Expand Down

0 comments on commit 52a4551

Please sign in to comment.