ActivateSnapshot checks that the mempool is empty before it starts, but PopulateAndValidateSnapshot then runs without cs_main, which takes minutes on mainnet. A transaction entering the mempool in that window (e.g. through sendrawtransaction) hits the assert in AddChainstate:
Assertion failed: (!prev_chainstate.m_mempool || prev_chainstate.m_mempool->size() == 0), function AddChainstate, file validation.cpp, line 6201.
By then the base blockhash file has been written, so the node needs -reindex to start again.
This sets a flag on ChainstateManager while ActivateSnapshot runs, and AcceptToMemoryPool and ProcessNewPackage reject with snapshot-loading while it's set. testmempoolaccept still works. A second loadtxoutset started while one is running is also rejected.
test_mempool_blocked_during_load in feature_assumeutxo.py pauses the load through a FIFO, checks that sendrawtransaction and submitpackage are rejected and the mempool stays empty, then lets the load finish. On master the transaction is accepted and the node aborts. The test is skipped where os.mkfifo isn't available.