Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
6c785de
test(replication): add Solr version to lifecycle matrix
vsimko Nov 4, 2026
0c360b8
test(replication): update docs/api-coverage.md
vsimko Nov 4, 2026
da50267
test(replication): update docs/api-inventory.json
vsimko Nov 4, 2026
770a1ec
test(replication): update docs/compatibility.md
vsimko Nov 4, 2026
fba0329
docs(replication): record lifecycle verification boundary
vsimko Nov 4, 2026
e3934e6
test(replication): register lifecycle integration test
vsimko Nov 4, 2026
154ba70
test(replication): verify leader follower fetch lifecycle
vsimko Nov 4, 2026
0350e6c
test(replication): allow loopback leader URLs in isolated CI Solr
vsimko Nov 4, 2026
2e763c2
test(replication): configure BasicAuth for secure leader fetches
vsimko Nov 4, 2026
1570218
test(replication): pass Solr version to secure integration matrix
vsimko Nov 4, 2026
e062fea
test(replication): allow loopback leader URLs on Solr 10 CI
vsimko Nov 4, 2026
edddceb
test(solrcloud): add opt-in SPLITSHARD and MIGRATE verification
vsimko Nov 4, 2026
f791448
docs(solrcloud): clarify opt-in runtime certification boundary
vsimko Nov 4, 2026
483c41c
test(replication): allow local leader URLs across Solr versions
vsimko Nov 4, 2026
3e99948
test(replication): enable qt dispatch for internal leader fetch
vsimko Nov 4, 2026
769b515
test(replication): use version-specific leader URL form
vsimko Nov 4, 2026
b83f953
docs(replication): clarify version-specific leader URL form (docs/rep…
vsimko Nov 4, 2026
9f9333d
docs(replication): clarify version-specific leader URL form (test/rep…
vsimko Nov 4, 2026
8cb3bb6
docs(replication): clarify version-specific leader URL form (test/rep…
vsimko Nov 4, 2026
3338c6b
types(config): expose request-handler handleSelect (src/types.ts)
vsimko Nov 4, 2026
09cf69b
types(config): expose request-handler handleSelect (test/admin-api-ty…
vsimko Nov 4, 2026
cf7d70e
types(config): expose request-handler handleSelect (docs/config.md)
vsimko Nov 4, 2026
7b1415c
docs(solrcloud): require per-version workflow evidence
vsimko Nov 4, 2026
b3db297
ci: fix duplicate jobs key in opt-in workflow
vsimko Nov 4, 2026
150ceb7
test(replication): reuse numeric Solr major for fetch command
vsimko Nov 4, 2026
648617d
test(replication): configure leader commit replication trigger
vsimko Nov 4, 2026
9c15350
test(replication): use persisted follower credentials for fetch
vsimko Nov 4, 2026
7947995
test(replication): enable qt routing on leader select handler
vsimko Nov 4, 2026
74a083a
docs(replication): explain qt routing prerequisite
vsimko Nov 4, 2026
709ab96
test(replication): retain SearchHandler class when enabling qt dispatch
vsimko Nov 4, 2026
9f9493c
test(replication): register handlers on isolated cores
vsimko Nov 4, 2026
be1c37f
test(replication): enable legacy qt routing on replication handler
vsimko Nov 4, 2026
116a310
docs: keep replication lifecycle evidence pending CI
vsimko Nov 4, 2026
bbd1c0b
docs: qualify pending replication lifecycle verification
vsimko Nov 4, 2026
53cd4a5
docs: document replication lifecycle opt-in limits
vsimko Nov 4, 2026
39d24e8
test(replication): pass explicit leader handler URL and abort stalled…
vsimko Nov 4, 2026
6669a96
docs(replication): use full leader handler URL
vsimko Nov 4, 2026
ac14a67
test(types): use full replication leader URL
vsimko Nov 4, 2026
9226939
test(replication): assert full leader handler URL
vsimko Nov 4, 2026
1b62693
docs: keep replication fetch runtime evidence pending
vsimko Nov 4, 2026
7a0f7a4
docs: keep replication fetch runtime evidence pending
vsimko Nov 4, 2026
543e04b
docs(replication): show fully qualified leader handler URL
vsimko Nov 4, 2026
5244978
test(replication): clarify leader handler URL
vsimko Nov 4, 2026
4634895
docs: distinguish replication matrix from manual cloud workflow
vsimko Nov 4, 2026
b538027
docs(replication): clarify standard CI coverage
vsimko Nov 4, 2026
e40337a
fix(test): route replication qt requests through select handler
vsimko Nov 4, 2026
ecf547c
docs(replication): clarify legacy qt handler routing
vsimko Nov 4, 2026
f2dfb67
docs: fix API coverage table row separator
vsimko Nov 4, 2026
cc6b384
test(replication): enable legacy qt routing for Solr 8
vsimko Nov 4, 2026
4d4dd8b
test(replication): use Solr 9 fetch command
vsimko Nov 4, 2026
455f12d
docs(replication): correct Solr 9 fetch command
vsimko Nov 4, 2026
dba8b1e
docs: correct replication command matrix
vsimko Nov 4, 2026
3845a2d
docs: correct replication command matrix
vsimko Nov 4, 2026
f193c2e
test: remove unnecessary Solr 8 dispatcher override
vsimko Nov 4, 2026
fb8ae0b
test(replication): use fetchindex across pinned Solr versions
vsimko Nov 4, 2026
929d447
docs(replication): standardize fetch commands across Solr versions
vsimko Nov 4, 2026
9f36532
docs: align replication compatibility matrix
vsimko Nov 4, 2026
6ad4471
docs: align replication compatibility matrix
vsimko Nov 4, 2026
9336c68
test(solr): use core URL for replication leader
vsimko Nov 4, 2026
5d9fb34
docs(solr): clarify replication leader URL format
vsimko Nov 4, 2026
2071c90
test(solr): pass replication credentials to fetchindex
vsimko Nov 4, 2026
18076cb
test(solr): type replication fetch auth parameters
vsimko Nov 4, 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
15 changes: 13 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ on:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:
inputs:
enable_destructive_solrcloud_tests:
description: "Run opt-in SPLITSHARD and MIGRATE checks on the disposable two-node cluster"
required: false
default: false
type: boolean
jobs:
test:
strategy:
Expand Down Expand Up @@ -45,7 +52,7 @@ jobs:
--volume "$RUNNER_TEMP/solr-backups:/var/solr/backups" \
--publish 8983:8983 \
--env SOLR_JAVA_MEM="-Xms512m -Xmx512m" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups -Dsolr.disable.shardsWhitelist=true -Dsolr.disable.allowUrls=true -Dsolr.security.allow.urls.enabled=false" \
"solr:${{ matrix.solr-version }}" \
solr-precreate integration
- name: Wait for Solr and integration core
Expand All @@ -67,6 +74,7 @@ jobs:
env:
SOLR_BASE_URL: http://localhost:8983/solr
SOLR_CORE: integration
SOLR_VERSION: "${{ matrix.solr-version }}"
SOLR_BACKUP_LOCATION: /var/solr/backups
- name: Print Solr logs
if: always()
Expand Down Expand Up @@ -124,7 +132,7 @@ jobs:
--volume "$RUNNER_TEMP/solr-backups:/var/solr/backups" \
--publish 8983:8983 \
--env SOLR_JAVA_MEM="-Xms512m -Xmx512m" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups -Dsolr.disable.shardsWhitelist=true -Dsolr.disable.allowUrls=true -Dsolr.security.allow.urls.enabled=false" \
--entrypoint /bin/bash \
"solr:${{ matrix.solr-version }}" \
-lc 'mkdir -p /var/solr/data && cp /tmp/security.json /var/solr/data/security.json && chmod 666 /var/solr/data/security.json && exec docker-entrypoint.sh solr-precreate integration'
Expand All @@ -149,6 +157,7 @@ jobs:
env:
SOLR_BASE_URL: http://localhost:8983/solr
SOLR_CORE: integration
SOLR_VERSION: "${{ matrix.solr-version }}"
SOLR_SECURITY: "true"
SOLR_USERNAME: integration-admin
SOLR_PASSWORD: integration-password
Expand All @@ -158,6 +167,8 @@ jobs:
run: docker logs solr-secure || true

cloud-integration:
env:
SOLR_DESTRUCTIVE_OPT_IN: "${{ github.event_name == 'workflow_dispatch' && inputs.enable_destructive_solrcloud_tests == true && 'true' || 'false' }}"
strategy:
fail-fast: false
matrix:
Expand Down
15 changes: 15 additions & 0 deletions docs/administration.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,18 @@ The alias and cluster-status integration checks exercise alias read-back, collec
The V1 parameter spellings are intentional: this client calls `/solr/admin/collections`, not the Solr 10 V2 `/api/collections` resources. The V2 API maps `split.key` to `splitKey` and `target.collection` to `target`; those V2 names must not be sent through this V1 client.

Reference guides: [Solr 8.1 Collections API](https://archive.apache.org/dist/lucene/solr/ref-guide/apache-solr-ref-guide-8.1.pdf), [Solr 9.2 Collection Management](https://solr.apache.org/guide/solr/9_2/deployment-guide/collection-management.html), [Solr 9.10 Shard Management](https://solr.apache.org/guide/solr/9_10/deployment-guide/shard-management.html), and [Solr 10.0 Collections API](https://solr.apache.org/guide/solr/10_0/configuration-guide/collections-api.html).

## Opt-in SPLITSHARD and MIGRATE verification

These operations are intentionally excluded from normal push/pull-request CI. The opt-in suite uses only collections created by the fixture with unique `integration_*` names. It refuses to run unless all of the following are true:

- `SOLR_CLOUD=true` and `SOLR_MULTINODE=true`.
- `SOLR_DESTRUCTIVE_OPT_IN=true` is explicitly set.
- `SOLR_BASE_URL` resolves to localhost / loopback; remote Solr endpoints are skipped.
- The disposable cluster reports at least two live nodes; the split test additionally confirms its new collection starts with one shard and the migration test confirms the target collection is empty.

Run it from the GitHub Actions **CI** workflow using **Run workflow** and enable `enable_destructive_solrcloud_tests`. This provisions the workflow's ephemeral two-node SolrCloud cluster and runs the opt-in tests for the pinned Solr version matrix. Leaving the input disabled keeps both tests skipped, including on ordinary pull requests.

The tests use asynchronous request IDs and poll `REQUESTSTATUS` for up to 180 seconds, then remove completed status records. They verify active child-shard state and post-split document visibility, and verify that every routed document is searchable in the migration target. They do not claim to test concurrent writes, rollback of a partially completed operation, or recovery after a cluster/node failure.

If a request times out or fails, do not rerun against a reused cluster. Preserve the CI job logs, inspect `CLUSTERSTATUS` and `REQUESTSTATUS`, and discard the ephemeral cluster. Fixture cleanup deletes only the collections it created; if Solr still has an operation in flight and refuses deletion, destroy the ephemeral cluster rather than attempting cleanup against a shared server. The suite is an opt-in verification harness, not permission to point these destructive actions at a user-owned cluster. A workflow that is skipped or has not been manually dispatched is not runtime evidence; record successful Solr versions individually before updating compatibility status. Keep the workflow run URL and tested Solr version alongside the compatibility record.
5 changes: 3 additions & 2 deletions docs/api-coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ A generic request method does not mean that every endpoint has a typed wrapper,
| Core Admin | `coreAdmin(action, params)` with `CoreAdminParams<A>` action-specific models for STATUS, CREATE, RELOAD, UNLOAD, RENAME, SWAP, MERGEINDEXES, and SPLIT; `CoreAdminStatusResponse` for STATUS and `CoreAdminCommandResponse` as the default non-STATUS response envelope | STATUS models per-core paths/config metadata, optional index statistics, initialization failures, and unknown fields. Other actions default to a named extensible response-header envelope; callers may supply a more specific generic. Unit/type fixtures cover minimal and detailed STATUS payloads plus CREATE/RELOAD response inference. Isolated CREATE, STATUS, RELOAD, and fixture-cleanup UNLOAD are integration-tested on Solr 8.11.4/9.11.0/10.1.0; remaining actions retain serialization/type coverage only and are not claimed as runtime-certified. See [Core Admin evidence](administration.md#core-admin-status-response) and Issue #229.
| Collections | `collections(action, params)` with action-specific `CollectionAdminParams<A>` and `CollectionAdminResponse<A>` conditional response contracts | `LIST` uses `SolrCollectionListResponse`; collection lifecycle/policy, replica, and role actions use named extensible response envelopes; alias, cluster, shard, backup/restore, and async actions retain their named response models. Runtime evidence remains partial, not blanket certification of every action: exact Solr 8.11.4/9.11.0/10.1.0 evidence is listed in the [per-action Collections matrix](collections-api-coverage.md). `MODIFYCOLLECTION`, `SPLITSHARD`, `MIGRATE`, `ADDROLE`, and `REMOVEROLE` remain runtime-unverified. See [backup and restore docs](backup-restore.md), [Collections action matrix](collections-api-coverage.md), and Issues #80–#85, #121, and #230. |
| Security | `security(area, command)` | Security-enabled standalone matrix covers anonymous 401 responses for both authentication and authorization, authenticated reads, authentication property mutation/read-back, and malformed JSON rejection on Solr 8.11.4/9.11.0/10.1.0. Unit tests verify Basic/Bearer credentials and Authorization headers are not exposed through client HTTP errors. See Issues #86–#88. |
| System | `systemInfo()`, `systemProperties()`, `systemThreads()`, `systemLogging()` | System info, non-empty JVM/process properties, a non-empty thread dump, and logger metadata are exercised on pinned Solr 8.11.4/9.11.0/10.1.0. Optional fields remain version-dependent; response models preserve unknown fields. See Issues #89 and #91. |\n| Metrics | `metrics()` with typed group/registry/prefix/regex filters; exported `SolrMetricsJsonResponse`, `SolrMetricsRegistry`, and open `SolrMetricValue`; JSON/Prometheus response union | JVM response-format coverage remains distinct (observed JSON on Solr 8/9 and Prometheus exposition on 10.1). A `node` group integration check runs on all pinned versions, asserting a non-empty JSON registry on Solr 8/9 and Prometheus samples on 10.1; registry, prefix, and regex filters are asserted against JSON responses on Solr 8/9 (Solr 10.1 supports Prometheus/OpenMetrics, not the JSON writer). Consumer fixtures verify the extensible registry/value envelope; plugin-specific metrics remain open and unenumerated. See Issues #90, #91, and #236. |
| System | `systemInfo()`, `systemProperties()`, `systemThreads()`, `systemLogging()` | System info, non-empty JVM/process properties, a non-empty thread dump, and logger metadata are exercised on pinned Solr 8.11.4/9.11.0/10.1.0. Optional fields remain version-dependent; response models preserve unknown fields. See Issues #89 and #91. |
| Metrics | `metrics()` with typed group/registry/prefix/regex filters; exported `SolrMetricsJsonResponse`, `SolrMetricsRegistry`, and open `SolrMetricValue`; JSON/Prometheus response union | JVM response-format coverage remains distinct (observed JSON on Solr 8/9 and Prometheus exposition on 10.1). A `node` group integration check runs on all pinned versions, asserting a non-empty JSON registry on Solr 8/9 and Prometheus samples on 10.1; registry, prefix, and regex filters are asserted against JSON responses on Solr 8/9 (Solr 10.1 supports Prometheus/OpenMetrics, not the JSON writer). Consumer fixtures verify the extensible registry/value envelope; plugin-specific metrics remain open and unenumerated. See Issues #90, #91, and #236. |
| Backup and restore | `replication("backup" | "restore" | "restorestatus" | "deletebackup")`, `collections("BACKUP" | "RESTORE" | "LISTBACKUP" | "DELETEBACKUP" | "REQUESTSTATUS" | "DELETESTATUS")` | Typed core and SolrCloud backup/restore parameters and response models, including async status polling. Full core restore and SolrCloud collection backup/restore cycles are integration-tested on Solr 8.11.4/9.11.0/10.1.0 using local filesystem repositories and shared SolrCloud storage. See [backup and restore docs](backup-restore.md). |
| Replication | `replication(command, params)`, `replicationFile(params)`; exported command-specific parameter and response models | V1 ReplicationHandler commands for index version, details, file list, leader/follower control (Solr 10 fetchindex/abortfetch; Solr 8/9 snappull/abort), core backup/restore/status/delete, and raw file-content streaming. Integration coverage includes core backup/restore cycles on Solr 8.11.4/9.11.0/10.1.0. An end-to-end leader/follower fetch cycle is not yet certified. See Issue #95 and [replication docs](replication.md). |
| Replication | `replication(command, params)`, `replicationFile(params)`; exported command-specific parameter and response models | V1 ReplicationHandler commands for index version, details, file list, leader/follower control (fetchindex/abortfetch across Solr 8/9/10), core backup/restore/status/delete, and raw file-content streaming. Integration coverage includes core backup/restore cycles on Solr 8.11.4/9.11.0/10.1.0. A disposable two-core leader/follower fetch/read-back check is implemented but remains pending runtime verification until its pinned-version CI jobs pass; it uses `fetchindex`/`abortfetch` across Solr 8/9/10. Abort and polling lifecycle behavior remains unit-only. See Issue #95 and [replication docs](replication.md). |
| Streaming Expressions | `stream()` | Sends `expr` with `wt=json` and parses the complete JSON response through the shared transport. It is not an incremental tuple-stream parser: no chunk-boundary protocol or memory-bound/backpressure guarantee is claimed. SolrCloud search is integration-tested on pinned Solr 8.11.4/9.11.0/10.1.0; unit tests cover JSON parsing, caller cancellation during body consumption, and cleanup after body-stream errors. See [Streaming Expressions](streaming.md) and Issue #93. |
| Export | `export()`, `exportStream()`; exported `SolrExportParams`, `SolrExportSort`, and `SolrExportFieldType` | Export requests require typed `fl` and `sort` parameters, support repeated filter queries, structured or raw sort expressions, batch sizing, JSON/JavaBin writers, and an explicit custom-parameter escape hatch. The raw Response preserves backpressure-aware streaming; `exportStream()` exposes its byte body directly. Sort fields must be single-valued docValues fields (int, long, float, double, or string); field lists additionally support date and boolean and may be multi-valued. Solr 10.1 `includeStoredFields` support is exposed but requires version-specific verification. Existing raw Export response tests pass on pinned Solr 8.11.4/9.11.0/10.1.0; typed parameter serialization and streamed chunk consumption have unit coverage. See [Export docs](export.md) and Issues #92–#94. |
| Advanced / Raw | `requestRaw(path, options)` with typed method/query/header/body/control options and a raw Fetch `Response` | Relative paths and same-origin absolute URLs use the shared transport. Cross-origin URLs, embedded credentials, and URL fragments are rejected before Fetch, preventing configured credentials from being sent to unrelated hosts. Generic request()/requestRaw() transport behavior has unit coverage only; arbitrary custom endpoint behavior remains unverified until endpoint-specific integration tests exist. See [raw requests](raw-requests.md) and Issue #98. |
Expand Down
Loading
Loading