Проектная лаборатория
Собственный Redis
Этап 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-серверу как реплика и выполнит команды:
PING— ожидается+PONG\r\n.REPLCONF listening-port <PORT>— ожидается+OK\r\n.REPLCONF capa eof capa psync2— ожидается+OK\r\n.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 go2. Откройте папку в IDE
cd ./my-redisРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage cf8Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.