Skip to content

Commit 0b961f7

Browse files
committed
Explore acquisition scheduler offloading.
[#668]
1 parent f27d3bc commit 0b961f7

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

src/main/java/io/r2dbc/postgresql/PostgresqlConnection.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import io.r2dbc.spi.R2dbcException;
4141
import io.r2dbc.spi.TransactionDefinition;
4242
import io.r2dbc.spi.ValidationDepth;
43+
import io.r2dbc.spi.Wrapped;
4344
import org.reactivestreams.Publisher;
4445
import org.reactivestreams.Subscription;
4546
import reactor.core.CoreSubscriber;
@@ -48,6 +49,7 @@
4849
import reactor.core.publisher.Flux;
4950
import reactor.core.publisher.Mono;
5051
import reactor.core.publisher.Sinks;
52+
import reactor.core.scheduler.Scheduler;
5153
import reactor.util.Logger;
5254
import reactor.util.Loggers;
5355
import reactor.util.annotation.Nullable;
@@ -62,7 +64,7 @@
6264
/**
6365
* An implementation of {@link Connection} for connecting to a PostgreSQL database.
6466
*/
65-
final class PostgresqlConnection implements io.r2dbc.postgresql.api.PostgresqlConnection {
67+
final class PostgresqlConnection implements io.r2dbc.postgresql.api.PostgresqlConnection, Wrapped<Object> {
6668

6769
private final Logger logger = Loggers.getLogger(this.getClass());
6870

@@ -384,6 +386,21 @@ public String toString() {
384386
'}';
385387
}
386388

389+
@Override
390+
public <E> E unwrap(Class<E> targetClass) {
391+
392+
if (targetClass == Scheduler.class) {
393+
return targetClass.cast(this.client.getScheduler());
394+
}
395+
396+
return Wrapped.super.unwrap(targetClass);
397+
}
398+
399+
@Override
400+
public Object unwrap() {
401+
return null;
402+
}
403+
387404
@Override
388405
public Mono<Boolean> validate(ValidationDepth depth) {
389406

src/main/java/io/r2dbc/postgresql/client/Client.java

+7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import reactor.core.Disposable;
2929
import reactor.core.publisher.Flux;
3030
import reactor.core.publisher.Mono;
31+
import reactor.core.scheduler.Scheduler;
3132

3233
import java.util.Optional;
3334
import java.util.TimeZone;
@@ -121,6 +122,12 @@ default Flux<BackendMessage> exchange(Publisher<FrontendMessage> requests) {
121122
*/
122123
Optional<Integer> getProcessId();
123124

125+
/**
126+
* @return returns the EventLoop as scheduler.
127+
* @since 1.0.7
128+
*/
129+
Scheduler getScheduler();
130+
124131
/**
125132
* Returns the connected process secret key if it has been communicated.
126133
*

src/main/java/io/r2dbc/postgresql/client/ReactorNettyClient.java

+12
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.netty.channel.ChannelHandlerContext;
2323
import io.netty.channel.ChannelOption;
2424
import io.netty.channel.ChannelPipeline;
25+
import io.netty.channel.EventLoop;
2526
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
2627
import io.netty.handler.logging.LogLevel;
2728
import io.netty.handler.logging.LoggingHandler;
@@ -54,6 +55,7 @@
5455
import reactor.core.publisher.Mono;
5556
import reactor.core.publisher.Operators;
5657
import reactor.core.publisher.Sinks;
58+
import reactor.core.scheduler.Scheduler;
5759
import reactor.core.scheduler.Schedulers;
5860
import reactor.netty.Connection;
5961
import reactor.netty.channel.AbortedException;
@@ -107,6 +109,8 @@ public final class ReactorNettyClient implements Client {
107109

108110
private final Connection connection;
109111

112+
private final Scheduler scheduler;
113+
110114
private ConnectionContext context;
111115

112116
private final Sinks.Many<Publisher<FrontendMessage>> requestSink = Sinks.many().unicast().onBackpressureBuffer();
@@ -150,6 +154,9 @@ private ReactorNettyClient(Connection connection, ConnectionSettings settings) {
150154
this.byteBufAllocator = connection.outbound().alloc();
151155
this.context = new ConnectionContext().withChannelId(connection.channel().toString());
152156

157+
EventLoop eventLoop = connection.channel().eventLoop();
158+
this.scheduler = Schedulers.fromExecutorService(eventLoop, eventLoop.toString());
159+
153160
AtomicReference<Throwable> receiveError = new AtomicReference<>();
154161

155162
connection.inbound().receive()
@@ -453,6 +460,11 @@ public Optional<Integer> getProcessId() {
453460
return Optional.ofNullable(this.processId);
454461
}
455462

463+
@Override
464+
public Scheduler getScheduler() {
465+
return this.scheduler;
466+
}
467+
456468
@Override
457469
public Optional<Integer> getSecretKey() {
458470
return Optional.ofNullable(this.secretKey);

src/test/java/io/r2dbc/postgresql/client/TestClient.java

+7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import reactor.core.publisher.Flux;
2929
import reactor.core.publisher.Mono;
3030
import reactor.core.publisher.Sinks;
31+
import reactor.core.scheduler.Scheduler;
32+
import reactor.core.scheduler.Schedulers;
3133
import reactor.util.annotation.Nullable;
3234

3335
import java.util.ArrayList;
@@ -138,6 +140,11 @@ public Optional<Integer> getProcessId() {
138140
return Optional.ofNullable(this.processId);
139141
}
140142

143+
@Override
144+
public Scheduler getScheduler() {
145+
return Schedulers.immediate();
146+
}
147+
141148
@Override
142149
public Optional<Integer> getSecretKey() {
143150
return Optional.ofNullable(this.secretKey);

0 commit comments

Comments
 (0)