Stop modify from falsely returning WT_NOTFOUND when the key exists

XMLWordPrintableJSON

    • Storage Engines - Foundations
    • 213.925
    • SE Foundations - 2026-08-04
    • 5

      Summary

      In disaggregated multi-node testing the leader and follower databases diverge: the two nodes return different results for the same operation, and the run then aborts on a whole-database checksum mismatch.

      Symptom

      While running the disaggregated multi-node format stress tests (format-stress-test-disagg-multi-*), the follower and the leader disagree on the result of an operation:

      • A MODIFY on the follower returns WT_NOTFOUND (-31803) while the leader returns 0 for the same key at the same read timestamp.
      • At the end of the run this manifests as a whole-database checksum mismatch (leader_hash != follower_hash), which aborts both nodes in disagg_sync_multi_node (test/format/format_disagg.c:196).

      Deletes and truncates are disabled in the workload.

      Reproduction

      • Branch: develop (observed on 7ee03cba2c and neighbouring commits).
      • The disagg multi-node validation tasks, on both the stress and ASAN disagg stress variants.
      • The following CONFIG reproduces reliably (about 50% of multi-node tasks fail):
        • ############################################
          #  RUN PARAMETERS: V3
          ############################################
          assert.read_timestamp=0
          background_compact=0
          background_compact.free_space_target=40
          backup=0
          backup.incremental=off
          backup.incr_granularity=10259
          backup.live_restore=0
          backup.live_restore_read_size=8192
          backup.live_restore_threads=9
          block_cache=0
          block_cache.cache_on_checkpoint=1
          block_cache.cache_on_writes=0
          block_cache.size=44
          btree.reverse=0
          cache=3072
          cache.evict_max=5
          cache.eviction_dirty_target=0
          cache.eviction_dirty_trigger=0
          cache.eviction_updates_target=0
          cache.eviction_updates_trigger=0
          cache.minimum=0
          cache.maximum=0
          checkpoint=on
          checkpoint.log_size=146
          checkpoint.wait=75
          checkpoint_threads=1
          compact.free_space_target=78
          debug.background_compact=0
          debug.checkpoint_retention=2
          debug.cursor_reposition=0
          debug.disagg_slow_truncate_follower=0
          debug.eviction=0
          debug.log_retention=7
          debug.realloc_exact=0
          debug.realloc_malloc=0
          debug.slow_checkpoint=0
          debug.slow_truncate=0
          debug.table_logging=0
          debug.update_restore_evict=0
          disagg.internal_page_delta=1
          disagg.leaf_page_delta=1
          disagg.multi=1
          disagg.multi_validation=1
          disagg.enabled=1
          disagg.layered=1
          disagg.mode=leader
          disagg.page_log=palite
          disagg.key_provider=2
          disagg.page_log.verbose=0
          disagg.drain_threads=11
          disagg.preserve=1
          disagg.stepdown_async=0
          disk.data_extend=0
          disk.encryption=rotn-7
          disk.mmap=1
          disk.mmap_all=0
          eviction.evict_use_softptr=0
          file_manager.close_handle_minimum=14
          file_manager.close_idle_time=33
          file_manager.close_scan_interval=26
          format.abort=0
          format.independent_thread_rng=0
          format.major_timeout=0
          import=0
          logging=0
          logging.compression=none
          logging.file_max=191044
          logging.prealloc=1
          logging.remove=0
          obsolete_cleanup.method=off
          obsolete_cleanup.wait=3133
          ops.alter=0
          ops.compaction=0
          ops.hs_cursor=1
          ops.pct.delete=0
          ops.bound_cursor=0
          ops.prepare=0
          ops.reserve=1
          ops.random_cursor=1
          ops.salvage=0
          ops.throttle=0
          ops.throttle.sleep_us=124755
          ops.verify=1
          prefetch=1
          prefetch.default=0
          precise_checkpoint=1
          preserve_prepared=1
          quiet=1
          random.data_seed=5947916
          random.extra_seed=15179692
          rollback_to_stable_threads=10
          runs.in_memory=0
          runs.ops=500000
          runs.predictable_replay=1
          runs.source=layered
          runs.tables=3
          runs.threads=13
          runs.timer=360
          runs.type=row-store
          runs.verify_failure_dump=0
          statistics.mode=fast
          statistics_log.sources=off
          stress.aggressive_stash_free=0
          stress.aggressive_sweep=0
          stress.checkpoint=0
          stress.checkpoint_evict_page=0
          stress.checkpoint_prepare=0
          stress.compact_slow=0
          stress.evict_reposition=0
          stress.failpoint_eviction_split=1
          stress.failpoint_hs_delete_key_from_ts=0
          stress.failpoint_rec_before_wrapup=0
          stress.hs_checkpoint_delay=0
          stress.hs_search=0
          stress.hs_sweep=0
          stress.prefetch_delay=0
          stress.prepare_resolution_1=0
          stress.sleep_before_read_overflow_onpage=0
          stress.split_1=1
          stress.split_2=0
          stress.split_3=0
          stress.split_4=0
          stress.split_5=0
          stress.split_6=0
          stress.split_7=0
          stress.split_8=0
          tiered_storage.flush_frequency=0
          tiered_storage.storage_source=off
          transaction.implicit=0
          transaction.operation_timeout_ms=2000
          transaction.timestamps=1
          wiredtiger.config=off
          wiredtiger.rwlock=1
          wiredtiger.leak_memory=0
          ############################################
          #  TABLE PARAMETERS: table 1
          ############################################
          table1.btree.compression=none
          table1.btree.dictionary=0
          table1.btree.internal_key_truncation=1
          table1.btree.internal_page_max=9
          table1.btree.key_max=120
          table1.btree.key_min=19
          table1.btree.leaf_page_max=14
          table1.btree.memory_page_max=6
          table1.btree.prefix_len=0
          table1.btree.prefix_compression=1
          table1.btree.prefix_compression_min=8
          table1.btree.split_pct=56
          table1.btree.value_max=2946
          table1.btree.value_min=12
          table1.disk.checksum=off
          table1.disk.firstfit=0
          table1.ops.pareto=0
          table1.ops.pareto.skew=16
          table1.ops.pct.insert=7
          table1.ops.pct.modify=10
          table1.ops.pct.read=58
          table1.ops.pct.write=25
          table1.ops.truncate=0
          table1.runs.mirror=0
          table1.runs.rows=427354
          ############################################
          #  TABLE PARAMETERS: table 2
          ############################################
          table2.btree.compression=none
          table2.btree.dictionary=0
          table2.btree.internal_key_truncation=1
          table2.btree.internal_page_max=11
          table2.btree.key_max=60
          table2.btree.key_min=17
          table2.btree.leaf_page_max=13
          table2.btree.memory_page_max=5
          table2.btree.prefix_len=0
          table2.btree.prefix_compression=1
          table2.btree.prefix_compression_min=0
          table2.btree.split_pct=66
          table2.btree.value_max=2151
          table2.btree.value_min=10
          table2.disk.checksum=unencrypted
          table2.disk.firstfit=0
          table2.ops.pareto=0
          table2.ops.pareto.skew=30
          table2.ops.pct.insert=5
          table2.ops.pct.modify=0
          table2.ops.pct.read=89
          table2.ops.pct.write=6
          table2.ops.truncate=0
          table2.runs.mirror=0
          table2.runs.rows=862867
          ############################################
          #  TABLE PARAMETERS: table 3
          ############################################
          table3.btree.compression=none
          table3.btree.dictionary=0
          table3.btree.internal_key_truncation=1
          table3.btree.internal_page_max=16
          table3.btree.key_max=128
          table3.btree.key_min=27
          table3.btree.leaf_page_max=12
          table3.btree.memory_page_max=9
          table3.btree.prefix_len=0
          table3.btree.prefix_compression=1
          table3.btree.prefix_compression_min=2
          table3.btree.split_pct=80
          table3.btree.value_max=2975
          table3.btree.value_min=18
          table3.disk.checksum=unencrypted
          table3.disk.firstfit=0
          table3.ops.pareto=0
          table3.ops.pareto.skew=13
          table3.ops.pct.insert=3
          table3.ops.pct.modify=78
          table3.ops.pct.read=19
          table3.ops.pct.write=0
          table3.ops.truncate=0
          table3.runs.mirror=0
          table3.runs.rows=491757 

        1. repro-only.patch
          35 kB
          Alexander Pullen
        2. WT-18173-FINDINGS.md
          40 kB
          Alexander Pullen

            Assignee:
            Alexander Pullen
            Reporter:
            Alexander Pullen
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: