USACE / USACE/cwms-data-api

cwms-python get_timeseries_identifier endpoint not working in CDA 2026.03-31-d

Open
#1,776 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.