From f9ed099a30c2c2fca6ab263de121cc22736c75cf Mon Sep 17 00:00:00 2001 From: Vilnis Termanis Date: Tue, 30 Apr 2024 11:20:45 +0200 Subject: [PATCH] GH-4968: server-spring - Close query result on pre-render exception - Previously between getting the query response and rendering it to the desired output an exception could occur (e.g. due to unsupported result format) which would leave the result un-closed. This in turn would sometimes trigger an exception on closing the associated repo connection. --- .../handler/AbstractQueryRequestHandler.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/handler/AbstractQueryRequestHandler.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/handler/AbstractQueryRequestHandler.java index 987b84abd57..c9274bb83f6 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/handler/AbstractQueryRequestHandler.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/handler/AbstractQueryRequestHandler.java @@ -58,6 +58,7 @@ public ModelAndView handleQueryRequest(HttpServletRequest request, RequestMethod HttpServletResponse response) throws HTTPException, IOException { RepositoryConnection repositoryCon = null; + Object queryResponse = null; try { Repository repository = repositoryResolver.getRepository(request); @@ -75,9 +76,6 @@ public ModelAndView handleQueryRequest(HttpServletRequest request, RequestMethod boolean distinct = isDistinct(request); try { - - Object queryResponse; - if (headersOnly) { queryResponse = null; } else { @@ -114,10 +112,22 @@ public ModelAndView handleQueryRequest(HttpServletRequest request, RequestMethod } } catch (Exception e) { - // only close the connection when an exception occurs. Otherwise, the QueryResultView will take care of - // closing it. - if (repositoryCon != null) { - repositoryCon.close(); + // only close the response & connection when an exception occurs. Otherwise, the QueryResultView will take + // care of closing it. + try { + if (queryResponse instanceof AutoCloseable) { + ((AutoCloseable) queryResponse).close(); + } + } catch (Exception qre) { + logger.warn("Query response closing error", qre); + } finally { + try { + if (repositoryCon != null) { + repositoryCon.close(); + } + } catch (Exception qre) { + logger.warn("Connection closing error", qre); + } } throw e; }