Цена читающего маршрута: чекпойнт WAL по таймеру и условный запрос
- рядом с воркером свёртки живёт горутина, раз в минуту разбирающая журнал пассивным чекпойнтом; «журнал не разбирается» видно строкой владельцу, а не только по `df`. Признак — пара чисел, а не флаг занятости: тот молчит под удерживаемым читателем (`busy=0` при 6256 страницах и пяти перенесённых), а при занятой блокировке отдаёт `-1` вместо ответа, и `-1 >= -1` читалось бы как «разобрано целиком» - каталог отвечает `304` на `If-None-Match`, не открывая снимок витрины. Метка собрана из всего, от чего зависит ответ: версии витрины (`data_version` с закреплённого соединения плюс поколение — значение локально для соединения и не переживает переоткрытия), горизонта измерения и области действия ресурса. Версия снимается до и после сборки: снятая после пометила бы устаревший снимок свежим номером - предел и дедлайн ответа отложены в задачу Read API точек вместе с измеренной ценой первого запроса; попутно починен флаки-тест чужой задачи, искавший значение точки в сыром буфере записи лога
This commit is contained in:
@@ -169,7 +169,7 @@ func measureStyles(t *testing.T, st *store.Store) {
|
||||
t.Helper()
|
||||
|
||||
started := time.Now()
|
||||
metrics, err := catalog.New(st, slog.New(slog.DiscardHandler)).Metrics(context.Background())
|
||||
metrics, err := metricsOf(context.Background(), catalog.New(st, slog.New(slog.DiscardHandler)))
|
||||
if err != nil {
|
||||
t.Fatalf("каталог: %v", err)
|
||||
}
|
||||
@@ -291,3 +291,10 @@ func gunzip(t *testing.T, body []byte) []byte {
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// metricsOf — список метрик каталога без версии витрины: версию проверяют
|
||||
// отдельные тесты, остальным нужен только состав ответа.
|
||||
func metricsOf(ctx context.Context, s *catalog.Service) ([]catalog.Metric, error) {
|
||||
snap, err := s.Metrics(ctx)
|
||||
return snap.Metrics, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user