Skip to content

ДЗ Шардированные блокировки

xphoenix edited this page Mar 1, 2021 · 3 revisions

Домашнее задание Stripped Locking

Идея заключается в том, чтобы реализовать 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.

Тесты

Проверять руками