|
37 | 37 | import javax.annotation.concurrent.GuardedBy; |
38 | 38 |
|
39 | 39 | public class FallbackChannelPool implements ChannelPool { |
40 | | - private FallbackConfiguration config; |
| 40 | + private volatile FallbackConfiguration config; |
41 | 41 | private final ChannelPool primary; |
42 | 42 | private final ChannelPool secondary; |
43 | 43 | private final PoolFallbackListener poolFallbackListener; |
@@ -94,22 +94,29 @@ public void updateConfig(ChannelPoolConfiguration newConfig) { |
94 | 94 | } |
95 | 95 |
|
96 | 96 | // For now only updates error rate, interval, and is enabled. |
97 | | - synchronized void updateConfig(FallbackConfiguration newConfig) { |
98 | | - config = |
99 | | - config.toBuilder() |
100 | | - .setEnabled(newConfig.isEnabled()) |
101 | | - .setCheckInterval(newConfig.getCheckInterval()) |
102 | | - .setErrorRate(newConfig.getErrorRate()) |
103 | | - .build(); |
104 | | - |
105 | | - if (!config.isEnabled()) { |
106 | | - if (currentPool.compareAndSet(secondary, primary)) { |
107 | | - poolFallbackListener.onFallback( |
108 | | - config.getFallbackName(), |
109 | | - config.getPrimaryName(), |
110 | | - ChannelFallbackReason.FALLBACK_DISABLE); |
| 97 | + void updateConfig(FallbackConfiguration newConfig) { |
| 98 | + boolean triggerCallback = false; |
| 99 | + FallbackConfiguration localConfig; |
| 100 | + synchronized (this) { |
| 101 | + config = |
| 102 | + config.toBuilder() |
| 103 | + .setEnabled(newConfig.isEnabled()) |
| 104 | + .setCheckInterval(newConfig.getCheckInterval()) |
| 105 | + .setErrorRate(newConfig.getErrorRate()) |
| 106 | + .build(); |
| 107 | + localConfig = config; |
| 108 | + |
| 109 | + if (!localConfig.isEnabled()) { |
| 110 | + triggerCallback = currentPool.compareAndSet(secondary, primary); |
111 | 111 | } |
112 | 112 | } |
| 113 | + |
| 114 | + if (triggerCallback) { |
| 115 | + poolFallbackListener.onFallback( |
| 116 | + localConfig.getFallbackName(), |
| 117 | + localConfig.getPrimaryName(), |
| 118 | + ChannelFallbackReason.FALLBACK_DISABLE); |
| 119 | + } |
113 | 120 | } |
114 | 121 |
|
115 | 122 | @Override |
@@ -193,19 +200,22 @@ private void checkRatesAndReschedule() { |
193 | 200 | scheduleCheckRates(); |
194 | 201 | } |
195 | 202 |
|
196 | | - private synchronized void checkRates() { |
| 203 | + private void checkRates() { |
197 | 204 | int successes = successCount.getAndSet(0); |
198 | 205 | int failures = failureCount.getAndSet(0); |
199 | 206 | int total = successes + failures; |
| 207 | + FallbackConfiguration localConfig = config; |
200 | 208 |
|
201 | | - if (!config.isEnabled()) { |
| 209 | + if (!localConfig.isEnabled()) { |
202 | 210 | return; |
203 | 211 | } |
204 | 212 |
|
205 | | - if (total > 0 && ((double) failures) / total >= config.getErrorRate()) { |
| 213 | + if (total > 0 && ((double) failures) / total >= localConfig.getErrorRate()) { |
206 | 214 | if (currentPool.compareAndSet(primary, secondary)) { |
207 | 215 | poolFallbackListener.onFallback( |
208 | | - config.getPrimaryName(), config.getFallbackName(), ChannelFallbackReason.ERROR_RATE); |
| 216 | + localConfig.getPrimaryName(), |
| 217 | + localConfig.getFallbackName(), |
| 218 | + ChannelFallbackReason.ERROR_RATE); |
209 | 219 | } |
210 | 220 | } |
211 | 221 | } |
|
0 commit comments