Skip to content

EN Release Notes 2.1.1

Alan Zhang edited this page Oct 7, 2026 · 1 revision

Home · GitHub

English | 简体中文

TsGate 2.1.1

Version 2.1.1 fixes cursor-time conversion and IoTDB batch column identity, adds reusable adapter contract checks and automates Docker regression selection. The Template → adapter SPI → backend architecture, public API, com.alandevise.tsgate.* packages, tsdb.* configuration keys, Java 17 and existing Spring Boot/client/server baselines remain unchanged.

This is a GitHub-only release: source and release attachments. 2.1.1 is not published to Maven Central. Published Central coordinates remain 2.1.0 and do not acquire these fixes automatically. The 2.1.0 release record and its validation evidence remain unchanged.

Fixes and test coverage

Area Behavior in 2.1.1
Cursor-time conversion Numeric result times must be finite, integral and within signed long range. Fractional values, NaN, infinity and overflow no longer silently become another timestamp. Existing Instant / ISO millisecond behavior and ordinary time-alias priority/fallback remain. If a time page has hasNext=true but its last returned row cannot supply a valid continuation time, the template throws QUERY_ERROR. Strict cursors still require every physical cursor key on every returned row.
IoTDB batch preflight Column role/type checks and each prepared row's values use the same Locale.ROOT lowercase physical identity. Case variants within one record, including TAG/FIELD overlap or null-valued fields, fail with METADATA_ERROR, NOT_COMMITTED and zero database I/O. Compatible variants across records merge into one Tablet column without losing values; role/type conflicts reject the complete batch before borrowing a session. Caller records and keys are unchanged.
Reusable adapter contracts Shared test fixtures/assertions and a machine-readable capability table exercise common argument/count, configuration-snapshot, lifecycle, batch preflight/commit and query/pagination contracts. Capabilities distinguish supported, unsupported and configuration-required behavior. Backend-specific error classifications remain; unsupported capabilities must assert UNSUPPORTED_OPERATION rather than silently skip. Test infrastructure introduces no production capability SPI or runtime dependency.
Docker CI Relevant pull requests and pushes select Docker backends by changed paths; shared core/build inputs select all affected backends, and InfluxDB 1.x changes also select OpenGemini. Routine OpenGemini checks cover 1.4.1/1.5.2 single nodes. Release tags and full manual runs cover both versions as single nodes and three-node/three-replica clusters. Reports record selected/excluded scope, source identity, versions and cleanup results.

Time-only pagination still requires unique boundary timestamps to avoid skipping equal-time rows; this release does not add nanosecond cursors or cross-page snapshots. IoTDB's new rejection applies to ambiguous/conflicting input, without changing normal compatible writes. InfluxDB 1.x HTTP 400 remains an uncertain commit, and OpenGemini retains its HTTP integer-precision and asynchronous index-visibility limits.

Use 2.1.1 from source

Install the exact release into the local Maven repository before declaring any 2.1.1 dependency. Run with Java 17+ and Maven 3.9+:

git clone --branch v2.1.1 --depth 1 https://github.com/AlanDevise/TsGate.git tsgate-2.1.1
cd tsgate-2.1.1
mvn clean install

The installation supplies the aligned parent, BOM, adapters and starters. After it succeeds, an application may use, for example:

<dependency>
    <groupId>io.github.alandevise</groupId>
    <artifactId>tsgate-iotdb-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

Keep all TsGate dependencies and an explicitly imported TsGate BOM at 2.1.1. A GitHub release does not make Maven Central resolve this version; other machines need the same source installation or an application-managed artifact repository. For direct Central consumption, retain aligned 2.1.0 dependencies. See Getting started for activation and runtime settings.

Verification evidence

Local verification on 2026-10-07 (Asia/Shanghai) passed on frozen source commit 7c7cf76. Each recorded run confirmed unchanged source manifests and Git commit. These are fresh 2.1.1 results; historical 2.1.0 counts are retained separately.

Scope Actual result / evidence
JDK 17 / Boot 2.7.18; JDK 21 / Boot 3.5.14; JDK 25 / Boot 4.1.0 unit regression 1,078 passed in each runtime combination, with zero failures, errors or skips. Reports: unit-jdk17/summary.json, unit-jdk21/summary.json, unit-jdk25/summary.json.
Local IoTDB / InfluxDB 1.x / InfluxDB 3 Docker reads/writes and regression, including at least 12 mixed-case rows in one IoTDB Tablet 115 passed, with zero failures, errors or skips. Exact servers: IoTDB 2.0.10, InfluxDB OSS 1.13.1, InfluxDB 3 Core 3.11.5; Temurin 17 / Boot 2.7.18. Report: docker-existing/summary.json.
OpenGemini 1.4.1 and 1.5.2, each single node and three-node/three-replica cluster 44 passed in each deployment; 176 total, with zero failures, errors or skips. Both real three-node clusters used three replicas. Report: opengemini-matrix/summary.json.
Runner/workflow checks, capability matrix and unsigned release archive audit 27 unsigned release JAR archives passed verification. 51 Python checks passed (34 core/CI/artifact-verifier and 17 OpenGemini runner checks); actionlint 1.7.7 and YAML syntax checks passed. Reports: unit-jdk17/release-artifacts.json, python-core.log, python-opengemini.log.
Release source SHA, report locations and owned-container/network cleanup Full SHA: 7c7cf76100085891131080ca0fddf2273a4dfa0e. Reports are under .local-test/release-2.1.1-20261007/. All owned existing-backend containers and OpenGemini containers/networks were removed; no cleanup failures.

Remote CI: both the main-branch run and the full v2.1.1 tag run completed successfully, including their verification gates, on source 7c7cf76100085891131080ca0fddf2273a4dfa0e. Main verified OpenGemini 1.4.1 and 1.5.2 single nodes; the tag run passed all nine jobs and covered all four OpenGemini version/topology combinations, including real three-node/three-replica clusters. The local counts above remain separate from remote run results. A public summary is attached as release-verification.json.

A passing representative suite establishes only its recorded versions, configurations and operations. It does not certify untested database releases, TLS/authentication deployments or failover behavior. Reproduction commands and CI scope are in Testing and publishing.

Clone this wiki locally