Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Осокин Дмитрий, Политех, hw 1 #22

Merged
merged 6 commits into from
Mar 1, 2024

Conversation

osokindm
Copy link
Contributor

No description provided.

import java.lang.foreign.ValueLayout;
import java.nio.charset.StandardCharsets;

public class Converter {
Copy link

Choose a reason for hiding this comment

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

Add a private constructor to hide the implicit public one.

@@ -0,0 +1,109 @@
package ru.vk.itmo.test.osokindm;

import one.nio.http.*;
Copy link

Choose a reason for hiding this comment

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

Avoid unused imports such as 'one.nio.http'

}


@Path("/v0/entity")
Copy link

Choose a reason for hiding this comment

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

'METHOD_DEF' has more than 1 empty lines before.

import ru.vk.itmo.dao.Entry;

import java.lang.foreign.MemorySegment;
import java.util.*;
Copy link

Choose a reason for hiding this comment

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

Using the '.' form of import should be avoided - java.util..

import ru.vk.itmo.dao.Entry;

import java.lang.foreign.MemorySegment;
import java.util.*;
Copy link

Choose a reason for hiding this comment

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

Using the '.' form of import should be avoided - java.util..

@@ -0,0 +1,109 @@
package ru.vk.itmo.test.osokindm;

import one.nio.http.*;
Copy link

Choose a reason for hiding this comment

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

Avoid unused imports such as 'one.nio.http'

super.stop();
}

@Path("/v0/entity")
Copy link

Choose a reason for hiding this comment

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

The String literal '/v0/entity' appears 4 times in this file; the first occurrence is on line 62


