Цена читающего маршрута: чекпойнт WAL по таймеру и условный запрос
- рядом с воркером свёртки живёт горутина, раз в минуту разбирающая журнал пассивным чекпойнтом; «журнал не разбирается» видно строкой владельцу, а не только по `df`. Признак — пара чисел, а не флаг занятости: тот молчит под удерживаемым читателем (`busy=0` при 6256 страницах и пяти перенесённых), а при занятой блокировке отдаёт `-1` вместо ответа, и `-1 >= -1` читалось бы как «разобрано целиком» - каталог отвечает `304` на `If-None-Match`, не открывая снимок витрины. Метка собрана из всего, от чего зависит ответ: версии витрины (`data_version` с закреплённого соединения плюс поколение — значение локально для соединения и не переживает переоткрытия), горизонта измерения и области действия ресурса. Версия снимается до и после сборки: снятая после пометила бы устаревший снимок свежим номером - предел и дедлайн ответа отложены в задачу Read API точек вместе с измеренной ценой первого запроса; попутно починен флаки-тест чужой задачи, искавший значение точки в сыром буфере записи лога
This commit is contained in:
@@ -176,9 +176,19 @@ func TestFoldНесравнимыеНаборыДаютWarn(t *testing.T) {
|
||||
t.Errorf("координаты объекта в записи не те: %q", at)
|
||||
}
|
||||
// И ни одного значения точки: данные о здоровье чувствительнее токенов.
|
||||
//
|
||||
// Метка времени из проверки исключается, и это не поблажка: она содержит
|
||||
// доли секунды, поэтому подстрока вроде "5.1" находится в ней примерно раз
|
||||
// на сотню прогонов — тест краснел от хода часов, а не от утечки. Проверять
|
||||
// надо запись без служебного поля, которое значений нести не может.
|
||||
delete(rec, "time")
|
||||
clean, err := json.Marshal(rec)
|
||||
if err != nil {
|
||||
t.Fatalf("запись лога не сериализуется: %v", err)
|
||||
}
|
||||
for _, secret := range []string{"5.1", "До еды"} {
|
||||
if strings.Contains(buf.String(), secret) {
|
||||
t.Errorf("в логе оказалось значение точки %q:\n%s", secret, buf.String())
|
||||
if strings.Contains(string(clean), secret) {
|
||||
t.Errorf("в логе оказалось значение точки %q:\n%s", secret, clean)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user