Skip to content

Documentation on user SID and trace ID in changefeeds#33

Open
maximyurchuk wants to merge 209 commits into
main-for-38890from
pr-38890
Open

Documentation on user SID and trace ID in changefeeds#33
maximyurchuk wants to merge 209 commits into
main-for-38890from
pr-38890

Conversation

@maximyurchuk

Copy link
Copy Markdown
Owner

Changelog category

  • Documentation (changelog entry is not required)

Description for reviewers

Add documentation on new features

robot-piglet and others added 30 commits April 23, 2026 09:01
commit_hash:c062515add9726c9047ad91eb0449af5191da85b
commit_hash:db2f26ac6d01d9245899287496f1651c2f627a5d
commit_hash:c4f32aac4b251cfb981bc2549522fa92881ae370
commit_hash:84610a30b17de408952f5c68dbc32b18b753b247
commit_hash:2b3c252afc470f808af644051444907eddc53c04
commit_hash:625ceb4265c5726142530e6f3b93afc9be9d414c
Пытаюсь исправить работу native type flags:

- Исправления в TYqlRowSpecInfo:
  * При создании новых таблиц (SetType) - сразу выставляем нужные флаги согласно типу вместо усечения NTCF\_ALL на поздних этапах
    * Сделал прагму NativeYtTypeCompatibility static per cluster
  * При чтении \_yql\_row\_spec существующих таблиц - игнорируем записанное значение флагов, вместо этого выводим его из нативной схемы
- Пишем правильные флаги \_yql\_row\_spec выходных таблиц (в зависимости от текущих  NativeYtTypeCompatibility)
- Обновил логику в оптимизаторах насчет выравнивания флагов
- Убрал использование NTCF\_VOID и NTCF\_NULL для консистентности чтения/записи флагов (они и так всегда native, при чтении старый формат распознается)
  - Исправил Skiff схему для этих типов для соответствия поведению кодека (раньше каким-то чудом не стреляло)
commit_hash:4a744866861591f9ba4a92c515cf33cfb88fb0a8
commit_hash:a201cbc3a08b7bad471d4d6a15f3dfc3f63d989b
commit_hash:474f329b97ed122a419ae33de5799b287843797f
Type: fix
Component: query-tracker

---

Pull Request resolved: ytsaurus/ytsaurus#1693

Co-authored-by: Tony-Romanov <150126326+Tony-Romanov@users.noreply.github.com>
commit_hash:cd901fca4f968331b640672bda30898cb0fd67ce
commit_hash:08873d6b3d108d8d10d4df42250ddb760af7c85b
commit_hash:1f8dfd3ac360038ab7338c385fc4b9d18f93fdc5
…areInvokerQueue

`InversedWeight` was set to `ceil(UnitWeight * weight)` but the field comment
and semantics require `ceil(UnitWeight / weight)` — a heavier bucket should
have a smaller inversed weight so it is penalized less. Also guards against
zero weight by falling back to `UnitWeight`, and clamps the result to at
least 1.
commit_hash:358839f4b0deed4b13f1bdd18e8a8e053d347e2f
commit_hash:076e0cbc7339af774aa7d0607676ca512ac298ac
Добавил либу pytest-asynctio v1.3.0 в проектный контриб, так как в общем контрибе ее оказалось слишком дорого обновлять.
commit_hash:5156c890041ea1f9ec49ded5ee0645f2f31b35f4
This reverts commit 0d6627860643042ada733ebe39d017d97ab26515, reversing
changes made to b72ffe70e1f91ea4b9c8beb0728934372ada078f.

Revert " Enable support Go 1.25 coverage per package"

This reverts commit 0d6627860643042ada733ebe39d017d97ab26515, reversing
changes made to b72ffe70e1f91ea4b9c8beb0728934372ada078f.
commit_hash:f967bc7221ff187b501d37d4ba235b12393ee7f7
… code

commit_hash:6591570b89e8d857bed3dbd9da5e813a0b6a651a
commit_hash:c9efcc80ce50d6cc78a55c5f0a73596fdb28e1f6
* Changelog entry
  Type: fix
  Component: cpp-sdk

