From 436cca698e4a4438548eef06101a0cde6c0cba94 Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Tue, 19 May 2009 14:38:59 +0000 Subject: [PATCH] setExpiration function. Using this together with garbage collector log, items in monitoring memory storage can be set as soft state. This work was kindly sponsored by Teltech Systems Inc. git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1393 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- apps/monitoring/Monitoring.cpp | 22 +++++++++++++++++++++- apps/monitoring/Monitoring.h | 1 + doc/Readme.monitoring | 4 +++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/monitoring/Monitoring.cpp b/apps/monitoring/Monitoring.cpp index 88a5ceab..b9254381 100644 --- a/apps/monitoring/Monitoring.cpp +++ b/apps/monitoring/Monitoring.cpp @@ -63,6 +63,11 @@ Monitor::~Monitor() { } int Monitor::onLoad() { + AmArg a; + a.assertArray(); + AmArg b; + a.pop(b); + // todo: if GC configured, start thread AmConfigReader cfg; if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) { @@ -92,6 +97,8 @@ void Monitor::invoke(const string& method, logAdd(args,ret); } else if(method == "markFinished"){ markFinished(args,ret); + } else if(method == "setExpiration"){ + setExpiration(args,ret); } else if(method == "get"){ get(args,ret); } else if(method == "getAttribute"){ @@ -120,6 +127,7 @@ void Monitor::invoke(const string& method, ret.push(AmArg("log")); ret.push(AmArg("logAdd")); ret.push(AmArg("markFinished")); + ret.push(AmArg("setExpiration")); ret.push(AmArg("erase")); ret.push(AmArg("clear")); ret.push(AmArg("clearFinished")); @@ -184,7 +192,19 @@ void Monitor::markFinished(const AmArg& args, AmArg& ret) { LogBucket& bucket = getLogBucket(args[0].asCStr()); bucket.log_lock.lock(); if (!bucket.log[args[0].asCStr()].finished) - bucket.log[args[0].asCStr()].finished = time(0); + bucket.log[args[0].asCStr()].finished = time(0); + bucket.log_lock.unlock(); + ret.push(0); + ret.push("OK"); +} + +void Monitor::setExpiration(const AmArg& args, AmArg& ret) { + assertArgCStr(args[0]); + assertArgInt(args[1]); + + LogBucket& bucket = getLogBucket(args[0].asCStr()); + bucket.log_lock.lock(); + bucket.log[args[0].asCStr()].finished = args[1].asInt(); bucket.log_lock.unlock(); ret.push(0); ret.push("OK"); diff --git a/apps/monitoring/Monitoring.h b/apps/monitoring/Monitoring.h index c5ae66a0..3afc0e15 100644 --- a/apps/monitoring/Monitoring.h +++ b/apps/monitoring/Monitoring.h @@ -68,6 +68,7 @@ class Monitor void log(const AmArg& args, AmArg& ret); void logAdd(const AmArg& args, AmArg& ret); void markFinished(const AmArg& args, AmArg& ret); + void setExpiration(const AmArg& args, AmArg& ret); void clear(const AmArg& args, AmArg& ret); void clearFinished(const AmArg& args, AmArg& ret); void erase(const AmArg& args, AmArg& ret); diff --git a/doc/Readme.monitoring b/doc/Readme.monitoring index d1abda91..fcf0d6ca 100644 --- a/doc/Readme.monitoring +++ b/doc/Readme.monitoring @@ -30,10 +30,12 @@ This will remove all info about finished sessions preiodically. DI API ------ -functions to log, e.g. from inside SEMS: +functions to log, e.g. from inside SEMS (but may also be like memcache from outside): log(ID, key, value [, key, value [, key, value [...]]]) - set one or multiple AVPs logAdd(ID, key, value) - add a value to a AVPs markFinished(ID) - mark call as finished + setExpiration(ID, time) - set expiration of item identified with ID to time + in seconds since the Epoch (like time(2)) functions to get log, e.g. from the outside: list() - list IDs of calls