Skip to content

Commit 64fe5c2

Browse files
committed
Have a global and thread local observer in QueryObserverHolder
1 parent 2cb85bc commit 64fe5c2

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

geode-core/src/main/java/org/apache/geode/cache/query/internal/QueryObserverHolder.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515
package org.apache.geode.cache.query.internal;
1616

17+
1718
import org.apache.geode.annotations.Immutable;
1819
import org.apache.geode.annotations.internal.MakeNotStatic;
1920

@@ -49,31 +50,46 @@ public class QueryObserverHolder {
4950
* The current observer which will be notified of all query events.
5051
*/
5152
@MakeNotStatic
52-
private static ThreadLocal<QueryObserver> _instance = ThreadLocal.withInitial(() -> NO_OBSERVER);
53+
private static final ThreadLocal<QueryObserver> _instance = new ThreadLocal<>();
54+
55+
private static volatile QueryObserver _globalInstance = NO_OBSERVER;
5356

5457
/**
5558
* Set the given observer to be notified of query events. Returns the current observer.
5659
*/
57-
public static QueryObserver setInstance(QueryObserver observer) {
60+
public static synchronized QueryObserver setInstance(QueryObserver observer) {
5861
Support.assertArg(observer != null, "setInstance expects a non-null argument!");
59-
QueryObserver oldObserver = _instance.get();
62+
QueryObserver oldObserver;
63+
if (_instance.get() != null) {
64+
oldObserver = _instance.get();
65+
} else {
66+
oldObserver = _globalInstance;
67+
}
6068
_instance.set(observer);
69+
_globalInstance = observer;
6170
return oldObserver;
6271
}
6372

64-
public static boolean hasObserver() {
65-
return _instance.get() != NO_OBSERVER;
73+
public static synchronized boolean hasObserver() {
74+
if (_instance.get() != null) {
75+
return _instance.get() != NO_OBSERVER;
76+
}
77+
return _globalInstance != NO_OBSERVER;
6678
}
6779

6880
/** Return the current QueryObserver instance */
6981
public static QueryObserver getInstance() {
70-
return _instance.get();
82+
if (_instance.get() != null) {
83+
return _instance.get();
84+
}
85+
return _globalInstance;
7186
}
7287

7388
/**
7489
* Only for test purposes.
7590
*/
7691
public static void reset() {
7792
_instance.set(NO_OBSERVER);
93+
_globalInstance = NO_OBSERVER;
7894
}
7995
}

0 commit comments

Comments
 (0)