Create trace\_id on client side
commit_hash:270019c138bed296ed934649a0b157f514fca0cb
commit_hash:bab9209e214501e0c3b701d2f7a2a78fd0b079fd
commit_hash:f816818f157d5b058712a5b88ba4889829ecf0b8
commit_hash:1df628420d0447df8d593dcaf3527cb88741fdf3
commit_hash:0d56ad553d98fc8a8c41a2361de6de85adf0bcc1
Lineage in the added test:

```
"Lineage" = {
    "key_filtered" = [
        {
            "Input" = 1;
            "Field" = "key";
            "Transforms" = #
        }
    ]
}
```
commit_hash:5683541e0408a82bdf17b1c39e85f2aec1aab282
Unified Agent: новый протокол стриминга и изменения в клиенте

Документ опирается на `library/cpp/unified_agent_client/proto/unified_agent.proto` и реализацию `TClientSession` в `client_impl.cpp`.

---

## 1. Новый протокол

**Legacy** — сессия без согласования версии: в ответе `Initialized` поле `protocol_version` отсутствует или равно **0**. Поведение соответствует старому контракту до появления опциональных полей согласования.

**Версионированный режим (v1 и выше)** — клиент объявляет максимально поддерживаемую версию (`accept_protocol_version`), агент возвращает **согласованную** версию `protocol_version` и опционально **opaque**-токен привязки сессии. Дальнейшие реконнекты с тем же `session_id` требуют передачи **доказательства** привязки (`session_binding_proof`), чтобы сервер мог отличить легитимное продолжение от подмены.

Семантика потока данных не меняется: после `Initialized` идут `DataBatch` / `Ack`, ретраи по `seq_no` и дедупликация на стороне агента при совпадении `session_id` и повторной отправке записей.

---

### 1.2. Новые поля

**Запрос `Request.Initialize`**

| Поле | Тип | Назначение |
|------|-----|------------|
| `accept_protocol_version` | `optional uint32` | Верхняя граница версии, которую клиент готов использовать (стиль HTTP Accept). **Не задано или 0** — клиент не предлагает новый протокол (legacy-only). |
| `session_binding_proof` | `bytes` | Доказательство привязки при реконнекте; используется, когда согласована версия **> 0** и у клиента есть токен от предыдущего `Initialized`. |

Поля `session_id`, `meta`, `shared_secret_key` — как раньше; `session_id` при реконнекте передаётся для дедупликации.

**Ответ `Response.Initialized`**

| Поле | Тип | Назначение |
|------|-----|------------|
| `protocol_version` | `optional uint32` | Согласованная версия: **min**(accept клиента, максимум сервера). **Не задано или 0** — сессия считается **legacy**. |
| `session_binding_token` | `bytes` | Непрозрачный токен: клиент обязан вернуть его в следующем `Initialize` как `session_binding_proof` при переподключении (для версий протокола **≥ 1**). |

Остальное без изменений: `session_id`, `last_seq_no`.

---

### 1.3. Процесс и логика выбора версии

1. Клиент задаёт **`MaxAcceptProtocolVersion`** (в коде: `SetMaxAcceptProtocolVersion`). Значение **0** означает: поле `accept_protocol_version` в `Initialize` **не отправляется** — только legacy.
2. Если `MaxAcceptProtocolVersion > 0`, в первом (и последующих) сообщении `Initialize` выставляется `accept_protocol_version = MaxAcceptProtocolVersion`.
3. Агент вычисляет согласованную версию как **min**(`accept_protocol_version`, собственный потолок поддерживаемых версий) и возвращает её в `Initialized.protocol_version`. Если клиент не прислал accept (legacy-only) или сервер отвечает **0** / не задаёт поле — на клиенте фиксируется **legacy** (`NegotiatedProtocol` сбрасывается).
4. При успешном `Initialized` с **`protocol_version > 0`** клиент сохраняет число версии в `NegotiatedProtocol` и копирует `session_binding_token` во внутреннее состояние для следующих коннектов.

