Проектная лаборатория

Собственный Redis

0 / 124этапов пройдено

Этап 41 · Репликация

WAIT после нескольких команд

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы расширите WAIT для случая, когда реплики подключены и уже получили команды записи.

WAIT после передачи команд

Ранее мы обработали случаи, когда:

  • Реплик нет, и ведущий может вернуть 0.
  • Реплики подключены, но ещё не получали команды записи.

Теперь рассмотрим случай, когда команды записи уже переданы репликам. Смещения репликации больше не равны 0, поэтому перед ответом ведущий должен проверить, какие реплики успешно обработали последнюю команду записи.

Для этого ведущий должен отправить репликам REPLCONF GETACK *, если после последнего WAIT остались неподтверждённые команды записи. Каждая реплика ответит своим текущим смещением (REPLCONF ACK <offset>).

Команда WAIT должна завершиться при любом из условий:

  • Нужное число реплик подтвердило все предыдущие команды записи.
  • Истекло время ожидания.

В обоих случаях ведущий возвращает число реплик, подтвердивших все предыдущие команды записи, в виде целого числа RESP.

Тесты

Тестирующая программа запустит вашу программу как ведущий сервер так:

./your_program.sh

Затем запустит несколько реплик, которые подключатся к серверу. Каждая выполнит рукопожатие и будет ожидать пустой RDB.

Далее тест подключится к ведущему как клиент и отправит несколько команд записи вперемешку с WAIT:

$ redis-cli SET foo 123
$ redis-cli WAIT 1 500    # (must wait until either 1 replica has processed previous commands or 500ms have passed)
 
$ redis-cli SET bar 456
$ redis-cli WAIT 2 500    # (must wait until either 2 replicas have processed previous commands or 500ms have passed)

Примечания

  • Возвращённое количество реплик может быть меньше или больше числа, указанного в команде WAIT.

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init redis ./my-redis --language go

2. Откройте папку в IDE

cd ./my-redis

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage na2

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста