Module: sip-router
Branch: master
Commit: 834dce1f4d0dbd2aac3b63477459f1045239010f
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=834dce1…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Wed Sep 17 00:57:40 2014 +0200
htable: lookup event route for expired items at startup
- searching it by name at runtime can become an overhead for lot of
entries in htable
---
modules/htable/ht_api.c | 55 ++++++++++++++++++++++++++--------------------
modules/htable/ht_api.h | 3 +-
2 files changed, 33 insertions(+), 25 deletions(-)
diff --git a/modules/htable/ht_api.c b/modules/htable/ht_api.c
index 1d39149..f888714 100644
--- a/modules/htable/ht_api.c
+++ b/modules/htable/ht_api.c
@@ -275,6 +275,7 @@ int ht_init_tables(void)
{
ht_t *ht;
int i;
+ char route_name[64];
ht = _ht_root;
@@ -282,6 +283,26 @@ int ht_init_tables(void)
{
LM_DBG("initializing htable [%.*s] with nr. of slots: %d\n",
ht->name.len, ht->name.s, ht->htsize);
+ if(ht->name.len + sizeof("htable:expired:") < 64)
+ {
+ strcpy(route_name, "htable:expired:");
+ strncat(route_name, ht->name.s, ht->name.len);
+ ht->evrt_expired = route_get(&event_rt, route_name);
+
+ if (ht->evrt_expired < 0
+ || event_rt.rlist[ht->evrt_expired] == NULL)
+ {
+ ht->evrt_expired = -1;
+ LM_DBG("event route for expired items in [%.*s] does not exist\n",
+ ht->name.len, ht->name.s);
+ } else {
+ LM_DBG("event route for expired items in [%.*s] exists\n",
+ ht->name.len, ht->name.s);
+ }
+ } else {
+ LM_WARN("event route name for expired items in htable [%.*s]"
+ " is too long\n", ht->name.len, ht->name.s);
+ }
ht->entries = (ht_entry_t*)shm_malloc(ht->htsize*sizeof(ht_entry_t));
if(ht->entries==NULL)
{
@@ -954,39 +975,25 @@ void ht_timer(unsigned int ticks, void *param)
void ht_handle_expired_record(ht_t *ht, ht_cell_t *cell)
{
- ht_expired_cell = cell;
-
- char route_name[64] = "htable:expired:";
-
- if (ht->name.len + strlen(route_name) > 64)
- {
- LM_ERR("ht_expired_record route name too long");
+ if(ht->evrt_expired<0)
return;
- }
+ ht_expired_cell = cell;
- strncat(route_name, ht->name.s, ht->name.len);
- ht_expired_run_event_route(route_name);
+ LM_DBG("running event_route[htable:expired:%.*s]\n",
+ ht->name.len, ht->name.s);
+ ht_expired_run_event_route(ht->evrt_expired);
ht_expired_cell = NULL;
}
-void ht_expired_run_event_route(char *route)
+void ht_expired_run_event_route(int routeid)
{
- int rt, backup_rt;
+ int backup_rt;
sip_msg_t *fmsg;
- if (route == NULL)
- {
- LM_ERR("bad route\n");
- }
-
- LM_DBG("ht_expired_run_event_route event_route[%s]\n", route);
-
- rt = route_get(&event_rt, route);
-
- if (rt < 0 || event_rt.rlist[rt] == NULL)
+ if (routeid < 0 || event_rt.rlist[routeid] == NULL)
{
- LM_DBG("route does not exist");
+ LM_DBG("route does not exist\n");
return;
}
@@ -1001,7 +1008,7 @@ void ht_expired_run_event_route(char *route)
backup_rt = get_route_type();
set_route_type(EVENT_ROUTE);
- run_top_route(event_rt.rlist[rt], fmsg, 0);
+ run_top_route(event_rt.rlist[routeid], fmsg, 0);
set_route_type(backup_rt);
}
diff --git a/modules/htable/ht_api.h b/modules/htable/ht_api.h
index d7ba916..b6175b6 100644
--- a/modules/htable/ht_api.h
+++ b/modules/htable/ht_api.h
@@ -63,6 +63,7 @@ typedef struct _ht
int updateexpire;
unsigned int htsize;
int dmqreplicate;
+ int evrt_expired;
ht_entry_t *entries;
struct _ht *next;
} ht_t;
@@ -95,7 +96,7 @@ int ht_db_sync_tables(void);
int ht_has_autoexpire(void);
void ht_timer(unsigned int ticks, void *param);
void ht_handle_expired_record(ht_t *ht, ht_cell_t *cell);
-void ht_expired_run_event_route(char *route);
+void ht_expired_run_event_route(int routeid);
int ht_set_cell_expire(ht_t *ht, str *name, int type, int_str *val);
int ht_get_cell_expire(ht_t *ht, str *name, unsigned int *val);