Захотелось мне посмотреть распределение своего флуда в конфах по времени. Получилось нечто типа следующего:
!muc stat day
Message statistic for "Гадский демон":
Mon |#################### (75)
Tue |# (4)
Wed |## (10)
Thu | (0)
Fri |################# (64)
Sat |##### (21)
Sun |##### (20)
!muc stat hour
Message statistic for "Гадский демон":
00:00 |#################### (43)
01:00 |########## (23)
02:00 |### (7)
03:00 | (0)
04:00 | (0)
05:00 | (0)
06:00 | (0)
07:00 | (1)
08:00 | (0)
09:00 |### (8)
10:00 | (0)
11:00 | (0)
12:00 | (0)
13:00 |# (4)
14:00 |################ (36)
15:00 |######## (18)
16:00 | (0)
17:00 | (0)
18:00 | (2)
19:00 |# (3)
20:00 |####### (17)
21:00 | (0)
22:00 |######## (19)
23:00 |###### (14)
Плохо, что инфа есть в базе только с 03.06.2009 ;)
За сутки уже набежало:
gluxi=> select count(*) from conference_log;
count
-------
35717
(1 row)
Интересно, на сколько глупой идеей это было и как скоро это всё начнет тормозить?
Гладиолус: Pong from Гладиолус after -85601.2 secs.
<message from='***@conference.jabber.ru/Зомби' to='gluxi@inhex.net/GluxiBot-dev' xml:lang='en' type='groupchat'>
<body>Гладиолус: Pong from Гладиолус after -85601.2 secs.</body>
</message>
</pre>
PS. Кроме какого-то переполнения на ум ничего не приходит… С другой стороны, на пинги таймаут стоит, который гарантированно влезит в long…
Мне таки кажется, что на jabber.ru установлен какой-то умный шейпер не только на c2s но и на s2s. Станзы <presence /> и <iq /> доставляются моментально, а <message /> тормозят… Очень похоже, что есть ограничение в количество станз в единицу времени на все конференции.
Судя по тому, что с другими серверами, вроде jabbus.org все нормально, это таки не канал.
Надо будет как-то померять что-то.
Сегодня после очередного фикса получилось нечтно типа DoS в одной из конференций на conference.jabber.ru.
В конфигураторе глюкса стоит галочка “запрашивать версию всех входящих посетителей” и таймаут на ответ в 1 секунду. Если за одну секунду бот не получает ответ на запрос версии, то просто забивает на это и считает что версия скрыта. Если же ответ на запрос версии таки дойдет через время, большее таймаута, то глюкс в ответ отправит стазу
<iq type='error' to='muc-room@conference.jabber.ru/User' id='some_id'>
<query xmlns='jabber:iq:version'/>
</iq>
что в принципе не совсем корректно. Хотя с другой стороны, этот ответ не был обработан, и об этом можно сообщить другой стороне.
Другой бот, Talisman, на cтанзу вида
<iq type='error' to='foo@conference.jabber.ru/Talisman' id='uid74'>
<query xmlns='jabber:iq:version'/>
</iq>
шлет информацию о своей версии. Глюкс не знает, что делать с такой вот информацией и посылает очередной отлуп.. Собственно круг замкнулся и получился iq-флуд. :)
После того, как уперлись в ограничение на количество конференций, где можно сидеть одновременно, составил нечто типа рейтинга конференций, который определяет, сколько разных JID-ов побывало в конференции с 01.07.2008.
Для текущей структуры базы, такую информацию можно вытащить запросом:
select conferences.name, (select count(distinct jid)
from conference_nicks
where conference_nicks.conference_id=conferences.id and lastaction > '2008-07-01') as cnt
from conferences where autojoin=true and online=true and autoleave=true order by cnt;
Вот что вышло (больше — конференция популярнее)
continue reading
mysql> select count(*) from conferences where online=1 and name like "%@conference.jabber.ru";
+----------+
| count(*) |
+----------+
| 51 |
+----------+
1 row in set (0.09 sec)
Все. Напоролся на ограничение в количество заджойненых конференций для одного JID-а на conference.jabber.ru.
Выборочно за неделю, судя по логам бота gluxi
continue reading
Нашел у себя в коде
int RoleList::calc(const QString& role, const QString& affiliation)
{
QString r=role.toUpper();
QString a=affiliation.toUpper();
if (a.startsWith("OWNER"))
return(ROLE_OWNER);
if (a.startsWith("ADMIN"))
return(ROLE_ADMIN);
if (r.startsWith("MODER"))
return(ROLE_MODERATOR);
if (a.startsWith("MEMBER"))
return(ROLE_MEMBER);
if (r.startsWith("PARTICIPANT"))
return(ROLE_PARTICIPANT);
}
ССЗБ как говорится :)