Skip to content

OAK-12249: lazy ES index provisioning — skip creation for empty reindex - #3085

Open
bhabegger wants to merge 2 commits into
apache:trunkfrom
oak-indexing:OAK-12249-lazy-provisioning
Open

OAK-12249: lazy ES index provisioning — skip creation for empty reindex#3085
bhabegger wants to merge 2 commits into
apache:trunkfrom
oak-indexing:OAK-12249-lazy-provisioning

Conversation

@bhabegger

Copy link
Copy Markdown
Contributor

Summary

  • Defers provisionIndex() from the ElasticIndexWriter constructor to the first updateDocument(), deleteDocumentTree(), or deleteDocument() call when both FT_OAK-12249 and FT_OAK-12248 are enabled
  • A reindex that produces zero documents never creates an Elasticsearch index or alias, eliminating the empty-index problem described in OAK-12249
  • ensureProvisioned() handles the incremental-write-after-empty-reindex case: if an alias does not exist when the first document arrives, it creates a new backing index with a fresh seed and points the alias at it

Dependency on OAK-12248

OAK-12248 (#2950, graceful 404 handling) has merged to trunk. This branch is rebased on top of it.

The runtime dependency remains: isLazyProvisioningActive() returns true only when both FT_OAK-12249 and FT_OAK-12248 are enabled. Enabling FT_OAK-12249 alone falls back to eager provisioning and logs a WARN.

Tests

Three new unit tests in ElasticIndexWriterTest:

  • lazyProvisioning_requiresGraceful404Toggle — asserts lazy provisioning is inactive when OAK-12248 toggle is off
  • emptyReindex_doesNotCreateEsIndex — verifies no ES index is created during construction when no documents are written
  • nonEmptyReindex_provisionsOnFirstDocument — verifies provisionIndex() is called on the first updateDocument() and not before

All 11 tests in ElasticIndexWriterTest pass; full oak-search-elastic suite (514 tests) passes.

Note

Supersedes #2955, opened from #2955 (bhabegger/jackrabbit-oak), moved to this fork to pick up CI.

Jira

https://issues.apache.org/jira/browse/OAK-12249

bhabegger and others added 2 commits August 18, 2026 15:34
When FT_OAK-12249 and FT_OAK-12248 are both enabled, ElasticIndexWriter
defers provisionIndex() from the constructor to the first updateDocument()
or deleteDocuments() call. A reindex that produces zero documents never
creates an Elasticsearch index or alias, eliminating the empty-index
problem described in OAK-12249.

Deployment order is enforced at runtime: isLazyProvisioningActive() returns
true only when both toggles are on. Enabling FT_OAK-12249 alone logs a WARN
and falls back to eager provisioning, preventing 404 errors on query paths
that lack graceful 404 handling.

ensureProvisioned() handles the incremental-write-after-empty-reindex case:
if an alias does not exist when the first document arrives, it creates a new
backing index with a fresh seed and points the alias at it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FulltextIndexWriter.deleteDocuments(path) was split into
deleteDocumentTree(path)/deleteDocument(path) by OAK-12244, merged to
trunk after this branch was cut. LazyElasticIndexWriter now implements
both, delegating to the real ElasticIndexWriter.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@bhabegger
bhabegger force-pushed the OAK-12249-lazy-provisioning branch from 2a59d7b to 7cc43b2 Compare August 18, 2026 13:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant