cwms-python get_timeseries_identifier endpoint not working in CDA 2026.03-31-d
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 28
- Forks
- 25
- Avg merge
- 4d 22h
- Merged PRs (30d)
- 20
Description
Describe the bug
This endpoint worked in the 2025.09 version of CDA, but stopped working with recent CDA updates. We saw this error in CWBI-Test, and now that we have upgraded our local CDA it is occurring here as well. This endpoint is nice since it's faster to check if a time series exists rather than retrieving the data to check.
This endpoint still exists in Github for cwms-python, but we did find another endpoint that appears to do the same thing (get_timeseries_identifiers). We will try to update our python scripts to use this endpoint in the meantime.
Expected behavior
Expected the endpoint to continue to work after updating CDA.
To Reproduce
In a Python script, run the following chunk of code, and see the error generated.
ts_identifier = cwms.get_timeseries_identifier(ts_id='FTPK.Elev.Inst.1Hour.0.Best-MRBWM', office_id='NWDM')
Logs/Incident Identifier
10-Jun-2026 13:29:10.511 WARNING [https-openssl-nio-<IP>-8243-exec-705] cwms.cda.ApiServlet.lambda$init$8 error on request[e3ec304a-8846-4bf8 -88e8-1b3791b1cf7c]: /nwdm-data/timeseries/identifier-descriptor/FTPK.Elev.Inst.1Hour.0.Best-MRBWM org.jooq.exception.TooManyRowsException: Cursor returned more than one result at org.jooq_3.18.7.ORACLE18C.debug(Unknown Source) at org.jooq_3.18.7.ORACLE18C.debug(Unknown Source) at org.jooq.impl.Tools.fetchOne(Tools.java:2738) at org.jooq.impl.ResultQueryTrait.fetchOne(ResultQueryTrait.java:509) at cwms.cda.data.dao.TimeSeriesIdentifierDescriptorDao.lambda$getTimeSeriesIdentifier$3(TimeSeriesIdentifierDescriptorDao.java:232) at org.jooq.impl.DefaultDSLContext.connectionResult(DefaultDSLContext.java:658) at cwms.cda.data.dao.JooqDao.connectionResult(JooqDao.java:755) at cwms.cda.data.dao.TimeSeriesIdentifierDescriptorDao.getTimeSeriesIdentifier(TimeSeriesIdentifierDescriptorDao.java:227) at cwms.cda.api.TimeSeriesIdentifierDescriptorController.getOne(TimeSeriesIdentifierDescriptorController.java:193) at io.javalin.apibuilder.CrudFunction$2.invoke$lambda-0(CrudHandler.kt:31) at io.javalin.apibuilder.CrudFunctionHandler.handle(CrudHandler.kt) at cwms.cda.security.CdaAccessManager.manage(CdaAccessManager.java:37) at io.javalin.http.JavalinServlet.addHandler$lambda-0(JavalinServlet.kt:96) at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:99) at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-11$lambda-10(JavalinServletHandler.kt:119) at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:680) at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658) at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2094) at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:119) at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-11$lambda-10(JavalinServletHandler.kt:119) at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:680) at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658) at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2094) at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:119) at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:89) at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) at cwms.cda.ApiServlet.service(ApiServlet.java:926) at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:197) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:129) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:334) at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:161) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:88) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:596) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:643) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:240) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:935) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1831) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:834)
CDA Version (please complete the following information):
2026.03.31-d
Additional context
This issue has been occurring for a few months in CWBI-Test. I didn't see an existing issue open about it though - feel free to move this to that issue if one already exists.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with TimeSeriesIdentifierDescriptorDao.java around getTimeSeriesIdentifier and the controller entry point TimeSeriesIdentifierDescriptorController.getOne, using the supplied Python request to reproduce the failure. Trace why the query returns more than one result, then verify that the get_timeseries_identifier endpoint works for the reported time-series identifier without the TooManyRowsException.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- api, backend, databases
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 58/100