Commit 09b9fa04 authored by Pavel Vainerman's avatar Pavel Vainerman

(LogDB): добавил ограничение на количество создаваемых websocket-ов.

parent 3aab7b07
......@@ -86,6 +86,9 @@ DB: Сделать регулируемый буфер на INSERT-ы БД, чт
в ThreadCreator использовать std::function()..
Разобраться с BigEndian и LittleEndian! Использовать htons,htol и т.п. (и реализации для 64bit)
ВОЗМОЖНО СТОИТ:
Уйти от использования libxml2,DebugLog ==> и применять одну библиотеку libpoco (http://pocoproject.org/documentation/index.html)
или всё-таки на boost?
......
......@@ -42,6 +42,7 @@
<LogDB name="LogDB">
<logserver name="logserver1" ip="localhost" port="3333" cmd="-s level1" description="Лог сервер процесса управления N1"/>
<logserver name="logserver2" ip="localhost" port="3333" cmd="" description="Лог сервер процесса управления N2"/>
<logserver name="ses" ip="localhost" port="21107" cmd="-d level8 ALL" description="SES"/>
</LogDB>
<settings>
......
......@@ -59,6 +59,7 @@ LogDB::LogDB( const string& name , const string& prefix ):
qbufSize = conf->getArgPInt("--" + prefix + "buffer-size", it.getProp("bufferSize"), qbufSize);
maxdbRecords = conf->getArgPInt("--" + prefix + "max-records", it.getProp("maxRecords"), qbufSize);
maxwsocks = conf->getArgPInt("--" + prefix + "max-websockets", it.getProp("maxWebsockets"), maxwsocks);
std::string s_overflow = conf->getArg2Param("--" + prefix + "overflow-factor", it.getProp("overflowFactor"), "1.3");
float ovf = atof(s_overflow.c_str());
......@@ -322,6 +323,7 @@ void LogDB::help_print()
cout << "--prefix-buffer-size sz - Размер буфера (до скидывания в БД)." << endl;
cout << "--prefix-max-records sz - Максимальное количество записей в БД. При превышении, старые удаляются. 0 - не удалять" << endl;
cout << "--prefix-overflow-factor float - Коэффициент переполнения, после которого запускается удаление старых записей. По умолчанию: 1.3" << endl;
cout << "--prefix-max-websockets num - Максимальное количество websocket-ов" << endl;
}
// -----------------------------------------------------------------------------
void LogDB::run( bool async )
......@@ -1009,6 +1011,21 @@ void LogDB::onWebSocketSession(Poco::Net::HTTPServerRequest& req, Poco::Net::HTT
return;
}
{
uniset_rwmutex_rlock lk(wsocksMutex);
if( wsocks.size() >= maxwsocks )
{
resp.setStatus(HTTPResponse::HTTP_SERVICE_UNAVAILABLE);
resp.setContentType("text/html");
resp.setStatusAndReason(HTTPResponse::HTTP_SERVICE_UNAVAILABLE);
resp.setContentLength(0);
std::ostream& err = resp.send();
err << "Error: exceeding the maximum number of open connections (" << maxwsocks << ")";
err.flush();
return;
}
}
auto ws = newWebSocket(&req, &resp, seg[2]);
if( !ws )
......
......@@ -117,6 +117,8 @@ namespace uniset
\endcode
Где \a logname - это имя логсервера от которого мы хотим получать логи (см. \ref sec_LogDB_Conf).
Количество создаваемых websocket-ов можно ограничить при помощи параметр maxWebsockets (--prefix-max-websockets).
\section sec_LogDB_DETAIL LogDB Технические детали
Вся релизация построена на "однопоточном" eventloop. В нём происходит,
......@@ -131,9 +133,6 @@ namespace uniset
\todo db: Возможно в последствии оптимизировать таблицы (нормализовать) если будет тормозить. Сейчас пока прототип.
\todo db: Пока не очень эффективная работа с датой и временем (заодно подумать всё-таки в чём хранить)
\todo WebSocket: доделать настройку всевозможных timeout-ов
\todo WebSocket: доделать проверку соединения
\todo WebSocket: сделать ограничение на максимальное количество соединений
\todo utils: написать конвертор обычных uniset-логов в БД.
\todo db: возможно всё-таки стоит парсить логи на предмет loglevel, и тогда уж и дату с временем вынимать
\todo web: генерировать html-страничку со списком подключения к логам с использованием готового шаблона
*/
......@@ -355,6 +354,7 @@ namespace uniset
std::list<std::shared_ptr<LogWebSocket>> wsocks;
uniset::uniset_rwmutex wsocksMutex;
size_t maxwsocks = { 50 }; // максимальное количество websocket-ов
#endif
private:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment