)]}'
{
  "commit": "e41af825359b02fa668759cc609856c51ca6c691",
  "tree": "035c6495c444a96a6caac1723780fc73b48ecf09",
  "parents": [
    "2461b073251f54b7421f78cf73b4bfa705f46b8e"
  ],
  "author": {
    "name": "Paul Rütter",
    "email": "paul@blueconic.com",
    "time": "Fri Sep 04 00:35:43 2026 +0200"
  },
  "committer": {
    "name": "Paul Rütter",
    "email": "paul@blueconic.com",
    "time": "Fri Sep 04 08:54:15 2026 +0200"
  },
  "message": "FELIX-6859 allow a bounded VirtualThreadPool as the virtual threads executor\n\nJetty 12 documents a QueuedThreadPool whose virtual threads executor is a\nbounded VirtualThreadPool as the preferred setup, but Felix HTTP could not\nbe configured to build it. The two virtual thread options were the\nextremes: an unbounded number of concurrent tasks, or a standalone\nVirtualThreadPool that creates only virtual threads. A deployment that\nwants platform threads for the acceptors and the selectors, and a bound on\nconcurrent request tasks, had no way to express that.\n\nAdds org.apache.felix.http.jetty.virtualthreads.max to the jetty12 bundle.\nWhen virtual threads are enabled and this property is set to a positive\nvalue, the thread pool becomes a QueuedThreadPool, sized by threadpool.max\nas usual, whose virtual threads executor is a VirtualThreadPool bounded by\nsetMaxConcurrentTasks. Note that unlike threadpool.max, this property\nbounds the number of concurrent tasks rather than the number of threads.\n\nThe VirtualThreadPool is added as a bean of the QueuedThreadPool, because\nsetVirtualThreadsExecutor() only stores the executor and does not manage\nits life cycle; an unstarted VirtualThreadPool rejects every task with a\nRejectedExecutionException. Being a managed bean also covers the teardown,\nso the pool is stopped when the server stops.\n\nNon-positive values fall through to the existing behaviour, since Jetty\nitself treats maxConcurrentTasks \u003c\u003d 0 as unbounded. The pre-existing branch\nthat builds a standalone VirtualThreadPool keeps using threadpool.max as\nits bound, so no released behaviour changes.\n\nThe thread pool selection is extracted from createServer() into a package\nprivate createThreadPool(JettyConfig), returning null when no thread pool\nis configured so that Jetty\u0027s own default applies, so that the resulting\npool can be asserted without starting a server. JettyServiceThreadPoolTest\ncovers every combination: the type of pool, its bound, and that the\nVirtualThreadPool is registered as a bean of the QueuedThreadPool.\n\nTwo related fixes in the same area:\n\n* The attribute definition for virtualthreads.enable passed -1 as its\n  default value, which selects the int constructor of\n  AttributeDefinitionImpl, so the flag was declared as an INTEGER\n  attribute defaulting to -1 even though JettyConfig reads it with\n  getBooleanProperty. It is now declared as a BOOLEAN defaulting to false.\n  Reading a previously stored integer value is unaffected.\n* The guard in JettyVirtualThreadsIT matched the version string with\n  startsWith(\"21\"), so the test body was skipped on every later JDK while\n  the test was still reported as passing. It now compares the feature\n  version, so the ITs run on Java 21 and on every later JDK. Note that the\n  Pax Exam runner swallows a failed assumption and reports the test as\n  passing rather than as skipped, so below Java 21 the test still shows up\n  as green, as it did before.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "2483e7c42091f9ca6f7f9bab946d09e14540dfad",
      "old_mode": 33188,
      "old_path": "http/README.md",
      "new_id": "8adc663938e3579ea6f14b79af14d94c648e6218",
      "new_mode": 33188,
      "new_path": "http/README.md"
    },
    {
      "type": "modify",
      "old_id": "2372d8c59faa1015dd9d28721fc37d2786ee8b3f",
      "old_mode": 33188,
      "old_path": "http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/ConfigMetaTypeProvider.java",
      "new_id": "ec29ea5f8538a217f2ce9d3b31a26beb9e76c494",
      "new_mode": 33188,
      "new_path": "http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/ConfigMetaTypeProvider.java"
    },
    {
      "type": "modify",
      "old_id": "0e2c605008fef29ba76e85d376fa7378b8aa9b91",
      "old_mode": 33188,
      "old_path": "http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java",
      "new_id": "28e9eb693658b50bbaa54a8330c495d13201cb4f",
      "new_mode": 33188,
      "new_path": "http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java"
    },
    {
      "type": "modify",
      "old_id": "9706368ed1a21bac0355a32f908f1f1ecf5044bb",
      "old_mode": 33188,
      "old_path": "http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java",
      "new_id": "982be440b747317c41433bba7ad376c993cdbf0d",
      "new_mode": 33188,
      "new_path": "http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java"
    },
    {
      "type": "modify",
      "old_id": "e0e7bcc269d1bed31459671f0a6da567071bad8e",
      "old_mode": 33188,
      "old_path": "http/jetty12/src/test/java/org/apache/felix/http/jetty/internal/JettyConfigTest.java",
      "new_id": "42c790f68901ccfe2ce7412d4a307c0107b68990",
      "new_mode": 33188,
      "new_path": "http/jetty12/src/test/java/org/apache/felix/http/jetty/internal/JettyConfigTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8ddd9e063aa0ccf86b4aae4bbadb5fe04894a6aa",
      "new_mode": 33188,
      "new_path": "http/jetty12/src/test/java/org/apache/felix/http/jetty/internal/JettyServiceThreadPoolTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dbe184631b4815083d6a2dd7b6f67bda6eeb4aa0",
      "new_mode": 33188,
      "new_path": "http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsBoundedExecutorIT.java"
    },
    {
      "type": "modify",
      "old_id": "d18958c6420f8b7992871a7f6b29ce0c860fe20b",
      "old_mode": 33188,
      "old_path": "http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsIT.java",
      "new_id": "719754662b3ef9b9450b087d37f46784bb9643dc",
      "new_mode": 33188,
      "new_path": "http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsIT.java"
    }
  ]
}
