Проект курса "NoSQL" в Образовательном центре VK в Политехе.
Форкните проект, склонируйте и добавьте upstream
:
$ git clone [email protected]:<username>/2022-nosql-lsm.git
Cloning into '2022-nosql-lsm'...
...
$ git remote add upstream [email protected]:polis-vk/2022-nosql-lsm.git
$ git fetch upstream
From github.com:polis-vk/2022-nosql-lsm
* [new branch] main -> upstream/main
Так можно запустить тесты (ровно то, что делает CI):
$ ./gradlew clean build
Откройте в IDE -- IntelliJ IDEA Community Edition нам будет достаточно.
ВНИМАНИЕ! При запуске тестов или сервера в IDE необходимо передавать Java опцию -Xmx64m
.
Сделать имплементацию интерфейса DAO, заставив пройти все тесты. Для этого достаточно реализовать две операции: get и upsert, при этом достаточно реализации "в памяти".
Продолжайте запускать тесты и исправлять ошибки, не забывая подтягивать новые тесты и фиксы из upstream
. Если заметите ошибку в upstream
, заводите баг и присылайте pull request ;)
Когда всё будет готово, присылайте pull request в ветку main
со своей реализацией на review. Не забывайте отвечать на комментарии в PR и исправлять замечания!
Приведите код в состояние, удовлетворяющее новым тестам. А именно: при конструировании DAO следует восстановить состояние, персистентно сохраненное в методе close()
.
Нужно реализовать метод get(key)
, который будет возвращать Entry
, сохраненной в памяти или в хипе.
В DaoFactory.Factory
появился конструктор createDao(Config config)
, который нужно переопределить в своей реализации.
Config
Содержит в себе basePath
- директория для сохранения состояния DAO.
В новых тестах не предполагается использование полноценной реализации метода get(from, to)
.
Следует иметь в виду, что в дальнейшем в этом файле будет происходить бинарный поиск без полной загрузки в память (но на данном этапе, это можно игнорировать).
Когда всё будет готово, присылайте pull request со своей реализацией на review. Не забывайте отвечать на комментарии в PR и исправлять замечания!
Приведите код в состояние, удовлетворяющее данным запросам:
- Бинарный поиск по файлу теперь является обязательным для реализации.
- Метод
get(from, to)
должен работать полноценно и полностью поддерживаться DAO даже при наличии в ней данных, записанных в файл. - Стоит учитывать, что в диапазоне от
from
доto
, некая часть данных может уже находиться в файле на диске, в то время, как другая часть будет все ещеInMemory
. Несмотря на это, необходимо уметь последовательно отдавать все данные в правильно отсортированном порядке. - Запрошенный диапазон значений может быть слишком велик, чтобы держать его полностью в памяти, нужно динамически подгружать лишь необходимую в данный момент часть этого диапазона.
- За один тест метод
close
у конкретного инстанса DAO может быть вызван только один раз, однако после этого имеется возможность создать новый инстанс с тем жеconfig
(т.е будет произведено переоткрытие DAO). В отличие от прошлого этапа, в этот раз в DAO можно будет писать новую информацию, а не только читать старую из него. Количество таких переоткрытий за один тест неограниченно. Следовательно, должна поддерживаться возможность создания соответствующего количества файлов, содержащих данные нашей БД - по одному на каждыйclose
, а так же возможность поиска значений по всем этим файлам. - После использования метода
close
,Entry
с уже записанным до этого в файл ключом может быть добавлено в последующие DAO еще несколько раз, т.е текущее значение, соответствующее этому ключу, будет таким образом перезаписано, однако старые значения, соответствующие этому же ключу, все еще будут находиться в более ранних файлах. База данных должна суметь выдать самое свежее для запрошенного ключа значение при поиске из всех имеющихся. - На данный момент метод
flush
будет вызываться только из методаclose
. Таким образом,flush
будет гарантированно выполняться однопоточно, также на данном этапе можно рассчитывать на то, чтоget
иupsert
в процессе выполнения методаflush
вызываться не будут, однако во все остальное времяget
иupsert
могут работать в многопоточном режиме - старые тесты наconcurrency
никуда не пропадают, но могут появиться и новые. Считаем, что поведениеget
иupsert
после отработки методаclose
-undefined
upsert
сvalue == null
подразумевает удаление: такие записи не должны возвращаться вget
.
Когда всё будет готово, присылайте pull request в ветку main
со своей реализацией на review. Не забывайте отвечать на комментарии в PR и исправлять замечания!
Требуется реализовать метод compact()
в DAO
:
- Все SSTable'ы должны быть слиты в один, включая как таблицы на диски, так и таблицу в памяти.
- Старые должны быть удалены.
- Должна сохраняться только самая свежая запись, старые записи должны быть удалены.
- Удалённые записи (
upsert
сnull
-значением) не должны сохраняться присompact()
. - В рамках данного задания гарантируется, что сразу после
compact()
будет вызван методclose()
, а значит работа с этимDAO
больше производиться не будет. Но в последствии может быть открыто новоеDAO
c тем же конфигом. И на нём тоже может быть вызванcompact
. close()
обязан быть идемпотентным - повторныйclose()
не должен приводить к отрицательным последствиям, включая потерю производительности. На текущем этапе можно считать, что конкуретных вызововclose()
нет.- Тесты будут появляться и дополняться.
Когда всё будет готово, присылайте pull request в ветку main
со своей реализацией на review. Не забывайте отвечать на комментарии в PR и исправлять замечания!