-
Notifications
You must be signed in to change notification settings - Fork 228
ДЗ Шардированные блокировки
Идея заключается в том, чтобы реализовать stripped lock для хранилища данных afina тем самым убрать hight contention на блокировке, сделанной во втором домашнем задании
Реализация простого хранилища находится в файлах src/storage/SimpleLRU.h
и src/storage/SimpleLRU.cpp
. Нужно сделать новую реализацию src/storage/StripedLRU.h
и src/storage/StripedLRU.cpp
, добавить код в скрипт сборки src/storage/CMakeLists.txt
и наконец прописать новый тип хранилища mt_slru
в опции командной строки main.cpp#Application#Config
Реализация должна размазывать все входящие запросы на массив объектовSimpleLRU
. Сделать это можно считая хэш от ключа и превращая его в индекс массива через деление по модулю:
- Каждый из объектов LRU считает лимиты независимо друг от друга, поэтому нужно быть акуратным при задании конфигурации, т.е:
BuildStripedLRU(std::size_t memory_limit, std::size_t stripe_count) {
SimpleLRU shards[stripe_count];
...
// Вот тут можно получить не корректное число, вроде 1 байт размера пары ключ/значение.
// В таком случае нужно бросить пользователю исключение на старте и сказать, что параметры выбранны
// не верно
//
// Протокол требует, чтобы мы могли вставить максимум 1MB данных на 1 ключ
std::size_t stripe_limit = memory_limit / stripe_count;
...
}
- Каждый из шардов (SimpleLRU) реализует логику вытеснения независимо
При сдаче, крайне желательно уметь отвечать на вопросы:
- Какие недостатки и достоинства у данного метода stripe
- Как альтернативные подходы к логике "размазывания" нагрузки между шардами -- какие у этих способов достояинства/недостатки
- Почему метод шардирования, применяемый в домашке можно применять в данном конкретном случае
Смысл упражнения в том, чтобы Вы понимали все trade off, которые делаете ввода stripe locking.
Проверять руками