jinmeiliao commented on a change in pull request #6835:
URL: https://github.com/apache/geode/pull/6835#discussion_r708724763
##########
File path:
geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/MessageDispatcher.java
##########
@@ -362,31 +387,67 @@ protected void runDispatcher() {
}
waitForResumption();
}
- try {
- clientMessage = (ClientMessage) _messageQueue.peek();
- } catch (RegionDestroyedException skipped) {
- break;
+
+ // if message is not delivered due to authentication expiation, this
clientMessage
+ // would not be null.
+ if (clientMessage == null) {
+ try {
+ clientMessage = (ClientMessage) _messageQueue.peek();
+ } catch (RegionDestroyedException skipped) {
+ break;
+ }
}
+
getStatistics().setQueueSize(_messageQueue.size());
if (isStopped()) {
break;
}
- if (clientMessage != null) {
- // Process the message
- long start = getStatistics().startTime();
- //// BUGFIX for BUG#38206 and BUG#37791
- boolean isDispatched = dispatchMessage(clientMessage);
- getStatistics().endMessage(start);
- if (isDispatched) {
+
+ if (clientMessage == null) {
+ _messageQueue.remove();
+ continue;
+ }
+
+ // Process the message
+ long start = getStatistics().startTime();
+ try {
+ if (dispatchMessage(clientMessage)) {
+ getStatistics().endMessage(start);
_messageQueue.remove();
if (clientMessage instanceof ClientMarkerMessageImpl) {
getProxy().setMarkerEnqueued(false);
}
}
- } else {
+ clientMessage = null;
+ wait_for_re_auth_start_time = -1;
+ } catch (NotAuthorizedException notAuthorized) {
+ // behave as if the message is dispatched, remove from the queue
+ logger.info("skip delivering message: " + clientMessage,
notAuthorized);
_messageQueue.remove();
+ clientMessage = null;
+ } catch (AuthenticationExpiredException expired) {
+ if (wait_for_re_auth_start_time == -1) {
+ wait_for_re_auth_start_time = System.currentTimeMillis();
+ // only send the message to clients who can handle the message
+ if
(getProxy().getVersion().isNewerThanOrEqualTo(RE_AUTHENTICATION_START_VERSION))
{
+ EventID eventId = createEventId();
+ sendMessageDirectly(new ClientReAuthenticateMessage(eventId));
+ }
+ // for older client, we still wait, just in case client will
perform some operations to
+ // trigger credential refresh on its own.
+ Thread.sleep(200);
+ } else {
+ long elapsedTime = System.currentTimeMillis() -
wait_for_re_auth_start_time;
+ if (elapsedTime > reAuthenticateWaitTime) {
+ logger.warn("Client did not re-authenticate back successfully in
" + elapsedTime
+ + "ms. Unregister this client proxy.");
+ pauseOrUnregisterProxy(expired);
+ } else {
+ Thread.sleep(200);
Review comment:
the `sleep()` is basically an interval between two authorization checks.
We don't want the check to be too busy. So the logic is like this
`
while(I am not stopped) {
if (last message is not delivered), keep process the same message
else take the message out of the queue
try{
dispatch the message (which includes authorization)
message dispatched
} catch (AuthExpirationException e) {
if (this is the first time I am processing this message) {
send the re-auth message to the client
wait for 200ms before go back to the loop
} else {
if ( I waited long enough) {
stop the dispatcher and terminate the connection
} else {
wait for 200ms and then go back to thee loop
}
}
}
}
`
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]