Module: sems Branch: master Commit: 4c2d456cd06d3ffa594dcf9b0591bcc99a72334f URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=4c2d456cd06d3ffa594dcf9b0591bcc99a72334f
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Thu Aug 11 16:32:22 2011 +0200 don't retry failed de-register. delete_failed_deregistrations option --- apps/db_reg_agent/DBRegAgent.cpp | 67 +++++++++++++++++++++---------- apps/db_reg_agent/DBRegAgent.h | 3 + apps/db_reg_agent/etc/db_reg_agent.conf | 7 +++ doc/Readme.db_reg_agent.txt | 9 ++++ 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/apps/db_reg_agent/DBRegAgent.cpp b/apps/db_reg_agent/DBRegAgent.cpp index 359ea3a..d56fc17 100644 --- a/apps/db_reg_agent/DBRegAgent.cpp +++ b/apps/db_reg_agent/DBRegAgent.cpp @@ -48,6 +48,7 @@ unsigned int DBRegAgent::ratelimit_per = 0; bool DBRegAgent::ratelimit_slowstart = false; bool DBRegAgent::delete_removed_registrations = true; +bool DBRegAgent::delete_failed_deregistrations = false; bool DBRegAgent::save_contacts = true; bool DBRegAgent::db_read_contact = false; string DBRegAgent::contact_hostport; @@ -136,6 +137,9 @@ int DBRegAgent::onLoad() delete_removed_registrations = cfg.getParameter("delete_removed_registrations", "yes") == "yes"; + delete_failed_deregistrations = + cfg.getParameter("delete_failed_deregistrations", "no") == "yes"; + save_contacts = cfg.getParameter("save_contacts", "yes") == "yes"; @@ -449,8 +453,9 @@ void DBRegAgent::updateRegistration(long subscriber_id, return; } - bool need_reregister = it->second->getInfo().domain != realm || - it->second->getInfo().user != user; + bool need_reregister = it->second->getInfo().domain != realm + || it->second->getInfo().user != user; + string old_realm = it->second->getInfo().domain; string old_user = it->second->getInfo().user; it->second->setRegistrationInfo(SIPRegistrationInfo(realm, user, @@ -568,7 +573,7 @@ void DBRegAgent::onRegistrationActionEvent(RegistrationActionEvent* reg_action_e if (!it->second->doRegistration()) { updateDBRegistration(ProcessorDBConnection, reg_action_ev->subscriber_id, - 480, "unable to send request", + 480, ERR_REASON_UNABLE_TO_SEND_REQUEST, true, REG_STATUS_FAILED); if (error_retry_interval) { // schedule register-refresh after error_retry_interval @@ -590,14 +595,24 @@ void DBRegAgent::onRegistrationActionEvent(RegistrationActionEvent* reg_action_e reg_action_ev->subscriber_id); } else { if (!it->second->doUnregister()) { - updateDBRegistration(ProcessorDBConnection, - reg_action_ev->subscriber_id, - 480, "unable to send request", - true, REG_STATUS_TO_BE_REMOVED); - if (error_retry_interval) { - // schedule register-refresh after error_retry_interval - setRegistrationTimer(reg_action_ev->subscriber_id, error_retry_interval, - RegistrationActionEvent::Deregister); + if (delete_removed_registrations && delete_failed_deregistrations) { + DBG("sending de-Register failed - deleting registration %i " + "(delete_failed_deregistrations=yes)\n", reg_action_ev->subscriber_id); + deleteDBRegistration(reg_action_ev->subscriber_id, ProcessorDBConnection); + } else { + DBG("failed sending de-register, updating DB with REG_STATUS_TO_BE_REMOVED " + ERR_REASON_UNABLE_TO_SEND_REQUEST "for subscriber %i\n", + reg_action_ev->subscriber_id); + updateDBRegistration(ProcessorDBConnection, + reg_action_ev->subscriber_id, + 480, ERR_REASON_UNABLE_TO_SEND_REQUEST, + true, REG_STATUS_TO_BE_REMOVED); + // don't re-try de-registrations if sending failed + // if (error_retry_interval) { + // // schedule register-refresh after error_retry_interval + // setRegistrationTimer(reg_action_ev->subscriber_id, error_retry_interval, + // RegistrationActionEvent::Deregister); + // } } } } @@ -753,27 +768,34 @@ void DBRegAgent::onSipReplyEvent(AmSipReplyEvent* ev) { bool auth_pending = false; if (ev->reply.code >= 300) { - // auth response codes + // REGISTER or de-REGISTER failed if ((ev->reply.code == 401 || ev->reply.code == 407) && + // auth response codes // processing reply triggered sending request: resent by auth (cseq_before != registration->getDlg()->cseq)) { DBG("received negative reply, but still in pending state (auth).\n"); auth_pending = true; } else { - // registration failed - mark in DB - DBG("registration failed - mark in DB\n"); - update_status = true; - status = REG_STATUS_FAILED; - if (error_retry_interval) { - if (registration->getUnregistering()) { - // schedule deregister after error_retry_interval - setRegistrationTimer(subscriber_id, error_retry_interval, - RegistrationActionEvent::Deregister); - } else { + if (!registration->getUnregistering()) { + // REGISTER failed - mark in DB + DBG("registration failed - mark in DB\n"); + update_status = true; + status = REG_STATUS_FAILED; + if (error_retry_interval) { // schedule register-refresh after error_retry_interval setRegistrationTimer(subscriber_id, error_retry_interval, RegistrationActionEvent::Register); } + } else { + // de-REGISTER failed + if (delete_removed_registrations && delete_failed_deregistrations) { + DBG("de-Register failed - deleting registration %ld " + "(delete_failed_deregistrations=yes)\n", subscriber_id); + delete_status = true; + } else { + update_status = true; + status = REG_STATUS_TO_BE_REMOVED; + } } } } else if (ev->reply.code >= 200) { @@ -1042,6 +1064,7 @@ void DBRegAgent::DIupdateRegistration(int subscriber_id, const string& user, DBG("DI method: updateRegistration(%i, %s, %s, %s)\n", subscriber_id, user.c_str(), pass.c_str(), realm.c_str()); + updateRegistration(subscriber_id, user, pass, realm, contact); ret.push(200); ret.push("OK"); diff --git a/apps/db_reg_agent/DBRegAgent.h b/apps/db_reg_agent/DBRegAgent.h index ef02623..a33ff7b 100644 --- a/apps/db_reg_agent/DBRegAgent.h +++ b/apps/db_reg_agent/DBRegAgent.h @@ -68,6 +68,8 @@ using std::queue; #define RegistrationActionEventID 117 +#define ERR_REASON_UNABLE_TO_SEND_REQUEST "unable to send request" + struct RegistrationActionEvent : public AmEvent { enum RegAction { Register=0, Deregister }; @@ -129,6 +131,7 @@ class DBRegAgent static bool ratelimit_slowstart; static bool delete_removed_registrations; + static bool delete_failed_deregistrations; static bool save_contacts; static bool db_read_contact; diff --git a/apps/db_reg_agent/etc/db_reg_agent.conf b/apps/db_reg_agent/etc/db_reg_agent.conf index 6b9fedb..a77abf0 100644 --- a/apps/db_reg_agent/etc/db_reg_agent.conf +++ b/apps/db_reg_agent/etc/db_reg_agent.conf @@ -90,3 +90,10 @@ joined_query="select subscribers.subscriber_id as subscriber_id, subscribers.use # default: yes # #delete_removed_registrations=no + +# delete_failed_deregistrations=yes : delete failed de-registrations from registrations +# table in DB? (otherwise they will stay with STATUS_TO_BE_REMOVED) +# only applicable if delete_removed_registrations=yes +# default: no +# +#delete_failed_deregistrations=no diff --git a/doc/Readme.db_reg_agent.txt b/doc/Readme.db_reg_agent.txt index 8411a32..4ccb794 100644 --- a/doc/Readme.db_reg_agent.txt +++ b/doc/Readme.db_reg_agent.txt @@ -105,6 +105,15 @@ CREATE TABLE IF NOT EXISTS `subscribers` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; +Error handling +-------------- + +If a REGISTER or de-REGISTER could not be sent, the status in the database +is set to 480 "unable to send request". + +Failed REGISTERs are re-tried after retry_interval. Failed de-REGISTERs are +not retried. + Todo ---- o (optionally) create DB entries on DI functions _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
