-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Separates backoff delay logic for testability into BackoffCalculator #40
Separates backoff delay logic for testability into BackoffCalculator #40
Conversation
Hi @Synesso, Thanks for the PR, we've taken a quick look at it and have a question before we do a full review. Would you mind clarifying whether new behavior is included in this PR?
It sounds like you are describing this as new behavior, but Thanks, |
Yes, however the delay did not reset to zero after a successfully long
connection. It behaved as if it had failed once.
This is particularly noticeable when using the SSE endpoints of Stellar
Horizon
<https://www.stellar.org/developers/horizon/reference/streaming.html>, as
that server software will terminate a connection after 10 seconds *or* 10
events. Where there are thousands of events to be received the launchdarkly
library will receive 10, wait, receive 10 etc. The only workaround is to
set the max delay to zero, effectively disabling the backoff feature.
…On Thu, 19 Dec 2019 at 04:42, Gavin Whelan ***@***.***> wrote:
Hi @Synesso <https://github.com/Synesso>,
Thanks for the PR, we've taken a quick look at it and have a question
before we do a full review. Would you mind clarifying whether new behavior
is included in this PR?
Additionally, the logic has been modified such that there is no
reconnection delay after a long-lived connection
It sounds like you are describing this as new behavior, but
backoffResetThresholdMs was already a configuration used for determining
whether to reset the connection time.
Thanks,
@gwhelanLD <https://github.com/gwhelanLD>
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#40?email_source=notifications&email_token=AAAFKY7FJJEIQK2TBYN5KE3QZJVJTA5CNFSM4J3WQS62YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEHHCQ7Y#issuecomment-567158911>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAAFKY2V4QPNSIRFIBZZREDQZJVJTANCNFSM4J3WQS6Q>
.
|
Ah, I see now. Thanks for a PR that fixes this and has better testability for this part of the behavior. We'll go over the changes and give feedback or get it merged soon. Thanks, |
We can't accept this because the "reset to zero, instead of to the initial delay" behavior is not desirable for the LaunchDarkly Java SDK, which is the main consumer of this library - and I don't think it's reasonable to assume that other consumers would want that change either. But we will add it as an opt-in behavior in a future release. The rest of the changes here were already basically implemented in recent releases. |
However, I'd like to emphasize that in most use cases, that is not desirable behavior. I realize that in the unusual scenario you mentioned, the dropped connection is not really an error and it is only being dropped for this one client, so it does make sense to try to reconnect immediately. But for most other use cases, if the connection drops there's a good chance that it is a server outage or network interruption that has affected lots of other clients at the same time - so if it uses a zero delay, there will be a thundering herd. Even a relatively brief randomized delay of 500-1000ms is better in that regard than zero. |
@Synesso Could you provide a reference for what you said about the Stellar Horizon stream having this "close after every 10 events" behavior? I don't see anything about that on the page you linked to, and it is a strange way for them to have implemented this, if "there are thousands of events to be received" is a realistic scenario - the whole point of having an SSE endpoint is for it to stay open more than briefly; if clients have to make hundreds of connections to receive incremental updates, then they might as well just be polling. |
I agree with you. It's odd behaviour, especially as their paginated
response API returns 200 records at a time.
https://stellar.stackexchange.com/a/1090
…On Wed, 8 Apr 2020 at 08:46, Eli Bishop ***@***.***> wrote:
@Synesso <https://github.com/Synesso> Could you provide a reference for
what you said about the Stellar Horizon stream having this "close after
every 10 events" behavior? I don't see anything about that on the page you
linked to, and it is a strange way for them to have implemented this, if
"there are thousands of events to be received" is a realistic scenario -
the whole point of having an SSE endpoint is for it to stay open more than
briefly; if clients have to make hundreds of connections to receive
incremental updates, then they might as well just be polling.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#40 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAAFKY3DVR4A3Y3SLYLCT5TRLOUN5ANCNFSM4J3WQS6Q>
.
|
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * add 1.x branch * bump OkHttp version to latest Java 7-compatible version * prepare 1.10.2 release (#43) * Releasing version 1.10.2 * Gradle update + build fixes * add ability to force a stream restart; improve tests so we can test this (#29) * prepare 1.11.0 release (#44) * Releasing version 1.11.0 * Gradle release fixes * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * prepare 1.11.1 release (#49) * Releasing version 1.11.1 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * prepare 1.11.2 release (#56) * Releasing version 1.11.2 * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: LaunchDarklyCI <LaunchDarklyCI@users.noreply.github.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * add 1.x branch * bump OkHttp version to latest Java 7-compatible version * prepare 1.10.2 release (#43) * Releasing version 1.10.2 * Gradle update + build fixes * add ability to force a stream restart; improve tests so we can test this (#29) * prepare 1.11.0 release (#44) * Releasing version 1.11.0 * Gradle release fixes * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * prepare 1.11.1 release (#49) * Releasing version 1.11.1 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * prepare 1.11.2 release (#56) * Releasing version 1.11.2 * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: LaunchDarklyCI <LaunchDarklyCI@users.noreply.github.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * add 1.x branch * bump OkHttp version to latest Java 7-compatible version * prepare 1.10.2 release (#43) * Releasing version 1.10.2 * Gradle update + build fixes * add ability to force a stream restart; improve tests so we can test this (#29) * prepare 1.11.0 release (#44) * Releasing version 1.11.0 * Gradle release fixes * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * prepare 1.11.1 release (#49) * Releasing version 1.11.1 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * prepare 1.11.2 release (#56) * Releasing version 1.11.2 * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: LaunchDarklyCI <LaunchDarklyCI@users.noreply.github.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * add 1.x branch * bump OkHttp version to latest Java 7-compatible version * prepare 1.10.2 release (#43) * Releasing version 1.10.2 * Gradle update + build fixes * add ability to force a stream restart; improve tests so we can test this (#29) * prepare 1.11.0 release (#44) * Releasing version 1.11.0 * Gradle release fixes * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * prepare 1.11.1 release (#49) * Releasing version 1.11.1 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * prepare 1.11.2 release (#56) * Releasing version 1.11.2 * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * consistently use placeholders instead of concatenation in log output Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: LaunchDarklyCI <LaunchDarklyCI@users.noreply.github.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * bump OkHttp version to latest Java 7-compatible version * add ability to force a stream restart; improve tests so we can test this (#29) * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * consistently use placeholders instead of concatenation in log output * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * bump OkHttp version to latest Java 7-compatible version * add ability to force a stream restart; improve tests so we can test this (#29) * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * remove SLF4J dependency, use only com.launchdarkly.logging * update com.launchdarkly.logging version * consistently use placeholders instead of concatenation in log output * update release metadata * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * fix release metadata * remove usage of Duration for Android compatibility Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * bump OkHttp version to latest Java 7-compatible version * add ability to force a stream restart; improve tests so we can test this (#29) * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * remove SLF4J dependency, use only com.launchdarkly.logging * update com.launchdarkly.logging version * consistently use placeholders instead of concatenation in log output * update release metadata * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * fix release metadata * remove usage of Duration for Android compatibility * new synchronous EventSource implementation (#64) * add async wrapper to emulate old EventSource (#65) Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * bump OkHttp version to latest Java 7-compatible version * add ability to force a stream restart; improve tests so we can test this (#29) * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * remove SLF4J dependency, use only com.launchdarkly.logging * update com.launchdarkly.logging version * consistently use placeholders instead of concatenation in log output * update release metadata * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * fix release metadata * remove usage of Duration for Android compatibility * new synchronous EventSource implementation (#64) * add async wrapper to emulate old EventSource (#65) * update doc comments regarding thread behavior in Android * update Gradle to 7.6 + fix snapshot releases Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * bump OkHttp version to latest Java 7-compatible version * add ability to force a stream restart; improve tests so we can test this (#29) * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * remove SLF4J dependency, use only com.launchdarkly.logging * update com.launchdarkly.logging version * consistently use placeholders instead of concatenation in log output * update release metadata * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * fix release metadata * remove usage of Duration for Android compatibility * new synchronous EventSource implementation (#64) * add async wrapper to emulate old EventSource (#65) * update doc comments regarding thread behavior in Android * update Gradle to 7.6 + fix snapshot releases * in streaming data mode, throw an exception if stream is closed during an event (#68) * in streaming data mode, throw an exception if stream is closed during an event * one more unit test Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * bump OkHttp version to latest Java 7-compatible version * add ability to force a stream restart; improve tests so we can test this (#29) * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * remove SLF4J dependency, use only com.launchdarkly.logging * update com.launchdarkly.logging version * consistently use placeholders instead of concatenation in log output * update release metadata * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * fix release metadata * remove usage of Duration for Android compatibility * new synchronous EventSource implementation (#64) * add async wrapper to emulate old EventSource (#65) * update doc comments regarding thread behavior in Android * update Gradle to 7.6 + fix snapshot releases * in streaming data mode, throw an exception if stream is closed during an event (#68) * in streaming data mode, throw an exception if stream is closed during an event * one more unit test * fix overly time-sensitive tests Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
* add time threshold for backoff reset * allow endpoint to be specified as either URI or HttpUrl * add @SInCE * add interface for customizing requests * javadoc fixes * add changelog for past releases * remove JSR305 * replace SSL-specific config method with general-purpose HTTP config method * make helper method static * add end-to-end EventSource tests * spacing * omit default header value if there's a custom value * avoid trailing period in logger name * add 1.x branch * update to OkHttp 4.x and Java 8 * javadoc fixes * remove EventSource setters, + test improvements * update Gradle release * enable Github Pages * skip tests in release * add ability to force a stream restart; improve tests so we can test this * revert whitespace change * bump OkHttp version to latest Java 7-compatible version * add ability to force a stream restart; improve tests so we can test this (#29) * update to okhttp 4.5.0 * longer timeout for cleaner shutdown of test servers * fix Gradle scopes * allow setting specific thread priority * remove misleading logging & unnecessary backoff, improve tests (#34) * known issue with onClose() - add comment, disable test assertions * allow caller to specify a custom logger instead of SLF4J (#32) * add method for changing base name of SLF4J logger * enable coverage reports in CI, improve CI to test all supported Java versions * rm inapplicable CI copy-paste * another CI fix * add checkstyle config * fix jitter calculation when upper bound is a power of 2 * misc coverage + test improvements, add CI enforcement of coverage (#39) * fix shutdown state logic, simplify code paths (#40) * Fix Java 7 compatibility. * add OpenJDK 7 build + fix test race condition + javadoc fix (#42) * update Gradle to 6.8.3 * Kotlinize build script * fix logic for shutting down after an unrecoverable error * use newer HTTP test helpers * use Releaser v2 config + newer CI images (#47) * use new stream-reading implementation to support CR-only line endings * make buffer size configurable * rm usage that's not allowed in Java 8 * add Guava test dependency * add code coverage ovverride * implement contract tests (#48) * use Gradle 7 * Bounded queues for the EventHandler thread (#58) * Bounded queue for the EventHandler thread The unbounded queue fronting the 'event' thread can cause trouble when the EventHandler is unable to keep up with the workload. This can lead to heap exhaustion, GC issues and failure modes that are generally considered "bad". Band-aid over this with a semaphore to limit the number of tasks in the queue. The semaphore is opt-in and disabled by default to avoid any nasty surprises for folks upgrading. Also add 'EventSource.awaitClosed()' to allow users to wait for underlying thread pools to completely shut down. We can't know if it's safe to clean up resources used by the EventHandler thread if we can't be certain that it has completely terminated. * Address checkstyle griping in StubServer * Fix JavaDoc issue * Tighten up exception handling Co-authored-by: Eli Bishop <eli@launchdarkly.com> * update @SInCE * test Java 17 in CI (#51) * improve tests for AsyncEventHandler and EventSource.awaitClosed (#52) * add streaming data mode for very large events (#53) * add option to ensure that expected fields are always read * add Gradle option to suppress kotlin-stdlib in our pom * update okhttp to 4.9.3 * use LaunchDarkly logging facade * rm unused * misc fixes * improve javadoc links * remove SLF4J dependency, use only com.launchdarkly.logging * update com.launchdarkly.logging version * consistently use placeholders instead of concatenation in log output * update release metadata * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * use SecureRandom instead of Random, just to make scanners happier * fix release metadata * remove usage of Duration for Android compatibility * new synchronous EventSource implementation (#64) * add async wrapper to emulate old EventSource (#65) * update doc comments regarding thread behavior in Android * update Gradle to 7.6 + fix snapshot releases * in streaming data mode, throw an exception if stream is closed during an event (#68) * in streaming data mode, throw an exception if stream is closed during an event * one more unit test * fix overly time-sensitive tests * Bumping Guava to fix CVE-2023-2976 --------- Co-authored-by: Eli Bishop <eli@launchdarkly.com> Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com> Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com> Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com> Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com> Co-authored-by: Todd Anderson <tanderson@launchdarkly.com> Co-authored-by: tanderson-ld <127344469+tanderson-ld@users.noreply.github.com>
The jittered backoff delay calculation is extracted into a separate class.
Additionally, the logic has been modified such that there is no reconnection delay after a long-lived connection. Backoff is only performed when the connection was short-lived.