tarantool-php / client

PHP client for Tarantool.
MIT License
67 stars 22 forks source link

Unexpected response received: expected sync #974229717, got #429377306. #64

Closed AidynMakhataev closed 5 years ago

AidynMakhataev commented 5 years ago

Мы недавно обновили версию tarantool до 2.2 и также обновили php-client до 0.6. После этого апдейта периодически начали всплывать такие ошибки. Можете, пожалуйста, помочь с этим вопросом, так и не разобрались из за чего она. В клиентском коде, идет проверка на существование записи а потом непосредственно сама запись в базу.

image

Настройки инстанса тарантула

box.cfg {
    listen = config.tarantool.port;
    background = true;
    work_dir = dirLog;
    io_collect_interval = nil;
    readahead = 16320;
    memtx_memory = 2048 * 1024 * 1024; -- 2GB
    memtx_min_tuple_size = 16;
    memtx_max_tuple_size = 1 * 1024 * 1024; -- 1Mb
    vinyl_memory = 128 * 1024 * 1024; -- 128Mb
    vinyl_cache = 128 * 1024 * 1024; -- 128Mb
    wal_mode = "fsync";
    wal_max_size = 256 * 1024 * 1024;
    checkpoint_interval = 60 * 60; -- one hour
    checkpoint_count = 6;
    snap_io_rate_limit = nil;
    force_recovery = true;
    log_level = 5;
    too_long_threshold = 0.5;
    log = dirLog .. 'logs.log';
    pid_file = dirLog .. 'tarantool.pid';
}

в логах тарантула

2019-11-15 13:56:49.705 [29611] main txn.c:446 W> too long WAL write: 1 rows at LSN 1609493: 0.565 sec
rybakit commented 5 years ago

Эта ошибка означает, что клиент получил ответ от сервера, но не на тот запрос, который он отправлял. Так может случиться, например, когда у вас персистентное соединение, клиент шлет запрос, не успевает вычитать ответ и умирает. В следующий раз он снова шлет запрос, но сервер ему вернет ответ, который он не успел вычитать в предыдущий раз. В этом случае выбросится исключение UnexpectedResponse. В вашем случае, возможно, причина в таймауте (о чем косвенно свидетельствует too long WAL write в логе тарантула). Если клиент не успел вычитать ответ за определенное таймаутом время, и если вы используете RetryMiddlewere, клиент попытается повторить запрос и, опять же, получит предыдущий, не отправленный в прошлый раз ответ от сервера. В версиях клиента < 0.6 такие ошибки не всплывали потому, что проверки на соответствие ответа запросу просто не было.

Я подозреваю, что если вы решите проблему с too long WAL write, эти ошибки тоже уйдут. Чтобы проверить мою догадку, попробуйте временно отключить RetryMiddlewere — вы должны увидеть CommunicationFailed исключения вместо UnexpectedResponse, в этом случае увеличьте значение socket_timeout.

AidynMakhataev commented 5 years ago

Спасибо за развернутый ответ, проблема решилась исправлением ошибки

too long WAL write