Thanks to visit codestin.com
Credit goes to github.com

Skip to content

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

Merged
merged 1 commit into from
Dec 29, 2022

Conversation

kartikarora2
Copy link

@kartikarora2 kartikarora2 commented Dec 27, 2022

This fix relates to one statement timeout issues: #338
Since QUERY_TIMEOUT was not utilised by the r2dbc-spi, hence have replaced it with STATEMENT_TIMEOUT. As the underlying implementation for STATEMENT_TIMEOUT will remain same as QUERY_TIMEOUT, therefore the underlying logic has not been modified.

Query timeout was initially added in commit: 686e20f

@kartikarora2
Copy link
Author

kartikarora2 commented Dec 29, 2022

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",
`

@oshai
Copy link
Contributor

oshai commented Dec 29, 2022

@kartikarora2 since this is a breaking change, maybe we should keep a fallback to query timeout (and mark it as deprecated) for few versions?

@kartikarora2
Copy link
Author

@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.

@oshai
Copy link
Contributor

oshai commented Dec 29, 2022

ok thanks, so I will merge it as is.

@oshai
Copy link
Contributor

oshai commented Jan 29, 2023

Fixed in 2.1.9

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants