-
Notifications
You must be signed in to change notification settings - Fork 48
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
Conversation
import java.lang.foreign.ValueLayout; | ||
import java.nio.charset.StandardCharsets; | ||
|
||
public class Converter { |
There was a problem hiding this comment.
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.*; |
There was a problem hiding this comment.
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") |
There was a problem hiding this comment.
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.*; |
There was a problem hiding this comment.
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.*; |
There was a problem hiding this comment.
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.*; |
There was a problem hiding this comment.
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") |
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
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.*; |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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.
There was a problem hiding this 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; |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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(); |
There was a problem hiding this comment.
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) { |
There was a problem hiding this 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; | ||
private static final String PATH = "/v0/entity"; |
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
@Override | ||
public void handleRequest(Request request, HttpSession session) throws IOException { | ||
String id = request.getParameter(ID_REQUEST); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
похоже, что этот метод уже вызывается за нас в super.handleRequest. Возможно имеет смысл не делать двойной пробег, а сразу сделать, что нужно? Например, здесь и на null проверить, и может метод тоже проверить да разроутить...)
There was a problem hiding this 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 | ||
|
There was a problem hiding this comment.
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 | ||
``` | ||
|
||
Повторное выполнение запроса на пустой БД не приводит к существенному изменению результатов, в связи с тем, что созданные записи не просматриваются при вставке. |
There was a problem hiding this comment.
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). |
There was a problem hiding this comment.
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'у |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да, создается ощущение, что SelectorThread должен другими делами заниматься) Посмотрим, что получится сделать на следующем этапе
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тут и в get - кажется, что маленький диапазон допустимых рандомных айдишек, чтоб говорить о точных результатах профилирования
* hw1 first try
* hw1 first try
No description provided.