Цена читающего маршрута: чекпойнт WAL по таймеру и условный запрос
- рядом с воркером свёртки живёт горутина, раз в минуту разбирающая журнал пассивным чекпойнтом; «журнал не разбирается» видно строкой владельцу, а не только по `df`. Признак — пара чисел, а не флаг занятости: тот молчит под удерживаемым читателем (`busy=0` при 6256 страницах и пяти перенесённых), а при занятой блокировке отдаёт `-1` вместо ответа, и `-1 >= -1` читалось бы как «разобрано целиком» - каталог отвечает `304` на `If-None-Match`, не открывая снимок витрины. Метка собрана из всего, от чего зависит ответ: версии витрины (`data_version` с закреплённого соединения плюс поколение — значение локально для соединения и не переживает переоткрытия), горизонта измерения и области действия ресурса. Версия снимается до и после сборки: снятая после пометила бы устаревший снимок свежим номером - предел и дедлайн ответа отложены в задачу Read API точек вместе с измеренной ценой первого запроса; попутно починен флаки-тест чужой задачи, искавший значение точки в сыром буфере записи лога
This commit is contained in:
@@ -58,15 +58,21 @@ iPhone ──HTTPS POST──► healthlog ──► журнал доставо
|
||||
В разработке. Готовы каркас и приём, большая часть разбора: сервис принимает
|
||||
пакеты, складывает их в сырой архив и **разбирает метрики в часовые объекты**
|
||||
— с выводом слоя из данных, канонизацией содержимого и слиянием точек по
|
||||
полноте. Секции, которых разбор пока не покрывает (`workouts`, `stateOfMind` —
|
||||
половина потока), принимаются, хранятся и честно помечаются как неразобранные.
|
||||
полноте. Тренировки и записи со своим `id` (`workouts`, `stateOfMind`) тоже
|
||||
разбираются; секции, которых разбор не покрывает, принимаются, хранятся и
|
||||
честно помечаются как неразобранные.
|
||||
|
||||
Есть и пересборка: `healthlog reindex` проигрывает журнал доставок в свежую
|
||||
витрину и сверяет её отпечаток с накопленной — на живом архиве из 116 тел
|
||||
пересборка воспроизводима и повторный прогон ничего не меняет.
|
||||
|
||||
Чего ещё нет: каталога метрик с измеренным родом агрегации и **read API** —
|
||||
данные наружу пока не отдаются никак. План в [docs/plan.md](docs/plan.md).
|
||||
Первый маршрут чтения открыт: **каталог разрезов** (`GET /api/v1/metrics`) под
|
||||
токеном чтения отдаёт слои с диапазонами и измеренный род агрегации, а повтор
|
||||
неизменившегося отвечает `304` по `ETag` — снимок витрины при этом не
|
||||
открывается. Журнал WAL разбирается фоновым чекпойнтом по таймеру.
|
||||
|
||||
Чего ещё нет: **read API точек**, тренировок и записей — сами данные наружу
|
||||
пока не отдаются. План в [docs/plan.md](docs/plan.md).
|
||||
|
||||
Разведка формата закончена: 50 находок на живом потоке, половина расходится с
|
||||
документацией Health Auto Export — [docs/local-research.md](docs/local-research.md).
|
||||
@@ -132,6 +138,9 @@ task run
|
||||
curl localhost:8080/healthz
|
||||
curl -X POST localhost:8080/api/v1/ingest -d '{"data":{"metrics":[]}}'
|
||||
curl localhost:8080/api/v1/metrics # каталог: слои, диапазоны, род агрегации
|
||||
|
||||
# повтор неизменившегося не стоит ничего: метка из ответа возвращается условием
|
||||
curl -i -H 'If-None-Match: W/"…"' localhost:8080/api/v1/metrics # 304
|
||||
```
|
||||
|
||||
### Подключение телефона по локальной сети
|
||||
|
||||
Reference in New Issue
Block a user