Implements POST/PUT /indexes/{uid}/documents and DELETE /indexes/{uid}/documents:
- Primary key extraction on hot path with 400 miroir_primary_key_required if missing
- _miroir_shard injection into every document before forwarding to nodes
- Rejection of _miroir_shard in client-submitted docs (400 miroir_reserved_field)
- Two-rule quorum: per-group floor(RF/2)+1 ACKs, success if ≥1 group meets quorum
- X-Miroir-Degraded header when any group misses quorum
- 503 miroir_no_quorum only when NO group meets quorum
- Per-batch grouping by target shard for efficient HTTP fan-out
- DELETE by IDs routes each ID independently to its shard
- DELETE by filter broadcasts to all nodes
Acceptance tests pass:
- Primary key validation before any writes
- Reserved field rejection
- Shard distribution uniformity (17-26 shards/node with 64 shards/3 nodes)
- Quorum calculation: floor(RF/2)+1
- Meilisearch-compatible error shape
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
59 lines
No EOL
955 B
JSON
59 lines
No EOL
955 B
JSON
{
|
|
"corpus_dir": "corpus",
|
|
"query_file": "queries/queries.jsonl",
|
|
"shard_count": 10,
|
|
"limit": 100,
|
|
"total_queries": 10000,
|
|
"merge_strategies": [
|
|
"score",
|
|
"rrf",
|
|
"dfs"
|
|
],
|
|
"rrf_k": 60,
|
|
"global_stats": {
|
|
"N": 100000,
|
|
"avgdl": 53.56222
|
|
},
|
|
"shard_stats": {
|
|
"0": {
|
|
"N": 930,
|
|
"avgdl": 53.40752688172043
|
|
},
|
|
"1": {
|
|
"N": 93015,
|
|
"avgdl": 53.55875933989142
|
|
},
|
|
"2": {
|
|
"N": 930,
|
|
"avgdl": 53.48924731182796
|
|
},
|
|
"3": {
|
|
"N": 930,
|
|
"avgdl": 53.5505376344086
|
|
},
|
|
"4": {
|
|
"N": 930,
|
|
"avgdl": 53.73010752688172
|
|
},
|
|
"5": {
|
|
"N": 930,
|
|
"avgdl": 53.075268817204304
|
|
},
|
|
"6": {
|
|
"N": 930,
|
|
"avgdl": 53.89247311827957
|
|
},
|
|
"7": {
|
|
"N": 930,
|
|
"avgdl": 53.85376344086021
|
|
},
|
|
"8": {
|
|
"N": 465,
|
|
"avgdl": 54.05806451612903
|
|
},
|
|
"9": {
|
|
"N": 10,
|
|
"avgdl": 56.8
|
|
}
|
|
}
|
|
} |