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

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

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

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

Передача пустого файла RDB

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

На этом этапе вы добавите отправку пустого файла RDB ведущим сервером.

Полная повторная синхронизация

При первом подключении реплика отправляет ведущему PSYNC ? -1, сообщая, что у неё ещё нет данных и требуется полная повторная синхронизация.

Ведущий отвечает в два шага:

  • Подтверждает запрос ответом FULLRESYNC (реализовано ранее).
  • Отправляет снимок текущего состояния как файл RDB.

Реплика должна загрузить файл в память и заменить своё состояние данными ведущего.

В этом задании не нужно самостоятельно формировать RDB. Можно использовать заранее заданный пустой файл RDB: будем считать, что база ведущего всегда пуста.

Шестнадцатеричное представление и base64 пустого файла RDB находятся здесь. Перед отправкой реплике их нужно декодировать в двоичные данные.

Файл отправляется в формате:

$<length_of_file>\r\n<binary_contents_of_file>

Это похоже на кодирование объёмных строк, но без завершающего \r\n.

Тесты

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

./your_program.sh --port <PORT>

Затем подключится к TCP-серверу как реплика и выполнит команды:

  1. PING — ожидается +PONG\r\n.
  2. REPLCONF listening-port <PORT> — ожидается +OK\r\n.
  3. REPLCONF capa eof capa psync2 — ожидается +OK\r\n.
  4. PSYNC ? -1 — ожидается +FULLRESYNC <REPL_ID> 0\r\n.

После последнего ответа тест ожидает пустой файл RDB от сервера.

Подойдёт любой корректный пустой файл RDB.

Примечания

  • Файл RDB отправляется так: $<length>\r\n<contents>.
    • <length> — длина файла в байтах.
    • <contents> — двоичное содержимое файла.
    • Это НЕ объёмная строка RESP: в конце нет \r\n.
  • Подробнее о формате RDB — в этой статье. В задании есть отдельное расширение, посвящённое чтению файлов RDB.

Проверка в вашей 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 cf8

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

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

go / ЛОКАЛЬНО

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

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

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

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