فهرست منبع

Enforce start happens-before stop

Closes gh-13133
Josh Cummings 2 سال پیش
والد
کامیت
5d903b5b71

+ 28 - 6
web/src/main/java/org/springframework/security/web/server/ObservationWebFilterChainDecorator.java

@@ -21,6 +21,8 @@ import java.util.List;
 import java.util.ListIterator;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import io.micrometer.common.KeyValue;
 import io.micrometer.common.KeyValues;
@@ -382,6 +384,8 @@ public final class ObservationWebFilterChainDecorator implements WebFilterChainP
 
 				private static final ObservationReference NOOP = new ObservationReference(Observation.NOOP);
 
+				private final Lock lock = new ReentrantLock();
+
 				private final AtomicInteger state = new AtomicInteger(0);
 
 				private final Observation observation;
@@ -391,20 +395,38 @@ public final class ObservationWebFilterChainDecorator implements WebFilterChainP
 				}
 
 				private void start() {
-					if (this.state.compareAndSet(0, 1)) {
-						this.observation.start();
+					try {
+						this.lock.lock();
+						if (this.state.compareAndSet(0, 1)) {
+							this.observation.start();
+						}
+					}
+					finally {
+						this.lock.unlock();
 					}
 				}
 
 				private void error(Throwable ex) {
-					if (this.state.get() == 1) {
-						this.observation.error(ex);
+					try {
+						this.lock.lock();
+						if (this.state.get() == 1) {
+							this.observation.error(ex);
+						}
+					}
+					finally {
+						this.lock.unlock();
 					}
 				}
 
 				private void stop() {
-					if (this.state.compareAndSet(1, 2)) {
-						this.observation.stop();
+					try {
+						this.lock.lock();
+						if (this.state.compareAndSet(1, 2)) {
+							this.observation.stop();
+						}
+					}
+					finally {
+						this.lock.unlock();
 					}
 				}