Log exceptions in onFailure instead of bubbling up (elastic/elasticsearch#4709)
Today we wrap the checked IOException in an unchecked exception when sending back a failure the security transport interceptor. Yet, if that failure handling in-turn fails due to a broken response channel we should rather log the exception instead of bubbling it up since it can have unforeseeable side-effects. Relates to elastic/elasticsearch#4706 * fix line len Original commit: elastic/x-pack-elasticsearch@03c3826112
This commit is contained in:
parent
b6703c1515
commit
8651c0ad9f
|
@ -5,10 +5,12 @@
|
||||||
*/
|
*/
|
||||||
package org.elasticsearch.xpack.security.transport;
|
package org.elasticsearch.xpack.security.transport;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.elasticsearch.Version;
|
import org.elasticsearch.Version;
|
||||||
import org.elasticsearch.action.ActionListener;
|
import org.elasticsearch.action.ActionListener;
|
||||||
import org.elasticsearch.action.support.DestructiveOperations;
|
import org.elasticsearch.action.support.DestructiveOperations;
|
||||||
import org.elasticsearch.common.CheckedConsumer;
|
import org.elasticsearch.common.CheckedConsumer;
|
||||||
|
import org.elasticsearch.common.component.AbstractComponent;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.util.concurrent.AbstractRunnable;
|
import org.elasticsearch.common.util.concurrent.AbstractRunnable;
|
||||||
import org.elasticsearch.common.util.concurrent.ThreadContext;
|
import org.elasticsearch.common.util.concurrent.ThreadContext;
|
||||||
|
@ -38,8 +40,6 @@ import org.elasticsearch.xpack.security.user.SystemUser;
|
||||||
import org.elasticsearch.xpack.security.user.User;
|
import org.elasticsearch.xpack.security.user.User;
|
||||||
import org.elasticsearch.xpack.ssl.SSLService;
|
import org.elasticsearch.xpack.ssl.SSLService;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.UncheckedIOException;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -48,7 +48,7 @@ import java.util.concurrent.Executor;
|
||||||
import static org.elasticsearch.xpack.XPackSettings.TRANSPORT_SSL_ENABLED;
|
import static org.elasticsearch.xpack.XPackSettings.TRANSPORT_SSL_ENABLED;
|
||||||
import static org.elasticsearch.xpack.security.Security.setting;
|
import static org.elasticsearch.xpack.security.Security.setting;
|
||||||
|
|
||||||
public class SecurityServerTransportInterceptor implements TransportInterceptor {
|
public class SecurityServerTransportInterceptor extends AbstractComponent implements TransportInterceptor {
|
||||||
|
|
||||||
private static final String SETTING_NAME = "xpack.security.type";
|
private static final String SETTING_NAME = "xpack.security.type";
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@ public class SecurityServerTransportInterceptor implements TransportInterceptor
|
||||||
SSLService sslService,
|
SSLService sslService,
|
||||||
SecurityContext securityContext,
|
SecurityContext securityContext,
|
||||||
DestructiveOperations destructiveOperations) {
|
DestructiveOperations destructiveOperations) {
|
||||||
|
super(settings);
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
this.threadPool = threadPool;
|
this.threadPool = threadPool;
|
||||||
this.authcService = authcService;
|
this.authcService = authcService;
|
||||||
|
@ -131,7 +132,7 @@ public class SecurityServerTransportInterceptor implements TransportInterceptor
|
||||||
public <T extends TransportRequest> TransportRequestHandler<T> interceptHandler(String action, String executor,
|
public <T extends TransportRequest> TransportRequestHandler<T> interceptHandler(String action, String executor,
|
||||||
boolean forceExecution,
|
boolean forceExecution,
|
||||||
TransportRequestHandler<T> actualHandler) {
|
TransportRequestHandler<T> actualHandler) {
|
||||||
return new ProfileSecuredRequestHandler<>(action, forceExecution, executor, actualHandler, profileFilters,
|
return new ProfileSecuredRequestHandler<>(logger, action, forceExecution, executor, actualHandler, profileFilters,
|
||||||
licenseState, threadPool);
|
licenseState, threadPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,18 +174,20 @@ public class SecurityServerTransportInterceptor implements TransportInterceptor
|
||||||
|
|
||||||
public static class ProfileSecuredRequestHandler<T extends TransportRequest> implements TransportRequestHandler<T> {
|
public static class ProfileSecuredRequestHandler<T extends TransportRequest> implements TransportRequestHandler<T> {
|
||||||
|
|
||||||
protected final String action;
|
private final String action;
|
||||||
protected final TransportRequestHandler<T> handler;
|
private final TransportRequestHandler<T> handler;
|
||||||
private final Map<String, ServerTransportFilter> profileFilters;
|
private final Map<String, ServerTransportFilter> profileFilters;
|
||||||
private final XPackLicenseState licenseState;
|
private final XPackLicenseState licenseState;
|
||||||
private final ThreadContext threadContext;
|
private final ThreadContext threadContext;
|
||||||
private final String executorName;
|
private final String executorName;
|
||||||
private final ThreadPool threadPool;
|
private final ThreadPool threadPool;
|
||||||
private final boolean forceExecution;
|
private final boolean forceExecution;
|
||||||
|
private final Logger logger;
|
||||||
|
|
||||||
ProfileSecuredRequestHandler(String action, boolean forceExecution, String executorName, TransportRequestHandler<T> handler,
|
ProfileSecuredRequestHandler(Logger logger, String action, boolean forceExecution, String executorName,
|
||||||
Map<String, ServerTransportFilter> profileFilters, XPackLicenseState licenseState,
|
TransportRequestHandler<T> handler, Map<String, ServerTransportFilter> profileFilters,
|
||||||
ThreadPool threadPool) {
|
XPackLicenseState licenseState, ThreadPool threadPool) {
|
||||||
|
this.logger = logger;
|
||||||
this.action = action;
|
this.action = action;
|
||||||
this.executorName = executorName;
|
this.executorName = executorName;
|
||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
|
@ -206,8 +209,9 @@ public class SecurityServerTransportInterceptor implements TransportInterceptor
|
||||||
public void onFailure(Exception e) {
|
public void onFailure(Exception e) {
|
||||||
try {
|
try {
|
||||||
channel.sendResponse(e);
|
channel.sendResponse(e);
|
||||||
} catch (IOException e1) {
|
} catch (Exception e1) {
|
||||||
throw new UncheckedIOException(e1);
|
e1.addSuppressed(e);
|
||||||
|
logger.warn("failed to send exception response for action [" + action + "]", e1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue