Skip to content

Match OpenSearch shard routing in pull-ingestion IndexRouter#7013

Open
srikanthpadakanti wants to merge 3 commits into
opensearch-project:mainfrom
srikanthpadakanti:fix/pull-ingestion-murmur3-shard-routing-6993-public
Open

Match OpenSearch shard routing in pull-ingestion IndexRouter#7013
srikanthpadakanti wants to merge 3 commits into
opensearch-project:mainfrom
srikanthpadakanti:fix/pull-ingestion-murmur3-shard-routing-6993-public

Conversation

@srikanthpadakanti

@srikanthpadakanti srikanthpadakanti commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

Description

The pull-ingestion IndexRouter computed the Murmur3 hash over UTF-8 bytes, but OpenSearch's Murmur3HashFunction.hash(String) hashes UTF-16 little-endian bytes, so documents could be routed to a different partition than the shard OpenSearch places them on. The shard calculation also used floorMod(hash, numberOfShards) instead of OpenSearch's floorMod(hash, routingNumShards) / routingFactor, diverging whenever number_of_routing_shards differs from number_of_shards.

Hash the UTF-16 little-endian bytes, source number_of_routing_shards from the index settings (falling back to number_of_shards), and scale by routingFactor so partition assignment matches OpenSearch's OperationRouting.generateShardId. Adds a cross-check against OpenSearch's authoritative Murmur3HashFunction known values and known-answer shard tests.

Issues Resolved

Resolves #6993

Check List

  • [ X ] New functionality includes testing.
  • New functionality has a documentation issue. Please link to it in this PR.
  • [ X ] New functionality has javadoc added
  • [ X ] Commits are signed with a real name per the DCO

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

The pull-ingestion IndexRouter computed the Murmur3 hash over UTF-8 bytes,
but OpenSearch's Murmur3HashFunction.hash(String) hashes UTF-16 little-endian
bytes, so documents could be routed to a different partition than the shard
OpenSearch places them on. The shard calculation also used
floorMod(hash, numberOfShards) instead of OpenSearch's
floorMod(hash, routingNumShards) / routingFactor, diverging whenever
number_of_routing_shards differs from number_of_shards.

Hash the UTF-16 little-endian bytes, source number_of_routing_shards from the
index settings (falling back to number_of_shards), and scale by routingFactor
so partition assignment matches OpenSearch's OperationRouting.generateShardId.
Adds a cross-check against OpenSearch's authoritative Murmur3HashFunction known
values and known-answer shard tests.

Resolves opensearch-project#6993

Signed-off-by: Srikanth Padakanti <srikanth_padakanti@apple.com>
…index settings

Signed-off-by: Srikanth Padakanti <srikanth_padakanti@apple.com>
@srikanthpadakanti

Copy link
Copy Markdown
Collaborator Author

Hello @kkondaka @dlvenable Please review this.

…ngFactor, unify parsing, strengthen test

Signed-off-by: Srikanth Padakanti <srikanth_padakanti@apple.com>
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.

[BUG] Pull-ingestion IndexRouter murmur3 hash does not match OpenSearch shard routing

2 participants