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.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

import io.undertow.UndertowOptions;
import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
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;
private volatile boolean enabled;
private volatile boolean started;

private Consumer<Boolean> statisticsChangeListener;

protected ListenerService(String name, OptionMap listenerOptions, OptionMap socketOptions) {
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);
}
}
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();
Expand All @@ -191,6 +200,8 @@ public void stop(StopContext context) {
stopListening();
}
unregisterBinding();
getUndertowService().unregisterStatisticsListener(statisticsChangeListener);
statisticsChangeListener = null;
}

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

import org.jboss.as.controller.AbstractWriteAttributeHandler;
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.PersistentResourceDefinition;
import org.jboss.as.controller.ReloadRequiredRemoveStepHandler;
import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SubsystemRegistration;
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.RejectAttributeChecker;
import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder;
Expand All @@ -42,6 +47,7 @@
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.jboss.dmr.ValueExpression;
import org.jboss.msc.service.ServiceController;
import org.jboss.security.SecurityConstants;
import org.wildfly.extension.undertow.filters.FilterDefinitions;
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);
}

@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;

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.function.Consumer;
import javax.security.jacc.PolicyContext;
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 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 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.defaultServer = defaultServer;
this.defaultVirtualHost = defaultVirtualHost;
this.instanceId = instanceId;
this.statistics = statistics;
this.statisticsEnabled = statisticsEnabled;
}

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() {
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.