Цена читающего маршрута: чекпойнт WAL по таймеру и условный запрос
- рядом с воркером свёртки живёт горутина, раз в минуту разбирающая журнал пассивным чекпойнтом; «журнал не разбирается» видно строкой владельцу, а не только по `df`. Признак — пара чисел, а не флаг занятости: тот молчит под удерживаемым читателем (`busy=0` при 6256 страницах и пяти перенесённых), а при занятой блокировке отдаёт `-1` вместо ответа, и `-1 >= -1` читалось бы как «разобрано целиком» - каталог отвечает `304` на `If-None-Match`, не открывая снимок витрины. Метка собрана из всего, от чего зависит ответ: версии витрины (`data_version` с закреплённого соединения плюс поколение — значение локально для соединения и не переживает переоткрытия), горизонта измерения и области действия ресурса. Версия снимается до и после сборки: снятая после пометила бы устаревший снимок свежим номером - предел и дедлайн ответа отложены в задачу Read API точек вместе с измеренной ценой первого запроса; попутно починен флаки-тест чужой задачи, искавший значение точки в сыром буфере записи лога
This commit is contained in:
@@ -45,3 +45,12 @@ func Transient(err error) bool {
|
||||
}
|
||||
return errors.Is(err, context.Canceled) || errors.Is(err, ErrBusy)
|
||||
}
|
||||
|
||||
// ErrClosed — хранилище закрыто, и заводить новые соединения к нему поздно.
|
||||
//
|
||||
// Отдельная ошибка, а не общая: запрос версии витрины и остановка сервиса идут
|
||||
// в разных горутинах, и запрос, успевший в это окно, обязан получить отказ, а
|
||||
// не открыть базу заново. Соединение, открытое после закрытия пула, оставило бы
|
||||
// последним себя — SQLite не сделал бы финальный чекпойнт, и рядом с базой
|
||||
// остался бы неразобранный `-wal`.
|
||||
var ErrClosed = errors.New("хранилище закрыто")
|
||||
|
||||
Reference in New Issue
Block a user