@Path("/v0/entity")
@RequestMethod(Request.METHOD_GET)
public Response get(@Param(value = "id=", required = true) String id) {
Copy link

Choose a reason for hiding this comment

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

The String literal 'id=' appears 4 times in this file; the first occurrence is on line 64

import java.nio.file.Path;
import java.util.List;

public class TestServer {
Copy link

Choose a reason for hiding this comment

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

All methods are static. Consider using a utility class instead. Alternatively, you could add a private constructor or make the class abstract to silence this warning.

@@ -0,0 +1,109 @@
package ru.vk.itmo.test.osokindm;

import one.nio.http.*;
Copy link

Choose a reason for hiding this comment

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

Using the '.' form of import should be avoided - one.nio.http..

public class HttpServerImpl extends HttpServer {

private static final int MEMORY_LIMIT = 8388608;
// private static final int MEMORY_LIMIT = 1024;
Copy link

Choose a reason for hiding this comment

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

This block of commented-out lines of code should be removed.

public class HttpServerImpl extends HttpServer {

private static final int MEMORY_LIMIT = 8388608;
// private static final int MEMORY_LIMIT = 1024;
Copy link

Choose a reason for hiding this comment

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

Comment has incorrect indentation level 0, expected is 4, indentation should be the same level as line 26.

@lamtev lamtev requested review from Marashov-Alexander and removed request for lamtev February 21, 2024 19:19
@lamtev lamtev assigned Marashov-Alexander and unassigned lamtev Feb 21, 2024
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.

Провел ревью кода, чуть позже вернусь к ревью нагрузочного тестирования)


public class HttpServerImpl extends HttpServer {

private static final int MEMORY_LIMIT = 8388608;
Copy link
Contributor

Choose a reason for hiding this comment

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

Константа всё равно магическая получается) Лучше объяснять, откуда это число взялось и что оно означает. Для того, чтоб объяснить, откуда оно взялось, можно использовать выражение: 8 * 1024 * 1024. Оно всё равно посчитается единожды, зато читающему код будет понятно его происхождение. И в название константы лучше добавить единицы измерения. Например, MEMORY_LIMIT_BYTES

public HttpServerImpl(ServiceConfig config) throws IOException {
super(createServerConfig(config));
workingDir = config.workingDir();
daoWrapper = new DaoWrapper(new Config(config.workingDir(), MEMORY_LIMIT));
Copy link
Contributor

Choose a reason for hiding this comment

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

Для чего здесь создается объект DaoWrapper, если он же создается в методе start?
Созданное в конструкторе дао перетирается объектом из start

private DaoWrapper daoWrapper;
private final java.nio.file.Path workingDir;

private final Logger logger = LoggerFactory.getLogger(HttpServerImpl.class);
Copy link
Contributor

Choose a reason for hiding this comment

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

logger - объект класса, однако создается вне конструктора. Если создается единственный конструктор для инициализации полей, то по возможности лучше все поля в нём объявлять. Однако logger думаю вообще можно сделать статическим полем. Здесь и во всех других классах

private static final int MEMORY_LIMIT = 8388608;
private static final String PATH = "/v0/entity";
private static final String ID_REQUEST = "id=";
private DaoWrapper daoWrapper;
Copy link
Contributor

Choose a reason for hiding this comment

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

Мутабельные поля лучше указывать после иммутабельных) Чисто по стилю удобнее понимать код

@Override
public synchronized void stop() {
try {
daoWrapper.stop();
Copy link
Contributor

Choose a reason for hiding this comment

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

Получается, что сервер отвечает за жизненный цикл dao: он и создает его, и останавливает, и использует. Кажется, слишком много ответственности. Может сделать так, чтоб ServiceImpl управлял не только жизненным циклом сервера, но еще и dao? А объект dao передавать в server в качестве зависимости. Тогда и принцип единой ответственности будет лучше соблюдаться, и класс service будет более полезным) И в TestServer тоже можно будет использовать Service

daoWrapper = new DaoWrapper(new Config(config.workingDir(), MEMORY_LIMIT));
}

private static HttpServerConfig createServerConfig(ServiceConfig serviceConfig) {
Copy link
Contributor

Choose a reason for hiding this comment

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

приватные методы лучше указывать после публичных. Приватные методы - это обычно детали реализации, а читающему код чаще всего интересны в первую очередь публичные методы

public class HttpServerImpl extends HttpServer {

private static final int MEMORY_LIMIT = 8388608;
private static final String PATH = "/v0/entity";
Copy link
Contributor

Choose a reason for hiding this comment

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

думаю есть смысл здесь тоже конкретизировать, что это за PATH. А то это слово встречается в разных контекстах в этом классе, поэтому добавить постфикс лишним не будет

}

@Path(PATH)
@RequestMethod(Request.METHOD_POST)
Copy link
Contributor

Choose a reason for hiding this comment

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

Тогда уж стоило поддержать и остальные http-методы)) Не post'ом единым
image
Может удобнее для этой цели было бы сделать один метод, в котором в зависимости от http-метода выполнять ту или иную логику? А в случае неподдерживаемого типа возвращать то, что возвращается в этом методе


@Override
public void handleRequest(Request request, HttpSession session) throws IOException {
String id = request.getParameter(ID_REQUEST);
Copy link
Contributor

Choose a reason for hiding this comment

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

похоже, что этот метод уже вызывается за нас в super.handleRequest. Возможно имеет смысл не делать двойной пробег, а сразу сделать, что нужно? Например, здесь и на null проверить, и может метод тоже проверить да разроутить...)

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.

В связи с недочетами в коде и некоторыми вопросами по профилированию готов поставить 12 баллов

## Нахождение точки разладки
### GET
Размер БД = 2.1gb

Copy link
Contributor

Choose a reason for hiding this comment

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

Похоже, что в этом месте не хватает вывода wrk

Transfer/sec: 523.42KB
```

Повторное выполнение запроса на пустой БД не приводит к существенному изменению результатов, в связи с тем, что созданные записи не просматриваются при вставке.
Copy link
Contributor

Choose a reason for hiding this comment

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

Не очень понял, что тут имелось в виду

99.999% 33.95ms
100.000% 33.98ms
```
Если изменить скрипт lua и наполнять БД, обращаясь по ключам с уже существующими значениями, то можно заметить, что время работы также не изменилось (1.19ms vs 1.17ms).
Copy link
Contributor

Choose a reason for hiding this comment

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

Лучше сравнивать не средние значения, а перцентили с девятками. Так точность сравнения будет существенно выше


Больше всего выделений памяти (8%) уходило на Mapped MemorySegment

На данный момент все запросы выполняются внутри SelectorThread, чего быть по идее не должно, поэтому возможна оптимизация путем делегирования задачи WorkerPool'у
Copy link
Contributor

Choose a reason for hiding this comment

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

Да, создается ощущение, что SelectorThread должен другими делами заниматься) Посмотрим, что получится сделать на следующем этапе

Copy link
Contributor

Choose a reason for hiding this comment

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

Думаю, лучше прикреплять флеймграфы в виде html,чтобы проверяющие могли потыкаться в результаты

@@ -0,0 +1,33 @@
minId = 1
Copy link
Contributor

Choose a reason for hiding this comment

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

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

@Marashov-Alexander Marashov-Alexander merged commit f10fd34 into polis-vk:main Mar 1, 2024
2 checks passed
osokindm added a commit to osokindm/2024-highload-dht that referenced this pull request Mar 6, 2024
axothy pushed a commit to axothy/2024-highload-dht that referenced this pull request Mar 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants