diff --git a/marklogic-client-api/src/main/java/com/marklogic/client/eval/EvalResultIterator.java b/marklogic-client-api/src/main/java/com/marklogic/client/eval/EvalResultIterator.java index 8278c11a8..a0c26fb77 100644 --- a/marklogic-client-api/src/main/java/com/marklogic/client/eval/EvalResultIterator.java +++ b/marklogic-client-api/src/main/java/com/marklogic/client/eval/EvalResultIterator.java @@ -6,15 +6,23 @@ import java.io.Closeable; import java.util.Iterator; -/** An Iterator to walk through all results returned from calls to +/** + * An Iterator to walk through all results returned from calls to * {@link ServerEvaluationCall#eval()}. */ public interface EvalResultIterator extends Iterable, Iterator, Closeable { - @Override - Iterator iterator(); - @Override - boolean hasNext(); - @Override - EvalResult next(); - void close(); + @Override + Iterator iterator(); + + @Override + boolean hasNext(); + + @Override + EvalResult next(); + + /** + * As of 7.1.0, this must be called to ensure that the response is closed, as results are now + * streamed from MarkLogic instead of being read entirely into memory first. + */ + void close(); } diff --git a/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java b/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java index 52ab8a86d..ef8d51317 100644 --- a/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java +++ b/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java @@ -3856,7 +3856,17 @@ private U evalAndStreamResults(RequestLogger re try { MultipartReader reader = new MultipartReader(response.body()); PartIterator partIterator = new PartIterator(reader); - return (U) new DefaultOkHttpResultIterator(reqlog, partIterator, response); + return (U) new DefaultOkHttpResultIterator(reqlog, partIterator, () -> { + // Looking at OkHttp source code, it does not appear necessary to call close on the reader; it appears + // sufficient to only call it on the response. But doing both in case this behavior changes in a future + // OkHttp release. + try { + reader.close(); + } catch (IOException e) { + // Ignore, the next call should close everything properly. + } + response.close(); + }); } catch (IOException e) { throw new MarkLogicIOException(e); }