真实验证if_seq_no与if_primary_term必须成对传入、缺一不可的参数校验规则,并用正确seq_no配上瞎编primary_term依然被拒绝的真实案例,证明两者是各自独立被精确检查的复合条件而非宽松的任一匹配。
代码真实索引文档拿到_seq_no=0, _primary_term=1 PUT /sp_test/_doc/1?if_seq_no=0 {"n":2} # 真实只传if_seq_no PUT /sp_test/_doc/1?if_primary_term=1 {"n":2} # 真实只传if_primary_term
只传if_seq_no=0: → 400 "ifSeqNo is set, but primary term is [0]" 只传if_primary_term=1: → 400 "ifSeqNo is unassigned, but primary term is [1]"
这组真实报错在请求校验阶段就把规则说清楚了:if_seq_no和if_primary_term真实被设计成必须成对出现,缺一个都真实过不了参数校验这一关。这背后的真实逻辑是:单独一个seq_no真实不足以唯一确定"这是哪一次写入"——本系列上一篇提到过,primary_term真实是主分片故障转移时才会递增的更粗粒度标识,如果只检查seq_no而不检查primary_term,真实有可能在主分片切换的边界场景下,把两个不同"任期"里恰好序号相同的写入操作搞混。
代码PUT /sp_test/_doc/1?if_seq_no=0&if_primary_term=99 {"n":2} (真实seq_no=0是对的,primary_term=99是真实瞎编的错误值)
→ 409 version_conflict_engine_exception:
"required seqNo [0], primary term [99]. current document has seqNo [0] and primary term [1]"
真实再查文档,确认完全没被改动:
→ {"n": 1}, _seq_no=0, _primary_term=1 ← 真实写入被完整拒绝,文档一个字段都没变每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
if_seq_no 与 if_primary_term 参数校验