feat: add tla config for model

This commit is contained in:
hhhh 2026-06-14 23:55:35 +03:00
parent 8758541668
commit 57d048661a
7 changed files with 1592 additions and 0 deletions

33
validate/README.md Normal file
View file

@ -0,0 +1,33 @@
# Валидация
## Описание структуры данных (partitions_storage)
1) Внутри данной структуры данных хранятся множества в виде полуоткрытых интервалов ([X; Y), [Y; Z), ... )
2) В процессе работы множество может быть разбито на два более маленьких для увелечения производительности доступа
3) В процессе работы множество может быть присаеденено к другому если оно стало слишком маленьким
4) Запросы, которые может поддерживать:
- `get(key)` - отдает множество, в которому принадлежит данный ключ, множество находится в данный момент под mutex_lock
## Описание работы структуры данных
1) Внутри используется персистентное AVL дерево, которое является lock-free и в узлах, хранит как раз так называемые множества
2) У партиции может быть несколько состояний в момент когда пользователь взяль mutex lock и прочитал состояние:
- ALIVE ( 16 <= `partition.size()` <= 128)
- NEED_SPLIT ( `partition.size()` > 128)
- NEED_SHRINK ( 16 > `partition.size()` && partitions_count > 1)
- DEAD (особое состояние)
3) Как происходит get:
- сначала получаем из AVL дерева ноду на партицию (она защищена QSBR) и берем у нее mutex lock
- проверяем состояние, если DEAD, то возвращаемся к предыдущему шагу. Если ALIVE то возвращаем, иначе выполняем соответствующие команды
4) Как происходит split:
- так как над портицией держится lock то мы пемечяем ее как DEAD
- разделяем на две по некоторому ключу
- вставляем в AVL дерево за место ноды связку из таких node (left, split_key, right)
5) Как происходит shrink (shrink происходит когда множеств больше чем одно):
- отпускаем lock
- находим предыдущею до нас множество и берем у него lock, проверяя не является ли она DEAD
- берем lock у нашей партиции и проверяем что она не DEAD
- находим следующую за нами множество и берем у него lock, проверяя не является ли она DEAD
- помечаем нашу партицию как DEAD
- "убираем" нашу партицию из дерева и запоминаем каким ребенком мы были для предка (left, right)
- если мы были правым ребенком то передаем все множество в следующее множество
- если мы были левым ребенком то передаем все множество в прошлое множество
6) В начальный момент времени существует либо только одно множество, либо несколько их, которые сбалансированы