Commit 7dd5cf85 authored by Pavel Vainerman's avatar Pavel Vainerman

(SM): добавил ведение статистики по "недоступным заказчикам"

и так же учёт количества изменений датчика.
parent a7486f85
......@@ -504,7 +504,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%exclude %_pkgconfigdir/libUniSet2.pc
# history of current unpublished changes
# ..
# - remove 'fastSaveValue'
# - add suppor HTTP REST API
# - (SM): add new statistics for consumers
%changelog
* Mon Oct 24 2016 Pavel Vainerman <pv@altlinux.ru> 2.5-alt20
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -18,6 +18,7 @@
<AutoStartUpTime name="1"/>
<DumpStateTime name="10"/>
<SleepTickMS name="500"/>
<ConsumerMaxAttempts name="3"/>
<UniSetDebug levels="" name="ulog"/>
<ConfDir name="./"/>
<DataDir name="./"/>
......
......@@ -312,7 +312,7 @@
limit - количество в ответе.
/consumers - получить список заказчиков по каждому датчику
/lost - получить список заказчиков с которыми терялась связь (и они удалялись из списка)
*/
class SharedMemory:
public IONotifyController
......
......@@ -5,7 +5,7 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs"
ulimit -Sc 10000000000
./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory \
--confile test-lost.xml --datfile test-lost.xml --ulog-add-levels system,level1 \
--confile test-lost.xml --datfile test-lost.xml --ulog-add-levels crit,warn,system,level1 \
--sm-log-add-levels any $* --sm-run-logserver --activate-timeout 320000
#--pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100
......
......@@ -137,7 +137,8 @@ void LostTestProc::timerInfo( const TimerMessage* tm )
if(ui->getValue(s.first) != (s.second+1) )
{
cerr << myname << "(check): SAVE TO SM ERROR!! smValue=" << smValue << endl;
cerr << myname << "(check): SAVE TO SM ERROR!! sid=" << s.first
<< " value=" << smValue << " != " << (s.second+1) << endl;
UniSetTypes::SimpleInfo_var i = getInfo();
cerr << i->info << endl;
std::abort();
......
......@@ -2,7 +2,7 @@
START=uniset2-start.sh
LOGS="crit,warn,info"
LOGLEVEL="crit,warn,info"
${START} -f ./sm-lostmessage-test --confile ./test-lost.xml \
--numproc 3 \
......
......@@ -309,6 +309,8 @@ class IOController:
long d_off_value = { 0 }; /*!< блокирующее значение */
std::shared_ptr<USensorInfo> d_usi; // shared_ptr на датчик от которого зависит этот.
size_t nchanges = { 0 }; // количество изменений датчика
// функция обработки информации об изменении состояния датчика, от которого зависит данный
void checkDepend( std::shared_ptr<USensorInfo>& d_usi, IOController* );
......
......@@ -160,6 +160,12 @@ class IONotifyController:
// --------------------------------------------
// http API
virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) override;
nlohmann::json httpRequest( const string& req, const Poco::URI::QueryParameters& p );
// --------------------------------------------
/*! Информация о заказчике */
struct ConsumerInfoExt:
public UniSetTypes::ConsumerInfo
......@@ -172,6 +178,7 @@ class IONotifyController:
UniSetObject_i_var ref;
size_t attempt;
size_t lostEvents = { 0 }; // количество потерянных сообщений (не смогли послать)
size_t smCount = { 0 }; // количество посланных SensorMessage
ConsumerInfoExt( const ConsumerInfoExt& ) = default;
ConsumerInfoExt& operator=( const ConsumerInfoExt& ) = default;
......@@ -270,11 +277,6 @@ class IONotifyController:
/*! словарь: аналоговый датчик --> список порогов по нему */
typedef std::unordered_map<UniSetTypes::ObjectId, ThresholdsListInfo> AskThresholdMap;
// http API
virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) override;
nlohmann::json httpRequest( const string& req, const Poco::URI::QueryParameters& p );
protected:
IONotifyController();
virtual bool activateObject() override;
......@@ -320,7 +322,8 @@ class IONotifyController:
};
// http api
virtual nlohmann::json request_consumers( const std::string& req, const Poco::URI::QueryParameters& p );
nlohmann::json request_consumers( const std::string& req, const Poco::URI::QueryParameters& p );
nlohmann::json request_lost( const string& req, const Poco::URI::QueryParameters& p );
private:
friend class NCRestorer;
......@@ -346,10 +349,27 @@ class IONotifyController:
/*! замок для блокирования совместного доступа к cписку потребителей пороговых датчиков */
UniSetTypes::uniset_rwmutex trshMutex;
int maxAttemtps; /*! timeout for consumer */
sigc::connection conInit;
sigc::connection conUndef;
int maxAttemtps; /*! timeout for consumer */
std::mutex lostConsumersMutex;
struct LostConsumerInfo
{
size_t count = { 0 }; // количество "пропаданий"
bool lost = { false }; // флаг означающий что "заказчик пропал"
// lost нужен чтобы в count не увеличивать, на send() по каждому датчику, если заказчик заказывал больше одного датчика)
// флаг сбрасывается при перезаказе датчика..
};
/*! map для хранения информации о заказчиках с которыми была потеряна связь
* и которые были удалены из списка заказчиков
* size_t - количество раз
* ObjectId - id заказчика
*/
std::unordered_map<UniSetTypes::ObjectId, LostConsumerInfo> lostConsumers;
};
// --------------------------------------------------------------------------
#endif
......
......@@ -937,6 +937,11 @@ throw(UniSetTypes::ResolveNameError, UniSetTypes::TimeOut )
// uwarn << "UI(resolve): CORBA::SystemException" << endl;
throw UniSetTypes::TimeOut();
}
catch( std::exception& ex )
{
ucrit << "UI(resolve): myID=" << myid << ": resolve id=" << rid << "@" << node
<< " catch " << ex.what() << endl;
}
throw UniSetTypes::ResolveNameError();
}
......
......@@ -291,7 +291,10 @@ long IOController::localSetValue( std::shared_ptr<USensorInfo>& usi,
bool blocked = ( usi->blocked || usi->undefined );
changed = ( usi->real_value != value );
// если поменялось состояние блокировки
// Смотрим поменялось ли состояние блокировки.
// т.е. смотрим записано ли у нас уже value = d_off_value и флаг блокировки
// т.к. если blocked=true то должно быть usi->value = usi->d_off_value
// если флаг снимется, то значит должны "восстанавливать" значение из real_value
blockChanged = ( blocked != (usi->value == usi->d_off_value ) );
if( changed || blockChanged )
......@@ -309,6 +312,8 @@ long IOController::localSetValue( std::shared_ptr<USensorInfo>& usi,
usi->value = (blocked ? usi->d_off_value : value);
retValue = usi->value;
usi->nchanges++; // статистика
// запоминаем время изменения
try
{
......@@ -950,6 +955,7 @@ void IOController::getSensorInfo( nlohmann::json& jdata, std::shared_ptr<USensor
jsens["type"] = UniSetTypes::iotype2str(s->type);
jsens["default_val"] = s->default_val;
jsens["dbignore"] = s->dbignore;
jsens["nchanges"] = s->nchanges;
jsens["calibration"] = {
{ "cmin",s->ci.minCal},
{ "cmax",s->ci.maxCal},
......@@ -958,7 +964,6 @@ void IOController::getSensorInfo( nlohmann::json& jdata, std::shared_ptr<USensor
{ "precision",s->ci.precision}
};
// ::CORBA::Boolean undefined;
// ::CORBA::Boolean blocked;
// ::CORBA::Long priority;
......
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