)]}'
{
  "log": [
    {
      "commit": "c614f13a1ef89698c9655ebddd5b54f09b497af4",
      "tree": "3a185660b029699a65608b7173e11a45651949a9",
      "parents": [
        "0989c119c646efbce8926ed42580b1d1f782be68"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 17 16:22:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 19:22:56 2026 -0400"
      },
      "message": "[improve][test] Add integration tests for the MongoDB source connector (#124)\n\n* [improve][test] Add integration tests for the MongoDB source connector\n\nAdd MongoSourceContainerTest, the first integration test for the\nMongoDB source. It starts a MongoDBContainer (mongo:6.0, which\nauto-initializes the single-node replica set that change streams\nrequire), seeds documents, and runs MongoSource end-to-end, asserting\nthat inserts flow through a real change stream into the source\u0027s queue\nwith the expected operation, namespace, fullDocument and key.\n\nMirrors the sibling MongoSinkContainerTest container harness and the\nDynamoDBSourceIntegrationTest blocking-read pattern: MongoSource is a\nPushSource whose read() blocks forever on an empty queue, so reads run\non a bounded daemon executor with a timeout. syncType\u003dFULL_SYNC replays\nthe pre-seeded documents from the start of the stream, making delivery\ndeterministic rather than racing the subscription becoming active; a\nbackground writer keeps a steady supply as a safety net.\n\nFixes #121\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* [improve][test] Mongo source IT: drop writer, assert exact FULL_SYNC replay set\n\nBuilds on the autofix (writer moved after open, seed-only assertion). The\nbackground writer is now unnecessary for this test: FULL_SYNC replays the\ndocuments seeded before open() from the start of the stream, so delivery\ndoes not depend on post-open writes. Remove it, and assert the received\ndocument set equals the seeded set exactly — proving every seeded doc is\nreplayed once and nothing extraneous is delivered, rather than only checking\neach record starts with \u0027seed-\u0027.\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "0989c119c646efbce8926ed42580b1d1f782be68",
      "tree": "f979ad588e1743deca79b8eac837798b9c56f321",
      "parents": [
        "5cf71a6e40ab30abed1eeb4404d88a76a7de9cf0"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 17 16:22:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 19:22:35 2026 -0400"
      },
      "message": "[improve][test] Add integration tests for the Kinesis source connector (#123)\n\n* [improve][test] Add integration tests for the Kinesis source connector\n\nAdd KinesisSourceIntegrationTest, the first integration test for the\nKinesis source. It starts a LocalStack container (Kinesis + DynamoDB +\nCloudWatch, since the KCL uses DynamoDB for its lease table and\nCloudWatch for metrics), creates a stream, seeds records, and runs\nKinesisSource end-to-end, asserting that records flow through the KCL\nworker into the source queue with the expected value, partition key,\nand sequence-number property.\n\nMirrors the existing DynamoDBSourceIntegrationTest harness (both are\nKCL sources against LocalStack): seed before open with TRIM_HORIZON, a\nbackground writer for steady supply, a unique applicationName per run\nfor a fresh lease table, and a bounded reader thread because\nKinesisSource.read() blocks forever on an empty queue. Enhanced fan-out\nis disabled (useEnhancedFanOut\u003dfalse) because SubscribeToShard is\nunreliable on LocalStack.\n\nFixes #122\n\n* [improve][test] Kinesis source IT: address review feedback\n\n- Bound the blocking AWS calls in @BeforeMethod (createStream/describeStream)\n  and deleteStream with explicit get() timeouts; @BeforeMethod is not covered\n  by @Test(timeOut\u003d...), so an unbounded future could hang the suite.\n- Validate that the emitted value and partition key carry what was written\n  (value-* payload, pk-* key) instead of only checking they are non-empty.\n- Drop the redundant post-loop count assertion (the fixed-count loop already\n  guarantees it).\n- Use the REGION constant in createClient() instead of hard-coding US_EAST_1."
    },
    {
      "commit": "5cf71a6e40ab30abed1eeb4404d88a76a7de9cf0",
      "tree": "59b366a2cfa20ed18d7051b8fbab514abe7e5d5e",
      "parents": [
        "901215790c772020d3c6570c15e08a695df54e48"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Wed Jul 15 11:06:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:06:01 2026 -0700"
      },
      "message": "[improve][test] KCA: re-enable broker tests (add buildtools + opentelemetry-sdk-testing) (#119)\n\n* [improve][test] KCA: add pulsar-buildtools so broker tests compile (WIP)\n\nThe 5 broker-dependent Kafka Connect Adaptor test files were excluded from\ncompilation with a note that they were waiting for unreleased Pulsar artifacts.\nThat is not the case: every class they need is already published in the pinned\npulsar 4.2.0. The only gap was TestRetrySupport (the root of the\nProducerConsumerBase -\u003e MockedPulsarServiceBaseTest -\u003e TestRetrySupport chain),\nwhich lives in org.apache.pulsar:buildtools and was not declared as a test\ndependency. Adding it makes all 5 files compile; every earlier error was a\ncascade from that missing supertype.\n\nAdd testImplementation(libs.pulsar.buildtools) and remove the\nbrokerDependentTestSources compile exclusion.\n\nWIP: the tests now COMPILE but do not yet EXECUTE - TestNG silently skips\nProducerConsumerBase subclasses in this Gradle harness (reproduced with a\nminimal probe). That execution issue is tracked separately; see #118.\n\nRefs #118\n\n* [improve][test] KCA: add opentelemetry-sdk-testing so broker tests execute\n\nAdding pulsar-buildtools (previous commit) made the broker-dependent tests\ncompile, but they still silently did not run: TestNG collected zero tests from\nevery MockedPulsarServiceBaseTest subclass.\n\nRoot cause: TestNG\u0027s test discovery calls Class.getDeclaredMethods() on each\nclass in the hierarchy. MockedPulsarServiceBaseTest (from pulsar-broker:tests)\nhas methods whose signatures reference io.opentelemetry.sdk.testing.assertj.*\n(e.g. LongSumAssert). That type lives in opentelemetry-sdk-testing, which\npulsar-broker declares test-scoped, so it is not pulled transitively through the\ntests jar. getDeclaredMethods() therefore throws NoClassDefFoundError, which\nTestNG swallows during discovery, yielding zero test methods for the subclass\n(reproduced identically on macOS and Linux CI, and with raw org.testng.TestNG).\n\nAdd opentelemetry-sdk-testing to the test classpath. Discovery then succeeds and\nthe full suite runs: KafkaConnectSinkTest (45), KafkaConnectSourceTest (12),\nPulsarOffsetBackingStoreTest (5), and the source-error tests all execute and\npass (99 tests total, 0 failures).\n\nFixes #118\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* [improve][test] Reword buildtools comment (no longer references a list below)\n\nAddress Copilot review on #119: the exclusion list this comment used to sit\nabove was removed, so \u0027broker-backed tests below\u0027 was stale. Comment-only.\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "901215790c772020d3c6570c15e08a695df54e48",
      "tree": "7ae41c3fb0741b2f73318dc50cb8e12ba3a2d18b",
      "parents": [
        "07ec19f99eb97a036793bd5a9d67a850f4c34bff"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Wed Jul 15 09:54:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 09:54:31 2026 -0700"
      },
      "message": "[fix][test] Harden flaky timing assertions in FileListingTaskTest (#120)\n\n* [fix][test] Harden flaky timing assertions in FileListingTaskTest\n\npollingIntervalTest failed intermittently in CI (\"Wanted but not invoked:\nworkQueue.offer(...); zero interactions\"). It slept only pollingInterval+20ms\n(120ms) before asserting the asynchronous listing thread had already run — a\nwindow too tight for a loaded CI runner. Every other test in the file shared the\nsame sleep-then-verify anti-pattern with a fixed 2000ms wait.\n\nReplace the fixed sleeps for positive assertions with Awaitility: wait up to 15s\nfor the listing thread to offer exactly the expected number of files. A healthy\nrun still finishes as soon as the count is reached; a slow runner simply waits\nlonger instead of failing. The \u0027nothing should be offered\u0027 assertions keep a\nfixed wait (there is no positive event to await), and the semantic file-ageing\nsleep in maximumAgeTest is preserved.\n\nRefs the flaky run observed on PR #115 CI (the flake is in this pre-existing\ntest, not in the File source integration test).\n\n* [fix][test] Correct misleading maximumAgeTest comments\n\nAddress Copilot review on #120: the inline comments described the two file\nbatches backwards. The first batch is aged past maximumFileAge by the sleep and\nis therefore skipped; the second, freshly created batch is the one young enough\nto be processed (the 5 offers awaited). Comment-only change."
    },
    {
      "commit": "07ec19f99eb97a036793bd5a9d67a850f4c34bff",
      "tree": "2f460b77bc58aa27e2399785b2978ef55b29ff53",
      "parents": [
        "c43eb7fff4d2350e535bde3943761d4288b1bb1b"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Wed Jul 15 08:58:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 08:58:29 2026 -0700"
      },
      "message": "[improve][test] Add File source integration test (#115)\n\n* [improve][test] Add File source integration test\n\nDrives FileSource through its real open() -\u003e worker pool -\u003e consume() path and\nasserts the emitted record bytes, rather than exercising the internal worker\nthreads in isolation as the existing unit tests do.\n\nCovers plain-text line splitting, gzip decode, recursive traversal, file\nfiltering, hidden-file exclusion, delete-after-process, processedFileSuffix\nrename, polling pickup of files created after open(), and the empty-directory\npath. All waits are deadline-bounded so an under-delivering pipeline fails fast\ninstead of hanging CI. No external service required.\n\nFixes #108\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* [improve][test] Address review comments on File source integration test\n\n- Write all test input files with Charset.defaultCharset() to match the\n  connector (FileConsumerThread reads via Files.lines(defaultCharset) and\n  re-encodes with line.getBytes()), avoiding platform-dependent failures.\n- Decode emitted record values with Charset.defaultCharset() for the same\n  reason.\n- testHiddenFilesAreIgnored: set fileFilter to \u0027.*\u0027 so the hidden file is\n  excluded solely by ignoreHiddenFiles, actually validating that behavior.\n- tearDown: interrupt the reader, close the source to stop the worker pool\n  and unblock read(), then join and assert the reader stopped; keep cleanup\n  in a finally so a failing close() cannot leak the temp directory.\n- Remove now-unused StandardCharsets import.\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "c43eb7fff4d2350e535bde3943761d4288b1bb1b",
      "tree": "9ef7a5294d6eca80012de2e1c04056b2360a18c4",
      "parents": [
        "69d683634bc807cb63a19cd6276d3f5802009ac5"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Wed Jul 15 08:05:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 08:05:54 2026 -0700"
      },
      "message": "[fix][io] File source: read zip entries so zip files emit records (#117)\n\n* [fix][io] File source: read zip entries so zip files emit records\n\nZipFiles.lines() wrapped a ZipInputStream in a reader but never called\ngetNextEntry(). A ZipInputStream yields no data until it is positioned onto an\nentry, so the reader saw an empty stream and the File source emitted zero\nrecords for every zip file, then deleted/renamed it as if processed.\n\nRead through each file entry and return the collected lines (in entry order),\nso single- and multi-entry archives both deliver their content.\n\nAlso make ZipFilesTest non-vacuous: streamZipFileTest previously asserted inside\na forEachOrdered that ran zero times and swallowed exceptions, so it passed even\nthough no lines were read. It now asserts the exact nine lines, and a new\nstreamMultiEntryZipFileTest builds a two-entry archive and checks all lines are\nreturned.\n\nFixes #114\n\n* [fix][io] Stream zip entries lazily instead of buffering all lines\n\nAddress review feedback: ZipFiles.lines() collected every line into a\nList before returning a stream, which buffers the whole decompressed\narchive in memory and defeats the line-by-line back-pressure that\nFileConsumerThread relies on. Walk the entries lazily via a line\niterator that opens a fresh reader per entry (preserving entry\nboundaries as line boundaries) and closes the ZipInputStream when the\nreturned stream is closed, matching the lazy GZipFiles.lines contract."
    },
    {
      "commit": "69d683634bc807cb63a19cd6276d3f5802009ac5",
      "tree": "4cd57f014154d42632870da648a31515bce91122",
      "parents": [
        "81ae86a9a41f79d9fc4063704990a3fe8bbbbaeb"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Wed Jul 15 07:54:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 07:54:12 2026 -0700"
      },
      "message": "[improve][test] Add Netty source integration test and null-safe close() (#116)\n\n* [improve][test] Add Netty source integration test and null-safe close()\n\nDrives NettySource through its real open() entry point, sends bytes over an\nactual socket for each supported transport (TCP, UDP, HTTP), and asserts the\nrecords the source emits. The existing NettyServerTest only constructs\nNettyServer objects and asserts they are non-null; nothing crossed the wire.\n\nAlso make NettySource.close() null-safe: nettyServer is assigned asynchronously\nby the server thread, so close() could NPE if it ran before the server started.\n\nFixes #110\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "81ae86a9a41f79d9fc4063704990a3fe8bbbbaeb",
      "tree": "b25ed73e15b7676d3b1740e290f0f1dbcf274699",
      "parents": [
        "5d5847aed78b64990648a4a8253f90e73ba81a90"
      ],
      "author": {
        "name": "Praveen Kumar",
        "email": "122990319+Praveenkumar76@users.noreply.github.com",
        "time": "Tue Jul 14 21:37:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:07:41 2026 -0700"
      },
      "message": "[fix][io] Fix Solr Sink KeyValue schema unwrapping for Debezium CDC (#26)\n\n* [fix][io] Fix Solr Sink Debezium KeyValue unwrapping by bypassing generic schema API and extracting JSON payloads\n\n* DRY violation, avoid log spam, return null on mapping failure, and remove hardcoded id by dynamically extracting primary key\n\n* fix: prevent data loss by using record.fail() on conversion errors and improve CDC detection by validating Debezium envelope (op + before/after)\n\n* refactor the nested if-else statement\n\n* Add the DELETE test above to confirm that your executeSolrDelete call is reached\n\n* Address AI review: harden Solr DELETE handling and PK extraction\n\n* Address AI review: refine Solr CDC behavior, error handling, and tests\n\n- Restored legacy direct field mapping for non-CDC messages to maintain backward compatibility.\n- Updated DELETE extraction to throw IllegalArgumentException for malformed envelopes, ensuring proper fail/retry routing.\n- Broadened normalizeValue to coerce all Number subtypes to Strings.\n- Updated SolrSinkConfig help text to accurately reflect the full scope of unwrapDebeziumRecord.\n- Hardened SolrGenericRecordSinkTest by stubbing SolrClient.request() and adding Mockito verification for delete operations."
    },
    {
      "commit": "5d5847aed78b64990648a4a8253f90e73ba81a90",
      "tree": "9af0ee577bbcc45d0e08d5a2bf92535742201d89",
      "parents": [
        "d254f50b9e1032486b0d41f47d42f0ae7f2835d6"
      ],
      "author": {
        "name": "Dream95",
        "email": "864197662@qq.com",
        "time": "Tue Jul 14 23:56:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 08:56:00 2026 -0700"
      },
      "message": "[feat][mqtt] Support dynamic MQTT topic via topicProperty config (#34)\n\n* [feat][mqtt] Support dynamic MQTT topic via topicProperty config\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\n\n* [fix][mqtt] Fall back to default topic when record properties is null\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\n\n* [improve][test] Add MQTT sink e2e coverage for dynamic topicProperty\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\n\n* [fix][test] Add timeOut to MQTT dynamic topicProperty e2e test\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\n\n---------\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\nCo-authored-by: David Kjerrumgaard \u003c35466513+david-streamlio@users.noreply.github.com\u003e"
    },
    {
      "commit": "d254f50b9e1032486b0d41f47d42f0ae7f2835d6",
      "tree": "d2f0626e37f409d772fd0753c04cc9700dfad4db",
      "parents": [
        "03a4a30a1fce544a73a77b437b4d693ce39e4c19"
      ],
      "author": {
        "name": "Enrique Fernández",
        "email": "enrique@bluelabs.eu",
        "time": "Tue Jul 14 17:54:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 08:54:25 2026 -0700"
      },
      "message": "[improve][io] Extend RMQ source with connection, queue and exchange options (#90)\n\n* [improve][io] Extend RabbitMQ source with queue and exchange options\n\n* allow secure connections\n\n* namespaced message property keys\n\n* improve validations\n\n* null-safe channel and connection closure"
    },
    {
      "commit": "03a4a30a1fce544a73a77b437b4d693ce39e4c19",
      "tree": "cc270e1c5da8f22388a6163dffc2d4f16249da57",
      "parents": [
        "c2c251a5c1db68ba2024ef2d733bcccfe6e6dd04"
      ],
      "author": {
        "name": "Rui Fu",
        "email": "freeznet@users.noreply.github.com",
        "time": "Sun Jul 12 10:05:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 10:05:16 2026 +0800"
      },
      "message": "feat(kinesis): add message key mode for Kinesis records (#35)"
    },
    {
      "commit": "c2c251a5c1db68ba2024ef2d733bcccfe6e6dd04",
      "tree": "b21cb78a3be6345058350508319e020700b34856",
      "parents": [
        "0a71167118a7ff05ac18dada23b592bb509742a4"
      ],
      "author": {
        "name": "Rui Fu",
        "email": "freeznet@users.noreply.github.com",
        "time": "Sat Jul 11 16:50:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 16:50:33 2026 +0800"
      },
      "message": "feat(kafka): copy Pulsar properties to Kafka headers and support idempotence (#36)\n\nCo-authored-by: David Kjerrumgaard \u003c35466513+david-streamlio@users.noreply.github.com\u003e"
    },
    {
      "commit": "0a71167118a7ff05ac18dada23b592bb509742a4",
      "tree": "5d90ad0f85a39f6ca38a3300ff2d195c89783046",
      "parents": [
        "23a89612c0ab4a753b76c6f903b3a0ef616bb3f4"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 18:55:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 18:55:29 2026 -0700"
      },
      "message": "[fix][io] Upgrade OpenMLDB client to 0.9.2 and add sink integration test (#105)\n\n* [fix][io] Upgrade OpenMLDB client to 0.9.2 so the connector can run on current hosts\n\nThe pinned OpenMLDB client (0.4.4-hotfix1) is unusable in a current\nbuild, for three independent reasons:\n\n- Its native SDK (libsql_jsdk.so) references _dl_sym@GLIBC_PRIVATE,\n  which glibc 2.34 removed, so loading the driver hard-crashes the JVM\n  on any modern Linux host.\n- Its JDBC driver has no META-INF/services/java.sql.Driver entry, so\n  DriverManager cannot discover it and JdbcAbstractSink.open() fails\n  with \u0027No suitable driver\u0027.\n- 0.9.2 is the newest version with a matching 4pdosc/openmldb Docker\n  image.\n\nThe 0.9.2 SDK still needs two module-scoped version forces because it\nis compiled against APIs that the platform-enforced versions removed:\nCurator 4.2.0 (NodeCache.getListenable() signature changed in 5.x) and\nprotobuf-java 3.21.12 (generated classes call makeExtensionsImmutable(),\nremoved in 3.22). NARs never bundle protobuf, so the protobuf force only\naffects compile/test classpaths.\n\n* [improve][test] Add OpenMLDB JDBC sink integration test\n\nFixes #46\n\nAdd OpenMLDBJdbcSinkIntegrationTest, the first integration test for the\nOpenMLDB JDBC sink. It starts an OpenMLDB 0.9.2 cluster (the image\u0027s\ninit.sh: ZooKeeper on localhost:2181, zkPath /openmldb) via\nTestcontainers with host networking, creates the database and table,\nwrites an Avro GenericRecord through the sink, and reads the row back\nover a fresh JDBC connection.\n\nHost networking is required because the JDBC driver discovers\ntablet/nameserver endpoints through ZooKeeper and dials them directly,\nso the advertised addresses must be reachable from the test JVM; that\nalso makes the test Linux-only, as is the driver\u0027s native SDK\n(libsql_jsdk.so, Linux x86-64 only).\n\nTwo OpenMLDB driver limitations shape the test: key/nonKey must not be\nconfigured (the driver only supports INSERT prepared statements, and\nkey/nonKey makes the sink also prepare UPDATE/DELETE, which throw\n\u0027unsupported sql\u0027), and ResultSet getters must be positional (getters\nby column label throw \u0027current do not support this method\u0027).\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "23a89612c0ab4a753b76c6f903b3a0ef616bb3f4",
      "tree": "d1af54c555947dd87b08ef40803c1974a5c29970",
      "parents": [
        "661efb55d344360314d02da82a7e789fab44e763"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 16:28:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 16:28:21 2026 -0700"
      },
      "message": "[improve][test] Add HBase sink integration test (#104)\n\n* [improve][test] Add HBase sink integration test\n\nFixes #51\n\nAdd the first integration test for the HBase sink,\nHbaseGenericRecordSinkIntegrationTest. It starts an all-in-one HBase\ncontainer (harisekhon/hbase:2.1) via Testcontainers, creates the table,\nwrites a record through HbaseGenericRecordSink, polls until the flush\nlands, and reads the row back with the HBase client. A never-written row\nis asserted absent as a non-vacuous guard.\n\nThe test uses host networking, which works on Linux only: HBase\u0027s\nRegionServer advertises its own host/port through ZooKeeper and the\nclient dials it directly, so the advertised address must be reachable\nfrom the test JVM. The all-in-one images are also amd64-only.\n\nDepends on the opentelemetry-semconv pin from #102 (already merged);\nwithout it the sink throws NoClassDefFoundError on the first HBase\ncall.\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "661efb55d344360314d02da82a7e789fab44e763",
      "tree": "589eca4ee9932f8939f33a994150c7af4b4f7e1b",
      "parents": [
        "52e3415a77dc7c46b19298fd4ed16abddf46b2f2"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 14:54:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:54:45 2026 -0700"
      },
      "message": "[fix][io] Flush and sync before closing the HDFS text sink stream (#100)\n\n* [fix][io] Flush and sync before closing the HDFS text sink stream\n\nHdfsAbstractTextFileSink.close() closed the writer (and its underlying\nHDFS stream) before the superclass ran its final hsync()/ack in\nHdfsSyncThread.halt(). Whenever records were still unacked at close\ntime, that hsync() ran against an already-closed stream and threw\nClosedChannelException, so the final batch was never acked or committed.\n\nFlush the writer, let super.close() halt the sync thread and hsync/ack\nwhile the stream is still open, then close the writer.\n\nAdd a regression test that closes the sink with records still queued\n(a long syncInterval keeps the background thread from draining first):\nit fails with ClosedChannelException against the old order and passes\nwith the fix.\n\n* [fix][test] Address review on the HDFS close-ordering fix\n\n- close() now wraps flush()+super.close() in try/finally so the writer\n  (and its underlying HDFS stream) is always closed, even if the final\n  hsync()/ack in super.close() throws.\n- The regression test mirrors the defensive close-on-error pattern so a\n  throwing close() cannot leave the non-daemon HdfsSyncThread running.\n- Lower the test\u0027s syncInterval from 5s to 1s: close() joins the sync\n  thread (halt() does not interrupt its sleep), so the interval is dead\n  suite time; 1s stays comfortably above the millisecond enqueue."
    },
    {
      "commit": "52e3415a77dc7c46b19298fd4ed16abddf46b2f2",
      "tree": "a5e0d503dd97e9f873b2f733b4d45877cae3a72f",
      "parents": [
        "89219f05b2e19f6d482d6d33b11c490ff607d0d9"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 14:50:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:50:53 2026 -0700"
      },
      "message": "[improve][test] Bound container startup in all Testcontainers tests (#103)\n\nAdd an explicit withStartupTimeout to every Testcontainers container\nstarted in @BeforeClass/@BeforeMethod so a stalled image pull or container\nstart fails fast instead of hanging the CI job until its 45-minute limit.\n\nA @Test(timeOut\u003d...) only bounds the test method, not the container start\nin @BeforeClass/@BeforeMethod, so without withStartupTimeout a stuck start\ncould cancel unrelated PRs\u0027 CI at the job limit (see #89; fixed for MQTT in\n#91). This applies the same bound to the remaining Testcontainers tests.\n\nN\u003d3 for a single normal container; N\u003d5 for the Debezium source tests\n(DB + Pulsar container) and for large/slow images (ClickHouse, LocalStack,\nPulsar). Only the startup timeout is added; no test logic is changed."
    },
    {
      "commit": "89219f05b2e19f6d482d6d33b11c490ff607d0d9",
      "tree": "fae5dbffe36c7d40608b9ef0d21e040b78cf38db",
      "parents": [
        "2094f3b6e554d42ae28dca280fd8b795a5c56db0"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 14:32:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:32:18 2026 -0700"
      },
      "message": "[fix][io] Pin opentelemetry-semconv to a version the HBase client can use (#102)\n\nhbase-client references io.opentelemetry.semconv.SemanticAttributes when\nbuilding a trace span on every table operation. That class was removed\nafter the ~1.30 semconv line, but the shared platform force-upgrades\nsemconv to 1.37.0, so the sink throws NoClassDefFoundError on its first\nHBase call — the connector cannot write in a current build.\n\nExclude the platform-managed semconv and pin 1.29.0-alpha (the version\nhbase-client declares), which still ships SemanticAttributes. After the\nchange :hbase:runtimeClasspath resolves semconv to 1.29.0-alpha and the\nclass is present."
    },
    {
      "commit": "2094f3b6e554d42ae28dca280fd8b795a5c56db0",
      "tree": "be442c3c8e4c50ecb0d1b778c301cfb1130c50b7",
      "parents": [
        "d32fb93b643b9c9673caa105a25169d30c1be62c"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 12:33:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:33:19 2026 -0700"
      },
      "message": "[improve][test] Add NSQ source integration test (#95)\n\n* [improve][test] Add NSQ source integration test\n\nAdd a Testcontainers-based integration test for NSQSource that exercises\nthe full path from a real NSQ cluster (nsqlookupd + nsqd) through the\nsource\u0027s push queue.\n\nThe nsq-j Subscriber discovers nsqd via nsqlookupd\u0027s HTTP /lookup endpoint\nand then connects directly to the advertised broadcast_address:tcp_port, so\nnsqd runs with --broadcast-address\u003d127.0.0.1 and a pinned TCP port 4150 to\nbe reachable from the host. Records are read on a bounded worker thread with\na per-read deadline, since PushSource.read() blocks forever on an empty\nqueue and must never be called inside an Awaitility assertion.\n\n* [fix][test] Address review on NSQSourceIntegrationTest\n\n- Close the HttpURLConnection input streams and disconnect() in\n  lookupHasProducer and nsqdPost so repeated polling does not leak\n  connections/file descriptors.\n- Replace the hard-coded nsqd TCP port 4150 with an ephemeral free port\n  chosen at startup (nsqd advertises it via --tcp-address and it is bound\n  1:1 to the host), avoiding collisions on busy or shared CI runners."
    },
    {
      "commit": "d32fb93b643b9c9673caa105a25169d30c1be62c",
      "tree": "ac4372198891b5b31de0b2df583cdbae71b65e5c",
      "parents": [
        "090907a66f93d8010f7050c5c4f9a6e96982375f"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 12:26:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:26:51 2026 -0700"
      },
      "message": "[improve][test] Add HDFS3 sink integration test against MiniDFSCluster (#93)\n\n* [improve][test] Add HDFS3 sink integration test against MiniDFSCluster\n\nAdds an end-to-end integration test for the HDFS3 sink that exercises the\nsink against a real, in-JVM Hadoop MiniDFSCluster (no Docker required).\nPreviously the hdfs3 module had only config tests and mock-based sink\ntests that verified acks against a Mockito mock and never wrote to a real\nfilesystem.\n\nThe test opens the HdfsStringSink pointed at the mini cluster via a\ngenerated core-site.xml, writes several records, waits for them to be\nacked, closes the sink to flush, then reads the committed file back from\nthe mini cluster\u0027s own FileSystem and asserts the bytes match what was\nwritten.\n\nExcludes the Jetty 12 BOM from the enforced platform for this module and\npins the test classpath to Jetty 9.x (via the existing jetty9 override)\nso the mini cluster\u0027s embedded HDFS HTTP server can start.\n\n* [fix][test] Address review on HdfsSinkIntegrationTest\n\n- Set the sink\u0027s encoding to UTF-8 explicitly so the write side matches\n  the UTF-8 read-back regardless of the JVM default charset.\n- Wrap the sink lifecycle in try/finally so close() runs on failure\n  paths too, preventing a leaked non-daemon HdfsSyncThread.\n- Correct the build.gradle.kts comment: the Jetty BOM exclusion\n  customizes the enforced platform on the implementation configuration,\n  not just the test classpath (no Jetty reaches the runtime either way)."
    },
    {
      "commit": "090907a66f93d8010f7050c5c4f9a6e96982375f",
      "tree": "793371ba68164735250535a7b1a87a39ea60651f",
      "parents": [
        "28ef0cc1603119ca51d85b288d57ef06a07decf4"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 12:26:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:26:08 2026 -0700"
      },
      "message": "[improve][test] Add Aerospike sink integration test (#96)\n\nAdds the first test for the `aerospike` module, an end-to-end\nTestcontainers integration test that runs a real Aerospike Community\nEdition server, writes records through `AerospikeStringSink`, and reads\nthem back with an independent `AerospikeClient` to assert the bin values\nround-trip. Fixes #47.\n\nWriting exposed a latent defect: `AerospikeAbstractSink` stored values\nvia `Value.getAsBlob(...)` (Java object serialization), but in the pinned\n`aerospike-client-bc:4.5.0`, `BlobValue.estimateSize()` unconditionally\nthrows \"Object serializer has been disabled\" -- object serialization was\nremoved from that client build, so every write failed with result code\n-10. Switched the sink to `Value.get(...)`, which stores the value as a\nnative, first-class Aerospike value (a string bin for the string sink)\nthat is interoperable and directly queryable.\n\nContainer startup is bounded with a two-minute timeout on a log-message\nwait strategy so a stalled image pull can never hang CI."
    },
    {
      "commit": "28ef0cc1603119ca51d85b288d57ef06a07decf4",
      "tree": "6ea756df914e31fd0870c0513b57a648d628c3cf",
      "parents": [
        "8528e369bb50adc7e9baa229ea1450cdd224ecd3"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 09:26:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 09:26:16 2026 -0700"
      },
      "message": "[improve][ci] Shard the test job across three parallel runners (#92)\n\nThe Tests - Connectors job ran every module\u0027s tests on one runner. As\ncontainer-backed suites landed (Debezium, Kafka, Solr, DynamoDB,\nInfluxDB, MariaDB, ...) its wall-clock roughly doubled to ~20 minutes,\nand Gradle\u0027s in-job parallelism is capped at the runner\u0027s 2 cores.\n\nSplit it into three matrix shards that run on separate runners:\n- Debezium: the seven debezium modules (Oracle\u0027s 1.6GB image dominates)\n- Streaming \u0026 Search: elastic-search, kafka, kafka-connect-adaptor,\n  kinesis, dynamodb\n- Other: a catch-all running \u0027test integrationTest\u0027 for every remaining\n  module, via -x exclusions of the two explicit groups\n\nThe catch-all guarantees a newly added module is always covered by\nexactly one shard. Verified with --dry-run that the three shards form a\ndisjoint cover of all 40 test/integrationTest tasks: 7 + 5 + 28 \u003d 40,\nno task skipped, no overlap."
    },
    {
      "commit": "8528e369bb50adc7e9baa229ea1450cdd224ecd3",
      "tree": "d135cd1ef27e15359f2f6ef4b7fcf185bf201de4",
      "parents": [
        "2ac8d8462bc1cc7a8bfd1e6a6f82f95ee8e113bb"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 09:25:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 09:25:56 2026 -0700"
      },
      "message": "[fix][test] Bound MqttSinkIntegrationTest container startup so it cannot hang CI (#91)\n\nThe Mosquitto GenericContainer had no wait strategy and no startup\ntimeout, so a stalled image pull hung @BeforeClass with no bound and\ntook the whole Tests - Connectors job to its 45-minute limit — a\ncancellation rather than a failure, with no diagnostics. Observed on\nrun 29100595779.\n\nAdd Wait.forListeningPort() with a 3-minute startup timeout, plus a\ntest-level timeOut backstop. An unsatisfiable startup now fails in\nabout 20s with ContainerLaunchException instead of hanging.\n\nThis test only began running in CI when #74 added integrationTest to\nthe matrix, so the hazard was newly live."
    },
    {
      "commit": "2ac8d8462bc1cc7a8bfd1e6a6f82f95ee8e113bb",
      "tree": "23baff9356545eff90af0f3b00e1c22e768c1a97",
      "parents": [
        "df0442759c1f1dabaf008929c23b1a0b577e73b0"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 08:50:40 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 08:50:40 2026 -0700"
      },
      "message": "[fix][test] Replace fixed sleeps with Awaitility polls in sink tests (#86)\n\n* [fix][test] Replace fixed sleeps with Awaitility polls in sink tests\n\nFive sink tests wrote to a sink that flushes asynchronously, waited a\nfixed Thread.sleep, then asserted the flush had happened. When CI is\nslow the flush has not run and the assertion fails: the sink is fine,\nthe test raced it. This is the shape that failed unrelated PRs twice\ntoday, in InfluxDBSinkTest (v2) and PulsarSchemaHistoryTest.\n\nPoll the same conditions with Awaitility instead. The assertions are\nunchanged; only the waiting is. The tests also get faster, since a poll\nreturns as soon as the condition holds.\n\n- mongo: MongoSinkTest, 5 sites\n- influxdb: InfluxDBGenericRecordSinkTest (v1) — sibling of the v2 test\n  already deflaked\n- hdfs3: HdfsSequentialSinkTest, HdfsTextSinkTest — one asserted 5000\n  acks within a hard-coded 2 seconds\n- hbase: HbaseGenericRecordSinkTest — currently @Test(enabled \u003d false),\n  so this is a compile-only change there\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "df0442759c1f1dabaf008929c23b1a0b577e73b0",
      "tree": "979aa4e629f15588338da5a4ce505c8fed50e1ef",
      "parents": [
        "71bdfe69a50a08fdc329f443cbbd06ee51aba59d"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 08:30:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 08:30:12 2026 -0700"
      },
      "message": "[fix][io] Interrupt Kafka Source instance thread on consumer fatal error to prevent deadlock (#88)\n\n* [fix][io] Interrupt Kafka Source instance thread on consumer fatal error to prevent deadlock\n\n* build: Add Testcontainers dependency to kafka module for liveness test\n\n* refactor: revert consumer.subscribe() back to main thread and check inside the catch block\n\n* updated Testcontainers to wait up to 5 minutes for it to boot, so it survives the GitHub Actions CI\n\n* refactor: the VM runs OOM,so completely eliminate the Testcontainers entire Kafka broker and zookeeper\n\n* [fix][test] Make the Kafka deadlock test deterministic\n\nAddress the review findings on KafkaSourceDeadlockTest:\n\n- poll() blocked on Thread.sleep(5000). It now waits on a latch, so it\n  leaves only by being interrupted, with no wall-clock delay and no race\n  between the sleep and the interrupt.\n- The simulator thread slept for a second, scanned every JVM thread for\n  one named \u0027Kafka Source Thread\u0027, and swallowed any exception. The\n  consumer thread now records itself when it enters poll(), and the test\n  interrupts it directly once a latch confirms it is blocked there. The\n  simulator thread is gone.\n- Assert.fail() ran before source.close(), leaving the runner thread\n  alive and able to disturb later tests. The blocking section is now in\n  a try/finally so close() always runs.\n\nEvery wait either completes or fails the test with a message, so a\nregression surfaces as a clear failure rather than a hang. Runtime drops\nfrom ~15s of sleeping to ~1s.\n\n---------\n\nCo-authored-by: Praveenkumar76 \u003ckit26.ad45@gmail.com\u003e"
    },
    {
      "commit": "71bdfe69a50a08fdc329f443cbbd06ee51aba59d",
      "tree": "65128238eab7cf503bf2b034fab72e9af42388cb",
      "parents": [
        "518742a3fe7507d0dcde7495063dc603a885c93c"
      ],
      "author": {
        "name": "Darin Spivey",
        "email": "darinspivey@users.noreply.github.com",
        "time": "Fri Jul 10 10:53:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 07:53:55 2026 -0700"
      },
      "message": "[fix][io] jdbc: drain flush() iteratively to avoid StackOverflowError under sustained backlog (#39)\n\n* [fix][io] jdbc: drain flush() iteratively to avoid StackOverflowError under sustained backlog\n\nProblem. Under sustained catch-up (backlog present, arrival rate greater than\nflush rate) JdbcAbstractSink.flush() recurses via `if (needAnotherRound) flush();`\nand never unwinds, eventually throwing StackOverflowError. The handler is\ncatch (Exception), not Throwable, so the Error bypasses the fatal() path added in\nPIP-297 (#25195). The ScheduledThreadPoolExecutor swallows it and cancels the\nperiodic flush, and the sink hangs silently: 1/1 Ready, zero writes and acks,\nconsumer blocked at the unacked cap, whole Shared subscription stalled, no logged\nerror.\n\nFix.\n1. Convert the recursion to a `do { ... } while (needAnotherRound)` loop.\n2. Widen catch (Exception) to catch (Throwable) and change fatal(Exception) to\n   fatal(Throwable) so an Error still triggers the instance restart instead of\n   vanishing.\n3. Release isFlushing in a single finally, which also fixes a latent stuck-flag\n   path.\n\nMost of the diff is re-indentation from wrapping the body in try/finally and\ndo/while. `git diff -w` shows the real delta is about 30 lines.\n\nTesting. Adds a regression test in the sqlite module that queues a large backlog\nand drives a single flush(), which StackOverflows on the old code and completes\non the fixed code.\n\nFixes #38.\n\n* [fix][io] jdbc: address review feedback on the flush() fix\n\nLog the throwable\u0027s toString() instead of getMessage(). An Error such as\nStackOverflowError carries no message, so the line rendered as \"Got\nexception null\" and hid what actually failed. Also convert the elapsed\ntime with TimeUnit.NANOSECONDS.toMillis(), and say \"throwable\" rather\nthan \"exception\" now that Errors are caught here.\n\nSeed the regression test\u0027s backlog directly onto the sink\u0027s incomingList\ninstead of calling write() 50k times. Each write() scheduled a flush\ntask (batchSize\u003d1), which was slow on CI and raced with the explicit\nflush(). With no scheduled tasks the drain is synchronous and\ndeterministic, so the isFlushing freeze and the Awaitility wait are no\nlonger needed.\n\nRef: apache/pulsar-connectors#38\n\n---------\n\nCo-authored-by: David Kjerrumgaard \u003c35466513+david-streamlio@users.noreply.github.com\u003e"
    },
    {
      "commit": "518742a3fe7507d0dcde7495063dc603a885c93c",
      "tree": "baa5315daf326f4c91d05d069cbc5c5d9a40a1bf",
      "parents": [
        "adbdad6a630a0bdc5675abe5afb1117595851946"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 07:37:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 07:37:24 2026 -0700"
      },
      "message": "[fix][test] Wait for the public tenant before creating the test namespace (#84)\n\nPulsarSchemaHistoryTest.setup() created public/my-ns as soon as the\ncontainer reported ready, but the broker creates the public tenant\nasynchronously during bootstrap. When the container\u0027s wait strategy\nreturned first, createNamespace failed with \u0027Tenant does not exist\u0027\n(HTTP 404), taking down every test in the class and failing unrelated\npull requests.\n\nPoll for the tenant before creating the namespace."
    },
    {
      "commit": "adbdad6a630a0bdc5675abe5afb1117595851946",
      "tree": "737f71d2944815ceac3952d1165b224f2eef2b0d",
      "parents": [
        "c00efd9dd2f5fbcf60dee8ee69674d62d2328584"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 07:36:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 07:36:17 2026 -0700"
      },
      "message": "[improve][test] Add DynamoDB source integration test (#77)\n\nThe dynamodb module had only config-parsing tests; DynamoDBSource was\nnever exercised. Add a LocalStack-based Testcontainers test that creates\na stream-enabled table, seeds items, opens the source at TRIM_HORIZON,\nand asserts records flow.\n\nRecords are read on a bounded worker thread with a per-record deadline,\nbecause the source\u0027s read() blocks and would otherwise hang the CI job\nrather than fail.\n\nDepends on the endpoint/region fix: without it the source cannot reach\nLocalStack at all."
    },
    {
      "commit": "c00efd9dd2f5fbcf60dee8ee69674d62d2328584",
      "tree": "06577a93646e63dc96f1299c894202f082ab3f4e",
      "parents": [
        "10f9daee19f86a66dd78a75c694cdc98e953060c"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 06:57:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 06:57:43 2026 -0700"
      },
      "message": "[fix][io] Fix DynamoDB source client construction with a custom endpoint (#79)\n\n* [fix][io] Fix DynamoDB source client construction with a custom endpoint\n\nAll three client builders set an endpoint configuration and then, in a\nseparate branch, a region. AWS SDK v1 rejects that combination with\n\u0027Only one of Region or EndpointConfiguration may be set\u0027, and\nDynamoDBSource.open() requires awsRegion, so every configuration that\nsupplies an endpoint failed at client construction. The endpoint path\ncould not have worked.\n\nMake region and endpoint mutually exclusive. Also gate the DynamoDB and\nCloudWatch builders on their own endpoint fields rather than on\nawsEndpoint: they were reading dynamoEndpoint and cloudwatchEndpoint\nwhile gating on awsEndpoint, so setting awsEndpoint alone built an\nendpoint configuration from an empty string.\n\n* [fix][io] Add regression tests for DynamoDB client endpoint/region handling\n\nCover the crash directly: constructing each client with an endpoint and\nthe (mandatory) region must not throw, each builder must select its own\nendpoint field, and setting awsEndpoint alone must not leak an empty\nendpoint into the DynamoDB and CloudWatch clients.\n\nThree of the four fail against the unfixed builders with the original\nIllegalStateException; the fourth pins the unaffected region-only path.\n\n* [fix][io] Restore the endpoint/region fix\n\nThe regression tests added in the previous commit were committed\nalongside an accidental revert of DynamoDBSourceConfig, and correctly\nfailed CI with the original IllegalStateException."
    },
    {
      "commit": "10f9daee19f86a66dd78a75c694cdc98e953060c",
      "tree": "42268459d4c0dee4c92e55f87d1579d41e6f34da",
      "parents": [
        "799b90719e2be7b593f654738b0c402f5cbc46a6"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Fri Jul 10 06:21:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 06:21:35 2026 -0700"
      },
      "message": "[fix][io] Prevent OOM in FileSource by bounding internal queues (#82)\n\n* [fix][io] Prevent OOM in FileSource by bounding internal queues\n\n* revert with old changes for specific getfile method\n\n* [fix][io] Block instead of throwing when bounded queues are full\n\nAddress the review findings on the bounded-queue change:\n\nFileConsumerThread produced into inProcess and recentlyProcessed with\nBlockingQueue.add(), which throws IllegalStateException on a bounded\nqueue that is full rather than returning false — so the surrounding\ndo/while(!added) retry loop never ran. Once the queues are bounded, a\ncleanup thread slower than the workers would kill the worker outright\nand stall processing. Use put() so the producer blocks and applies\nback-pressure. Existing tests verified add() on the spied queues and\nfollow the change.\n\nFileSourceConfig.validate() permitted a null maxQueueSize, which\nFileSource.open() then unboxed to size the queues, turning a config\nerror into a NullPointerException. Reject null explicitly.\n\nFileSourceConfigTest hard-coded /tmp as a dummy input directory; use\nthe existing INPUT_DIRECTORY constant so the tests do not depend on\nfilesystem layout.\n\nAdd FileConsumerThreadBoundedQueueTest, which fills recentlyProcessed\nand asserts the consumer blocks and survives; it fails against add()\nwith \u0027consumer thread died: expected 3 files, got 1\u0027.\n\n---------\n\nCo-authored-by: Praveenkumar76 \u003ckit26.ad45@gmail.com\u003e"
    },
    {
      "commit": "799b90719e2be7b593f654738b0c402f5cbc46a6",
      "tree": "b9b09d9e8a2415749fd4370ab1557e3f7d4bf6e5",
      "parents": [
        "02261c44eed4f7447b7a057a9e120e69fa5252c3"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 16:43:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 16:43:47 2026 -0700"
      },
      "message": "[fix][io] Do not drop files when the work queue rejects an offer (#81)\n\nFileListingTask records a file as offered before checking that the work\nqueue accepted it:\n\n    if (alreadyOffered.add(f)) {\n        workQueue.offer(f);\n    }\n\nIgnoring offer()\u0027s result is safe only while workQueue is unbounded. If\nit is bounded, offer() returns false when full, the file is already in\nthe tracking set, and the prune step only forgets files that have left\nthe disk. The file is never enqueued and never retried.\n\nTrack a file only once the queue has accepted it. A rejected file is\nretried on the next listing pass, so the lister slows to the consumer\u0027s\nrate instead of discarding work.\n\nAdd regression tests that bound the queue themselves: one asserts every\nfile eventually reaches the queue as it drains, the other that files\nalready queued are not offered twice while they remain on disk."
    },
    {
      "commit": "02261c44eed4f7447b7a057a9e120e69fa5252c3",
      "tree": "23e28cc0fc036535e2b4cf21074178b2e7dba526",
      "parents": [
        "c736bd37eab220f2a08f75e112035216f582fa80"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 16:18:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 16:18:36 2026 -0700"
      },
      "message": "[improve][test] Add Kafka source and sink integration tests (#76)\n\n* [improve][test] Add Kafka source and sink integration tests\n\nAdds a Testcontainers-based integration test that exercises both the Kafka\nsource and sink connectors against a real Kafka broker, complementing the\nexisting mock-only unit tests in the module.\n\nFixes #54\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "c736bd37eab220f2a08f75e112035216f582fa80",
      "tree": "d1f907ece253f576c4da210833a604fbf5b31daf",
      "parents": [
        "eb244a726a9a201d6db4052520d6f35458051f2d"
      ],
      "author": {
        "name": "The Apache Software Foundation",
        "email": "root-asf-gitbox-commits@apache.org",
        "time": "Thu Jul 09 18:17:14 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 16:17:14 2026 -0700"
      },
      "message": "Set up default protection ruleset for default and release branches (#25)\n\nCo-authored-by: David Kjerrumgaard \u003c35466513+david-streamlio@users.noreply.github.com\u003e"
    },
    {
      "commit": "eb244a726a9a201d6db4052520d6f35458051f2d",
      "tree": "6a695863744334b73d00c8160270d300594c2768",
      "parents": [
        "c849b21d465404e3a53681e1f4ba1adb244d0786"
      ],
      "author": {
        "name": "Philipp Dolif",
        "email": "52791955+pdolif@users.noreply.github.com",
        "time": "Fri Jul 10 01:16:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 16:16:30 2026 -0700"
      },
      "message": "[fix][io] Fix skipped file listing loop runs in file connector (#14)\n\n* [fix][io] Fix skipped file listing loop runs in file connector\n\n* FileListingThread: Change from Thread to Runnable\n\n* Rename FileListingThread to FileListingTask\n\n* Respect interrupts in FileListingTask polling loop\n\n---------\n\nCo-authored-by: David Kjerrumgaard \u003c35466513+david-streamlio@users.noreply.github.com\u003e"
    },
    {
      "commit": "c849b21d465404e3a53681e1f4ba1adb244d0786",
      "tree": "78700f94c465412892040aa4127e555d49f3d101",
      "parents": [
        "47ed4c0275092b88b8a92f99e8c22d3fbd36d33d"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 15:33:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 15:33:27 2026 -0700"
      },
      "message": "[improve][test] Add Solr sink integration test (#75)\n\n* [improve][test] Add Solr sink integration test\n\nAdd a Testcontainers-based integration test for the Solr sink connector\n(SolrGenericRecordSink). The test starts a real Solr 9.8 container, writes\nGenericRecord documents through the sink, and reads them back via SolrJ to\nassert the documents and their field values landed in Solr.\n\nFixes #57\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "47ed4c0275092b88b8a92f99e8c22d3fbd36d33d",
      "tree": "f41d9339509fc2d36fd3f2181fcd405cbfec4c26",
      "parents": [
        "a76b3a3c55b16f7d9718ec836d8bedd88f3aba45"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 15:16:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 15:16:00 2026 -0700"
      },
      "message": "[improve][ci] Run the integrationTest source set in CI (#74)\n\nThe mqtt module ships a Testcontainers integration test in a separate\nintegrationTest source set, added alongside the connector in #22. The\nCI workflow only invokes the test task, so that test has never run on\na pull request and its coverage was not enforced.\n\nAdd integrationTest to the tests matrix. The task currently resolves to\nmqtt only; other modules keep their container tests in src/test."
    },
    {
      "commit": "a76b3a3c55b16f7d9718ec836d8bedd88f3aba45",
      "tree": "1b19fba0c9bc2a4c0fafe3b529d8d2d35193f9b1",
      "parents": [
        "48aa4aeb521ef3c105f3cf6422cbd703d516f3cc"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 15:06:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 15:06:46 2026 -0700"
      },
      "message": "[improve][test] Add InfluxDB v1 and v2 sink integration tests, deflake the v2 mock test (#73)\n\n* [improve][test] Add InfluxDB v2 sink integration test and deflake the mock test\n\nThe influxdb module had no integration coverage: InfluxDBSinkTest only\nverified that the sink calls writePoints() on a mock, leaving untested\nwhether InfluxDB accepts the points the sink builds and whether the\nmeasurement, tags, fields and timestamp survive the round trip.\n\nAdd an integration test that runs the v2 sink against a real InfluxDB\nserver via Testcontainers, then reads the data back with Flux.\n\nAlso fix the race that made InfluxDBSinkTest.testOpenWriteCloseJson\nflaky: the sink flushes on a background executor once batchSize records\nare queued, but the test waited a fixed 100ms before verifying the call.\nUnder CI load the flush had not run and the test failed with \u0027Wanted but\nnot invoked: writeApiBlocking.writePoints\u0027. Poll with Awaitility instead.\n\n* [improve][test] Add InfluxDB v1 sink integration test\n\nThe v1 sink is a separate code path from v2: it uses the org.influxdb\nclient, the BatchPoints line-protocol API, and a database/retention-\npolicy model rather than v2\u0027s org/bucket/token model. Add a sibling\nintegration test running it against a real influxdb:1.8 server, with\nHTTP auth enabled so InfluxDBBuilderImpl\u0027s authenticated branch is\nexercised as well."
    },
    {
      "commit": "48aa4aeb521ef3c105f3cf6422cbd703d516f3cc",
      "tree": "3980c9a14270a0d6cef9a60f11dd2d3cd6ee49b3",
      "parents": [
        "e0f878ce84e4b89d116bd4f58182f72bd7c3f595"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 14:48:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 14:48:28 2026 -0700"
      },
      "message": "[doc][io] List the Debezium MariaDB source in the README connector table (#72)\n\nThe connector was added in #69 but the README\u0027s Sources table was not\nupdated in the merged commit."
    },
    {
      "commit": "e0f878ce84e4b89d116bd4f58182f72bd7c3f595",
      "tree": "7afa615d1f3c91d3f57758872f3dd69d9134b1ce",
      "parents": [
        "3ee99c4969893e786e2056c8078cdc49d75a2af3"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 14:44:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 14:44:18 2026 -0700"
      },
      "message": "[fix][test] Bound record reads in Debezium MySQL and Postgres tests (#71)\n\n* [fix][test] Bound record reads in Debezium MySQL and Postgres tests\n\nAbstractKafkaConnectSource.read() loops until a record is available and\nnever returns null. Calling it on the test thread inside an Awaitility\nuntilAsserted block means a connector that produces fewer records than\nexpected blocks forever: Awaitility cannot interrupt a blocked\nassertion, so its atMost(60s) never fires. Neither test declared a\ntimeOut, so the CI job ran to its own 45-minute limit and reported a\ncancellation rather than a failure.\n\nRead each record on a bounded worker thread and add a test-level\ntimeOut as a backstop, so under-delivery fails promptly with a message\nnaming the connector.\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "3ee99c4969893e786e2056c8078cdc49d75a2af3",
      "tree": "54e003ee757b1d6387391af1578569778b136f51",
      "parents": [
        "16bb0fdc332086e5c9437a6cf3c0c3f3fd88f6bb"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 14:30:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 14:30:58 2026 -0700"
      },
      "message": "[feat][io] Add Debezium MariaDB source connector (#69)\n\nDebezium ships a MariaDB source connector but this repository did not\nwrap it. Add pulsar-io-debezium-mariadb, following the structure of the\nexisting MySQL module: both connectors build on Debezium\u0027s shared\nbinlog base.\n\nIncludes a unit suite covering the connector/task class defaulting and\nvalidation, and a Testcontainers integration test that runs the source\nagainst a real MariaDB server and asserts the initial snapshot produces\nCDC records."
    },
    {
      "commit": "16bb0fdc332086e5c9437a6cf3c0c3f3fd88f6bb",
      "tree": "43723d67fd7afa79a3e62712d7ad437a6059d8bc",
      "parents": [
        "6377b9610bb668ac6a110265bb94955743db69da"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 14:29:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 14:29:28 2026 -0700"
      },
      "message": "[improve][test] Add Debezium MongoDB source integration test (#58)\n\n* [improve][test] Add Debezium MongoDB source integration test\n\nThe debezium/mongodb module had no tests. Add a Testcontainers-based\nintegration test following the existing DebeziumMysqlSourceTest\npattern: a single-node MongoDB replica set container plus a Pulsar\ncontainer for Debezium offset storage, seeded with two documents, and\nan assertion that the initial snapshot produces CDC records.\n\n* [improve][test] Bound record reads so an under-delivering connector cannot hang CI\n\nAbstractKafkaConnectSource.read() loops until a record is available and\nnever returns null. Calling it on the test thread inside an Awaitility\nuntilAsserted block meant a connector that produced fewer records than\nexpected blocked forever: Awaitility cannot interrupt a blocked\nassertion, so its atMost(60s) never fired and the CI job ran until its\nown 45-minute timeout.\n\nRead each record on a separate thread with a per-record deadline, and\nadd a test-level timeOut as a backstop. Under-delivery now fails in\nseconds with a message pointing at the connector, instead of hanging."
    },
    {
      "commit": "6377b9610bb668ac6a110265bb94955743db69da",
      "tree": "08866f24431c283ae57b510c6a904262c98a2456",
      "parents": [
        "628934babba3b71264202fd27ec46cbf6a2aa9bd"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 13:22:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 13:22:53 2026 -0700"
      },
      "message": "[fix][io] Fix duplicate file offers and flaky tests in file connector (#41)\n\n* [fix][io] Fix duplicate file offers and flaky tests in file connector\n\nProcessedFileThreadTest (renameFileTest, continuousRunTest) failed\nintermittently in CI with \u0027offer wanted 1 time but was 2\u0027. The root\ncause is a race in FileListingThread, not the tests: a file is briefly\nin none of the tracking queues while FileConsumerThread moves it from\nworkQueue to inProcess, and again while ProcessedFileThread takes it\nfrom recentlyProcessed and renames/deletes it on disk. A listing pass\nin either window re-offers the file, causing duplicate processing in\nproduction as well.\n\nFix the race at the source: when keepFile\u003dfalse, track offered files\nin a listing-thread-private set and only offer a file once for as long\nas it remains on disk. Entries are pruned before each listing snapshot\nonce the cleanup thread has renamed or deleted the file, so a stale\nentry can never suppress a legitimate new file with the same name.\nkeepFile\u003dtrue keeps its intentional re-processing semantics.\n\nAlso fix two bugs in the tests themselves: the drain loops exited when\nANY queue was empty (\u0026\u0026) instead of when ALL were empty, and nothing\nwaited for the final rename/delete to reach disk before asserting on\nfile existence. Replace both with a bounded await that covers the full\npipeline.\n\n* [fix][io] Fail awaitProcessingComplete on timeout instead of returning silently\n\nReturning at the deadline let a test proceed as if the pipeline had\ndrained, which could mask a regression the strict times(1) assertions\nare meant to catch. Fail with the queue depths and the number of files\nstill on disk instead."
    },
    {
      "commit": "628934babba3b71264202fd27ec46cbf6a2aa9bd",
      "tree": "128919b8dafea37b1a1af9e9504291d4509f3f32",
      "parents": [
        "5cecc7a597a626fdac019652c3ff020500486dec"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 13:22:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 13:22:11 2026 -0700"
      },
      "message": "[improve][io] Upgrade Debezium to 3.4.3.Final (#64)\n\n3.4.3.Final is the final patch release of the 3.4 line and carries bug\nfixes for the exact code we run. No API or configuration changes."
    },
    {
      "commit": "5cecc7a597a626fdac019652c3ff020500486dec",
      "tree": "22a6e507916ce2a6e0c7a67a296bac262057bbb6",
      "parents": [
        "7814717ddadee990d1eae7ddf80a580b3eca3324"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 13:18:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 13:18:33 2026 -0700"
      },
      "message": "[improve][test] Add MariaDB JDBC sink integration test (#59)\n\nThe jdbc/mariadb module had no tests. Add a Testcontainers-based\nintegration test that runs the MariadbJdbcAutoSchemaSink against a\nreal MariaDB 11.4 server: the table is created over plain JDBC, a\nrecord is written through the sink\u0027s Avro schema path with\ntransactions enabled, and the row is read back over JDBC to verify\nthe write.\n\nAlso adds a testcontainers-mariadb entry to the version catalog\n(version resolved via the testcontainers BOM imported by the\npulsar-connectors-dependencies platform)."
    },
    {
      "commit": "7814717ddadee990d1eae7ddf80a580b3eca3324",
      "tree": "8d63f5b626fed7defe58c4b476a2e6f023cd236c",
      "parents": [
        "05bc47f4debe8218b4191408cc1889fd321fa4e2"
      ],
      "author": {
        "name": "Jaroslav Kaspar",
        "email": "kaspar.jarek@gmail.com",
        "time": "Thu Jul 09 19:52:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 10:52:20 2026 -0700"
      },
      "message": "[fix][io] Fix loading offset issues in Kafka Adaptor (#31)\n\n* [fix][io] Create new JSON converters for offset storage in Kafka Connect Adaptor\n\nPulsar Kafka Connect adaptor previously used the same converters for both data and offset storage. This coudl cause various issues. For example when data were using AvroConverter, offsets were serialized using MockSchemaRegistryClient (in memory only). After a connector restart, the fresh MockSchemaRegistryClient had no schema records, causing deserialization to fail with \"Subject Not Found; error code: 40401\" and the connector losing its offset position.\n\nKafka Connect do not reuse the data converters for offset, but creates new JSON converters configured with `schema.enable` set to `false`. Thus the adaptor was changed to have the same behavior.\n\nThis is a breaking change for connectors that previously stored offsets in a non-JSON format, those offsets do not have to be readable after upgrade. The offsets probably weren\u0027t readable even before this fix (as we can see for the Avro converter). But since we cannot besure what converters users used and how they behaved, this change should be probably included in a major release.\n\nNote: The tests for adaptor currently do not compile. We are waiting for matching pulsar artifact to be publihsed. The fix was verified E2E by manual testing.\n\nFixes #30\n\n* Add unit test for offset converter round-trip across restart\n\n- Extract createOffsetConverter(boolean) as a @VisibleForTesting seam\n- Add KafkaConnectOffsetConverterTest proving offsets survive a restart\n  with the JSON offset converters, and documenting the pre-fix loss with\n  Avro data converters\n- Re-enable compileTestJava/test for the module, excluding only the\n  broker-dependent test sources that need unpublished pulsar artifacts\n\n* Add TODO for E2E offset converter test\n\n* Update TODO comment to add rather than replace tests\n\n---------\n\nCo-authored-by: David Kjerrumgaard \u003c35466513+david-streamlio@users.noreply.github.com\u003e"
    },
    {
      "commit": "05bc47f4debe8218b4191408cc1889fd321fa4e2",
      "tree": "a02766069114e7276dcb46ee63a3e0a1101ce315",
      "parents": [
        "54a505db475282592b4263a4a49e412f10820cf3"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 10:23:40 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 10:23:40 2026 -0700"
      },
      "message": "[fix][ci] Fix Tune Runner VM failure when no sd* block devices exist (#40)\n\nThe tune-runner-vm action fails on current GitHub runner images because\nthe /sys/block/sd*/queue/discard_max_bytes glob no longer matches any\ndevices, causing tee to exit 1 and abort the job before tests run.\n\nSync the fix from apache/pulsar master: glob all block devices and\nguard with a file-existence check."
    },
    {
      "commit": "54a505db475282592b4263a4a49e412f10820cf3",
      "tree": "828bcd633a8e88f035ad1957076b42ae418bb6f7",
      "parents": [
        "a46722b054b43a93bbddc75622440b6b8660eb61"
      ],
      "author": {
        "name": "David Kjerrumgaard",
        "email": "35466513+david-streamlio@users.noreply.github.com",
        "time": "Thu Jul 09 10:00:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 10:00:47 2026 -0700"
      },
      "message": "[fix][ci] Update setup-gradle action to v6.2.0 to match ASF actions allowlist (#37)"
    },
    {
      "commit": "a46722b054b43a93bbddc75622440b6b8660eb61",
      "tree": "d15a234632197c7ff55e730dc35d783a4c3b7e69",
      "parents": [
        "f172336f3576b2dd3446a76d99ba84efb85f4f25"
      ],
      "author": {
        "name": "Jakub Knetl",
        "email": "knetl.j@gmail.com",
        "time": "Wed Jun 24 16:02:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 07:02:18 2026 -0700"
      },
      "message": "[fix][io] Upgrade ClickHouse jdbc client version to 0.9.8 (#33)\n\n* [fix][io] Upgrade ClickHouse jdbc client version\n\n* [test][io] Add ClickHouse JDBC sink integration test for #32\n\nAdds a Testcontainers-based integration test that verifies the ClickHouse\nJDBC sink can discover an existing table and write a record against a real\nClickHouse server. This guards the driver upgrade in this PR: the test fails\non the old driver (0.4.6) with \"Not able to find table: pulsar_messages\" at\nJdbcUtils.getTableId (issue #32) and passes on 0.9.8.\n\nThe table is created and results are verified over ClickHouse\u0027s HTTP\ninterface, so the JDBC driver under test is exercised only by the sink.\n\n- Add testcontainers-clickhouse to the version catalog.\n- Add test dependencies to the clickhouse module build.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: david-streamlio \u003c35466513+david-streamlio@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "f172336f3576b2dd3446a76d99ba84efb85f4f25",
      "tree": "11d71bd5545316b0fd1b1c42d26d379e15ca9a9c",
      "parents": [
        "05379359e2d339a30099039ceeb2f84f50863387"
      ],
      "author": {
        "name": "Malla Sandeep",
        "email": "sandeep.malla78@gmail.com",
        "time": "Tue May 12 02:53:40 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 11 14:23:40 2026 -0700"
      },
      "message": "[fix][io] Fix delayed acknowledgment for offset 0 in Kafka Connect Adapter (#24)\n\n* offsets check is updated and test is added\n* updated the test for checking the offset value returned"
    },
    {
      "commit": "05379359e2d339a30099039ceeb2f84f50863387",
      "tree": "2994aead0a0b635c3d04b0c414763e6b5e25c9ca",
      "parents": [
        "b8760955f20db284c7779e38ca993ecedb5e563c"
      ],
      "author": {
        "name": "Dream95",
        "email": "864197662@qq.com",
        "time": "Sun May 10 23:29:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 10 08:29:20 2026 -0700"
      },
      "message": "[feat][io] Add MQTT sink connector (#22)\n\n* [feat][io] Add MQTT sink connector\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\n\n* [fix][io] Stabilize MQTT sink tests and split integration coverage\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\n\n* [fix][io] Handle disconnect interruption and correct serverPort FieldDoc\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e\n\n---------\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e"
    },
    {
      "commit": "b8760955f20db284c7779e38ca993ecedb5e563c",
      "tree": "8e18b700043bbf9f474a8f71743ce6f0a349d1a8",
      "parents": [
        "6d09baa6f20fc8237f7cda035f03561af82cca3b"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Thu Apr 30 04:47:55 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 09:47:55 2026 +0800"
      },
      "message": "[improve][build] Sync version catalog with apache/pulsar master (#20)\n\nPull library version updates from apache/pulsar master:\n- jetty 12.1.5 → 12.1.8\n- jackson 2.18.6 → 2.21.2\n- log4j2 2.25.3 → 2.25.4\n- asynchttpclient 2.12.4 → 2.14.5\n- bouncycastle (bcprov/bcpkix/bcutil) → 1.84 (CVE-2026-5588, CVE-2026-0636)\n- bcpkix-fips 2.0.10 → 2.0.11\n- bcutil-fips 2.0.5 → 2.0.6\n\nDrop bcprov-ext-jdk18on: BC team retired the -ext variant (last release\n1.78.1), and pinning it would shadow the CVE-2026-0636 fix in bcprov 1.84.\nNo consumers in this repo. Matches apache/pulsar#25569."
    },
    {
      "commit": "6d09baa6f20fc8237f7cda035f03561af82cca3b",
      "tree": "35e45324fbd0df1bb644090010235a404c8f2035",
      "parents": [
        "f0c0ea3e7cbb29267732aa4a403d423d5f5403ab"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Wed Apr 29 13:09:28 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 18:09:28 2026 +0800"
      },
      "message": "[fix][build] Fix the Jetty 9 bom override solution for Alluxio plugin (#19)"
    },
    {
      "commit": "f0c0ea3e7cbb29267732aa4a403d423d5f5403ab",
      "tree": "3791b1ed2868c0bb2c0b8918cb28505cb69479d4",
      "parents": [
        "31d67a2cd1ed1c9bdfb8259e49b157e5ad29bbd5"
      ],
      "author": {
        "name": "Malla Sandeep",
        "email": "sandeep.malla78@gmail.com",
        "time": "Tue Apr 21 17:00:00 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 14:30:00 2026 +0300"
      },
      "message": "[fix][io] Fix acknowledgments not being sent when collapsePartitionedTopics\u003dtrue in kafka-connect-adapter (#11)\n\n* added check for collapsePartitionedTopic for sending acknowledgments as well and added integration tests for the same\n\n* added topicPartitionResolver and refactored required methods into it.\n\n* refactored the caches into the nested class\n\n* removed unnecessary reference to KafkaConnectSink\n\n* increased visibility of TopicPartitionResolver to package private for test.\n\n* typo in comment\n\n* resolve nullPointerException issue with retry\n\n* minor typos and topicPartitionResolver access specifier to private"
    },
    {
      "commit": "31d67a2cd1ed1c9bdfb8259e49b157e5ad29bbd5",
      "tree": "5ce3e837a5ada6ab156db5265d2f2803f4b4baec",
      "parents": [
        "e689bc345bad14ff176a4a35998fd21111f26766"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Wed Apr 15 20:06:40 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 20:06:40 2026 +0300"
      },
      "message": "[improve] Upgrade Hadoop to 3.5.0 (#18)"
    },
    {
      "commit": "e689bc345bad14ff176a4a35998fd21111f26766",
      "tree": "70ce35c3f9b7596ff436992c720b2da4cfb545e9",
      "parents": [
        "c762d7ef118f7eb165c22bf2681ce801893558f9"
      ],
      "author": {
        "name": "Harangozó Péter",
        "email": "harangozop92@gmail.com",
        "time": "Fri Apr 03 16:29:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 07:29:14 2026 -0700"
      },
      "message": "[fix][io] JDBC sink: prevent OOM from unbounded queue on connection failure (#9)\n\n* [fix][io] JDBC sink: prevent OOM from unbounded queue on connection failure\n\nThe JDBC sink\u0027s internal queue (incomingList) is unbounded. When the\ndatabase connection drops, executeBatch() hangs until the TCP socket\ntimes out. During this period, isFlushing stays true, preventing any\ndraining, while write() continues accepting records without limit.\nThis causes OutOfMemoryError in production.\n\nThis commit fixes 4 issues:\n\n1. Bounded internal queue: write() now rejects records when queue\n   exceeds maxQueueSize (configurable, defaults to 10x batchSize),\n   applying Pulsar-level back-pressure via negative acknowledgment.\n\n2. State check in write(): records are failed immediately when the\n   sink state is not OPEN (after fatal() or close()).\n\n3. Connection validation and reconnection: ensureConnection() validates\n   the JDBC connection before each flush and reconnects automatically\n   on failure, allowing recovery from transient database outages.\n\n4. Scheduled flush cancellation: fatal() and close() now cancel the\n   periodic flush task to prevent repeated failures on a broken\n   connection.\n\nFixes https://github.com/apache/pulsar/issues/25030\n\n* [fix][connector] Address review: thread-safety, default, validation\n\n- Move record.fail() outside synchronized(incomingList) to avoid\n  holding the lock during framework callbacks\n- Move incomingList.size() check inside synchronized in flush() to\n  fix data race on non-thread-safe LinkedList\n- Change maxQueueSize default from 0 (auto-bounded) to -1 (unbounded)\n  to preserve backwards-compatible legacy behavior; users opt-in to\n  bounded queue by setting maxQueueSize\u003d0 (auto) or a positive value\n- Add overflow-safe auto-sizing (long arithmetic capped at MAX_VALUE)\n- Validate maxQueueSize in JdbcSinkConfig.validate() — reject \u003c -1\n- Add test for invalid maxQueueSize rejection"
    },
    {
      "commit": "c762d7ef118f7eb165c22bf2681ce801893558f9",
      "tree": "76cc2dd16eed9932f5112de5a0382db93f2fbfc4",
      "parents": [
        "62b8773c1591bfe15545985d86e958c1cac95b0f"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Thu Apr 02 21:05:15 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 21:05:15 2026 +0300"
      },
      "message": "[improve][build] Improve the gradle build to use similar best practices as apache/pulsar build (#10)"
    },
    {
      "commit": "62b8773c1591bfe15545985d86e958c1cac95b0f",
      "tree": "8d15d32452afec4b55071b8ad14d8d9d93cee191",
      "parents": [
        "7a810f3ad5a85c2a0142dbe3d50ba1fc549d0f4e"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Wed Apr 01 19:21:50 2026 +0300"
      },
      "committer": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Wed Apr 01 19:25:59 2026 +0300"
      },
      "message": "Remove default_branch key and jira_options from .asf.yaml\n\n- changing the default_branch isn\u0027t supported in .asf.yaml\n  see https://github.com/apache/infrastructure-asfyaml#default_branch\n"
    },
    {
      "commit": "7a810f3ad5a85c2a0142dbe3d50ba1fc549d0f4e",
      "tree": "3c796a18b2097a98ae4b9ac5f10d62dc1bbef3ed",
      "parents": [
        "32d944564659afe2902c3e87948e15cbab4e33b3"
      ],
      "author": {
        "name": "Matteo Merli",
        "email": "mmerli@apache.org",
        "time": "Wed Apr 01 06:21:25 2026 -0700"
      },
      "committer": {
        "name": "Matteo Merli",
        "email": "mmerli@apache.org",
        "time": "Wed Apr 01 06:22:11 2026 -0700"
      },
      "message": "Add .asf.yaml for GitHub repository configuration\n\nConfigure GitHub settings for pulsar-connectors including\ndefault branch (main), protected branch rules, merge button\nsettings, and notification routing.\n"
    },
    {
      "commit": "32d944564659afe2902c3e87948e15cbab4e33b3",
      "tree": "0159b87a98dadc455d090f903afe1dd687ed7c65",
      "parents": [
        "314b9defb6888804e3c3ec75085b015b7b16ae1b"
      ],
      "author": {
        "name": "Matteo Merli",
        "email": "mmerli@apache.org",
        "time": "Wed Apr 01 06:12:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 16:12:21 2026 +0300"
      },
      "message": "Add CI, integration test infrastructure, and testcontainer-based tests (#8)\n\n* Add connector integration tests from core pulsar repo\n\nCopy connector-specific integration tests that were removed from the\nmain pulsar repository as part of PIP-465. These tests exercise\nspecific connector sinks/sources against real external services\n(Cassandra, Elasticsearch, Kafka, RabbitMQ, Debezium, JDBC, etc.).\n\nIncludes:\n- Sink testers and PulsarSinksTest\n- Source testers (Kafka, Mongo, Debezium variants)\n- Container definitions (Cassandra, Debezium, RabbitMQ)\n- TestNG suite XMLs for IO sources, sinks, and Oracle source\n\n* Add GitHub Actions CI workflow\n\nCI pipeline for pulsar-connectors with:\n- Build and license check (RAT)\n- Unit tests split into 3 groups: Kafka Connect Adaptor,\n  Elasticsearch, and all other connectors\n- Runs on PRs and pushes to main/branch-* branches\n\n* Add README, LICENSE, and NOTICE files\n\n- LICENSE: Apache License 2.0 (same as main pulsar repo)\n- NOTICE: ASF notice file (same as main pulsar repo)\n- README: Overview of available connectors, build instructions,\n  usage guide, and versioning policy\n\n* Pin gradle/actions/setup-gradle to specific commit hash\n\n* Remove unnecessary --no-configuration-cache flag from CI\n\n* Fix CI double trigger on PRs\n\nRestrict pull_request trigger to main/branch-* to avoid running\nboth push and pull_request workflows on the same commit.\n\n* Include master branch in CI triggers\n\n* Add RAT license check exclusions\n\nConfigure Apache RAT exclusions for build artifacts, generated files\n(Kinesis flatbuffers), certificates, IDE files, and other non-source\nfiles that don\u0027t require license headers.\n\n* Fix kafka-connect-adaptor test compilation\n\nKCA tests extend ProducerConsumerBase from pulsar-broker test-jar,\nwhich requires the full broker test infrastructure and is not published\nto Maven Central. Disable test compilation until test artifacts are\npublished or tests are restructured as integration tests.\n\nAdd pulsar-functions-api, pulsar-functions-instance, and pulsar-broker\nto the version catalog for future use.\n\n* Add test dependencies for kafka-connect-adaptor\n\nAdd pulsar-broker (with tests classifier), pulsar-functions-api,\npulsar-functions-instance, and testmocks to the version catalog.\n\nKCA tests are temporarily disabled as they depend on broker internals\nthat changed since the 4.1.3 release. They will be re-enabled once\nmatching pulsar artifacts are available.\n\n* Add pulsar-broker test-jar dependency for debezium-core tests\n\nPulsarSchemaHistoryTest extends ProducerConsumerBase from the broker\ntest-jar. Add the broker and testmocks test-jar dependencies.\n\n* Add pulsar-all Docker image, integration tests, and fix debezium deps\n\n- Add docker/pulsar-all to build a connector image on top of\n  apachepulsar/pulsar base image\n- Add tests/integration module with build.gradle.kts for connector\n  integration tests (sinks, sources, Oracle debezium)\n- Add integration test CI jobs to workflow\n- Fix debezium-core test dependency (testmocks doesn\u0027t use tests classifier)\n- Fix version catalog access for modules outside subprojects block\n\n* Remove default from PULSAR_IMAGE arg in Dockerfile\n\nThe Gradle build always passes the versioned image via --build-arg.\nRemoving the default prevents accidentally using :latest.\n\n* Don\u0027t include docker image in default build\n\nThe dockerBuild task should be invoked explicitly, not as part of\nassemble/build, since it requires all connector NARs to be built first.\n\n* Copy integration test infrastructure from pulsar repo\n\nThe pulsar integration test infrastructure (PulsarCluster, PulsarContainer,\netc.) is not published to Maven Central. Copy the necessary classes locally\nso integration tests can compile without depending on unpublished test-jars.\n\nCopied packages:\n- containers (PulsarContainer, ChaosContainer, BK/ZK/Broker/Proxy/Worker)\n- docker (ContainerExecResult, DockerUtils)\n- topologies (PulsarCluster, PulsarClusterSpec, PulsarTestBase)\n- functions (PulsarFunctionsTestBase, CommandGenerator)\n- suites (PulsarTestSuite)\n- utils (TestRetrySupport, ExtendedNettyLeakDetector)\n\n* Fix CI failures: debezium test dep, JVM heap settings\n\n- Add pulsar-buildtools dependency to debezium-core for TestRetrySupport\n  (needed by ProducerConsumerBase test base class)\n- Add gradle.properties with JVM heap settings (-Xmx4g) to prevent OOM\n  during compilation in CI\n\n* Fix integration test suite XML and mark known flaky tests\n\n- Remove BatchSourceTest and DataGeneratorSourceTest from sources XML\n  (those tests stayed in pulsar repo, they test runtime not connectors)\n- Integration tests need Docker image setup (tracked separately)\n\n* Fix unit test failures: logging, Solr Jetty, ES SSL timeouts\n\n- Add log4j2 test runtime dependencies to all subprojects (was provided\n  by buildtools in pulsar repo). Fixes Alluxio timeout and other tests\n  that depend on logging being available.\n- Fix Solr test Jetty version conflict: use resolutionStrategy to force\n  Jetty 10.x for test configs (Solr 9.x requires javax.servlet)\n- Increase OpenSearch SSL test container timeouts and memory settings\n\n* Add test Docker image for connector integration tests\n\nCreate a pulsar-connectors-test Docker image that layers connector NARs\nand TLS certificates on top of apachepulsar/pulsar. This replaces the\npulsar-test-latest-version image that was built in the pulsar repo.\n\n- Add docker/pulsar-connectors-test with Dockerfile and build.gradle.kts\n- Copy TLS certificate-authority from pulsar repo for integration tests\n- Update PulsarContainer default image to pulsar-connectors-test\n- Build test Docker image in CI before running integration tests\n\n* Add RAT exclusions for certificate serial files\n\n* Fix Solr Jetty toolchain version and Docker NAR resolution\n\n- Exclude org.eclipse.jetty.toolchain from Jetty 10 version forcing\n  (toolchain artifacts use their own version scheme)\n- Rewrite Docker test image build to use jar task outputs instead of\n  NAR artifact type resolution (the NAR plugin produces .nar via jar\n  task, not via separate artifact type)\n\n* Use pulsar-test-latest-version as base for connector test image\n\nThe integration test infrastructure requires scripts like run-local-zk.sh\nthat only exist in the pulsar-test-latest-version image, not in the base\npulsar image. Use the published test image as the base and layer connector\nNARs on top.\n\n* Build test image from pulsar base with scripts and connectors\n\nThe pulsar-test-latest-version image is not published to Docker Hub.\nInstead, build the test image from apachepulsar/pulsar base image by\nadding the required test scripts (run-local-zk.sh, run-broker.sh, etc.),\nsupervisor config, connector NARs, and TLS certificates.\n\n* Simplify test infrastructure: use testcontainers, remove integration tests\n\nReplace the complex multi-node cluster integration test infrastructure\nwith simpler testcontainers-based tests that run as unit tests.\n\n- Remove tests/integration module and all copied PulsarCluster infrastructure\n- Remove docker/pulsar-connectors-test image (no longer needed)\n- Convert PulsarSchemaHistoryTest to use testcontainers-pulsar standalone\n  instead of embedded pulsar-broker\n- Remove pulsar-broker-test, testmocks, buildtools deps from debezium-core\n- Add testcontainers-pulsar and testcontainers-cassandra to version catalog\n- Simplify CI to single ./gradlew test job\n\n* Add testcontainer-based tests for Cassandra and MongoDB\n\n- Cassandra: new CassandraStringSinkTest that verifies the sink writes\n  records to a real Cassandra instance via testcontainers\n- MongoDB: new MongoSinkContainerTest that verifies the sink writes\n  JSON documents to a real MongoDB instance via testcontainers\n- Add testcontainers-cassandra, testcontainers-mongodb, and\n  mongodb-driver-sync test dependencies\n\n* Add testcontainer-based tests for Debezium MySQL and Postgres sources\n\n- MySQL: new DebeziumMysqlSourceTest that starts a MySQL container with\n  binlog enabled and a Pulsar container, then verifies CDC events flow\n  through the DebeziumMysqlSource from the initial snapshot\n- Postgres: new DebeziumPostgresSourceTest that starts a Postgres\n  container with wal_level\u003dlogical and verifies CDC events via pgoutput\n\n* Skip AlluxioSinkTest when local cluster fails to start\n\nThe embedded Alluxio LocalAlluxioCluster has a hardcoded 200s timeout\nfor master startup which is frequently exceeded in CI environments\nwith limited resources. Convert the TimeoutException to a test skip\ninstead of a test failure."
    },
    {
      "commit": "314b9defb6888804e3c3ec75085b015b7b16ae1b",
      "tree": "68dff727845eabb2c1c92cb295a22880e9ba17c2",
      "parents": [
        "3d03f1e6f5ac3781f39b5f34f412bc96dedcbb1b"
      ],
      "author": {
        "name": "Matteo Merli",
        "email": "mmerli@apache.org",
        "time": "Thu Mar 26 13:45:58 2026 -0700"
      },
      "committer": {
        "name": "Matteo Merli",
        "email": "mmerli@apache.org",
        "time": "Thu Mar 26 13:46:26 2026 -0700"
      },
      "message": "Initialize pulsar-connectors as standalone repository\n\nMove connectors from pulsar-io/ to top-level directories and set up\nstandalone Gradle build that consumes Pulsar artifacts as Maven\ndependencies.\n\n- Flatten directory structure: pulsar-io/\u003cname\u003e/ -\u003e \u003cname\u003e/\n- Add settings.gradle.kts with all connector modules\n- Add build.gradle.kts with shared configuration (NAR packaging,\n  dependency management, test setup)\n- Add gradle/libs.versions.toml with connector-specific dependencies\n- Add pulsar-dependencies/ platform module pinning Pulsar versions\n- Add distribution/io/ for connector NAR distribution packaging\n- Update all cross-project references to new flat paths\n- Add .gitignore for build artifacts\n"
    },
    {
      "commit": "3d03f1e6f5ac3781f39b5f34f412bc96dedcbb1b",
      "tree": "4299e7e82a3d396dc80549c34461ccb68c122bc3",
      "parents": [
        "2c69483cfc297793dbac03c287bf350181802b50"
      ],
      "author": {
        "name": "Matteo Merli",
        "email": "mmerli@apache.org",
        "time": "Thu Mar 26 11:08:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 11:08:27 2026 -0700"
      },
      "message": "[cleanup] PIP-463: Migrate build system from Maven to Gradle (#25398)"
    },
    {
      "commit": "2c69483cfc297793dbac03c287bf350181802b50",
      "tree": "0cb37beb7f011a3bbf9128972948b66f759926a8",
      "parents": [
        "fab58115e3e31f41dd4e27e172d494bec5dd59e8"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Tue Mar 24 21:24:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 12:24:59 2026 -0700"
      },
      "message": "[improve][build] Bump version to 4.3.0-SNAPSHOT in master, add branch-4.2 to protected branches (#25397)"
    },
    {
      "commit": "fab58115e3e31f41dd4e27e172d494bec5dd59e8",
      "tree": "95e5d9bd8ecb36d2cee716c1b81e0f9d8002d70f",
      "parents": [
        "335f7cb0c8a4a35d9075398e8be9368190c90cca"
      ],
      "author": {
        "name": "Matteo Merli",
        "email": "mmerli@apache.org",
        "time": "Fri Mar 20 17:04:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 21 02:04:27 2026 +0200"
      },
      "message": "[fix][test] Fix thread leaks in multiple tests and KinesisSink (#25376)"
    },
    {
      "commit": "335f7cb0c8a4a35d9075398e8be9368190c90cca",
      "tree": "eb3e6451c7700d2d46072baafb7d8d3ab0daa19f",
      "parents": [
        "59eb757070614f6780c2cc8be809357f93c9e6cd"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Wed Mar 18 23:58:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 23:58:01 2026 +0200"
      },
      "message": "[improve][io] Upgrade Debezium to 3.4.2 and Kafka Client/Connect to 4.1.1 (#25335)"
    },
    {
      "commit": "59eb757070614f6780c2cc8be809357f93c9e6cd",
      "tree": "f2c3f5ef4c175b1dd584422259108d34f4d24303",
      "parents": [
        "ccd2f79dc3276a5486433eed912516f0199eeb3e"
      ],
      "author": {
        "name": "Enrique Fernández",
        "email": "enrique@bluelabs.eu",
        "time": "Mon Mar 16 09:11:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 16 10:11:38 2026 +0200"
      },
      "message": "[fix][io][kca] kafka headers silently dropped (#25325)"
    },
    {
      "commit": "ccd2f79dc3276a5486433eed912516f0199eeb3e",
      "tree": "74b6d593007225a9a3c0e76b78ea5ddb12216e34",
      "parents": [
        "4c5d2748e645ff667d9d02423ccb002300bd1539"
      ],
      "author": {
        "name": "guptas6est",
        "email": "sanaya.gupta@est.tech",
        "time": "Wed Feb 11 13:37:43 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 11 10:07:43 2026 +0200"
      },
      "message": "[fix][sec] Override msgpack-core to 0.9.11 to address CVE-2026-21452 (#25233)\n\n"
    },
    {
      "commit": "4c5d2748e645ff667d9d02423ccb002300bd1539",
      "tree": "5dc1801160aef61902bda1cb0a67e18fc14f42f0",
      "parents": [
        "ce9e19e944867f269ca03685410002a579aa9dae"
      ],
      "author": {
        "name": "Bäm",
        "email": "dev@sandchaschte.ch",
        "time": "Fri Feb 06 12:15:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 06 13:15:52 2026 +0200"
      },
      "message": "[feat][io] implement pip-297 for jdbc sinks (#25195)\n\n"
    },
    {
      "commit": "ce9e19e944867f269ca03685410002a579aa9dae",
      "tree": "dc96c43e4d48da9da1f9307a9dda6360e7e6e4fc",
      "parents": [
        "f23955f5c88c468f69374fadbd96a28f3a20f2eb"
      ],
      "author": {
        "name": "jiangpengcheng",
        "email": "scjiangpengcheng@gmail.com",
        "time": "Fri Feb 06 01:25:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 05 19:25:20 2026 +0200"
      },
      "message": "[improve][io] Set default connector class for debezium connectors (#25215)\n\n"
    },
    {
      "commit": "f23955f5c88c468f69374fadbd96a28f3a20f2eb",
      "tree": "9b0790ec155c1817d751996c4db1e59fdef1235a",
      "parents": [
        "2830c37ca21d10ddb2a5ac9eee63b9d15fa8cf6d"
      ],
      "author": {
        "name": "guptas6est",
        "email": "sanaya.gupta@est.tech",
        "time": "Mon Feb 02 21:59:58 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 02 08:29:58 2026 -0800"
      },
      "message": "[fix][sec] Exclude org.lz4:lz4-java and standardize on at.yawk.lz4-java to remediate CVE-2025-12183 and CVE-2025-66566 (#25198)\n\n"
    },
    {
      "commit": "2830c37ca21d10ddb2a5ac9eee63b9d15fa8cf6d",
      "tree": "d49003949370e9059f67089264fae41645e2e2f3",
      "parents": [
        "2afd8a1341b640f56a20f477c824f9603c075181"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Sat Jan 24 10:09:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 24 10:09:36 2026 +0200"
      },
      "message": "[improve][misc] Upgrade to Alpine 3.23 (#25180)\n\n"
    },
    {
      "commit": "2afd8a1341b640f56a20f477c824f9603c075181",
      "tree": "f3164d01ca027815ed74913318205b21232af9c1",
      "parents": [
        "ee5dd298d9c3cbf77de2c027ac03be73e2c9a0d1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jan 23 08:47:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 23 08:47:37 2026 +0200"
      },
      "message": "[fix][sec] Bump org.apache.solr:solr-core from 9.8.0 to 9.10.1 in /pulsar-io/solr (#25175)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ee5dd298d9c3cbf77de2c027ac03be73e2c9a0d1",
      "tree": "3cc825b9045db7a303abc71a4e765e858f6fe7e8",
      "parents": [
        "87f22c82927f71af906403d73743dbce55171ad3"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Thu Jan 15 01:07:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 14 15:07:19 2026 -0800"
      },
      "message": "[improve][misc] Upgrade to Jetty 12.1.x (#25100)\n\n"
    },
    {
      "commit": "87f22c82927f71af906403d73743dbce55171ad3",
      "tree": "5bd88c316934a88f3fbc7f745cde976bde5064d3",
      "parents": [
        "7ae957c3f7768a2f37a59c871a16d140c8b3cef7"
      ],
      "author": {
        "name": "Dream95",
        "email": "864197662@qq.com",
        "time": "Wed Jan 14 21:55:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 14 21:55:20 2026 +0800"
      },
      "message": "[improve][io] Add PUT method support to HttpSink (#25133)\n\nSigned-off-by: Dream95 \u003czhou_8621@163.com\u003e"
    },
    {
      "commit": "7ae957c3f7768a2f37a59c871a16d140c8b3cef7",
      "tree": "10ef87e24987ad38b34c288d464e47003b3d604d",
      "parents": [
        "2e2d118b4553a8fec7f59240a60a313ca0c74c8b"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Wed Dec 17 05:16:28 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 17 11:16:28 2025 +0800"
      },
      "message": "[improve][io] Replace Qpid in tests with RabbitMQ in Testcontainers and upgrade RabbitMQ client version (#25085)\n\n"
    },
    {
      "commit": "2e2d118b4553a8fec7f59240a60a313ca0c74c8b",
      "tree": "afea3529c81e78c4acbbbcd6d667c134e221c376",
      "parents": [
        "86908b16aaff30d0098d4e96d1e2d019ba16a6d4"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Tue Dec 16 19:27:23 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 16 19:27:23 2025 +0200"
      },
      "message": "[cleanup][io] Remove Pulsar IO Twitter connector (#25080)\n\n"
    },
    {
      "commit": "86908b16aaff30d0098d4e96d1e2d019ba16a6d4",
      "tree": "17ac28bd43f7888d4cedaf9bb584c4615f2cd5c6",
      "parents": [
        "b6a9703cb50e6700ff5bf5c1ef70bce25286a4f5"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Tue Dec 16 17:57:05 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 16 17:57:05 2025 +0200"
      },
      "message": "[cleanup][io] Remove Pulsar IO Flume connector (#25079)\n\n"
    },
    {
      "commit": "b6a9703cb50e6700ff5bf5c1ef70bce25286a4f5",
      "tree": "afb89c962fd50733fc66e4b90a4eca2cc214bd44",
      "parents": [
        "f1bdeb20a7476a490f4e41b574dba181cdecfbf6"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Fri Nov 14 13:13:44 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 14 13:13:44 2025 +0200"
      },
      "message": "[fix][build] Remove Confluent and Restlet maven repositories from top level pom.xml (#24981)\n\n"
    },
    {
      "commit": "f1bdeb20a7476a490f4e41b574dba181cdecfbf6",
      "tree": "2df355dc61a2580057946fa3f65299c4b21f55a9",
      "parents": [
        "e3c3dadad9b15c5a88cb294dbb180c8239000fd8"
      ],
      "author": {
        "name": "Lucas Eby",
        "email": "90928360+LucasEby@users.noreply.github.com",
        "time": "Tue Nov 11 11:27:48 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 19:27:48 2025 +0200"
      },
      "message": "[fix][test] Fixed nondeterministic ordering in MongoSourceTest.testWriteBadMessage (#24835)\n\n"
    },
    {
      "commit": "e3c3dadad9b15c5a88cb294dbb180c8239000fd8",
      "tree": "08518714659e81c31977d7e7dc1e474ee3e5985f",
      "parents": [
        "1a3e0636385c2095641d999c185334c268385a7b"
      ],
      "author": {
        "name": "Lucas Eby",
        "email": "90928360+LucasEby@users.noreply.github.com",
        "time": "Tue Nov 11 09:26:33 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 17:26:33 2025 +0200"
      },
      "message": "[fix][test] Fixed ResponseBody Check in Test Helper (#24872)\n\n"
    },
    {
      "commit": "1a3e0636385c2095641d999c185334c268385a7b",
      "tree": "6339cc30d756dbd18535f38bd04c710dae2a5b35",
      "parents": [
        "6a032b0f2c1f103474e1ed3fcdb65b45468fb45e"
      ],
      "author": {
        "name": "guptas6est",
        "email": "sanaya.gupta@est.tech",
        "time": "Thu Nov 06 15:44:44 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 06 17:44:44 2025 +0200"
      },
      "message": "[fix][sec] Update Hbase version to 2.6.3-hadoop3 and exclude Avro from hbase-client to remediate CVEs (#24953)\n\n"
    },
    {
      "commit": "6a032b0f2c1f103474e1ed3fcdb65b45468fb45e",
      "tree": "aca86df8c2a6c07761cd207c89283147375eebd4",
      "parents": [
        "3d908d016e777a3b0ab394a7e9645cc5202370d1"
      ],
      "author": {
        "name": "guptas6est",
        "email": "sanaya.gupta@est.tech",
        "time": "Mon Nov 03 15:57:04 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 03 17:57:04 2025 +0200"
      },
      "message": "[fix][sec] Override kafka-clients in kinesis-kpl-shaded to remediate CVE-2024-31141 and CVE-2025-27817 (#24935)\n\n"
    },
    {
      "commit": "3d908d016e777a3b0ab394a7e9645cc5202370d1",
      "tree": "14e1732a5bc350414abeea929a1a2d829a2922c0",
      "parents": [
        "690c4161a8186d1d6a55ea267672127fcd423f42"
      ],
      "author": {
        "name": "AROP",
        "email": "57448903+AROP-REPLICATION@users.noreply.github.com",
        "time": "Wed Oct 29 00:00:40 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 28 18:00:40 2025 +0200"
      },
      "message": "[improve][io] Use try-with-resources for some locations (#24900)\n\nCo-authored-by: xcx \u003cxcx@qq.com\u003e"
    },
    {
      "commit": "690c4161a8186d1d6a55ea267672127fcd423f42",
      "tree": "7e45a806570118c21191e0a4a57ac49a322ecb3d",
      "parents": [
        "551299ac0e104c26a70ac403fdf633166ea8a6d8"
      ],
      "author": {
        "name": "Lucas Eby",
        "email": "90928360+LucasEby@users.noreply.github.com",
        "time": "Mon Oct 27 04:09:14 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 27 17:09:14 2025 +0800"
      },
      "message": "[fix][test] Fixed Nondeterministic Assertions in KafkaAbstractSinkTest (#24877)\n\n"
    },
    {
      "commit": "551299ac0e104c26a70ac403fdf633166ea8a6d8",
      "tree": "d082626e9c04bfb511724ec7c073f87d2dbb73ff",
      "parents": [
        "e8b47b8450d16057bc11bd27905c82d9dad93912"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Mon Oct 13 18:17:40 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 13 18:17:40 2025 +0300"
      },
      "message": "[improve] Upgrade Alpine base image to 3.22 version (#24840)\n\n"
    },
    {
      "commit": "e8b47b8450d16057bc11bd27905c82d9dad93912",
      "tree": "c18287e2a43fc19943d7f0d66024c6663b0e8319",
      "parents": [
        "fe45d39b6cadf4dd29cbac3e355e93817a0e89c3"
      ],
      "author": {
        "name": "Lucas Eby",
        "email": "90928360+LucasEby@users.noreply.github.com",
        "time": "Thu Oct 09 02:08:55 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 09 15:08:55 2025 +0800"
      },
      "message": "[fix][test] Fixed nondeterministic JSON ordering in multiple tests (#24821)\n\n"
    },
    {
      "commit": "fe45d39b6cadf4dd29cbac3e355e93817a0e89c3",
      "tree": "faf6b428d5f124759066bfa8e2b4b92ca3a0c956",
      "parents": [
        "6c069e4933e5dea1758b61cf60c14df615c1bacb"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Fri Sep 19 18:53:24 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 18:53:24 2025 +0300"
      },
      "message": "[fix][client] Exclude io.prometheus:simpleclient_caffeine from client-side dependencies (#24761)\n\n"
    },
    {
      "commit": "6c069e4933e5dea1758b61cf60c14df615c1bacb",
      "tree": "344e062e8991a1084e37792d1048cad3aa2aa58e",
      "parents": [
        "3d56edb1fb165e242a5a0ed2dc25d66595340cb1"
      ],
      "author": {
        "name": "Harangozó Péter",
        "email": "harangozop92@gmail.com",
        "time": "Thu Sep 11 23:18:12 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 12 00:18:12 2025 +0300"
      },
      "message": "[fix][io] Improve Kafka Connect source offset flushing logic (#24654)\n\n"
    },
    {
      "commit": "3d56edb1fb165e242a5a0ed2dc25d66595340cb1",
      "tree": "0aa98f56419758db59401d8e157817524ae90172",
      "parents": [
        "ac4dd5da3fe8c8ed38442c304e8963d447ee0efc"
      ],
      "author": {
        "name": "Enrique Fernández",
        "email": "enrique@bluelabs.eu",
        "time": "Mon Sep 08 21:18:31 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 08 22:18:31 2025 +0300"
      },
      "message": "[improve][io] Upgrade to Debezium 3.2.2 (#24712)\n\nCo-authored-by: Lari Hotari \u003clhotari@users.noreply.github.com\u003e"
    },
    {
      "commit": "ac4dd5da3fe8c8ed38442c304e8963d447ee0efc",
      "tree": "74b77a0d30f48ced16abf2260636ec4d0a1445cc",
      "parents": [
        "c9de431e5b94cbf03d7b544786a96f75144995bc"
      ],
      "author": {
        "name": "Cong Zhao",
        "email": "zhaocong@apache.org",
        "time": "Mon Sep 01 17:21:29 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 01 17:21:29 2025 +0800"
      },
      "message": "[fix][build] Set project version to 4.2.0-SNAPSHOT (#24690)\n\n"
    },
    {
      "commit": "c9de431e5b94cbf03d7b544786a96f75144995bc",
      "tree": "2289722436fcf676f153e1b9fb8d1ab217112bdd",
      "parents": [
        "70055127f84c9ffa4c6c8c7cbe98d5900b3b6de2"
      ],
      "author": {
        "name": "ran",
        "email": "rgao@streamnative.io",
        "time": "Sun Aug 31 23:55:51 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 31 23:55:51 2025 +0800"
      },
      "message": "[improve][client] PIP-420: Supports users implement external schemas (#24488)\n\n"
    },
    {
      "commit": "70055127f84c9ffa4c6c8c7cbe98d5900b3b6de2",
      "tree": "8bc93a792f1ec558eb8f35a8c62ae888e9a7edef",
      "parents": [
        "9fb8ad26ad3185a2d6f7db06ebea6d5cc434a12b"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Tue Aug 26 16:49:03 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 21:49:03 2025 +0800"
      },
      "message": "[improve][io] Support specifying Kinesis KPL native binary path with 1.0 version specific path (#24669)\n\n"
    },
    {
      "commit": "9fb8ad26ad3185a2d6f7db06ebea6d5cc434a12b",
      "tree": "0b17e1c98f6423a8d427c3d2633836ad3ccead3a",
      "parents": [
        "d772a604fef434d7c09b67f74e3da5c39886b585"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Tue Aug 26 07:44:05 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 07:44:05 2025 +0300"
      },
      "message": "[improve][io] Upgrade AWS SDK v1 \u0026 v2, Kinesis KPL and KPC versions (#24661)\n\n"
    },
    {
      "commit": "d772a604fef434d7c09b67f74e3da5c39886b585",
      "tree": "2a985ee6565301bd0b5c6fc762972b56356cc308",
      "parents": [
        "32f471f7de9504a041513bdbe8c869a1178b6503"
      ],
      "author": {
        "name": "Hang Chen",
        "email": "chenhang@apache.org",
        "time": "Wed Aug 13 22:38:54 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 14 13:38:54 2025 +0800"
      },
      "message": "[improve][broker] Upgrade avro version to 1.12.0 (#24617)\n\nCo-authored-by: Jiwe Guo \u003ctechnoboy@apache.org\u003e"
    },
    {
      "commit": "32f471f7de9504a041513bdbe8c869a1178b6503",
      "tree": "755755acfa3c21a6f190085a245b8dfdafcafee2",
      "parents": [
        "3bd4b37727d8958c09459788e80844f18047c15f"
      ],
      "author": {
        "name": "Rui Fu",
        "email": "freeznet@users.noreply.github.com",
        "time": "Mon Aug 04 09:26:52 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 04 09:26:52 2025 +0800"
      },
      "message": "[improve][io] support array schema for JDBC postgres connector (#24549)\n\nCo-authored-by: Omri Fried \u003c100372327+omri-cavnue@users.noreply.github.com\u003e"
    },
    {
      "commit": "3bd4b37727d8958c09459788e80844f18047c15f",
      "tree": "f2e5600079fffda5ff8501520210cb2747e1b104",
      "parents": [
        "c32a75a1c01229b3d9d5a2900aa79ef3a4db6cfe"
      ],
      "author": {
        "name": "Lari Hotari",
        "email": "lhotari@users.noreply.github.com",
        "time": "Fri Jul 25 21:01:56 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 25 21:01:56 2025 +0300"
      },
      "message": "[fix][sec] Upgrade Kafka connector and clients version to 3.9.1 to address CVE-2025-27818 (#24564)\n\n"
    },
    {
      "commit": "c32a75a1c01229b3d9d5a2900aa79ef3a4db6cfe",
      "tree": "fed93147c0b75da5b73ff97c8e2a92cafe6482fd",
      "parents": [
        "5f57d3324652db733afc716e733694e27fb874c1"
      ],
      "author": {
        "name": "Malla Sandeep",
        "email": "sandeep.malla78@gmail.com",
        "time": "Wed Jul 23 03:09:19 2025 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 22 14:39:19 2025 -0700"
      },
      "message": "[improve][io] Add support for the complete KinesisProducerConfiguration in KinesisSinkConfig (#24489)\n\n"
    },
    {
      "commit": "5f57d3324652db733afc716e733694e27fb874c1",
      "tree": "0ef8ee0358d8a261ffce1c042df8c149cdc8b0ef",
      "parents": [
        "c912d96076abd3bac4b8570cc3ba73f739e21245"
      ],
      "author": {
        "name": "Baodi Shi",
        "email": "baodi@apache.org",
        "time": "Tue Jul 22 17:18:11 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 22 17:18:11 2025 +0800"
      },
      "message": "[fix][io] Fix Kinesis checkpoint mechanism to prevent data duplication (#24534)\n\n"
    },
    {
      "commit": "c912d96076abd3bac4b8570cc3ba73f739e21245",
      "tree": "0fb34e29885882956d000f1ddb946f3e026e6a9a",
      "parents": [
        "c1bafc03d938957a764daea53e5f5179629002ed"
      ],
      "author": {
        "name": "Penghui Li",
        "email": "penghui@apache.org",
        "time": "Thu Jul 17 21:28:25 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 17 21:28:25 2025 -0700"
      },
      "message": "[fix][misc] Upgrade dependencies to fix critical security vulnerabilities (#24532)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c1bafc03d938957a764daea53e5f5179629002ed",
      "tree": "3686bac107aa2dfb452adc5568483516c4885797",
      "parents": [
        "8c970e40629e508fcfffbf14e5e98d9bfe4efa9c"
      ],
      "author": {
        "name": "Baodi Shi",
        "email": "baodi@apache.org",
        "time": "Fri Jul 11 16:49:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 11 16:49:16 2025 +0800"
      },
      "message": "[fix][io] Fix data loss issue in Kinesis source connector (#24501)\n\n"
    },
    {
      "commit": "8c970e40629e508fcfffbf14e5e98d9bfe4efa9c",
      "tree": "5c88775bf8219bb43e9c0ed266b61b7f35c7ceb5",
      "parents": [
        "8ebf12a4214efa54fc8626ab0369457c88006791"
      ],
      "author": {
        "name": "Praveen Kumar",
        "email": "praveen729483@gmail.com",
        "time": "Fri Jul 11 09:33:39 2025 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 11 12:03:39 2025 +0800"
      },
      "message": "[improve][ci] Fixes #23079: Checkstyle checks applied to all test (#24492)\n\n"
    },
    {
      "commit": "8ebf12a4214efa54fc8626ab0369457c88006791",
      "tree": "217b58e6bb81e1a23ddbfc67c31870841f91f816",
      "parents": [
        "690f1a9dff482a81b0e0707f38a36f253a2a332d"
      ],
      "author": {
        "name": "Baodi Shi",
        "email": "baodi@apache.org",
        "time": "Thu Jul 10 12:12:49 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 10 12:12:49 2025 +0800"
      },
      "message": "[fix][io] Make record properties configurable for kinesis source (#24495)\n\n"
    }
  ],
  "next": "690f1a9dff482a81b0e0707f38a36f253a2a332d"
}
