2020import com .google .common .base .Preconditions ;
2121import com .google .errorprone .annotations .CheckReturnValue ;
2222import java .util .concurrent .TimeUnit ;
23+ import java .util .logging .Level ;
24+ import java .util .logging .Logger ;
2325
2426/** Monitors the client's PING usage to make sure the rate is permitted. */
2527public final class KeepAliveEnforcer {
@@ -36,7 +38,7 @@ public final class KeepAliveEnforcer {
3638 private long lastValidPingTime ;
3739 private boolean hasOutstandingCalls ;
3840 private int pingStrikes ;
39-
41+ private static final Logger log = Logger . getLogger ( KeepAliveEnforcer . class . getName ());
4042 public KeepAliveEnforcer (boolean permitWithoutCalls , long minTime , TimeUnit unit ) {
4143 this (permitWithoutCalls , minTime , unit , SystemTicker .INSTANCE );
4244 }
@@ -50,24 +52,34 @@ public KeepAliveEnforcer(boolean permitWithoutCalls, long minTime, TimeUnit unit
5052 this .ticker = ticker ;
5153 this .epoch = ticker .nanoTime ();
5254 lastValidPingTime = epoch ;
55+ log .log (Level .INFO , "minTimeNanos=" + minTimeNanos );
5356 }
5457
5558 /** Returns {@code false} when client is misbehaving and should be disconnected. */
5659 @ CheckReturnValue
5760 public boolean pingAcceptable () {
5861 long now = ticker .nanoTime ();
5962 boolean valid ;
60- if (!hasOutstandingCalls && !permitWithoutCalls ) {
61- valid = compareNanos (lastValidPingTime + IMPLICIT_PERMIT_TIME_NANOS , now ) <= 0 ;
62- } else {
63- valid = compareNanos (lastValidPingTime + minTimeNanos , now ) <= 0 ;
64- }
65- if (!valid ) {
66- pingStrikes ++;
67- return pingStrikes <= MAX_PING_STRIKES ;
68- } else {
69- lastValidPingTime = now ;
70- return true ;
63+ log .log (Level .INFO , "Enter pingAcceptable." );
64+ try {
65+ if (!hasOutstandingCalls && !permitWithoutCalls ) {
66+ valid = compareNanos (lastValidPingTime + IMPLICIT_PERMIT_TIME_NANOS , now ) <= 0 ;
67+ } else {
68+ valid = compareNanos (lastValidPingTime + minTimeNanos , now ) <= 0 ;
69+ log .log (Level .INFO , String .format ("lastValidPingTime + minTimeNanos =%d, now=%d, difference=%fs, valid=%s." ,
70+ lastValidPingTime + minTimeNanos , now , (now - lastValidPingTime - minTimeNanos ) / 1_000_000_000.0 , valid ));
71+ }
72+ if (!valid ) {
73+ pingStrikes ++;
74+ log .log (Level .INFO , "Not valid. pingStrikes=" + pingStrikes + ". Returning " + (pingStrikes <= MAX_PING_STRIKES ));
75+ return pingStrikes <= MAX_PING_STRIKES ;
76+ } else {
77+ log .log (Level .INFO , "Valid. Setting lastValidPingTime to now." );
78+ lastValidPingTime = now ;
79+ return true ;
80+ }
81+ } finally {
82+ log .log (Level .INFO , "Exit pingAcceptable." );
7183 }
7284 }
7385
0 commit comments