Каталог

[Вернуться]
Режим постинга: Ответ
Имя
E-mail
Тема
Сообщение
Пароль   (для удаления поста)

No.265  >>267, >>277
Оказывается, в TinyIB есть т.н. "беклинки", ну то есть список ответов на пост, как и везде. А знаете, как это работает в TinyIB? При формировании поста, допустим с id=10, движок делает так:

1. Ищет родителя (тред) для id=10, допустим тред это будет id=5
2. Ищет все дочерние элементы у id=5, ну то есть все ответы у треда
3. В каждом найденом посте ищет строковое вхождение ">>10" - это будет беклинк

Вроде звучит все логично, НО:

1. Это происходит при РЕНДЕРИНГЕ, т.е. при создании HTML-разметки поста
2. Это происходит для КАЖДОГО поста в базе
3. Каждый новый созданный ответ на борде запускает процесс ПОЛНОГО РЕНДЕРИНГА

Допустим, у нас на борде 20 тредов по 200 ответов каждый. И вот я решил создать новый ответ. Получается, что:

1. У нас n = 20 * 200 = 4 000 элементов
2. Итерации вложеные, т.е. n^2 = 16 000 000 итераций
3. Поиск подстроки тоже будет минимум 16 000 000 итерации
4. Итого 32 000 000 операций

И так каждый раз.

Реальные примеры:

- На ноунейм параше было примерно 7к постов. Т.е. каждый новый пост ебал борду ((7 000)^2)*2 = 98 000 000 раз
- Здесь набито скромных 264 поста, то есть этот пост будет ебать борду всего-то 139 392 раза.

Как говорит сам разработчик,

> TinyIB - Lightweight and efficient
¨ No.266
👍
К счастью это было добавлено в 2021.
¨ No.267  >>277
>>265
Вообще все не так однозначно, конечно. Там перед базой висит типа кеш (в виде блядь обычного массива в памяти), так что по идее базу не должно так жестко ебать.

Но это получается упор в память, да и непонятно, как тот кеш работает вообще. Может, он пустой всегда.
¨ No.277
>>265
Все еще даже хуже, чем я думал. Вот пожалуйста, прямой путь к багам:

> 3. В каждом найденом посте ищет строковое вхождение ">>10" - это будет беклинк
> ищет строковое вхождение

То есть например, движок пошел искать ответы для поста No.5. Что он делает? Правильно, идет искать подстроку ">>5" в текстах сообщений. Казалось бы - логично, да? Только вот подстрока ">>5" еще может встретиться в ">>50" например, и вообще в любом ">>5\d+", даже в ">>51234". А движок подумает, что это все ответы на пост >>5. Охуенно придумал наш трудяга тревор в 2021 году.

И кстати кеш тот (>>267) действительно работает, но только на каждый реквест. Как я понимаю, пыха при каждом запросе запускается заново, и умирает потом. Соответственно, и кеш строится каждый раз новый.

То ли дело бы блядь сделать табличку from/to, но видимо это слишком сложно для гиганта мысли гигачеда тревора гнидума.
¨ No.309  >>310
О, а вот это уже косяк нормальный.

Гений тиниибы тревор гнидус запилил поддержку нескольких БД - это хорошо, разумеется. Только работает у него все как обычно через очко. Из-за своего уебищного кодинга автор сам себя запутал и допустил фатальные баги. Например, в режиме 'mysqli' (современный MySQL) INSERT банов происходит с хешированным IP, а вот SELECT - нет. То есть, по шагам:

1. Я решил забанить IP 1.1.1.1, и в базу летит hash('1.1.1.1')
2. В базе теперь лежит допустим '$2$...abc...' - хешированный айпишник
3. Допустим на борду летит новый пост, и надо бы проверить, вдруг постер в бане
4. Движок делает SELECT ... WHERE ip = "1.1.1.1"
5. Разумеется ничего не найдено, т.к. в базе лежит хеш, а не реальный IP

Таким образом на параше с 'mysqli'-базой можно не бояться банов, ведь их там по сути нет. Таблица банов будет полниться всякими айпишниками, которые никогда и никем не будут найдены.
¨ No.310  >>312
>>309
ну напиши ему в issues
¨ No.312
>>310
Похоже что ему похуй: https://codeberg.org/tslocum/tinyib/issues

Я лучше свой форк допилю со всеми фиксами. Если получится, выложу тут в тестовый раздел, а потом может и вообще на него мигрирую.
¨ No.313
Самый стремный эффект от такого "кода" в стиле тревора - ты потом на каждую строчку смотришь с подозрением, и ожидаешь в ней баги. Хотя багов там не так чтобы очень много. Вроде.
¨ No.323
Гнидс конечно учудил. У него в движке можно обновлять сущности - аккаунты для мочеров, посты, баны, спамфмльтр. Вроде все хорошо, но тут, понимаешь, есть нюанс - хеширование. Например, хеширование пароля у аккаунта и поста, хеширование айпишников. Казалось бы, в чем проблема? В том, что тревор гнидс мастерски наступает себе на яйца даже в такой ерунде:

> function updateAccount($account) {
> ...
> $row[ACCOUNT_PASSWORD] = hashData($account['password']);

Ясно, да? То есть если я обновлю что-то кроме пароля, то пароль повторно перехешируется, и станет невалидным. А ведь там есть как раз такое:

> $account['lastactive'] = time();
> updateAccount($account);

И все, ловушка гнидуса захлопнулась. Но старина тревор не такой уж идиот, он в своей патентованной функции hashData пишет следующее:

> function hashData($data, $force = false) {
> ...
> if (substr($data, 0, 4) == '$2y$' && !$force) {
> return $data;

Типа если строка начинается с "$2y$" - значит, это хеш, и хешировать больше не надо. Воистину гигачад от мира программирования. Честно, если бы моя мама купила книжку "Пыха для чайников" 2004 года и решила бы написать по ней борду - вышло бы не хуже, а то и лучше даже.
¨ No.341
Fun fact: около 60-70% кода тиниибы занимает ее админка и всякие админские фичи. По сути весь движок - это пять крудов, и там где-то сбоку еще и постинг с капчей болтаются. Такие дела.

Удалить пост