1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

"Моджанг какого х" N2 или убогий UserCache

Тема в разделе "Оффтопик", создана пользователем Shevchik, 4 сен 2015.

  1. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Вообще давно хотел написать небольшую ремарку на эту тему, но всё никак руки не доходили.
    Также решил именовать темы такого типа именно так как в заголовке, ибо очень подходит.

    Итак начнём.
    В связи с переходом майнкрафта на uuid серверу для многих вещей нужна была возможность конвертировать имя в юайди и наоборот. Но постоянно бомбить сервера моджангов не торт, поэтому в сервер был добавлен кэш.
    Но как всегда даже тут моджанги облажались.

    Так как кэш двухсторонний то нужно две мапы, вроде пока всё просто. Но ведь нехорошо хранить кэш вечно, поэтому был сделан ограничитель чтобы хранить только 10к записей. К тому же их них выбиралась только самые новые, что в принципе правильно. Хорошая идея, звучит просто, где же тут можно облажаться? Но моджанг умудрились....

    Итак если говорить проще моджанг имплементация всего этого выглядит так
    HashMap<String, UserCacheEntry>
    HashMap<UUID, UserCacheEntry>
    LinkedList<UserCacheEntry>
    приплыли...

    фактически чтобы следить за самыми часто используемыми записями моджанг использует LinkedList, то бишь каждая конверсия вынимает из связного списка обновляемый элемент и кладёт его в начало. Только вот операция удалеия элемента из связного списка имеет сложность - O(n), то бишь линейную, больше элементов - дольше удалять. Таким образом всё преимущество от использования хэшмапов просто уходит на нет, с тем же самым успехом можно было бы тупо пробегать по списку и сравнивать имя либо юид. Вот так в казалось бы простой вещи можно так сильно облажаться?
    Ну и ещё, всё это не синхронизовано и потому попытка конверта не из основного потока имеет шанс уронить сервер... В кране кстати решили послежднюю проблему использую LinkedBlockedQueue вместо LinkedList, что впрочем не особо спасает ситуацию, просто делает шанс сломать сервер очень маленьким. Кстати LinkedBlockedQueue имеет лимит после которого оно будет висеть в блокировке вечно, к счастью по дефолту он Integer.MAX_VALUE, ну по краней мере в OracleJVM, вот будет подстава если это не так где-то ещё.
    Ну и напоследок, в ванильке по дефолту после каждого обновления этот кэш ещё и сохраняется в файл, так что надеюсь вы не забыли отключить это деле в конфиге крана.
     
  2. TetrissWorld

    TetrissWorld Активный участник Пользователь

    Баллы:
    76
    Skype:
    qazwsx200221
    Имя в Minecraft:
    Tetriss
    save-user-cache-on-stop-only: false
     
  3. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Напиши это Моджангам, да услышат они твои замечания
     
  4. MySt1k

    MySt1k Старожил Пользователь

    Баллы:
    173
    Думаю только жалоба в баг-трекер поможет. Напиши там темку, а мы всем срубаккитом будем спамить подтвердим это в теме.
     
  5. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Там уже есть. Только никакого толк, всем насрать, ибо тесты всегда идут на чистой ванили, а при количестве игроков 10-20 никакой разницы в производительности.
     
  6. MySt1k

    MySt1k Старожил Пользователь

    Баллы:
    173
    Кинь ссылку пожалуйста, накатаю что-нибудь
    P.S Есть вариант связаться с диннербоном в IRC и договорится о переписывании части кода...
     
  7. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    И как это решает проблему? Или как обычно читаем только последнее предложение?
     
  8. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Я спрошу ещё раз. Как права на доступ к файлу помешают серверу каждый раз при каждом запросе увеличивать размер листа в памяти, а по достижению большого количества игроков просто начать тормозить?
     
  9. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Нет.
     
  10. Kvaizer

    Kvaizer Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    Kvaizer
    Ой дурак..
     
  11. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Можанги используют сановские/оракловские хешмапы, о чем можно говорить далее?)
     
  12. Wolfwood

    Wolfwood Активный участник Пользователь

    Баллы:
    88
    Прошлая тема была про тикающие сундуки?)
     
  13. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Хотя бы спиготам напиши, они для этого и создавались - быть оптимизированнее, раз моджангам плевать
     
  14. Kvaizer

    Kvaizer Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    Kvaizer
    Ой, насмешил.
     
  15. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Писал, но однако не приняли.
     
  16. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну когда их майнплекс рухнет, тогда может и задергаются.
     
  17. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Не рухнет, сервера разворачиваются из изначального состояния и схлопываются после окончания миниигры.
    И полуофициальный сервер spigot это не mineplex, а ecocitycraft, но у них вообще своя система кэша основанная на MongoDB кажется.
     
  18. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    Разве не true должно быть?
     
  19. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Оно по дефолту false, но должно быть true, иначё всё становится совсем печально.
     
  20. WhiteHeroV

    WhiteHeroV Активный участник Пользователь Заблокирован

    Баллы:
    68
    Имя в Minecraft:
    WhiteHeroV
    Для майнкрафта разве выгодно использовать MongoDB?
     

Поделиться этой страницей