You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zipkin.apache.org by ad...@apache.org on 2019/05/11 14:39:27 UTC
[incubator-zipkin-brave] 01/01: Fixes some edge cases around
sampler resetting
This is an automated email from the ASF dual-hosted git repository.
adriancole pushed a commit to branch fix-sampler
in repository https://gitbox.apache.org/repos/asf/incubator-zipkin-brave.git
commit a4dd38f9d575522867d22381f03a533927124d30
Author: Adrian Cole <ac...@pivotal.io>
AuthorDate: Sat May 11 22:36:36 2019 +0800
Fixes some edge cases around sampler resetting
I found these working on https://github.com/adriancole/zipkin-voltdb/pull/18
I don't have unit tests for the changes, but integrated looks a bit right now.
I think @pburm might be interested.
---
.../src/main/java/brave/sampler/RateLimitingSampler.java | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/brave/src/main/java/brave/sampler/RateLimitingSampler.java b/brave/src/main/java/brave/sampler/RateLimitingSampler.java
index 7bb775e..a6a3ef4 100644
--- a/brave/src/main/java/brave/sampler/RateLimitingSampler.java
+++ b/brave/src/main/java/brave/sampler/RateLimitingSampler.java
@@ -55,14 +55,17 @@ public class RateLimitingSampler extends Sampler {
long updateAt = nextReset.get();
long nanosUntilReset = -(now - updateAt); // because nanoTime can be negative
- boolean shouldReset = nanosUntilReset <= 0;
- if (shouldReset) {
- if (nextReset.compareAndSet(updateAt, updateAt + NANOS_PER_SECOND)) {
- usage.set(0);
- }
+ if (nanosUntilReset <= 0) {
+ // Attempt to move into the next sampling interval.
+ // nanosUntilReset is now invalid regardless of race winner, so we can't sample based on it.
+ if (nextReset.compareAndSet(updateAt, updateAt + NANOS_PER_SECOND)) usage.set(0);
+
+ // recurse as it is simpler than resetting all the locals.
+ // reset happens once per second, this code doesn't take a second, so no infinite recursion.
+ return isSampled(ignoredTraceId);
}
- int max = maxFunction.max(shouldReset ? 0 : nanosUntilReset);
+ int max = maxFunction.max(nanosUntilReset);
int prev, next;
do { // same form as java 8 AtomicLong.getAndUpdate
prev = usage.get();