Hello,
I am just thinking of making the connection inactive, via a flag in shared memory, so the other processes will ignore it as well. Then, if the connection is active more than N seconds, try to use it again, and if fails, keep it inactive.
This will work for every kind of selecting policy, read or write operation. I hope to push the patch very soon. Your patch could be ok for serial selection, but then we would have to add different ones for round robin and parallel operations.
Cheers, Daniel
On 4/7/12 4:59 PM, Juha Heinanen wrote:
daniel,
the patch below upgrades working connection if read operation on another connection with same priority has failed, i.e., next time the working connection will be tried before the failing one.
is the patch ok with you? if so, the same could be done on write operations.
-- juha
*** /usr/src/orig/sip-router/modules_k/db_cluster/dbcl_api.c 2012-03-28 18:26:21.000000000 +0300 --- modules_k/db_cluster/dbcl_api.c 2012-04-07 17:51:28.000000000 +0300
*** 46,51 **** --- 46,52 ---- int k;\ db1_con_t *dbh=NULL;\ dbcl_cls_t *cls=NULL;\
- dbcl_con_t *tmp;\ cls = (dbcl_cls_t*)_h->tail;\ ret = 0;\ for(i=DBCL_PRIO_SIZE-1; i>0; i--)\
*** 58,68 **** if(cls->rlist[i].clist[j] != NULL&& cls->rlist[i].clist[j]->flags!=0\ && cls->rlist[i].clist[j]->dbh != NULL)\ {\ ! LM_DBG("serial operation - cluster [%.*s] (%d/%d)\n",\ cls->name.len, cls->name.s, i, j);\ dbh = cls->rlist[i].clist[j]->dbh;\ ret = cls->rlist[i].clist[j]->dbf.command;\ if (ret==0) {\ cls->usedcon = cls->rlist[i].clist[j];\ return 0;\ }\ --- 59,76 ---- if(cls->rlist[i].clist[j] != NULL&& cls->rlist[i].clist[j]->flags!=0\ && cls->rlist[i].clist[j]->dbh != NULL)\ {\ ! LM_DBG("serial operation - cluster [%.*s] (%d/%d)\n", \ cls->name.len, cls->name.s, i, j);\ dbh = cls->rlist[i].clist[j]->dbh;\ ret = cls->rlist[i].clist[j]->dbf.command;\ if (ret==0) {\
if (j> 0) {\
LM_INFO("upgrading connection - cluster [%.*s] (%d/%d)\n", \
cls->name.len, cls->name.s, i, j);\
tmp = cls->rlist[i].clist[j];\
cls->rlist[i].clist[j] = cls->rlist[i].clist[j-1];\
cls->rlist[i].clist[j-1] = tmp;\
}\ cls->usedcon = cls->rlist[i].clist[j];\ return 0;\ }\