Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
0697175
support QWIP and sf for .net client
kafka1991 Apr 28, 2026
57e103b
code review and add cancelrow
kafka1991 Apr 29, 2026
30f1266
Merge branch 'main' into qwip_victor
kafka1991 Apr 29, 2026
5db8e98
fix linux test failed
kafka1991 Apr 29, 2026
98bdf17
code review and fix fsn race condition
kafka1991 Apr 29, 2026
b7abb47
code review and race condition
kafka1991 Apr 29, 2026
a9c5b9e
add bit writer tests
kafka1991 Apr 29, 2026
c56ffbb
flake tests
kafka1991 Apr 29, 2026
fd615a9
code review
kafka1991 Apr 29, 2026
b1e2b69
code review
kafka1991 Apr 30, 2026
c9bd822
code review and fix tests
kafka1991 Apr 30, 2026
3e70218
code review
kafka1991 Apr 30, 2026
334f521
code review
kafka1991 Apr 30, 2026
c4c1994
add more tests
kafka1991 Apr 30, 2026
4724fbc
update benchmark
kafka1991 Apr 30, 2026
a0a7f10
update benchmark docs
kafka1991 Apr 30, 2026
3f3c9eb
same seal file name
kafka1991 Apr 30, 2026
8eb4241
add egress
kafka1991 Apr 30, 2026
9809362
fix integration tests
kafka1991 Apr 30, 2026
442b108
code review
kafka1991 Apr 30, 2026
84d1185
code review
kafka1991 Apr 30, 2026
204c98f
code review
kafka1991 May 1, 2026
c3bd641
add qwip_victor branch review + actionable plan
nwoolmer May 5, 2026
1c8ee2b
1. ingress support configure multi servers 2. egress support random s…
kafka1991 May 6, 2026
cc07a95
optimise failover
kafka1991 May 6, 2026
22b6f0c
Merge pull request #75 from questdb/egress
kafka1991 May 6, 2026
baa6c6d
code review
kafka1991 May 6, 2026
e15f54c
code review and ci failed
kafka1991 May 6, 2026
3a81f6a
ci add timeout
kafka1991 May 6, 2026
78f2738
ci fix
kafka1991 May 6, 2026
3b135e8
code review
kafka1991 May 6, 2026
072aae4
code review
kafka1991 May 6, 2026
2729f94
code review
kafka1991 May 6, 2026
cf0510d
code review and fix bugs
kafka1991 May 6, 2026
360c01d
code review
kafka1991 May 6, 2026
9e4d4da
code review
kafka1991 May 6, 2026
a3f5301
add initial_connect_retry argument
kafka1991 May 7, 2026
2d5f824
fix race condition
kafka1991 May 7, 2026
1f6efad
fix failed tests
kafka1991 May 7, 2026
6b91ead
final code review
kafka1991 May 7, 2026
315fb9a
code review and remove obselete tests
kafka1991 May 8, 2026
48f6cdb
make tests stable
kafka1991 May 8, 2026
b0707e4
alian specs
kafka1991 May 9, 2026
011490e
code review and fix one race condition
kafka1991 May 11, 2026
5f531ca
add integration tests for qwp protocol
kafka1991 May 11, 2026
4f99ac2
fix durable model and fix integration tests
kafka1991 May 11, 2026
4d183e5
add more integration tests
kafka1991 May 11, 2026
02be36c
fix failed tests
kafka1991 May 11, 2026
01ad7ac
fix failed tests
kafka1991 May 11, 2026
3edd120
add options.durable_ack_keepalive_interval_millis config
kafka1991 May 12, 2026
3fdb773
little code review
kafka1991 May 12, 2026
6a450c0
finally code review
kafka1991 May 12, 2026
3b75281
code review
kafka1991 May 12, 2026
a545528
add ackwatermark
kafka1991 May 12, 2026
f8f7e4d
code review
kafka1991 May 12, 2026
5cbabc5
add listenser
kafka1991 May 13, 2026
bbba3c5
fix spec drift
kafka1991 May 13, 2026
d3fcfea
fix slot lock race condition
kafka1991 May 13, 2026
d859137
code review
kafka1991 May 13, 2026
a1d5f68
fix race condition
kafka1991 May 13, 2026
cfa9b0c
final code review
kafka1991 May 14, 2026
6662cc2
add more tests
kafka1991 May 14, 2026
fb94dc3
final code review
kafka1991 May 14, 2026
efad6e0
fix decimal scale
kafka1991 May 15, 2026
be94782
add fuzz and benchmark and fix serval bugs
kafka1991 May 18, 2026
834f906
CI use jdk25
kafka1991 May 18, 2026
534706a
code review and add more fuzz tests
kafka1991 May 18, 2026
d945531
add failover tests
kafka1991 May 18, 2026
3839119
add failover tests
kafka1991 May 18, 2026
3221e41
fix connstring and ci
kafka1991 May 18, 2026
a888361
revert some fixes
kafka1991 May 18, 2026
8ce1e9c
fix connect str and graceful shutdown QuestDb server
kafka1991 May 18, 2026
6f7801c
adjust rowcount
kafka1991 May 18, 2026
bf66b39
adjust rowcount
kafka1991 May 18, 2026
d5fb821
adjust tiemout on CI
kafka1991 May 18, 2026
11761f4
add more fuzz tests
kafka1991 May 18, 2026
ad87da3
another round reviews and add more tests
kafka1991 May 18, 2026
449b1fb
connect string should work for both ingress and egress
kafka1991 May 19, 2026
ea3fba7
code reviews
kafka1991 May 19, 2026
f072fda
falke test on macos
kafka1991 May 19, 2026
169e547
add memory align issue comment
kafka1991 May 20, 2026
4585636
add Enterprise e2e integration test infrastructure
ideoma May 26, 2026
3348de2
ent pipeline sidecar fixes
ideoma May 26, 2026
075d314
add enterprise e2e dispatch to PR pipeline
ideoma May 27, 2026
b51d261
move e2e build trigger to happen earlier
ideoma May 27, 2026
58d28e1
inline schema and remove schema registry
kafka1991 Jun 16, 2026
ffbb5f7
add server start vm option `-add-exports=java.base/jdk.internal.vm=io…
kafka1991 Jun 17, 2026
ce087d6
update questdb server's java client
kafka1991 Jun 17, 2026
056d0de
Remove the auth config parameter
mtopolnik Jun 18, 2026
6217794
Remove the gorilla ingress parameter
mtopolnik Jun 18, 2026
2bb9f2b
Reject non-QWP keys on ws:: connect strings
mtopolnik Jun 18, 2026
a122152
Fix stale QWP encoder test vectors for always-on Gorilla
mtopolnik Jun 18, 2026
433b7ea
Accept full QWP key union, reject non-QWP keys
mtopolnik Jun 18, 2026
55ab35c
add convert_local_to_utc config to conditionally enable local to utc …
ideoma Jun 19, 2026
2a5793c
fix: QwpMemorySegment has no finalizer → native-memory leak on the de…
ideoma Jun 22, 2026
8e8374b
fix: use enum instead of byte consts
ideoma Jun 22, 2026
38b1301
fix compilation
ideoma Jun 22, 2026
3061ac4
fix: Cancel() races on the shared _cancelRequested flag and can cance…
ideoma Jun 23, 2026
a66fbcd
fix: make QwpDecodeException public
ideoma Jun 23, 2026
30a1df1
fix minor reveiw points
ideoma Jun 23, 2026
5252feb
refactor decimals to force choosing type, precision upfront
ideoma Jun 23, 2026
3630f74
add ColumnDecimalXX method to ISender. Fix tests
ideoma Jun 24, 2026
b631099
fix: close_flush_timeout_millis=0 silently drops buffered rows on dis…
ideoma Jun 24, 2026
775ec81
fix: Malformed varint in RESULT_END/EXEC_DONE is misclassified as ret…
ideoma Jun 24, 2026
a613a9d
fix: docs: SenderOptions.ToString() does not re-parse for any authent…
ideoma Jun 24, 2026
2197f67
fix: Worst-case synchronous Dispose() latency compounds
ideoma Jun 24, 2026
3040de4
fix: macOS SF hot-spare files are never block-reserved → SIGBUS proc…
ideoma Jun 24, 2026
32d8f00
fix: Lowering sf_max_bytes between restarts silently truncates replay…
ideoma Jun 24, 2026
8447962
fix: QwpColumnBatch numeric accessors silently return wrong data on a…
ideoma Jun 25, 2026
e1fd4be
fix: Egress array accessors silently return wrong-typed data on a mis…
ideoma Jun 25, 2026
41b0ed9
fix: TLS CA certificate loaded for WS sender / query client is never …
ideoma Jun 25, 2026
7e868ca
fix: Infinite loop (process hang) in QwpColumn.GrowTo after Truncate()
ideoma Jun 25, 2026
d3d2a03
fix: target / initial_credit silently accepted (and ignored) on HTTP/…
ideoma Jun 25, 2026
c5b9463
fix: Unbounded reconnect backoff can throw from Task.Delay
ideoma Jun 25, 2026
b29e28f
fix: Ingest never records a host's zone on a successful connect
ideoma Jun 25, 2026
72f83e3
nits
ideoma Jun 26, 2026
6993c60
fix: A lone-surrogate symbol value permanently wedges the WS sender (…
ideoma Jun 26, 2026
cbd6fed
feat: implement transactions
ideoma Jun 26, 2026
66c87ad
fix: Transient drain timeout permanently abandons recoverable orphan …
ideoma Jun 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
354 changes: 354 additions & 0 deletions .claude/skills/review-pr/SKILL.md

Large diffs are not rendered by default.

465 changes: 465 additions & 0 deletions CLAUDE.md

Large diffs are not rendered by default.

168 changes: 154 additions & 14 deletions README.md

Large diffs are not rendered by default.

File renamed without changes.
154 changes: 150 additions & 4 deletions ci/azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,39 @@ steps:
version: '10.0.x'
installationPath: $(Agent.ToolsDirectory)/dotnet

- task: JavaToolInstaller@0
displayName: 'Install JDK 25 (to build QuestDB)'
inputs:
versionSpec: '25'
jdkArchitectureOption: 'x64'
jdkSourceOption: 'PreInstalled'
condition: eq(variables['osName'], 'Linux')

- script: |
df -h /
sudo rm -rf /usr/local/lib/android /opt/ghc /usr/share/swift /opt/hostedtoolcache/CodeQL 2>/dev/null || true
df -h /
displayName: 'Free agent disk space (Linux)'
condition: eq(variables['osName'], 'Linux')

- script: |
set -e
git clone --depth 1 https://github.com/questdb/questdb.git questdb-src
cd questdb-src
CLIENT_VERSION=$(sed -n 's/.*<questdb.client.version>\(.*\)<\/questdb.client.version>.*/\1/p' core/pom.xml | head -1)
echo "questdb.client.version=$CLIENT_VERSION"
PROFILES=build-binaries
case "$CLIENT_VERSION" in
*-SNAPSHOT)
git submodule update --init --depth 1 java-questdb-client
PROFILES=build-binaries,local-client
;;
esac
mvn -q -pl core -am -DskipTests -P "$PROFILES" package
echo "##vso[task.setvariable variable=QUESTDB_REPO]$(pwd)"
displayName: 'Clone + build QuestDB master'
condition: eq(variables['osName'], 'Linux')

- task: DotNetCoreCLI@2
displayName: 'Restore dependencies'
inputs:
Expand All @@ -80,24 +113,137 @@ steps:
projects: 'net-questdb-client.sln'
arguments: '--configuration $(buildConfiguration) --no-restore'

# Cross-repo trigger: fire the questdb-enterprise
# build-and-test-e2e-net-client pipeline with this build's SHA so
# the net_client-marked failover tests run against an Enterprise
# primary. The Enterprise pipeline posts a status check back on the
# PR (`enterprise-e2e-net-client` context); this step fire-and-forgets.
#
# Prerequisites (one-time, in the Azure DevOps UI):
# 1. Register ci/build-and-test-e2e-net-client.yaml in the
# `questdb-enterprise` ADO project as a pipeline named
# `build-and-test-e2e-net-client`.
# 2. Create a PAT in the `questdb-enterprise` ADO project with
# `Build (Read & execute)` scope. Add it as a secret variable
# on THIS pipeline named ENT_DISPATCH_PAT.
- bash: |
set -euo pipefail

ORG_URL="$(System.TeamFoundationCollectionUri)"
PROJECT="questdb-enterprise"
PIPELINE_NAME="build-and-test-e2e-net-client"

if [ -z "${ENT_DISPATCH_PAT:-}" ]; then
echo "ENT_DISPATCH_PAT not set; skipping enterprise e2e dispatch."
exit 0
fi

echo "Looking up '${PIPELINE_NAME}' in '${PROJECT}'..."
PIPELINES=$(curl -fsS -u ":${ENT_DISPATCH_PAT}" \
"${ORG_URL}${PROJECT}/_apis/pipelines?api-version=7.0")
PIPELINE_ID=$(echo "$PIPELINES" | jq -r --arg n "$PIPELINE_NAME" \
'.value[] | select(.name == $n) | .id' | head -1)

if [ -z "$PIPELINE_ID" ] || [ "$PIPELINE_ID" = "null" ]; then
echo "Pipeline '${PIPELINE_NAME}' not found in '${PROJECT}'; skipping."
exit 0
fi

CLIENT_PR_NUMBER="$(System.PullRequest.PullRequestNumber)"
if [ -z "${CLIENT_PR_NUMBER}" ] || [ "${CLIENT_PR_NUMBER}" = "None" ]; then
CLIENT_PR_NUMBER=""
fi

if [ "$(Build.Reason)" = "PullRequest" ]; then
CLIENT_BRANCH="$(System.PullRequest.SourceBranch)"
CLIENT_BRANCH="${CLIENT_BRANCH#refs/heads/}"
else
CLIENT_BRANCH="$(Build.SourceBranchName)"
fi

BODY=$(jq -n \
--arg commit "$(Build.SourceVersion)" \
--arg pr "${CLIENT_PR_NUMBER}" \
--arg branch "${CLIENT_BRANCH}" \
'{
templateParameters: {
netClientCommit: $commit,
netClientPrNumber: $pr,
clientBranch: $branch
},
resources: { repositories: { self: { refName: "refs/heads/main" } } }
}')

echo "Dispatching enterprise e2e: commit=$(Build.SourceVersion) PR=${CLIENT_PR_NUMBER} branch=${CLIENT_BRANCH}"

RESPONSE=$(curl -fsS -u ":${ENT_DISPATCH_PAT}" \
-H "Content-Type: application/json" \
-X POST \
-d "$BODY" \
"${ORG_URL}${PROJECT}/_apis/pipelines/${PIPELINE_ID}/runs?api-version=7.0")

RUN_URL=$(echo "$RESPONSE" | jq -r '._links.web.href // ""')
echo "Enterprise build queued: ${RUN_URL}"
displayName: 'Dispatch Enterprise e2e pipeline'
condition: and(succeeded(), eq(variables['osName'], 'Linux'))
env:
ENT_DISPATCH_PAT: $(ENT_DISPATCH_PAT)

- task: DotNetCoreCLI@2
displayName: 'Run all tests on $(osName)'
displayName: 'Run all tests on $(osName) (net8.0)'
inputs:
command: 'test'
projects: 'src/net-questdb-client-tests/net-questdb-client-tests.csproj'
arguments: '--configuration $(buildConfiguration) --framework net9.0 --no-build --verbosity normal --logger trx --collect:"XPlat Code Coverage"'
arguments: '--configuration $(buildConfiguration) --framework net8.0 --no-build --verbosity normal --logger trx --blame-hang --blame-hang-timeout 600s --blame-hang-dump-type mini --filter "FullyQualifiedName!~QuestDbIntegrationTests&FullyQualifiedName!~QuestDbWebSocketIntegrationTests&FullyQualifiedName!~QuestDbQueryIntegrationTests"'
publishTestResults: true

- task: DotNetCoreCLI@2
displayName: 'Run all tests on $(osName) (net9.0, with coverage)'
inputs:
command: 'test'
projects: 'src/net-questdb-client-tests/net-questdb-client-tests.csproj'
arguments: '--configuration $(buildConfiguration) --framework net9.0 --no-build --verbosity normal --logger trx --blame-hang --blame-hang-timeout 600s --blame-hang-dump-type mini --collect:"XPlat Code Coverage"'
publishTestResults: true
env:
QUESTDB_REPO: $(QUESTDB_REPO)
condition: eq(variables['osName'], 'Linux')

- task: DotNetCoreCLI@2
displayName: 'Run tests on $(osName) (excluding integration tests)'
displayName: 'Run tests on $(osName) (net9.0, excluding integration tests)'
inputs:
command: 'test'
projects: 'src/net-questdb-client-tests/net-questdb-client-tests.csproj'
arguments: '--configuration $(buildConfiguration) --framework net9.0 --no-build --verbosity normal --logger trx --collect:"XPlat Code Coverage" --filter "FullyQualifiedName!~QuestDbIntegrationTests"'
arguments: '--configuration $(buildConfiguration) --framework net9.0 --no-build --verbosity normal --logger trx --blame-hang --blame-hang-timeout 600s --blame-hang-dump-type mini --collect:"XPlat Code Coverage" --filter "FullyQualifiedName!~QuestDbIntegrationTests&FullyQualifiedName!~QuestDbWebSocketIntegrationTests&FullyQualifiedName!~QuestDbQueryIntegrationTests"'
publishTestResults: true
condition: ne(variables['osName'], 'Linux')

- task: DotNetCoreCLI@2
displayName: 'Run all tests on $(osName) (net10.0)'
inputs:
command: 'test'
projects: 'src/net-questdb-client-tests/net-questdb-client-tests.csproj'
arguments: '--configuration $(buildConfiguration) --framework net10.0 --no-build --verbosity normal --logger trx --blame-hang --blame-hang-timeout 600s --blame-hang-dump-type mini --filter "FullyQualifiedName!~QuestDbIntegrationTests&FullyQualifiedName!~QuestDbWebSocketIntegrationTests&FullyQualifiedName!~QuestDbQueryIntegrationTests"'
publishTestResults: true

- task: CopyFiles@2
displayName: 'Stage hang dumps + trx ($(osName))'
condition: always()
inputs:
sourceFolder: '$(Agent.TempDirectory)'
contents: |
**/*.dmp
**/*Sequence*.xml
**/*.trx
targetFolder: '$(Build.ArtifactStagingDirectory)/TestArtifacts'

- task: PublishPipelineArtifact@1
displayName: 'Publish hang dumps + trx ($(osName))'
condition: always()
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)/TestArtifacts'
artifact: 'TestArtifacts-$(osName)-$(Build.BuildId)'
publishLocation: 'pipeline'

- task: PublishCodeCoverageResults@2
displayName: 'Publish code coverage'
inputs:
Expand Down
Loading
Loading