{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":315374241,"defaultBranch":"main","name":"quarkus","ownerLogin":"snazy","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2020-11-23T16:26:53.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/957468?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1725822193.0","currentOid":""},"activityList":{"items":[{"before":"5f4acce7a1a6b32b0418f6e6811060b4737d4b48","after":"427f02dc93c26bfd5612f7926cf8701ae3d15731","ref":"refs/heads/oidc-concurrent-creates","pushedAt":"2024-09-08T19:29:08.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Prevent concurrent tenant creations\n\nRefactors `TenantConfigBean` internally to both prevent concurrent creation of the same OIDC tenant and optimizes the implementation to use non-volatile fields.\n\nTenant contexts are managed via the map-container (`TenantsMap`) and map-value type (`TenantHolder`), both are optimized for the \"99.99% case\" that the maps of static and dynamic tenants are \"fully populated\" and all (active) tenants have a \"ready\" context.\n\nRetrieving a tenant hits the \"fast path\" in the vast majority of all invocations, accessing only non-volatile fields and a non-concurrent hash map.\n\nIn case a tenant is not yet present (new dynamic tenant ID or late-initialized static default tenant), the implementations switches to the \"slow path\" and creates a new hash map with the new tenant and updates the non-volatile field referencing the tenants-map. Other threads that might not yet \"see\" the updated tenants-map field would also enter the slow path - but once the slow path has been executed, the update to the tenants-map field will be \"visible\".\n\nThe `TenantHolder` uses a mixture of non-volatile (the \"99.99% case\" is accessing a ready context) and volatile fields. The latter are used to make changes immediately \"visible\" to other threads - the order of writes is important here. Unlike `TenantsMap`, the `TenantHolder` class does not use/need a lock object or monitor.","shortMessageHtmlLink":"OIDC: Prevent concurrent tenant creations"}},{"before":null,"after":"5f4acce7a1a6b32b0418f6e6811060b4737d4b48","ref":"refs/heads/oidc-concurrent-creates","pushedAt":"2024-09-08T19:03:13.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Prevent concurrent tenant creations\n\nRefactors `TenantConfigBean` internally to both prevent concurrent creation of the same OIDC tenant and optimizes the implementation to use non-volatile fields.\n\nTenant contexts are managed via the map-container (`TenantsMap`) and map-value type (`TenantHolder`), both are optimized for the \"99.99% case\" that the maps of static and dynamic tenants are \"fully populated\" and all (active) tenants have a \"ready\" context.\n\nRetrieving a tenant hits the \"fast path\" in the vast majority of all invocations, accessing only non-volatile fields and a non-concurrent hash map.\n\nIn case a tenant is not yet present (new dynamic tenant ID or late-initialized static default tenant), the implementations switches to the \"slow path\" and creates a new hash map with the new tenant and updates the non-volatile field referencing the tenants-map. Other threads that might not yet \"see\" the updated tenants-map field would also enter the slow path - but once the slow path has been executed, the update to the tenants-map field will be \"visible\".\n\nThe `TenantHolder` uses a mixture of non-volatile (the \"99.99% case\" is accessing a ready context) and volatile fields. The latter are used to make changes immediately \"visible\" to other threads - the order of writes is important here. Unlike `TenantsMap`, the `TenantHolder` class does not use/need a lock object or monitor.","shortMessageHtmlLink":"OIDC: Prevent concurrent tenant creations"}},{"before":"cdfb3d10a2175066d65fe179e333ecd9cc06c7a0","after":"91f6dee008d5226b9d4278ce6f1493d884307743","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-09-08T13:52:28.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Limit number of dynamic tenants\n\nIntroduce a new configuration option `quarkus.oidc.dynamic-tenant-limit` as an opt-in to limit the number of active dynamic OIDC tenants. The default is no dynamic tenant limit.\n\nThis change adds the field `volatile long TenantConfigContext.lastUsed`, and removes the field `TenantConfigContext.ready` to keep the heap footprint the same. The `lastUsed` field is initially set to \"now\" and updated when the dynamic tenant is being accessed.\n\nWhen a new dynamic tenant is about to be added to the dynamic tenants map, eviction runs, if there are more dynamic tenants than configured via `dynami-tenant-limit`. The eviction algo is built to iterate over the dynamic tenants only once - it may need to iterate more often, if one of the eviction candidates has been accessed in the mean time. There is no linked-list structure to form an LRU list/queue, as that likely causes more runtime overhead (pointer updates, synchronization) than the cost of iterating over the list once in a while. The assumption is that the map of dynamic tenants has not a lot of \"churn\".","shortMessageHtmlLink":"OIDC: Limit number of dynamic tenants"}},{"before":"af9907d7988f6a2490b1810cbf66689bd1d326a3","after":"d94d7a96df5dd19275df324ac356bf4fe4770de7","ref":"refs/heads/oidc-keep-static-tenants-in-static","pushedAt":"2024-09-08T13:44:39.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"\"Sharpen\" Java visibility of `TenantConfigBean` members + re-add removed public functions, simplify some more code","shortMessageHtmlLink":"\"Sharpen\" Java visibility of TenantConfigBean members + re-add remo…"}},{"before":"3764850c4ce648131a5a9d6fe7e709b4937bbcec","after":"6b670ad49c5f30c5b8d5e290fa78576b892d3a92","ref":"refs/heads/oidc-refactor-for-context-limit","pushedAt":"2024-09-08T12:29:06.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Encapsulate static/dynamic tenants maps in `TenantConfigBean`\n\nLets `TenantConfigBean` be the sole \"owner\" of the static/dynamic tenants maps, adds/changes accessor methods for tenants. Also introduces a functional interface to create tenants.\n\nNo functional change, only moving code around.\n\nAlso some minor code cleanups (reducing the amount of warnings in IntelliJ).","shortMessageHtmlLink":"OIDC: Encapsulate static/dynamic tenants maps in TenantConfigBean"}},{"before":"05f0d34a367b8e7a8e2961a9358df374e5de6483","after":"cdfb3d10a2175066d65fe179e333ecd9cc06c7a0","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-09-07T17:24:37.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Limit number of dynamic tenants\n\nIntroduce a new configuration option `quarkus.oidc.dynamic-tenant-limit` as an opt-in to limit the number of active dynamic OIDC tenants. The default is no dynamic tenant limit.\n\nThis change adds the field `volatile long TenantConfigContext.lastUsed`, and removes the field `TenantConfigContext.ready` to keep the heap footprint the same. The `lastUsed` field is initially set to \"now\" and updated when the dynamic tenant is being accessed.\n\nWhen a new dynamic tenant is about to be added to the dynamic tenants map, eviction runs, if there are more dynamic tenants than configured via `dynami-tenant-limit`. The eviction algo is built to iterate over the dynamic tenants only once - it may need to iterate more often, if one of the eviction candidates has been accessed in the mean time. There is no linked-list structure to form an LRU list/queue, as that likely causes more runtime overhead (pointer updates, synchronization) than the cost of iterating over the list once in a while. The assumption is that the map of dynamic tenants has not a lot of \"churn\".","shortMessageHtmlLink":"OIDC: Limit number of dynamic tenants"}},{"before":"d0257dc987dc6c66638d285d7eba881a1992b8f0","after":"05f0d34a367b8e7a8e2961a9358df374e5de6483","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-09-07T17:22:26.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Limit number of dynamic tenants\n\nIntroduce a new configuration option `quarkus.oidc.dynamic-tenant-limit` as an opt-in to limit the number of active dynamic OIDC tenants. The default is no dynamic tenant limit.\n\nThis change adds the field `volatile long TenantConfigContext.lastUsed`, and removes the field `TenantConfigContext.ready` to keep the heap footprint the same. The `lastUsed` field is initially set to \"now\" and updated when the dynamic tenant is being accessed.\n\nWhen a new dynamic tenant is about to be added to the dynamic tenants map, eviction runs, if there are more dynamic tenants than configured via `dynami-tenant-limit`. The eviction algo is built to iterate over the dynamic tenants only once - it may need to iterate more often, if one of the eviction candidates has been accessed in the mean time. There is no linked-list structure to form an LRU list/queue, as that likely causes more runtime overhead (pointer updates, synchronization) than the cost of iterating over the list once in a while. The assumption is that the map of dynamic tenants has not a lot of \"churn\".","shortMessageHtmlLink":"OIDC: Limit number of dynamic tenants"}},{"before":"a41ea943436a5022c384c129e487d42ae66fadb4","after":"d0257dc987dc6c66638d285d7eba881a1992b8f0","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-09-07T17:19:33.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Limit number of dynamic tenants\n\nIntroduce a new configuration option `quarkus.oidc.dynamic-tenant-limit` as an opt-in to limit the number of active dynamic OIDC tenants. The default is no dynamic tenant limit.\n\nThis change adds the field `volatile long TenantConfigContext.lastUsed`, and removes the field `TenantConfigContext.ready` to keep the heap footprint the same. The `lastUsed` field is initially set to \"now\" and updated when the dynamic tenant is being accessed.\n\nWhen a new dynamic tenant is about to be added to the dynamic tenants map, eviction runs, if there are more dynamic tenants than configured via `dynami-tenant-limit`. The eviction algo is built to iterate over the dynamic tenants only once - it may need to iterate more often, if one of the eviction candidates has been accessed in the mean time. There is no linked-list structure to form an LRU list/queue, as that likely causes more runtime overhead (pointer updates, synchronization) than the cost of iterating over the list once in a while. The assumption is that the map of dynamic tenants has not a lot of \"churn\".","shortMessageHtmlLink":"OIDC: Limit number of dynamic tenants"}},{"before":"919d3398afbe80699a050ba2f7fd2f89624d1d64","after":"a41ea943436a5022c384c129e487d42ae66fadb4","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-09-07T17:07:32.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Limit number of dynamic tenants","shortMessageHtmlLink":"OIDC: Limit number of dynamic tenants"}},{"before":null,"after":"af9907d7988f6a2490b1810cbf66689bd1d326a3","ref":"refs/heads/oidc-keep-static-tenants-in-static","pushedAt":"2024-09-07T13:55:51.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Don't let static tenants \"escape\" into the dynamic tenants map","shortMessageHtmlLink":"OIDC: Don't let static tenants \"escape\" into the dynamic tenants map"}},{"before":"d0419b4b96b2ab6ba4aa1b5b4dc1471562bb2055","after":"3764850c4ce648131a5a9d6fe7e709b4937bbcec","ref":"refs/heads/oidc-refactor-for-context-limit","pushedAt":"2024-09-07T09:47:12.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Encapsulate static/dynamic tenants maps in `TenantConfigBean`\n\nLets `TenantConfigBean` be the sole \"owner\" of the static/dynamic tenants maps, adds/changes accessor methods for tenants. Also introduces a functional interface to create tenants.\n\nNo functional change, only moving code around.\n\nAlso some minor code cleanups (reducing the amount of warnings in IntelliJ).","shortMessageHtmlLink":"OIDC: Encapsulate static/dynamic tenants maps in TenantConfigBean"}},{"before":"6654e34a343a5ca888cf34bccc58724877f71562","after":"d0419b4b96b2ab6ba4aa1b5b4dc1471562bb2055","ref":"refs/heads/oidc-refactor-for-context-limit","pushedAt":"2024-09-05T15:31:03.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Fix (revert to previous) behavior + couple of nits","shortMessageHtmlLink":"Fix (revert to previous) behavior + couple of nits"}},{"before":"3178a45d1bd5cb38800e12f2091ab72561664bd4","after":"6654e34a343a5ca888cf34bccc58724877f71562","ref":"refs/heads/oidc-refactor-for-context-limit","pushedAt":"2024-09-05T12:56:56.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Fix (revert to previous) behavior + couple of nits","shortMessageHtmlLink":"Fix (revert to previous) behavior + couple of nits"}},{"before":"0a6ab3c0e1671d77ae85d381f301487e71ba17fa","after":"3178a45d1bd5cb38800e12f2091ab72561664bd4","ref":"refs/heads/oidc-refactor-for-context-limit","pushedAt":"2024-09-04T19:09:51.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Refactoring as a preparation to introduce a limit for dynamic tenants\n\nThis is a prerequisite for #42804 w/o any functional change. It moves the code to get/add tenants into the `TenantConfigBean`, so the limitation for the amount of dynamic tenants can be done there.","shortMessageHtmlLink":"OIDC: Refactoring as a preparation to introduce a limit for dynamic t…"}},{"before":null,"after":"0a6ab3c0e1671d77ae85d381f301487e71ba17fa","ref":"refs/heads/oidc-refactor-for-context-limit","pushedAt":"2024-09-04T10:08:35.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Refactoring as a preparation to introduce a limit for dynamic tenants","shortMessageHtmlLink":"OIDC: Refactoring as a preparation to introduce a limit for dynamic t…"}},{"before":"905ff848ef24a0a1917b351ab408558c285ad6b1","after":"919d3398afbe80699a050ba2f7fd2f89624d1d64","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-08-31T18:22:00.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Revert previous change, some refactorings","shortMessageHtmlLink":"Revert previous change, some refactorings"}},{"before":"2189ff4a297b40b5c2e41af9847cfc70d5dee626","after":"905ff848ef24a0a1917b351ab408558c285ad6b1","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-08-31T18:18:46.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Revert previous change, some refactorings","shortMessageHtmlLink":"Revert previous change, some refactorings"}},{"before":null,"after":"2189ff4a297b40b5c2e41af9847cfc70d5dee626","ref":"refs/heads/oidc-context-limit","pushedAt":"2024-08-27T14:06:45.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"OIDC: Limit the number of active OIDC contexts by amount and duration\n\nWIP","shortMessageHtmlLink":"OIDC: Limit the number of active OIDC contexts by amount and duration"}},{"before":"54a4d3e822cb60d5c882b6cc4e013180d7772f92","after":null,"ref":"refs/heads/bump-s-c-391","pushedAt":"2024-08-01T19:06:39.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"}},{"before":"8e7c255a708505f1f881f8f0f4ae8cebfd0fec62","after":null,"ref":"refs/heads/qml-no-exit-code","pushedAt":"2024-08-01T19:06:17.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"}},{"before":"c64824090faf6ee90d24d0e260a91543a325aae8","after":"8e7c255a708505f1f881f8f0f4ae8cebfd0fec62","ref":"refs/heads/qml-no-exit-code","pushedAt":"2024-08-01T14:40:58.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"gsmet","name":"Guillaume Smet","path":"/gsmet","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1279749?s=80&v=4"},"commit":{"message":"Fix `QuarkusMainLauncher` not returning exit code\n\n`QuarkusMainLauncher` always returns `0`, because `currentApplication` is set to `null` in `io.quarkus.runtime.ApplicationLifecycleManager#run(io.quarkus.runtime.Application, java.lang.Class, java.util.function.BiConsumer, java.lang.String...)`.\n\nThis change introduces a new callback to `ApplicationLifecycleManager` used by `StartupActionImpl` to know whether the application was actually started or not.","shortMessageHtmlLink":"Fix QuarkusMainLauncher not returning exit code"}},{"before":"f703ebbacdcd79db5bbf57ce68f124917367620b","after":"c64824090faf6ee90d24d0e260a91543a325aae8","ref":"refs/heads/qml-no-exit-code","pushedAt":"2024-08-01T08:57:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"add tests","shortMessageHtmlLink":"add tests"}},{"before":null,"after":"54a4d3e822cb60d5c882b6cc4e013180d7772f92","ref":"refs/heads/bump-s-c-391","pushedAt":"2024-08-01T08:55:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Bump smallrye-config from 3.9.0 to 3.9.1\n\nFixes #42240","shortMessageHtmlLink":"Bump smallrye-config from 3.9.0 to 3.9.1"}},{"before":"e6710e88415ea15c47a6932db32d273aee241d74","after":"f703ebbacdcd79db5bbf57ce68f124917367620b","ref":"refs/heads/qml-no-exit-code","pushedAt":"2024-08-01T08:22:28.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"gsmet","name":"Guillaume Smet","path":"/gsmet","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1279749?s=80&v=4"},"commit":{"message":"Get rid of some added lambdas","shortMessageHtmlLink":"Get rid of some added lambdas"}},{"before":"71e42adcc83da6b047370da1c43e3bc2975e9a59","after":null,"ref":"refs/heads/qml-no-exit-code-3.13","pushedAt":"2024-08-01T08:15:28.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"}},{"before":"ba20b72bf5f9ac0305664ee547b5cafcf4cdc3a3","after":"e6710e88415ea15c47a6932db32d273aee241d74","ref":"refs/heads/qml-no-exit-code","pushedAt":"2024-07-31T19:22:12.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"reset callbacks","shortMessageHtmlLink":"reset callbacks"}},{"before":"05b5b3a506a45e5ec191e6d869400ca34d6ab5c1","after":"71e42adcc83da6b047370da1c43e3bc2975e9a59","ref":"refs/heads/qml-no-exit-code-3.13","pushedAt":"2024-07-31T19:21:55.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"reset callbacks","shortMessageHtmlLink":"reset callbacks"}},{"before":"47278b1c07e63f6823899d152b4a4971ee37e289","after":"ba20b72bf5f9ac0305664ee547b5cafcf4cdc3a3","ref":"refs/heads/qml-no-exit-code","pushedAt":"2024-07-31T18:53:36.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Fix `QuarkusMainLauncher` not returning exit code\n\n`QuarkusMainLauncher` always returns `0`, because `currentApplication` is set to `null` in `io.quarkus.runtime.ApplicationLifecycleManager#run(io.quarkus.runtime.Application, java.lang.Class, java.util.function.BiConsumer, java.lang.String...)`.\n\nThis change introduces a new callback to `ApplicationLifecycleManager` used by `StartupActionImpl` to know whether the application was actually started or not.","shortMessageHtmlLink":"Fix QuarkusMainLauncher not returning exit code"}},{"before":null,"after":"05b5b3a506a45e5ec191e6d869400ca34d6ab5c1","ref":"refs/heads/qml-no-exit-code-3.13","pushedAt":"2024-07-31T18:52:13.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Fix `QuarkusMainLauncher` not returning exit code\n\n`QuarkusMainLauncher` always returns `0`, because `currentApplication` is set to `null` in `io.quarkus.runtime.ApplicationLifecycleManager#run(io.quarkus.runtime.Application, java.lang.Class, java.util.function.BiConsumer, java.lang.String...)`.\n\nThis change introduces a new callback to `ApplicationLifecycleManager` used by `StartupActionImpl` to know whether the application was actually started or not.","shortMessageHtmlLink":"Fix QuarkusMainLauncher not returning exit code"}},{"before":null,"after":"47278b1c07e63f6823899d152b4a4971ee37e289","ref":"refs/heads/qml-no-exit-code","pushedAt":"2024-07-31T18:50:27.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"snazy","name":"Robert Stupp","path":"/snazy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/957468?s=80&v=4"},"commit":{"message":"Fix `QuarkusMainLauncher` not returning exit code\n\n`QuarkusMainLauncher` always returns `0`, because `currentApplication`\nis set to `null` in\n`io.quarkus.runtime.ApplicationLifecycleManager#run(io.quarkus.runtime.Application,\njava.lang.Class,\njava.util.function.BiConsumer,\njava.lang.String...)`","shortMessageHtmlLink":"Fix QuarkusMainLauncher not returning exit code"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0wOFQxOToyOTowOC4wMDAwMDBazwAAAASwQK0G","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0wOFQxOToyOTowOC4wMDAwMDBazwAAAASwQK0G","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNy0zMVQxODo1MDoyNy4wMDAwMDBazwAAAASOZLNM"}},"title":"Activity · snazy/quarkus"}