Suppress logging of common peer condition.

This has been happening for a while on PX and I've been meaning to track
it down. When a peer shuts down an object that's proxied on other peers,
the other peers receive an ObjectDestroyedEvent, and clear the object
from their omgrs. Other listeners may also receive the event and will need
to clear the proxying information, but that causes an unsubscribe to be
queued up, which when it runs will find the DObject already gone, and log
an error.

At first I considered not queuing up the unsubscribe action if the object
is no longer present in the omgr, but in the case that I'm working with
we have 2 or more objects that will all be destroyed simultaneously.
Even if I test to see if the first object is around or not, this same
test would always pass for the second object even though its death event
is next on the queue. The unsubscribe would be enqueued after THAT, so
there's no test to detect that the two objects are linked.

Instead, just suppress this message if we're a peer client. I didn't
want to suppress it altogether because we might want this message logged for
normal client connections. Maybe not.

Perhaps there is a better way. Maybe the PeerNode should add its own
ObjectDeathListener and clear out the proxy information and ensure that
the proxied object is also destoyed, and clients need not unproxy manually
in that case.

RFC.
This commit is contained in:
Ray J. Greenwell
2013-10-26 18:33:53 -07:00
parent 408cf8aa6e
commit 3bbe3a6330
3 changed files with 26 additions and 1 deletions
@@ -971,6 +971,27 @@ public class Client
return false;
}
/**
* Should we be logging the specified failure?
*/
protected boolean isFailureLoggable (FailureType type)
{
return true;
}
/**
* The types of failures that may occur in our associated classes, which may call
* isFailureLoggable() for use to arbitrate whether we want to log the error.
*/
protected enum FailureType
{
/** An attempt was made to unsubscribe from an object that is not proxied. */
UNSUBSCRIBE_NOT_PROXIED,
// TODO: fill out more
;
}
/** Handles the process of switching between servers. See {@link Client#moveToServer}. */
protected class ServerSwitcher extends ClientAdapter
{
@@ -442,7 +442,7 @@ public class ClientDObjectMgr
if (dobj != null) {
dobj.removeSubscriber(target);
} else {
} else if (_client.isFailureLoggable(Client.FailureType.UNSUBSCRIBE_NOT_PROXIED)) {
log.info("Requested to remove subscriber from non-proxied object", "oid", oid,
"sub", target);
}
@@ -80,6 +80,10 @@ public class PeerNode
@Override protected Communicator createCommunicator () {
return PeerNode.this.createCommunicator(this);
}
@Override protected boolean isFailureLoggable (FailureType type) {
return (type != FailureType.UNSUBSCRIBE_NOT_PROXIED) &&
super.isFailureLoggable(type);
}
};
_client.addClientObserver(this);
}