THIS IS AN AUTOMATED MESSAGE, DO NOT REPLY.

A new Flyspray task has been opened.  Details are below. 

User who did this - Savolainen Dmitri (snen) 

Attached to Project - sip-router
Summary - usrloc driver error on query: Duplicate entry 'XXXXXXXXXXXX' for key 
'ruid_idx'
Task Type - Bug Report
Category - usrloc (k)
Status - Unconfirmed
Assigned To - 
Operating System - Linux
Severity - Medium
Priority - Normal
Reported Version - 4.1
Due in Version - Undecided
Due Date - Undecided
Details - getting error ERROR: db_mysql [km_dbase.c:122]: 
db_mysql_submit_query(): driver error on query: Duplicate entry 'XXXXXXXXXXXX' 
for key 'ruid_idx'

Getting error expample

usloc params:

<code>
modparam('usrloc', 'db_mode', 2)
modparam("usrloc", "db_check_update", 1) 
modparam("usrloc", "db_ops_ruid", 1)
modparam("usrloc", "timer_interval", 120) #default 60
modparam('usrloc', 'db_url', 'mysql:XXXXXXXXXXXXXXXXX')
</code>

now let's manipulate with user 1111

1. 1111 doesn't exist
<code>
mysql>select * from location where username='1111' \G
Empty set (0.00 sec)
</code>
2. add permanent location for 1111
./kamctl ul add '[email protected]' 'sip:[email protected]'

3. 1111 is in DB after some seconds (up to "timer_interval")  
<code>
mysql>select * from location where username='1111' \G
*************************** 1. row ***************************
           id: 111625
         ruid: ulcx-53b55b8f-46d1-1
     username: 1111
       domain: erinaco.ru
      contact: sip:[email protected]
     received: NULL
         path: NULL
      expires: 1970-01-01 03:00:00
            q: 1.00
       callid: [email protected]
         cseq: 1
last_modified: 1970-01-01 03:00:00
        flags: 0
       cflags: 0
   user_agent: SIP Router MI Server
       socket: NULL
      methods: NULL
     instance: NULL
       reg_id: 0
</code>
       
 4. let's execute this again
 ./kamctl ul add '[email protected]' 'sip:[email protected]'
 
 There is no any changes in db after "timer_interval"
<code>
 mysql>select * from location where username='1111' \G
*************************** 1. row ***************************
           id: 111626
         ruid: ulcx-53b55f26-4895-1
     username: 1111
       domain: erinaco.ru
      contact: sip:[email protected]
     received: NULL
         path: NULL
      expires: 1970-01-01 03:00:00
            q: 1.00
       callid: [email protected]
         cseq: 1
last_modified: 1970-01-01 03:00:00
        flags: 0
       cflags: 0
   user_agent: SIP Router MI Server
       socket: NULL
      methods: NULL
     instance: NULL
       reg_id: 0
1 row in set (0.00 sec)
</code>
 
Now,  every "timer_interval" seconds  in kamailio.log 
<code>
[snen@sw4 sbin]# grep 'ulcx-53b55f26-4895-1'  /var/log/kamailio.log 
Jul  3 17:52:22 sw4 ./kamailio[18576]: ERROR: db_mysql [km_dbase.c:122]: 
db_mysql_submit_query(): driver error on query: Duplicate entry 
'ulcx-53b55f26-4895-1' for key 'ruid_idx'
Jul  3 17:54:22 sw4 ./kamailio[18576]: ERROR: db_mysql [km_dbase.c:122]: 
db_mysql_submit_query(): driver error on query: Duplicate entry 
'ulcx-53b55f26-4895-1' for key 'ruid_idx'
Jul  3 17:56:22 sw4 ./kamailio[18576]: ERROR: db_mysql [km_dbase.c:122]: 
db_mysql_submit_query(): driver error on query: Duplicate entry 
'ulcx-53b55f26-4895-1' for key 'ruid_idx'
Jul  3 17:58:22 sw4 ./kamailio[18576]: ERROR: db_mysql [km_dbase.c:122]: 
db_mysql_submit_query(): driver error on query: Duplicate entry 
'ulcx-53b55f26-4895-1' for key 'ruid_idx'
</code> 

The reason is "modparam("usrloc", "db_check_update", 1)": affected_rows after 
UPDATE returns 0, and INSERT returns permanent error. 
Record was  marked as CS_DIRTY and will be never CS_SYNC up to kamailio reboot 
or registration change(that may be never for permanent registrations)  
so we can see increasing the number of such records in the work process for 
some usage configuration.

some fixes:
* set last_modified to NOW() while updating (bad for simultaneous updates)
* "INSERT IGNORE" as usrloc module param
* do not perform DB changes, if there is no "in memory" changes (may be bad in 
external DB update case) 
* mark record as CS_SYNC after affected_rows 0 and INSERT error, so error will 
be only once

in this patch INSERT error ignored after UPDATE and affected_rows 0 
<code>
diff --git a/modules/usrloc/ucontact.c b/modules/usrloc/ucontact.c
index b18ce98..ad71b34 100644
--- a/modules/usrloc/ucontact.c
+++ b/modules/usrloc/ucontact.c
@@ -820,9 +820,8 @@ int db_update_ucontact_addr(ucontact_t* _c)
                /* supposed to be an UPDATE, but if affected rows is 0, then try
                 * to do an INSERT */
                if(ul_dbf.affected_rows(ul_dbh)==0) {
-                       LM_DBG("affected rows by UPDATE was 0, doing an 
INSERT\n");
-                       if(db_insert_ucontact(_c)<0)
-                               return -1;
+                       LM_DBG("affected rows by UPDATE was 0, doing an INSERT 
without error check\n");
+                       db_insert_ucontact(_c);
                }
        }
        /* delete old db attrs and add the current list */
@@ -1006,9 +1005,8 @@ int db_update_ucontact_ruid(ucontact_t* _c)
                /* supposed to be an UPDATE, but if affected rows is 0, then try
                 * to do an INSERT */
                if(ul_dbf.affected_rows(ul_dbh)==0) {
-                       LM_DBG("affected rows by UPDATE was 0, doing an 
INSERT\n");
-                       if(db_insert_ucontact(_c)<0)
-                               return -1;
+                       LM_DBG("affected rows by UPDATE was 0, doing an INSERT 
without error check\n");
+                       db_insert_ucontact(_c);
                }
        }
 
@@ -1226,9 +1224,8 @@ int db_update_ucontact_instance(ucontact_t* _c)
                /* supposed to be an UPDATE, but if affected rows is 0, then try
                 * to do an INSERT */
                if(ul_dbf.affected_rows(ul_dbh)==0) {
-                       LM_DBG("affected rows by UPDATE was 0, doing an 
INSERT\n");
-                       if(db_insert_ucontact(_c)<0)
-                               return -1;
+                       LM_DBG("affected rows by UPDATE was 0, doing an INSERT 
without error check\n");
+                       db_insert_ucontact(_c);
                }
        }

</code>










More information can be found at the following URL:
http://sip-router.org/tracker/index.php?do=details&task_id=448

You are receiving this message because you have requested it from the Flyspray 
bugtracking system.  If you did not expect this message or don't want to 
receive mails in future, you can change your notification settings at the URL 
shown above.

_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to