Upon success the ShardingStateRecovery::recover call tries to cleanup the recovery document and uses majority write concern to do that. This method is called at the end of draining mode, but still under the global X lock and as a result it will never replicate and will stall leaving the draining mode.
Instead, ShardingStateRecovery::recover should use local-only write concern.