Repository: geode Updated Branches: refs/heads/develop 18d3e17b6 -> f403ae7cf
GEODE-2174: Added message for clients who unregister abnormally Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/f403ae7c Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/f403ae7c Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/f403ae7c Branch: refs/heads/develop Commit: f403ae7cf3ef2ef3babccc561765bed824d6306a Parents: 18d3e17 Author: Barry Oglesby <[email protected]> Authored: Mon Nov 28 18:17:32 2016 -0800 Committer: Barry Oglesby <[email protected]> Committed: Tue Dec 6 10:42:48 2016 -0800 ---------------------------------------------------------------------- .../cache/tier/sockets/BaseCommand.java | 5 ++++ .../cache/tier/sockets/BaseCommandQuery.java | 1 + .../cache/tier/sockets/CacheClientProxy.java | 8 +++--- .../cache/tier/sockets/ClientHealthMonitor.java | 27 +++++++++++++------- .../cache/tier/sockets/ServerConnection.java | 11 +++++++- .../tier/sockets/command/DestroyRegion.java | 2 ++ .../sockets/command/GatewayReceiverCommand.java | 2 ++ .../geode/internal/i18n/LocalizedStrings.java | 3 +++ 8 files changed, 45 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommand.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommand.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommand.java index c51868a..5379605 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommand.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommand.java @@ -305,6 +305,7 @@ public abstract class BaseCommand implements Command { } } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(eof); } private static void handleInterruptedIOException(Message msg, ServerConnection servConn, @@ -317,6 +318,7 @@ public abstract class BaseCommand implements Command { } } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(e); } private static void handleIOException(Message msg, ServerConnection servConn, Exception e) { @@ -339,6 +341,7 @@ public abstract class BaseCommand implements Command { } } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(e); } private static void handleShutdownException(Message msg, ServerConnection servConn, Exception e) { @@ -359,6 +362,7 @@ public abstract class BaseCommand implements Command { } } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(e); } // Handle GemfireSecurityExceptions separately since the connection should not @@ -499,6 +503,7 @@ public abstract class BaseCommand implements Command { } } finally { servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(th); } } http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommandQuery.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommandQuery.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommandQuery.java index 24711e4..5f7a8ef 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommandQuery.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/BaseCommandQuery.java @@ -271,6 +271,7 @@ public abstract class BaseCommandQuery extends BaseCommand { servConn.getName(), MessageType.getString(msg.getMessageType()), servConn.getProxyID()); } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(se); return false; } catch (Exception e) { // If an interrupted exception is thrown , rethrow it http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java index 5ec34fc..6e31fe5 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java @@ -2585,7 +2585,7 @@ public class CacheClientProxy implements ClientSession { // See isAlive(). // getProxy().close(false); - pauseOrUnregisterProxy(); + pauseOrUnregisterProxy(e); } // _isStopped } // synchronized exceptionOccured = true; @@ -2700,7 +2700,7 @@ public class CacheClientProxy implements ClientSession { } - private void pauseOrUnregisterProxy() { + private void pauseOrUnregisterProxy(Throwable t) { if (getProxy().isDurable()) { try { getProxy().pauseDispatching(); @@ -2727,7 +2727,7 @@ public class CacheClientProxy implements ClientSession { // been caught and here, so the _proxy will be null. if (chm != null) { ClientProxyMembershipID proxyID = getProxy().proxyID; - chm.removeAllConnectionsAndUnregisterClient(proxyID); + chm.removeAllConnectionsAndUnregisterClient(proxyID, t); if (!getProxy().isDurable()) { getProxy().getCacheClientNotifier().unregisterClient(proxyID, false); } @@ -2917,7 +2917,7 @@ public class CacheClientProxy implements ClientSession { LocalizedMessage.create( LocalizedStrings.CacheClientProxy_0__AN_UNEXPECTED_EXCEPTION_OCCURRED, this), e); - pauseOrUnregisterProxy(); + pauseOrUnregisterProxy(e); } } } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientHealthMonitor.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientHealthMonitor.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientHealthMonitor.java index 2202124..e21a834 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientHealthMonitor.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientHealthMonitor.java @@ -202,7 +202,8 @@ public class ClientHealthMonitor { * * @param proxyID The id of the client to be unregistered */ - private void unregisterClient(ClientProxyMembershipID proxyID) { + private void unregisterClient(ClientProxyMembershipID proxyID, boolean clientDisconnectedCleanly, + Throwable clientDisconnectException) { boolean unregisterClient = false; synchronized (_clientHeartbeatsLock) { Map oldClientHeartbeats = this._clientHeartbeats; @@ -215,10 +216,17 @@ public class ClientHealthMonitor { } if (unregisterClient) { - if (logger.isDebugEnabled()) { - logger.debug(LocalizedMessage.create( - LocalizedStrings.ClientHealthMonitor_CLIENTHEALTHMONITOR_UNREGISTERING_CLIENT_WITH_MEMBER_ID_0, - new Object[] {proxyID})); + if (clientDisconnectedCleanly) { + if (logger.isDebugEnabled()) { + logger.debug(LocalizedMessage.create( + LocalizedStrings.ClientHealthMonitor_CLIENTHEALTHMONITOR_UNREGISTERING_CLIENT_WITH_MEMBER_ID_0, + new Object[] {proxyID})); + } + } else { + logger.warn(LocalizedMessage.create( + LocalizedStrings.ClientHealthMonitor_CLIENTHEALTHMONITOR_UNREGISTERING_CLIENT_WITH_MEMBER_ID_0_DUE_TO_1, + new Object[] {proxyID, clientDisconnectException == null ? "Unknown reason" + : clientDisconnectException.getLocalizedMessage()})); } if (this.stats != null) { this.stats.incClientUnRegisterRequests(); @@ -236,8 +244,8 @@ public class ClientHealthMonitor { * @param clientDisconnectedCleanly Whether the client disconnected cleanly or crashed */ public void unregisterClient(ClientProxyMembershipID proxyID, AcceptorImpl acceptor, - boolean clientDisconnectedCleanly) { - unregisterClient(proxyID); + boolean clientDisconnectedCleanly, Throwable clientDisconnectException) { + unregisterClient(proxyID, clientDisconnectedCleanly, clientDisconnectException); // Unregister any CacheClientProxy instances associated with this member id // if this method was invoked from a ServerConnection and the client did // not disconnect cleanly. @@ -302,11 +310,12 @@ public class ClientHealthMonitor { } } - public void removeAllConnectionsAndUnregisterClient(ClientProxyMembershipID proxyID) { + public void removeAllConnectionsAndUnregisterClient(ClientProxyMembershipID proxyID, + Throwable t) { // Remove all connections cleanupClientThreads(proxyID, false); - unregisterClient(proxyID); + unregisterClient(proxyID, false, t); } /** http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java index 7e915f2..59b0fa4 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java @@ -691,6 +691,7 @@ public class ServerConnection implements Runnable { private boolean doHandshake = true; private boolean clientDisconnectedCleanly = false; + private Throwable clientDisconnectedException; private int failureCount = 0; private boolean processMessages = true; @@ -804,6 +805,9 @@ public class ServerConnection implements Runnable { // package access allowed so AcceptorImpl can call void handleTermination() { + if (this.crHelper.isShutdown()) { + setClientDisconnectCleanly(); + } handleTermination(false); } @@ -886,7 +890,7 @@ public class ServerConnection implements Runnable { this.acceptor.getClientHealthMonitor().removeConnection(this.proxyId, this); if (unregisterClient) { this.acceptor.getClientHealthMonitor().unregisterClient(this.proxyId, getAcceptor(), - this.clientDisconnectedCleanly); + this.clientDisconnectedCleanly, this.clientDisconnectedException); } } } @@ -1138,6 +1142,7 @@ public class ServerConnection implements Runnable { } catch (IOException ex) { logger.warn( LocalizedMessage.create(LocalizedStrings.ServerConnection_0__UNEXPECTED_EXCEPTION, ex)); + setClientDisconnectedException(ex); } finally { getAcceptor().releaseCommBuffer(Message.setTLCommBuffer(null)); // DistributedSystem.releaseThreadsSockets(); @@ -1853,4 +1858,8 @@ public class ServerConnection implements Runnable { public void setClientDisconnectCleanly() { this.clientDisconnectedCleanly = true; } + + public void setClientDisconnectedException(Throwable e) { + this.clientDisconnectedException = e; + } } http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/DestroyRegion.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/DestroyRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/DestroyRegion.java index e69747b..13fef02 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/DestroyRegion.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/DestroyRegion.java @@ -78,6 +78,7 @@ public class DestroyRegion extends BaseCommand { } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(se); return; } catch (Exception e) { writeException(msg, e, false, servConn); @@ -146,6 +147,7 @@ public class DestroyRegion extends BaseCommand { servConn.getProxyID()); } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(e); } else { writeException(msg, e, false, servConn); servConn.setAsTrue(RESPONDED); http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/GatewayReceiverCommand.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/GatewayReceiverCommand.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/GatewayReceiverCommand.java index cb5c9dc..54140bd 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/GatewayReceiverCommand.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/GatewayReceiverCommand.java @@ -490,6 +490,7 @@ public class GatewayReceiverCommand extends BaseCommand { servConn.getProxyID()); } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(e); } else { throw e; } @@ -683,6 +684,7 @@ public class GatewayReceiverCommand extends BaseCommand { servConn.getProxyID()); } servConn.setFlagProcessMessagesAsFalse(); + servConn.setClientDisconnectedException(e); return; } catch (Exception e) { // If an interrupted exception is thrown , rethrow it http://git-wip-us.apache.org/repos/asf/geode/blob/f403ae7c/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java b/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java index fc59922..10e64cd 100755 --- a/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java +++ b/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java @@ -399,6 +399,9 @@ public class LocalizedStrings { public static final StringId DiskRegion_COMPLEXDISKREGIONGETNEXTDIR_MAX_DIRECTORY_SIZE_WILL_GET_VIOLATED__GOING_AHEAD_WITH_THE_SWITCHING_OF_OPLOG_ANY_WAYS_CURRENTLY_AVAILABLE_SPACE_IN_THE_DIRECTORY_IS__0__THE_CAPACITY_OF_DIRECTORY_IS___1 = new StringId(1200, "Even though the configured directory size limit has been exceeded a new oplog will be created because compaction is enabled. The configured limit is {1}. The current space used in the directory by this disk store is {0}."); + public static final StringId ClientHealthMonitor_CLIENTHEALTHMONITOR_UNREGISTERING_CLIENT_WITH_MEMBER_ID_0_DUE_TO_1 = + new StringId(1201, + "ClientHealthMonitor: Unregistering client with member id {0} due to: {1}"); public static final StringId AttributesFactory_CLONENOTSUPPORTEDEXCEPTION_THROWN_IN_CLASS_THAT_IMPLEMENTS_CLONEABLE = new StringId(1213, "CloneNotSupportedException thrown in class that implements cloneable.");
