mirror of https://github.com/apache/kafka.git
The `onComplete` method in DelayedOperation is guaranteed to run only once, through `forceComplete`, invoked either by `tryComplete` or when operation is expired (`run` method). The invocation of `tryComplete` is done by attaining `lock` so no concurrent execution of `tryComplete` happens for same delayed operation. However, there can be concurrent execution of `tryComplete` and `onComplete` as the `expiration` thread can trigger a separte run of `onComplete` while `tryComplete` is still executing. This behaviour is not ideal as there are parallel runs where 1 threads method execution is wasteful i.e. if `onComplete` is already invoked by another thread then execution of `tryComplete` is not required. I ran some tests and performance is same. ### After the chages: ``` --num 10000 --rate 100 --timeout 1000 --pct50 0.5 --pct75 0.75 # latency samples: pct75 = 0, pct50 = 0, min = 0, max = 7 # interval samples: rate = 100.068948, min = 0, max = 129 # enqueue rate (10000 requests): # <elapsed time ms> <target rate> <actual rate> <process cpu time ms> <G1 Old Generation count> <G1 Young Generation count> <G1 Old Generation time ms> <G1 Young Generation time ms> 101196 99.809364 99.806376 3240 0 2 0 8 ``` ``` --num 10000 --rate 1000 --timeout 1000 --pct50 0.5 --pct75 0.75 # latency samples: pct75 = 0, pct50 = 0, min = 0, max = 9 # interval samples: rate = 999.371395, min = 0, max = 14 # enqueue rate (10000 requests): # <elapsed time ms> <target rate> <actual rate> <process cpu time ms> <G1 Old Generation count> <G1 Young Generation count> <G1 Old Generation time ms> <G1 Young Generation time ms> 11104 989.902990 989.805008 1349 0 2 0 7 ``` ### Before changes: ``` --num 10000 --rate 100 --timeout 1000 --pct50 0.5 --pct75 0.75 # latency samples: pct75 = 0, pct50 = 0, min = 0, max = 9 # interval samples: rate = 100.020304, min = 0, max = 130 # enqueue rate (10000 requests): # <elapsed time ms> <target rate> <actual rate> <process cpu time ms> <G1 Old Generation count> <G1 Young Generation count> <G1 Old Generation time ms> <G1 Young Generation time ms> 102366 98.657274 98.652408 3444 0 2 0 8 --num 10000 --rate 1000 --timeout 1000 --pct50 0.5 --pct75 0.75 # latency samples: pct75 = 0, pct50 = 0, min = 0, max = 8 # interval samples: rate = 997.134236, min = 0, max = 14 # enqueue rate (10000 requests): # <elapsed time ms> <target rate> <actual rate> <process cpu time ms> <G1 Old Generation count> <G1 Young Generation count> <G1 Old Generation time ms> <G1 Young Generation time ms> 11218 978.665101 978.665101 1624 0 2 0 7 Reviewers: Jun Rao <junrao@gmail.com>, Andrew Schofield <aschofield@confluent.io>, Chia-Ping Tsai <chia7712@gmail.com> |
||
|---|---|---|
| .. | ||
| src | ||
| .gitignore | ||