#### Диаграмма обмена (Mermaid sequence)

Первое подключение с согласованием версии и привязкой:

```mermaid
sequenceDiagram
    participant C as Клиент (TClientSession)
    participant G as gRPC stream
    participant A as Unified Agent

    C->>G: открыть Session(stream Request / stream Response)
    C->>A: Request.initialize<br/>accept_protocol_version = N (если N>0)<br/>session_id (опц.)<br/>meta, shared_secret_key, …

    Note over A: min(N, server_max) → negotiated

    A->>C: Response.initialized<br/>session_id<br/>last_seq_no<br/>protocol_version = negotiated<br/>session_binding_token (opaque)

    C->>C: сохранить NegotiatedProtocol,<br/>SessionBindingToken, SessionId

    loop Данные
        C->>A: Request.data_batch (seq_no, payload, …)
        A->>C: Response.ack (seq_no)
    end

    Note over C,A: обрыв стрима → реконнект
```

Реконнект при согласованной версии **> 0**:

```mermaid
sequenceDiagram
    participant C as Клиент
    participant A as Unified Agent

    C->>A: Request.initialize<br/>session_id = сохранённый<br/>accept_protocol_version = N<br/>session_binding_proof = прежний token<br/>…

    A->>C: Response.initialized<br/>session_id, last_seq_no,<br/>protocol_version, session_binding_token (может обновиться)

    C->>A: Request.data_batch …
```

---

### 1.4. Восстановление сессии и обмен ключами

- **Идентификатор сессии:** `session_id` приходит от сервера в `Initialized` и дальше передаётся в `Initialize` при реконнекте — основа для дедупликации и продолжения с теми же `seq_no`.
- **Shared secret:** по-прежнему `shared_secret_key` в `Initialize` (если задан в параметрах клиента) — отдельный канал авторизации/проверки, не смешивается с биндингом стрима.
- **Привязка сессии (protocol v1+):** после первого успешного `Initialized` с `protocol_version > 0` клиент хранит `session_binding_token`. При следующем `PrepareInitializeRequest`, если есть `NegotiatedProtocol > 0` и непустой токен, в запрос кладётся `session_binding_proof` (содержимое токена). Так сервер связывает новый gRPC-стрим с прежней логической сессией.
- **Конфликт сессии:** при завершении gRPC-вызова с кодом **`ALREADY_EXISTS`** клиент **сбрасывает** `SessionId`, `NegotiatedProtocol` и `SessionBindingToken`, чтобы следующий коннект не повторял конфликтующий идентификатор и не слал устаревшее proof (см. `OnGrpcCallFinished` в `client_impl.cpp`).

---

### 1.5. Совместимость клиентов и серверов

| Клиент | Сервер | Результат |
|--------|--------|-----------|
| `MaxAcceptProtocolVersion = 0` | любой | Поле `accept_protocol_version` не отправляется; ожидается legacy-ответ (`protocol_version` 0 / отсутствует). Биндинг по токену не используется. |
| `MaxAcceptProtocolVersion > 0` | только legacy | Обычно `protocol_version` в ответе 0 или отсутствует — клиент остаётся в legacy для этой сессии. |
| `MaxAcceptProtocolVersion > 0` | поддерживает v1+ | Согласуется конкретное число (например 1); включаются `session_binding_token` / `session_binding_proof` на реконнектах. |
| Новый клиент | старый агент | Безопасный откат: нет обязательных новых полей в wire-format для legacy; сервер игнорирует неизвестные optional-поля (proto3). |

Важно: поведение «только новый протокол» для отдельных механизмов (например принудительная отмена стрима по неактивности) в клиенте завязано на **фактически согласованную** версию **`NegotiatedProtocol > 0`**, а не только на настройку `MaxAcceptProtocolVersion`.

---

## 2. Изменения в клиенте — исправления и защита от регрессий

Ниже — логика, связанная с новым протоколом и устойчивостью сессий (файл `client_impl.cpp`, заголовки `client.h` / `client_impl.h`).

