OK, looks pretty good. But....
One little thing is still bothering me. Suppose we get interrupted from the
sleep() and bail out on that basis. If we got to the point where we're
sleeping, we must have caught an AccessDeniedException previously.
Unfortunately this exception is discarded if we were interrupted. This might
lose valuable diagnostic information. So, what do we do with it? How about
adding:
ie.addSuppressed(cause);
in the catch InterruptedException clause, before throwing the RuntimeException.
Another good point...
(There's another issue which is that if there were previous retries, the ADEs
from them are thrown away. But maybe we should save that one for another day.)
I had the same thought, but aside from collecting and reporting all of them
somehow I'm not sure what could be done about it.
Maybe instead of:
cause = ade;
do:
if (cause != null) {
cause.addSuppressed(ade);
} else {
cause = ade;
}
Then they'll at least all be reported when RuntimeException is thrown.
Very good point indeed, how about we also capture/print unconditionally
how many retries were made, this might give us some indication of the
gremlin we are dealing with.
Kumar
-DrD-