You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@grails.apache.org by "codeconsole (via GitHub)" <gi...@apache.org> on 2026/08/15 00:52:35 UTC

[PR] Resolve URL mapping names from the match rather than the request [grails-core]

codeconsole opened a new pull request, #16150:
URL: https://github.com/apache/grails-core/pull/16150

   Resolves captured URL mapping names from the match itself rather than from the dispatching
   request, which lets `collectControllerMappings` stop rebuilding the parameter map for every
   candidate mapping on every request.
   
   ## Measured
   
   | Benchmark | before ns/op | after ns/op | |
   |---|---:|---:|---|
   | `ControllerMappingCollectionBenchmark.oneCandidate` | 385.9 | **219.9** | −43% |
   | `ControllerMappingCollectionBenchmark.twoCandidates` | 599.8 | **282.9** | −53% |
   | `ControllerMappingCollectionBenchmark.fourCandidates` | 1241.6 | **777.4** | −37% |
   | `UrlMappingBenchmark.matchCachedHit` | 2.49 | 2.56 | unchanged |
   
   `collectControllerMappings` runs in full on every request even when the URL mapping cache hits,
   so this is on the always-on path. It still costs ~88x the cached match it wraps; what remains is
   `ControllerKey` allocation, the controller map lookup and the sort.
   
   ## Why it was slow
   
   A mapping's `controllerName` / `actionName` / `namespace` could be a Closure that read
   `RequestContextHolder.currentRequestAttributes().getParams()` — reaching for thread-local state to
   read a value the mapping already held in its own `params`. To ask a candidate "which controller are
   you?", the framework had to call `webRequest.resetParams()` and `info.configure(webRequest)` first,
   per candidate, cloning the parameter map each time.
   
   Those names now resolve from the match. `configure()` is still called for mappings whose names are
   genuinely request-dependent.
   
   ## Deliberately unchanged
   
   `action = { params.goHere }` is a documented feature — those closures are meant to read the request,
   and they still do, taking the old path.
   
   ## Behaviour change
   
   A request parameter no longer stands in for a token the URI does not capture. Under
   `"/$controller/$action?"`, `/article?action=gallery` now routes to the default action rather than
   `gallery`; a query string could previously steer which action ran. `params.action` is still bound
   either way. Documented as section 47 of the 8.0 upgrade guide and in the embedded-variables guide.
   
   This required changing one existing assertion, in `UrlMappingParameterTests.testNotEqual`, which is
   worth a reviewer's attention. That test originally asserted the mapping did **not** match
   (b84ef591f1, GRAILS-2297); when it moved to `UrlMappingsUnitTest` the fall-through to the default
   mapping made `info` non-null and a `controllerName == 'foo'` assertion was substituted — 'foo' being
   a value seeded into the request params by the test itself, i.e. an artifact of the thread-local
   resolution rather than the `notEqual` constraint the test is named for. It now asserts the value the
   URI actually captured.
   
   ## Notes
   
   - Adds `grails-web-benchmarks` (opt-in, not part of `build`/`check`). The same module is added by
     #16149; if that lands first this rebases and drops that commit.
   - `UrlMappingInfo` gains `isNameResolutionRequestDependent()` as a default method returning `true`,
     so third-party implementations keep current behaviour.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Resolve URL mapping names from the match rather than the request [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #16150:
URL: https://github.com/apache/grails-core/pull/16150#issuecomment-5319470632

   ## ✅ All tests passed ✅
   
   🏷️ Commit: 8803bd697d43dafc3d80ee2f28ac426fa895f638
   ▶️ Tests:  58944 executed
   ⚪️ Checks: 78/78 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Resolve URL mapping names from the match rather than the request [grails-core]

Posted by "codeconsole (via GitHub)" <gi...@apache.org>.
codeconsole closed pull request #16150: Resolve URL mapping names from the match rather than the request
URL: https://github.com/apache/grails-core/pull/16150


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Resolve URL mapping names from the match rather than the request [grails-core]

Posted by "codeconsole (via GitHub)" <gi...@apache.org>.
codeconsole commented on PR #16150:
URL: https://github.com/apache/grails-core/pull/16150#issuecomment-5469961230

   Consolidated into #16149, which now covers the request path as one reviewable change — per-request work, hidden HTTP method handling and multipart together.
   
   This branch was merged in with its history intact; no commits were squashed or dropped, and `git merge-base --is-ancestor` confirms every commit here is contained in #16149.
   
   Closing in favour of that. The reason is review flow rather than anything wrong here: these branches collided in `GrailsDispatcherServlet.checkMultipart` and `UrlMappingsHandlerMapping`, so reviewing them separately meant tracking a merge order, which is not a reasonable thing to ask of a reviewer.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Resolve URL mapping names from the match rather than the request [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #16150:
URL: https://github.com/apache/grails-core/pull/16150#issuecomment-5391497130

   ## 🚨 TestLens detected 1 failed test 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   #### [CI - Groovy Joint Validation Build / Build Grails with Groovy snapshot \(shard 2\)](https://github.com/apache/grails-core/actions/runs/32693786704/job/97332626174?pr=16150) > :grails-test-examples-scaffolding:integrationTest
   
   | Test | Runs | Flakiness |
   |---|---|--:|
   | UserControllerSpec > User list | ❌ | [1%&nbsp;🟡](https://github.com/apache/grails-core/issues/16030) |
   
   🏷️ Commit: 4691e25b89120a5ee5dbf1e78e04704932335b70
   ▶️ Tests:  54671 executed
   🟡 Checks: 65/85 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>UserControllerSpec > User list</strong> (:grails-test-examples-scaffolding:integrationTest in <a href="https://github.com/apache/grails-core/actions/runs/32693786704/job/97332626174?pr=16150">CI - Groovy Joint Validation Build / Build Grails with Groovy snapshot (shard 2)</a>)</summary>
   
   ```
   geb.waiting.WaitTimeoutException: condition did not pass in 30 seconds (failed with exception)
   	at geb.waiting.Wait.waitFor(Wait.groovy:128)
   	at geb.waiting.DefaultWaitingSupport.doWaitFor(DefaultWaitingSupport.groovy:55)
   	at geb.waiting.DefaultWaitingSupport.waitFor(DefaultWaitingSupport.groovy:41)
   	at geb.Page.waitFor(Page.groovy:120)
   	at com.example.pages.LoginPage.login(LoginPage.groovy:39)
   	at com.example.UserControllerSpec.User list(UserControllerSpec.groovy:48)
   Caused by: Assertion failed: 
   
   title != pageTitle && $('input', name: 'username').empty
   |     |  |         |
   |     |  |         false
   |     |  'Please sign in'
   |     false
   'Please sign in'
   
   	at com.example.pages.LoginPage.login_closure1(LoginPage.groovy:39)
   	at com.example.pages.LoginPage.login_closure1(LoginPage.groovy)
   	at geb.waiting.Wait.waitFor(Wait.groovy:117)
   	... 5 more
   ```
   
   </details>
   
   ### Rerun Controls
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   🔲 UserControllerSpec > User list <!-- uniqueId=[engine:spock]/[spec:com.example.UserControllerSpec]/[feature:$spock_feature_1_0] -->
   
   Reuse successful test results:
   
   🔲 ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   🔲 **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app/docs](https://testlens.app/docs/features/pr-comment/)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Resolve URL mapping names from the match rather than the request [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #16150:
URL: https://github.com/apache/grails-core/pull/16150#issuecomment-5300107441

   ## ✅ All tests passed ✅
   
   🏷️ Commit: be305f902d061de9a744ad89341606504314aa78
   ▶️ Tests:  59510 executed
   ⚪️ Checks: 75/75 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Resolve URL mapping names from the match rather than the request [grails-core]

Posted by "codecov[bot] (via GitHub)" <gi...@apache.org>.
codecov[bot] commented on PR #16150:
URL: https://github.com/apache/grails-core/pull/16150#issuecomment-5299870029

   ## [Codecov](https://app.codecov.io/gh/apache/grails-core/pull/16150?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
   :x: Patch coverage is `72.22222%` with `5 lines` in your changes missing coverage. Please review.
   :white_check_mark: Project coverage is 52.6442%. Comparing base ([`a83f874`](https://app.codecov.io/gh/apache/grails-core/commit/a83f87480e0c0138caa5a7191a053b1e59a64066?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`be305f9`](https://app.codecov.io/gh/apache/grails-core/commit/be305f902d061de9a744ad89341606504314aa78?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/grails-core/pull/16150?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
   |---|---|---|
   | [.../org/grails/web/mapping/DefaultUrlMappingInfo.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Forg%2Fgrails%2Fweb%2Fmapping%2FDefaultUrlMappingInfo.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L29yZy9ncmFpbHMvd2ViL21hcHBpbmcvRGVmYXVsdFVybE1hcHBpbmdJbmZvLmphdmE=) | 33.3333% | [0 Missing and 2 partials :warning: ](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...grails/web/mapping/RuntimeConstraintEvaluator.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Forg%2Fgrails%2Fweb%2Fmapping%2FRuntimeConstraintEvaluator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L29yZy9ncmFpbHMvd2ViL21hcHBpbmcvUnVudGltZUNvbnN0cmFpbnRFdmFsdWF0b3IuamF2YQ==) | 66.6667% | [2 Missing :warning: ](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...main/groovy/grails/web/mapping/UrlMappingInfo.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Fgrails%2Fweb%2Fmapping%2FUrlMappingInfo.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L2dyYWlscy93ZWIvbWFwcGluZy9VcmxNYXBwaW5nSW5mby5qYXZh) | 0.0000% | [1 Missing :warning: ](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   [![Impacted file tree graph](https://app.codecov.io/gh/apache/grails-core/pull/16150/graphs/tree.svg?width=650&height=150&src=pr&token=qJrryhpk7u&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   
   ```diff
   @@                Coverage Diff                 @@
   ##                8.0.x     #16150        +/-   ##
   ==================================================
   + Coverage     52.6311%   52.6442%   +0.0131%     
   - Complexity      18436      18450        +14     
   ==================================================
     Files            2037       2038         +1     
     Lines           96500      96514        +14     
     Branches        16860      16864         +4     
   ==================================================
   + Hits            50789      50809        +20     
   + Misses          38284      38274        -10     
   - Partials         7427       7431         +4     
   ```
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/grails-core/pull/16150?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [...org/grails/web/mapping/AbstractUrlMappingInfo.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Forg%2Fgrails%2Fweb%2Fmapping%2FAbstractUrlMappingInfo.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L29yZy9ncmFpbHMvd2ViL21hcHBpbmcvQWJzdHJhY3RVcmxNYXBwaW5nSW5mby5qYXZh) | `80.8219% <100.0000%> (+1.7174%)` | :arrow_up: |
   | [...groovy/org/grails/web/mapping/RegexUrlMapping.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Forg%2Fgrails%2Fweb%2Fmapping%2FRegexUrlMapping.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L29yZy9ncmFpbHMvd2ViL21hcHBpbmcvUmVnZXhVcmxNYXBwaW5nLmphdmE=) | `66.4729% <100.0000%> (-0.1295%)` | :arrow_down: |
   | [...ing/mvc/AbstractGrailsControllerUrlMappings.groovy](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Forg%2Fgrails%2Fweb%2Fmapping%2Fmvc%2FAbstractGrailsControllerUrlMappings.groovy&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L29yZy9ncmFpbHMvd2ViL21hcHBpbmcvbXZjL0Fic3RyYWN0R3JhaWxzQ29udHJvbGxlclVybE1hcHBpbmdzLmdyb292eQ==) | `60.1942% <100.0000%> (ø)` | |
   | [...main/groovy/grails/web/mapping/UrlMappingInfo.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Fgrails%2Fweb%2Fmapping%2FUrlMappingInfo.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L2dyYWlscy93ZWIvbWFwcGluZy9VcmxNYXBwaW5nSW5mby5qYXZh) | `0.0000% <0.0000%> (ø)` | |
   | [.../org/grails/web/mapping/DefaultUrlMappingInfo.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Forg%2Fgrails%2Fweb%2Fmapping%2FDefaultUrlMappingInfo.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L29yZy9ncmFpbHMvd2ViL21hcHBpbmcvRGVmYXVsdFVybE1hcHBpbmdJbmZvLmphdmE=) | `37.9032% <33.3333%> (-0.1133%)` | :arrow_down: |
   | [...grails/web/mapping/RuntimeConstraintEvaluator.java](https://app.codecov.io/gh/apache/grails-core/pull/16150?src=pr&el=tree&filepath=grails-web-url-mappings%2Fsrc%2Fmain%2Fgroovy%2Forg%2Fgrails%2Fweb%2Fmapping%2FRuntimeConstraintEvaluator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-Z3JhaWxzLXdlYi11cmwtbWFwcGluZ3Mvc3JjL21haW4vZ3Jvb3Z5L29yZy9ncmFpbHMvd2ViL21hcHBpbmcvUnVudGltZUNvbnN0cmFpbnRFdmFsdWF0b3IuamF2YQ==) | `66.6667% <66.6667%> (ø)` | |
   
   ... and [3 files with indirect coverage changes](https://app.codecov.io/gh/apache/grails-core/pull/16150/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   </details>
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
   - :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Resolve URL mapping names from the match rather than the request [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #16150:
URL: https://github.com/apache/grails-core/pull/16150#issuecomment-5377359802

   ## 🚨 TestLens detected 4 failed tests 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   #### [CI - Groovy Joint Validation Build / Build Grails with Groovy snapshot \(shard 1\)](https://github.com/apache/grails-core/actions/runs/32545196553/job/96962743773?pr=16150) > :grails-data-mongodb-core:test
   
   | Test | Runs | Flakiness |
   |---|---|--:|
   | MongoTransactionSpec > test a committed transaction persists all writes atomically | ❌ | [4%&nbsp;🟡](https://github.com/apache/grails-core/issues/16030) |
   | MongoTransactionSpec > test a rolled back transaction discards all writes on the server | ❌ | [4%&nbsp;🟡](https://github.com/apache/grails-core/issues/16030) |
   | MongoTransactionSpec > test read-your-writes within an active transaction | ❌ | [4%&nbsp;🟡](https://github.com/apache/grails-core/issues/16030) |
   | MongoTransactionSpec > test writes across multiple collections roll back together | ❌ | [4%&nbsp;🟡](https://github.com/apache/grails-core/issues/16030) |
   
   🏷️ Commit: 3af0db1d366b0c5c01f4bf136e583e91a4ef2f1e
   ▶️ Tests:  25876 executed
   🟡 Checks: 34/83 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>MongoTransactionSpec > test a committed transaction persists all writes atomically</strong> (:grails-data-mongodb-core:test in <a href="https://github.com/apache/grails-core/actions/runs/32545196553/job/96962743773?pr=16150">CI - Groovy Joint Validation Build / Build Grails with Groovy snapshot (shard 1)</a>)</summary>
   
   ```
   com.mongodb.MongoSocketReadException: Prematurely reached end of stream
   	at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:184)
   	at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:1081)
   	at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandResponseBuffers(InternalStreamConnection.java:589)
   	at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:569)
   	at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceiveInternal(InternalStreamConnection.java:496)
   	at com.mongodb.internal.connection.InternalStreamConnection.lambda$sendAndReceive$1(InternalStreamConnection.java:385)
   	at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:388)
   	at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:111)
   	at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:757)
   	at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:60)
   	at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:207)
   	at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:112)
   	at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:82)
   	at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:74)
   	at com.mongodb.internal.connection.DefaultServer$OperationCountTrackingConnection.command(DefaultServer.java:297)
   	at com.mongodb.internal.operation.SyncOperationHelper.lambda$executeRetryableWrite$11(SyncOperationHelper.java:285)
   	at com.mongodb.internal.operation.SyncOperationHelper.lambda$withSourceAndConnection$1(SyncOperationHelper.java:146)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSuppliedResource(SyncOperationHelper.java:177)
   	at com.mongodb.internal.operation.SyncOperationHelper.lambda$withSourceAndConnection$2(SyncOperationHelper.java:142)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSuppliedResource(SyncOperationHelper.java:177)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSourceAndConnection(SyncOperationHelper.java:138)
   	at com.mongodb.internal.operation.SyncOperationHelper.lambda$executeRetryableWrite$12(SyncOperationHelper.java:270)
   	at com.mongodb.internal.operation.SyncOperationHelper.lambda$decorateWriteWithRetries$13(SyncOperationHelper.java:329)
   	at com.mongodb.internal.async.function.RetryingSyncSupplier.get(RetryingSyncSupplier.java:67)
   	at com.mongodb.internal.operation.SyncOperationHelper.executeRetryableWrite(SyncOperationHelper.java:297)
   	at com.mongodb.internal.operation.BaseFindAndModifyOperation.execute(BaseFindAndModifyOperation.java:81)
   	at com.mongodb.client.internal.MongoClusterImpl$OperationExecutorImpl.execute(MongoClusterImpl.java:474)
   	at com.mongodb.client.internal.MongoCollectionImpl.executeFindOneAndUpdate(MongoCollectionImpl.java:787)
   	at com.mongodb.client.internal.MongoCollectionImpl.findOneAndUpdate(MongoCollectionImpl.java:766)
   	at org.grails.datastore.mapping.mongo.engine.MongoCodecEntityPersister.generateIdentifier(MongoCodecEntityPersister.groovy:443)
   	at org.grails.datastore.mapping.mongo.engine.MongoCodecEntityPersister.persistEntity(MongoCodecEntityPersister.groovy:226)
   	at org.grails.datastore.mapping.mongo.engine.MongoCodecEntityPersister.persistEntity(MongoCodecEntityPersister.groovy:567)
   	at org.grails.datastore.mapping.engine.EntityPersister.persist(EntityPersister.java:188)
   	at org.grails.datastore.mapping.core.AbstractSession.persist(AbstractSession.java:609)
   	at org.grails.datastore.gorm.GormInstanceApi.save_closure5(GormInstanceApi.groovy:213)
   	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:334)
   	at org.grails.datastore.gorm.AbstractGormApi.execute(AbstractGormApi.groovy:164)
   	at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:206)
   	at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:173)
   	at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:110)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.test a committed transaction persists all writes atomically_closure2(MongoTransactionSpec.groovy:73)
   	at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:103)
   	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
   	at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:100)
   	at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:703)
   	at org.grails.datastore.gorm.GormEntity$Trait$Helper.withTransaction(GormEntity.groovy:1066)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.test a committed transaction persists all writes atomically(MongoTransactionSpec.groovy:71)
   ```
   
   </details>
   <details>
   
   <summary><strong>MongoTransactionSpec > test a rolled back transaction discards all writes on the server</strong> (:grails-data-mongodb-core:test in <a href="https://github.com/apache/grails-core/actions/runs/32545196553/job/96962743773?pr=16150">CI - Groovy Joint Validation Build / Build Grails with Groovy snapshot (shard 1)</a>)</summary>
   
   ```
   com.mongodb.MongoTimeoutException: Timed out while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:32837, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}]
   	at com.mongodb.internal.connection.BaseCluster.logAndThrowTimeoutException(BaseCluster.java:431)
   	at com.mongodb.internal.connection.BaseCluster.lambda$selectServer$0(BaseCluster.java:166)
   	at com.mongodb.internal.time.Timeout.lambda$onExistsAndExpired$16(Timeout.java:238)
   	at com.mongodb.internal.time.Timeout.lambda$run$10(Timeout.java:203)
   	at com.mongodb.internal.time.TimePoint.checkedCall(TimePoint.java:100)
   	at com.mongodb.internal.time.Timeout.call(Timeout.java:176)
   	at com.mongodb.internal.time.Timeout.run(Timeout.java:196)
   	at com.mongodb.internal.time.Timeout.onExistsAndExpired(Timeout.java:235)
   	at com.mongodb.internal.time.Timeout.onExpired(Timeout.java:228)
   	at com.mongodb.internal.connection.BaseCluster.selectServer(BaseCluster.java:165)
   	at com.mongodb.internal.connection.SingleServerCluster.selectServer(SingleServerCluster.java:47)
   	at com.mongodb.internal.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:91)
   	at com.mongodb.client.internal.ClientSessionBinding.getConnectionSource(ClientSessionBinding.java:109)
   	at com.mongodb.client.internal.ClientSessionBinding.getWriteConnectionSource(ClientSessionBinding.java:102)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSuppliedResource(SyncOperationHelper.java:169)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSourceAndConnection(SyncOperationHelper.java:138)
   	at com.mongodb.internal.operation.SyncOperationHelper.withConnection(SyncOperationHelper.java:117)
   	at com.mongodb.internal.operation.DropDatabaseOperation.execute(DropDatabaseOperation.java:73)
   	at com.mongodb.internal.operation.DropDatabaseOperation.execute(DropDatabaseOperation.java:48)
   	at com.mongodb.client.internal.MongoClusterImpl$OperationExecutorImpl.execute(MongoClusterImpl.java:474)
   	at com.mongodb.client.internal.MongoDatabaseImpl.executeDrop(MongoDatabaseImpl.java:230)
   	at com.mongodb.client.internal.MongoDatabaseImpl.drop(MongoDatabaseImpl.java:220)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.setup_closure1(MongoTransactionSpec.groovy:58)
   	at org.grails.datastore.gorm.GormStaticApi.withNewSession_closure23(GormStaticApi.groovy:767)
   	at org.grails.datastore.mapping.core.DatastoreUtils.executeWithNewSession(DatastoreUtils.java:371)
   	at org.grails.datastore.gorm.GormStaticApi.withNewSession(GormStaticApi.groovy:766)
   	at org.grails.datastore.gorm.GormEntity$Trait$Helper.withNewSession(GormEntity.groovy:1157)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.setup(MongoTransactionSpec.groovy:57)
   ```
   
   </details>
   <details>
   
   <summary><strong>MongoTransactionSpec > test read-your-writes within an active transaction</strong> (:grails-data-mongodb-core:test in <a href="https://github.com/apache/grails-core/actions/runs/32545196553/job/96962743773?pr=16150">CI - Groovy Joint Validation Build / Build Grails with Groovy snapshot (shard 1)</a>)</summary>
   
   ```
   com.mongodb.MongoTimeoutException: Timed out while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:32837, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}]
   	at com.mongodb.internal.connection.BaseCluster.logAndThrowTimeoutException(BaseCluster.java:431)
   	at com.mongodb.internal.connection.BaseCluster.lambda$selectServer$0(BaseCluster.java:166)
   	at com.mongodb.internal.time.Timeout.lambda$onExistsAndExpired$16(Timeout.java:238)
   	at com.mongodb.internal.time.Timeout.lambda$run$10(Timeout.java:203)
   	at com.mongodb.internal.time.TimePoint.checkedCall(TimePoint.java:100)
   	at com.mongodb.internal.time.Timeout.call(Timeout.java:176)
   	at com.mongodb.internal.time.Timeout.run(Timeout.java:196)
   	at com.mongodb.internal.time.Timeout.onExistsAndExpired(Timeout.java:235)
   	at com.mongodb.internal.time.Timeout.onExpired(Timeout.java:228)
   	at com.mongodb.internal.connection.BaseCluster.selectServer(BaseCluster.java:165)
   	at com.mongodb.internal.connection.SingleServerCluster.selectServer(SingleServerCluster.java:47)
   	at com.mongodb.internal.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:91)
   	at com.mongodb.client.internal.ClientSessionBinding.getConnectionSource(ClientSessionBinding.java:109)
   	at com.mongodb.client.internal.ClientSessionBinding.getWriteConnectionSource(ClientSessionBinding.java:102)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSuppliedResource(SyncOperationHelper.java:169)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSourceAndConnection(SyncOperationHelper.java:138)
   	at com.mongodb.internal.operation.SyncOperationHelper.withConnection(SyncOperationHelper.java:117)
   	at com.mongodb.internal.operation.DropDatabaseOperation.execute(DropDatabaseOperation.java:73)
   	at com.mongodb.internal.operation.DropDatabaseOperation.execute(DropDatabaseOperation.java:48)
   	at com.mongodb.client.internal.MongoClusterImpl$OperationExecutorImpl.execute(MongoClusterImpl.java:474)
   	at com.mongodb.client.internal.MongoDatabaseImpl.executeDrop(MongoDatabaseImpl.java:230)
   	at com.mongodb.client.internal.MongoDatabaseImpl.drop(MongoDatabaseImpl.java:220)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.setup_closure1(MongoTransactionSpec.groovy:58)
   	at org.grails.datastore.gorm.GormStaticApi.withNewSession_closure23(GormStaticApi.groovy:767)
   	at org.grails.datastore.mapping.core.DatastoreUtils.executeWithNewSession(DatastoreUtils.java:371)
   	at org.grails.datastore.gorm.GormStaticApi.withNewSession(GormStaticApi.groovy:766)
   	at org.grails.datastore.gorm.GormEntity$Trait$Helper.withNewSession(GormEntity.groovy:1157)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.setup(MongoTransactionSpec.groovy:57)
   ```
   
   </details>
   <details>
   
   <summary><strong>MongoTransactionSpec > test writes across multiple collections roll back together</strong> (:grails-data-mongodb-core:test in <a href="https://github.com/apache/grails-core/actions/runs/32545196553/job/96962743773?pr=16150">CI - Groovy Joint Validation Build / Build Grails with Groovy snapshot (shard 1)</a>)</summary>
   
   ```
   com.mongodb.MongoTimeoutException: Timed out while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:32837, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}]
   	at com.mongodb.internal.connection.BaseCluster.logAndThrowTimeoutException(BaseCluster.java:431)
   	at com.mongodb.internal.connection.BaseCluster.lambda$selectServer$0(BaseCluster.java:166)
   	at com.mongodb.internal.time.Timeout.lambda$onExistsAndExpired$16(Timeout.java:238)
   	at com.mongodb.internal.time.Timeout.lambda$run$10(Timeout.java:203)
   	at com.mongodb.internal.time.TimePoint.checkedCall(TimePoint.java:100)
   	at com.mongodb.internal.time.Timeout.call(Timeout.java:176)
   	at com.mongodb.internal.time.Timeout.run(Timeout.java:196)
   	at com.mongodb.internal.time.Timeout.onExistsAndExpired(Timeout.java:235)
   	at com.mongodb.internal.time.Timeout.onExpired(Timeout.java:228)
   	at com.mongodb.internal.connection.BaseCluster.selectServer(BaseCluster.java:165)
   	at com.mongodb.internal.connection.SingleServerCluster.selectServer(SingleServerCluster.java:47)
   	at com.mongodb.internal.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:91)
   	at com.mongodb.client.internal.ClientSessionBinding.getConnectionSource(ClientSessionBinding.java:109)
   	at com.mongodb.client.internal.ClientSessionBinding.getWriteConnectionSource(ClientSessionBinding.java:102)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSuppliedResource(SyncOperationHelper.java:169)
   	at com.mongodb.internal.operation.SyncOperationHelper.withSourceAndConnection(SyncOperationHelper.java:138)
   	at com.mongodb.internal.operation.SyncOperationHelper.withConnection(SyncOperationHelper.java:117)
   	at com.mongodb.internal.operation.DropDatabaseOperation.execute(DropDatabaseOperation.java:73)
   	at com.mongodb.internal.operation.DropDatabaseOperation.execute(DropDatabaseOperation.java:48)
   	at com.mongodb.client.internal.MongoClusterImpl$OperationExecutorImpl.execute(MongoClusterImpl.java:474)
   	at com.mongodb.client.internal.MongoDatabaseImpl.executeDrop(MongoDatabaseImpl.java:230)
   	at com.mongodb.client.internal.MongoDatabaseImpl.drop(MongoDatabaseImpl.java:220)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.setup_closure1(MongoTransactionSpec.groovy:58)
   	at org.grails.datastore.gorm.GormStaticApi.withNewSession_closure23(GormStaticApi.groovy:767)
   	at org.grails.datastore.mapping.core.DatastoreUtils.executeWithNewSession(DatastoreUtils.java:371)
   	at org.grails.datastore.gorm.GormStaticApi.withNewSession(GormStaticApi.groovy:766)
   	at org.grails.datastore.gorm.GormEntity$Trait$Helper.withNewSession(GormEntity.groovy:1157)
   	at org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec.setup(MongoTransactionSpec.groovy:57)
   ```
   
   </details>
   
   ### Rerun Controls
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   🔲 MongoTransactionSpec > test a committed transaction persists all writes atomically <!-- uniqueId=[engine:spock]/[spec:org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec]/[feature:$spock_feature_1_1] -->
   🔲 MongoTransactionSpec > test a rolled back transaction discards all writes on the server <!-- uniqueId=[engine:spock]/[spec:org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec]/[feature:$spock_feature_1_2] -->
   🔲 MongoTransactionSpec > test read-your-writes within an active transaction <!-- uniqueId=[engine:spock]/[spec:org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec]/[feature:$spock_feature_1_4] -->
   🔲 MongoTransactionSpec > test writes across multiple collections roll back together <!-- uniqueId=[engine:spock]/[spec:org.grails.datastore.gorm.mongo.transactions.MongoTransactionSpec]/[feature:$spock_feature_1_3] -->
   
   Reuse successful test results:
   
   🔲 ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   🔲 **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app/docs](https://testlens.app/docs/features/pr-comment/)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org