1. **Согласование версии и биндинг** — `PrepareInitializeRequest` выставляет `accept_protocol_version` только при `MaxAcceptProtocolVersion > 0`; при наличии согласованной версии и токена добавляет `session_binding_proof`. `OnGrpcCallInitialized` выставляет `NegotiatedProtocol` и `SessionBindingToken` только если `protocol_version` задан и **> 0**, иначе очищает их (строгий legacy).

2. **Конфликт `ALREADY_EXISTS`** — при таком статусе завершения стрима сбрасываются `SessionId`, `NegotiatedProtocol` и `SessionBindingToken`, чтобы не зациклиться на неверной паре (session_id, proof) и не провоцировать повторные конфликты на стороне агента.

3. **Watchdog неактивности gRPC (`GrpcCallInactivityTimeout`)** — принудительное закрытие активного вызова (`BeginClose(true)`) и счётчик `GrpcCallsClosedByInactivity` выполняются **только** при `NegotiatedProtocol.Defined() && *NegotiatedProtocol > 0`. Для legacy и до первого успешного `Initialized` с ненулевой версией отмена по этому таймеру **не** выполняется; таймер перепланируется как раньше. Это устраняет нежелательное принудительное реконнект-поведение на транспортах, где ранее допускалось «молчание» без отмены (см. план по этому пути).

4. **Пост-fork дочерний процесс** — сброс `SessionId`, `NegotiatedProtocol`, `SessionBindingToken` вместе с очередями, чтобы дочерний процесс не унаследовал привязку чужой сессии.

Документация в публичном API: комментарий к `SetGrpcCallInactivityTimeout` в `client.h` описывает ограничение по согласованной версии протокола.

---

*При необходимости уточнения формулы `min(accept, server_max)` на стороне агента смотрите реализацию сервера в репозитории `logbroker/unified_agent` (обработка `Initialize` в gRPC-сессии).*
commit_hash:9d5ef1cdc0faf793b4f56bfd2bafa362d7995ac5
Print human readable description instead of misleading compiler help message.
commit_hash:78aa6c12f5a3b88535805f3dc5f39565c1295493
commit_hash:a3758715df7ff97a0a471492dd907f949744e4d7
Previous name resolution in a completion engine was poor, because it
just mapped a name for an expression and so redefinition was not working.
For example, a table name inference did not work on the following query:
```yql
$x = '/a' $x = $x || 'b'; $x = $x || 'c'; FROM plato.$x SELECT #;
```
But now it works. And also there was an issue with names visibility,
because names were resolved like for `letrec`, not `let`. It was fixed.

The new name resolution analyses the whole query and uses not only a name
for an identifier lookup, but also its position in text. Each named node
entry now classified as definition and a reference. There is a way to map
each reference to a definition. In future it will be a basis for named nodes
"go to definition", "find references", "rename" LSP methods.
commit_hash:ceeecbe2a59aa4d82ceb59ef930af5659dcd5ff7
commit_hash:2667edfae53909edc485af9517d27ff796863b1d
commit_hash:0af07ceeebf07bbda69e5335cbe4c08abfc55fb5
robot-piglet and others added 29 commits April 29, 2026 12:05
commit_hash:755b28fb1f8a62d7239aac70b4661bada1d9717d
commit_hash:95ec85cd6708a69d332e81d02cbf223e4b890413
# Changelog entry:

- Add ability of changing buckets of metric in hedging config
commit_hash:ab18a97c5ca2ee07de61c8afcc0f6af1662d127b
commit_hash:054395f57e37951159c1184eae2e6d4bc81245f8
commit_hash:e576414b74f02ffeef289cd2df5a3e964affeb96
commit_hash:946123c814d23e070516ef5f7d339cf6025547b6
There was an issue is that an alias for a table ref was not set
and defaulted to an autogenerated name, so SqlSelect could not
reference it. It gives +10 TPC-DS queries.
commit_hash:2b2d7c4a5242eeb8f2cccf3ac55be8bf6e59850e
…led (ydb-platform#38588)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: sintjuri <sintjuri@yandex.ru>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.