Skip to content

Commit 281cb20

Browse files
fix: registerListener issue when stream is closed after onCall, which leads to request being dead
1 parent d959f44 commit 281cb20

File tree

2 files changed

+17
-21
lines changed

2 files changed

+17
-21
lines changed

plugin/src/main/java/studio/o7/octopus/plugin/OctopusImpl.java

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
66
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
77
import lombok.NonNull;
8-
import org.bukkit.plugin.Plugin;
8+
import lombok.extern.slf4j.Slf4j;
99
import org.jetbrains.annotations.NotNull;
1010
import org.jetbrains.annotations.Nullable;
11-
import org.slf4j.Logger;
1211
import studio.o7.octopus.plugin.api.Octopus;
1312
import studio.o7.octopus.plugin.api.listener.Listener;
1413
import studio.o7.octopus.plugin.observer.EmptyObserver;
@@ -22,19 +21,14 @@
2221
import java.util.UUID;
2322
import java.util.concurrent.atomic.AtomicReference;
2423

24+
@Slf4j (topic = "OctopusPlugin")
2525
public final class OctopusImpl implements Octopus {
2626
private static final EmptyObserver EMPTY_OBSERVER = new EmptyObserver();
2727

2828
private final OctopusGrpc.OctopusStub stub = OctopusSDK.stub();
2929
private final OctopusGrpc.OctopusBlockingStub blockingStub = OctopusSDK.blockingStub();
3030
private final Object2ObjectMap<UUID, Pair<Listener, StreamObserver<ListenMessage>>> listeners = new Object2ObjectArrayMap<>();
3131

32-
private final Logger logger;
33-
34-
public OctopusImpl(Plugin plugin) {
35-
logger = plugin.getSLF4JLogger();
36-
}
37-
3832
@Override
3933
public @NotNull Collection<Entry> get(@NonNull String keyPattern, boolean includeExpired, @Nullable Instant createdRangeStart, @Nullable Instant createdRangeEnd) {
4034
var builder = GetRequest.newBuilder();
@@ -58,33 +52,35 @@ public void registerListener(@NonNull Listener listener) {
5852
var observer = stub.listen(new StreamObserver<>() {
5953
@Override
6054
public void onNext(EventCall value) {
61-
try {
62-
var request = requestRef.get();
63-
if (request == null) return;
55+
var start = System.currentTimeMillis();
56+
var request = requestRef.get();
57+
if (request == null) return;
58+
59+
listener.onCall(value.getObject());
6460

65-
listener.onCall(value.getObject());
61+
var msg = ListenMessage.newBuilder()
62+
.setCallback(value)
63+
.build();
6664

67-
var msg = ListenMessage.newBuilder()
68-
.setCallback(value)
69-
.build();
65+
request = requestRef.get();
66+
if (request == null) return;
7067

71-
request.onNext(msg);
72-
} catch (Exception e) {
73-
logger.error(e.getMessage(), e);
74-
}
68+
request.onNext(msg);
69+
log.debug("Finished EventCall `{}` in {}ms", value.getCallId(), System.currentTimeMillis() - start);
7570
}
7671

7772
@Override
7873
public void onError(Throwable t) {
7974
requestRef.set(null);
80-
logger.error("Cannot call event on listener {} with key-pattern {}", listener.getListenerUniqueId(), listener.getKeyPattern(), t);
75+
log.error("Cannot call event on listener {} with key-pattern {}", listener.getListenerUniqueId(), listener.getKeyPattern(), t);
8176
unregisterListener(listener);
8277
}
8378

8479
@Override
8580
public void onCompleted() {
8681
requestRef.set(null);
8782
unregisterListener(listener);
83+
log.debug("Completed listener `{}`", listener.getListenerUniqueId());
8884
}
8985
});
9086

plugin/src/main/java/studio/o7/octopus/plugin/OctopusPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public OctopusPlugin() {
1616

1717
@Override
1818
public void onEnable() {
19-
octopus = new OctopusImpl(this);
19+
octopus = new OctopusImpl();
2020
}
2121

2222
@Override

0 commit comments

Comments
 (0)