Andrea Cosentino created CAMEL-25159:
----------------------------------------
Summary: camel-mongodb - findAll, distinct and aggregate execute
their query twice
Key: CAMEL-25159
URL: https://issues.apache.org/jira/browse/CAMEL-25159
Project: Camel
Issue Type: Bug
Components: camel-mongodb
Reporter: Andrea Cosentino
Assignee: Andrea Cosentino
h3. Summary
{{findAll}}, {{distinct}} and {{aggregate}} run their query against MongoDB
**twice**: once to read the
results and once more in a {{finally}} block that was meant to close the
cursor. The cursor that was
actually read is never closed.
h3. Details
All three follow the same shape in {{MongoDbProducer}}:
{code:java}
try {
ret.iterator().forEachRemaining(result::add);
exchange.getMessage().setHeader(RESULT_PAGE_SIZE, result.size());
} finally {
ret.iterator().close();
}
{code}
{{MongoIterable.iterator()}} is not an accessor for an already-open cursor, it
executes the operation.
>From {{mongodb-driver-sync}} 5.9.2:
{code:java}
public MongoCursor<T> iterator() {
return new MongoBatchCursorAdapter<>(execute());
}
{code}
So the {{finally}} opens a *new* cursor - a second round trip to the server,
and for {{aggregate}} a
second execution of the whole pipeline - and closes that one, while the cursor
drained by
{{forEachRemaining}} is never closed explicitly. If {{forEachRemaining}} throws
part way through, that
first cursor is left open.
Affected operations: {{findAll}} and {{aggregate}} when the endpoint's
{{outputType}} is not
{{MongoIterable}}, and {{distinct}} always.
h3. Proposed fix
Hold the cursor in a variable and use try-with-resources, so the cursor that is
read is the cursor that
is closed and the query runs once:
{code:java}
try (MongoCursor<Document> cursor = ret.iterator()) {
cursor.forEachRemaining(...);
...
}
{code}
----
_Reported by Claude Code on behalf of oscerd (Andrea Cosentino)._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)