Skip to content
This repository has been archived by the owner on Mar 3, 2024. It is now read-only.

ДЗ№4. Тяпуев Дмитрий. Магистратура. Политех #202

Open
wants to merge 45 commits into
base: main
Choose a base branch
from

Conversation

typuichik123
Copy link
Contributor

No description provided.

@incubos incubos requested a review from lamtev October 27, 2023 09:36
@lamtev lamtev requested review from Marashov-Alexander and removed request for lamtev October 29, 2023 10:48
@lamtev lamtev assigned Marashov-Alexander and unassigned lamtev Oct 29, 2023
Copy link
Contributor

@Marashov-Alexander Marashov-Alexander left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

10/25
Из важных замечаний:

  1. Нейминг InMemoryDao, в котором сидит энергонезависимое хранилище. -1 балл
  2. Не оптимальный get -3 балла
  3. Есть кейсы, при которых общая арена не будет закрыта -3 балла
  4. Использование названия рабочей таблицы при проведении compaction -3 балла
  5. Потеря арены при getWriteBufferToSsTable -3 баллов
  6. Мутабельная статическая переменная. Нейминги статических переменных -1 балл
  7. Лишние аллокации: массив лонгов для возвращения значений, стримы при подсчете количества ssTable'ов -1 балл

src/main/java/ru/vk/itmo/tyapuevdmitrij/StorageHelper.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/Storage.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/Storage.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/Storage.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/Storage.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/StorageHelper.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/StorageHelper.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/InMemoryDao.java Outdated Show resolved Hide resolved
src/main/java/ru/vk/itmo/tyapuevdmitrij/InMemoryDao.java Outdated Show resolved Hide resolved
Copy link
Contributor

@Marashov-Alexander Marashov-Alexander left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Окончательный результат после второй проверки: 20/25
Из важных замечаний:

  1. Упускается кейс с кол-вом таблиц=1 и memTable.isEmpty - в таком случае не нужно компактить. -1 балл
  2. Закрытие арены в методе вручную, без try-with-resources. -1 балл
  3. Траблы со StorageHelper: наличие состояния, protected поля и методы вперемешку со статическими: -1 балл
  4. Лишняя аллокация в случае проблем или отсутствия файлов (создание пустого массива файлов). -1 балл
  5. Не последовательность: закрытие арены без проверки, в то время как в следующей ветке проверка осуществляется: -0.5 балла
  6. Метод с аргументом, который используется лишь в половине случаев в зависимости от другого аргумента-флага. -0.5 балла

@@ -91,27 +103,47 @@ public void compact() throws IOException {
return;
}
Iterator<Entry<MemorySegment>> dataIterator = get(null, null);
Arena writeArena = Arena.ofConfined();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше создавать под try-with-resources. Иначе, в случае исключения между созданием и закрытием, будет потеря памяти

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил

@@ -91,27 +103,47 @@ public void compact() throws IOException {
return;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не рассматривается еще один кейс: если количество таблиц == 1, а memTable is empty, то компактить тоже нет смысла

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил

StorageHelper.renameCompactedSsTable(ssTablePath);
compacted = true;
}

@Override
public void close() throws IOException {
if (compacted) {
readArena.close();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

думаю, проверка на isAlive должна быть выше всех. Иначе вы не проверяете на isAlive, а просто закрываете арену

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил

@@ -33,10 +33,16 @@ static MemorySegment getReadBufferFromSsTable(Path ssTablePath, Arena readArena)

static MemorySegment getWriteBufferToSsTable(Long writeBytes,
Path ssTablePath,
int ssTablesQuantity) throws IOException {
int ssTablesQuantity,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сейчас метод принимает два проблемных аргумента: ssTablesQuantity и compactionFlag. Первый аргумент лишний потому, что не используется в половине кейсов использования. А второй аргумент этому способствует)

Как насчет того, чтоб передавать в метод уже готовый Path? Тогда необходимости в тех двух аргументах отпадет, а сам метод будет выполнять единственную задачу - мапинг файла

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

исправил

@@ -33,10 +33,16 @@ static MemorySegment getReadBufferFromSsTable(Path ssTablePath, Arena readArena)

static MemorySegment getWriteBufferToSsTable(Long writeBytes,
Path ssTablePath,
int ssTablesQuantity) throws IOException {
int ssTablesQuantity,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сейчас метод принимает два проблемных аргумента: ssTablesQuantity и compactionFlag. Первый аргумент лишний потому, что не используется в половине кейсов использования. А второй аргумент этому способствует)

Как насчет того, чтоб передавать в метод уже готовый Path? Тогда необходимости в тех двух аргументах отпадет, а сам метод будет выполнять единственную задачу - мапинг файла

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У меня логика построена так, что при создании sstable учитывается их количество. Поэтому надо знать- компактим мы или просто пишем. Изначально у меня для этого было 2 метода, но я решил так оптимизировать. Да и codeclimate не позволял иметь много кода в одном файле, так что пришлось разделять логику по классам.

public void save(Iterable<Entry<MemorySegment>> memTableEntries, Path ssTablePath) throws IOException {
MemorySegment buffer = NmapBuffer.getWriteBufferToSsTable(StorageHelper.getSsTableDataByteSize(memTableEntries),
Arena writeArena = Arena.ofConfined();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

try-with-resources

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил

renamed = remainingFile.renameTo(new File(newFilePath));
}
if (!directory.exists() || !directory.isDirectory()) {
return new File[0];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

лучше возвращать null, чтоб не делать лишних аллокаций

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codeclimate на null ругался и указал так сделать

throw new IllegalStateException("Utility class");
}
protected static final String COMPACTED_FILE_NAME = "compact";
protected long memTableEntriesCount;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

если storageHelper имеет состояние, которое используется только в Storage, то лучше это состояние положить прямо в Storage

А то часть методов у хелпера статическая, а часть - protected. Это выглядит странно. protected должен использовать наследниками, а тут наследования никакого нет

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants