-
-
Notifications
You must be signed in to change notification settings - Fork 137
Fixed statement timeout not working. #348
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Adding testing logs below. In logs, one can see we are getting TimeoutException if the query is not able to execute in the time defined by statement timeout. For testing purpose I had kept the statement timeout to 1ms. `com.####.api.exception.####Exception: Resource Access Exception\n\tat com.####.api.exception.####Exception$####ExceptionBuilder.build(####Exception.kt:76)\n\tat com.####.api.dao.####.executeSelectQuery(####.kt:205)\n\tat com.####.api.dao.####.access$executeSelectQuery(####.kt:25)\n\tat com.####.api.dao.####$executeSelectQuery$1.invokeSuspend(####.kt)\n\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n\tat kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)\n\tat kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)\n\tat kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)\n\tat kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)\n\tat kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)\n Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcTimeoutException\n\tat org.springframework.r2dbc.connection.ConnectionFactoryUtils.lambda$getConnection$0(ConnectionFactoryUtils.java:88)\n\tat reactor.core.publisher.Mono.lambda$onErrorMap$31(Mono.java:3811)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)\n\tat reactor.core.publisher.FluxRetry$RetrySubscriber.onError(FluxRetry.java:95)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:172)\n\tat reactor.pool.AbstractPool$Borrower.fail(AbstractPool.java:475)\n\tat reactor.pool.SimpleDequePool.lambda$drainLoop$9(SimpleDequePool.java:431)\n\tat reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onError(FluxDoOnEach.java:186)\n\tat reactor.core.publisher.FluxRetry$RetrySubscriber.onError(FluxRetry.java:95)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)\n\tat reactor.core.publisher.Operators.error(Operators.java:198)\n\tat reactor.core.publisher.MonoError.subscribe(MonoError.java:53)\n\tat reactor.core.publisher.Mono.subscribe(Mono.java:4490)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)\n\tat reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)\n\tat reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)\n\tat reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onError(FluxTimeout.java:219)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:192)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:259)\n\tat io.r2dbc.pool.MonoDiscardOnCancel$MonoDiscardOnCancelSubscriber.onError(MonoDiscardOnCancel.java:98)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onError(MonoIgnoreThen.java:278)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:231)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)\n\tat reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onComplete(FluxDoFinally.java:128)\n\tat reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onComplete(FluxDoFinally.java:128)\n\tat reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89)\n\tat reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1803)\n\tat reactor.core.publisher.MonoCompletionStage.lambda$subscribe$0(MonoCompletionStage.java:96)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)\n\tat com.github.jasync.sql.db.mysql.MySQLConnection$close$lambda-2$$inlined$onCompleteAsync$1.accept(FutureUtils.kt:110)\n\tat com.github.jasync.sql.db.mysql.MySQLConnection$close$lambda-2$$inlined$onCompleteAsync$1.accept(FutureUtils.kt:92)\n\tat java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)\n\tat java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)\n\tat java.base/java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:483)\n\tat java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)\n\tat java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)\n\tat java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)\n\tat java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)\n\tat java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)\n Caused by: io.r2dbc.spi.R2dbcTimeoutException: null\n\tat com.github.jasync.r2dbc.mysql.JasyncStatement$execute$3.invoke(JasyncStatement.kt:141)\n\tat com.github.jasync.r2dbc.mysql.JasyncStatement$execute$3.invoke(JasyncStatement.kt:100)\n\tat reactor.kotlin.core.publisher.FluxExtensionsKt.onErrorMap$lambda-1(FluxExtensions.kt:171)\n\tat reactor.core.publisher.Flux.lambda$onErrorMap$29(Flux.java:7105)\n\tat reactor.core.publisher.Flux.lambda$onErrorResume$30(Flux.java:7158)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)\n\tat reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134)\n\tat reactor.core.publisher.MonoCompletionStage.lambda$subscribe$0(MonoCompletionStage.java:93)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)\n\tat com.github.jasync.sql.db.util.FutureUtilsKt.tryFailure(FutureUtils.kt:21)\n\tat com.github.jasync.sql.db.pool.TimeoutSchedulerImpl$addTimeout$1$scheduledFuture$1.invoke(TimeoutScheduler.kt:63)\n\tat com.github.jasync.sql.db.pool.TimeoutSchedulerImpl$addTimeout$1$scheduledFuture$1.invoke(TimeoutScheduler.kt:62)\n\tat com.github.jasync.sql.db.pool.TimeoutSchedulerImpl.schedule$lambda-0(TimeoutScheduler.kt:51)\n\tat io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)\n\tat io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:153)\n\tat io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)\n\tat io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)\n\tat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)\n\tat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)\n\tat java.base/java.lang.Thread.run(Thread.java:833)\n Caused by: java.util.concurrent.TimeoutException: Operation timeout after it took too long to return (PT0.001S)\n\t... 12 common frames omitted\n", |
@kartikarora2 since this is a breaking change, maybe we should keep a fallback to query timeout (and mark it as deprecated) for few versions? |
@oshai, I don't think this will be a breaking change, as there is no way to input query timeout for the clients. From r2dbc-spi, there is a way to provide value for statementTimeout but not for queryTimeout. Let me know if you think otherwise. |
ok thanks, so I will merge it as is. |
Fixed in 2.1.9 |
This fix relates to one statement timeout issues: #338
Since
QUERY_TIMEOUT
was not utilised by the r2dbc-spi, hence have replaced it withSTATEMENT_TIMEOUT
. As the underlying implementation forSTATEMENT_TIMEOUT
will remain same asQUERY_TIMEOUT
, therefore the underlying logic has not been modified.Query timeout was initially added in commit: 686e20f