just dont send two MT's to the same device in the same second. This is the fix. 
delay the second part for 2 sec so they can not get the same timestamp.

On 21.07.2010, at 09:23, Alexander Malysh wrote:

> Hi,
> 
> 2 MT at the same time are just not fixable for EMI due to the protocol flaw...
> 
> Thanks,
> Alexander Malysh
> 
> Am 21.07.2010 um 01:00 schrieb Vincent CHAVANIS:
> 
>> 
>> I'm +0 for this patch
>> because i really dislike the <LIKE '%searches'>, they are *extremely* slow
>> but this is at least the most advanced patch that partially fixes the EMI's 
>> dlr issue.
>> *but* you still have an issue if 2 MTs are send in the same second (same ts) 
>> to the same destination.
>> which DLR will you take ? Assuming you're using an 'trans-id' for each MT,
>> you have 1/2 (or more) chance to call the wrong one (depending on how this 
>> was inserted on your db)
>> I personnally experienced this on *hudges* MT pushes.
>> 
>> Vincent
>> 
>> 
>> Le 20/07/2010 23:05, Alexander Malysh a écrit :
>>> Hi Nikos,
>>> 
>>> +1 except some indents issues but I will fix it myself...
>>> 
>>> Any test results from users?
>>> 
>>> Thanks,
>>> Alexander Malysh
>>> 
>>> 
>>> Am 20.07.2010 um 12:07 schrieb Nikos Balkanas:
>>> 
>>> 
>>>> OK. I believe this is it.
>>>> 
>>>> BR,
>>>> Nikos
>>>> ----- Original Message ----- From: "Alexander Malysh"<[email protected]>
>>>> To: "Nikos Balkanas"<[email protected]>
>>>> Cc: "Byron Kiourtzoglou"<[email protected]>;<[email protected]>
>>>> Sent: Tuesday, July 20, 2010 12:14 PM
>>>> Subject: Re: Patch: EMI UUCP DLRs (final)
>>>> 
>>>> 
>>>> Hi Nikos,
>>>> 
>>>> see below ...
>>>> 
>>>> Am 20.07.2010 um 03:03 schrieb Nikos Balkanas:
>>>> 
>>>> 
>>>>> Hi Alex,
>>>>> 
>>>>> Please see inlined comments: I am still waiting feedback from some users 
>>>>> testing it.
>>>>> 
>>>>> 
>>>>>> ----- Original Message ----- From: "Alexander Malysh"<[email protected]>
>>>>>> To: "Nikos Balkanas"<[email protected]>
>>>>>> Cc: "Byron Kiourtzoglou"<[email protected]>;<[email protected]>
>>>>>> Sent: Tuesday, July 20, 2010 1:14 AM
>>>>>> Subject: Re: Patch: EMI UUCP DLRs (final)
>>>>>> 
>>>>> 
>>>>> 
>>>>>> Hi Nikos,
>>>>>> 
>>>>> 
>>>>>> I'm back from vacation and here are comments to your patch. Patch looks 
>>>>>> OK but still some things to fix:
>>>>>> 
>>>>> 
>>>>>> --- gw/dlr_mem.c (revision 4833)
>>>>>> +++ gw/dlr_mem.c (working copy)
>>>>>> @@ -125,8 +125,28 @@
>>>>>> /* XXX: check destination addr too, because e.g. for UCP is not enough 
>>>>>> to check only
>>>>>>   *          smsc and timestamp (timestamp is even without milliseconds)
>>>>>>   */
>>>>>> -    if(octstr_compare(dlr->smsc,smsc) == 0&&  
>>>>>> octstr_compare(dlr->timestamp,ts) == 0)
>>>>>> +    if (dst){
>>>>>> +       Octstr *dst_min;
>>>>>> +       int len1 = octstr_len(dlr->destination), len2 = octstr_len(dst);
>>>>>> +
>>>>>> +       if (len1<  len2)
>>>>>> +          return(1);
>>>>>> +
>>>>>> +       dst_min = octstr_duplicate(dlr->destination);
>>>>>> +       if (len1>  len2)
>>>>>> +             octstr_delete(dst_min, 0, len1 - len2);
>>>>>> +
>>>>>> +       if (octstr_compare(dlr->smsc, smsc) == 0&&  octstr_compare(dlr->
>>>>>> +           timestamp, ts) == 0&&  octstr_compare(dst_min, dst) == 0) {
>>>>>> +           octstr_destroy(dst_min);
>>>>>>     return 0;
>>>>>> +       }
>>>>>> +       octstr_destroy(dst_min);
>>>>>> +    }
>>>>>> +    else
>>>>>> +       if (octstr_compare(dlr->smsc, smsc) == 0&&  octstr_compare(dlr->
>>>>>> +           timestamp, ts) == 0)
>>>>>> +           return 0;
>>>>>> 
>>>>> 
>>>>>> why so complicated?
>>>>>> if (dst) {
>>>>>> pos = octstr_len(dlr->destination) - octstr_len(dst);
>>>>>> if(pos<  0)
>>>>>>    pos = 0;
>>>>>> if (octstr_compare(dlr->smsc, smsc) == 0&&  
>>>>>> octstr_compare(dlr->timestamp, ts) == 0&&  
>>>>>> octstr_search(dlr->destination, dst, pos) !>  = -1)
>>>>>>    return 0;
>>>>>> } else ...
>>>>>> 
>>>>> Same degree of complexity. You use octstr_search, I use octstr_compare. 
>>>>> Personally I wouldn't use either, but octstr_search is slightly faster. 
>>>>> The only reason I used octstr_delete&  compare is because you told me to 
>>>>> use truncate on a copy, and I even asked you twice about it. Will change 
>>>>> it.
>>>>> 
>>>> It's not the same. In my version you don't need  duplicate, destroy etc. 
>>>> and it just simpler to read...
>>>> 
>>>> 
>>>>> 
>>>>>> --- gw/dlr_sdb.c (revision 4833)
>>>>>> +++ gw/dlr_sdb.c (working copy)
>>>>>> +    if (dst)
>>>>>> +       like = octstr_format("AND \"%S\" LIKE '%%%S' %s", 
>>>>>> fields->field_dst,
>>>>>> +              dst, sdb_get_limit_str());
>>>>>> +    else
>>>>>> +       like = octstr_imm(sdb_get_limit_str());
>>>>>> 
>>>>> 
>>>>>> why not keep sdb_get_limit() in place and do it as for other DBs?
>>>>>> and \"%S... seems to be wrong...
>>>>>> 
>>>>> I don't understand what you are asking for here. The code was like that 
>>>>> before and I didn't change it. \"%S\" is a typo. Will fix.
>>>>> 
>>>> why did you put sdb_get_limit_str() here? it should be keep in sql = 
>>>> octstr_format("select ... %s", sdb_get_limit_str, ...)...
>>>> 
>>>> 
>>>> 
>>>>> 
>>>>>> --- gw/dlr.c (revision 4833)
>>>>>> +++ gw/dlr.c (working copy)
>>>>>>  Msg *msg = NULL;
>>>>>>   struct dlr_entry *dlr = NULL;
>>>>>> + Octstr *dst_min = NULL;
>>>>>> 
>>>>> 
>>>>>> indents....
>>>>>> 
>>>>> 
>>>>>> +    if (use_dst&&  dst) {
>>>>>> +       dst_min = octstr_duplicate(dst);
>>>>>> +       int len = octstr_len(dst);
>>>>>> +
>>>>>> +       if (len>  MIN_DST_LEN)
>>>>>> +          octstr_delete(dst_min, 0, len - MIN_DST_LEN);
>>>>>> + }
>>>>>> 
>>>>> I see. Intends are 3 spaces, instead of 4. That's why I don't use spaces. 
>>>>> I tried my best, but please feel free to adjust them exactly the way you 
>>>>> like them.
>>>>> 
>>>> :) kannel uses 4 spaces instead of tabs...
>>>> 
>>>> 
>>>>> 
>>>>>> indents...
>>>>>> 
>>>>> 
>>>>>>  /* destroy struct dlr_entry */
>>>>>>  dlr_entry_destroy(dlr);
>>>>>> +   octstr_destroy(dst_min);
>>>>>> 
>>>>> 
>>>>>> ditto
>>>>>> 
>>>>> 
>>>>> BR,
>>>>> Nikos
>>>>> --- gw/dlr.h (revision 4833)
>>>>> +++ gw/dlr.h (working copy)
>>>>> +Msg* dlr_find(const Octstr *smsc, const Octstr *ts, const Octstr *dst, 
>>>>> int type,
>>>>> + int use_dst);
>>>>> 
>>>>> change to
>>>>> +Msg* dlr_find(const Octstr *smsc, const Octstr *ts, const Octstr *dst, 
>>>>> int type, int use_dst);
>>>>> 
>>>>> 
>>>>> Thanks,
>>>>> Alexander Malysh
>>>>> 
>>>>> Am 14.07.2010 um 14:38 schrieb Nikos Balkanas:
>>>>> 
>>>>> 
>>>>>> Here it is. Added support for dest also for cimd2 as reported by Byron.
>>>>>> 
>>>>>> I have tested thoroughly dlr_mem.c, but only compilation for DBs, since 
>>>>>> i have no access to them.
>>>>>> 
>>>>>> @Byron: Could you please test patch for CIMD2 against some of the DBs 
>>>>>> you use?
>>>>>> 
>>>>>> Thanks,
>>>>>> Nikos
>>>>>> ----- Original Message ----- From: "Alexander Malysh"<[email protected]>
>>>>>> To: "Nikos Balkanas"<[email protected]>
>>>>>> Cc:<[email protected]>
>>>>>> Sent: Wednesday, July 07, 2010 6:11 PM
>>>>>> Subject: Re: Patch: EMI UUCP DLRs (final)
>>>>>> 
>>>>>> 
>>>>>> Hi,
>>>>>> 
>>>>>> sorry for delay... I have limited inet access now... see answers bellow.
>>>>>> 
>>>>>> Am 30.06.2010 um 19:30 schrieb Nikos Balkanas:
>>>>>> 
>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> Please see inlined answers.
>>>>>>> Thanks for the comments and corrections. Please confirm a few remaining 
>>>>>>> choices.
>>>>>>> 
>>>>>>> BR,
>>>>>>> Nikos
>>>>>>> ----- Original Message ----- From: "Alexander 
>>>>>>> Malysh"<[email protected]>
>>>>>>> To: "Nikos Balkanas"<[email protected]>
>>>>>>> Cc:<[email protected]>
>>>>>>> Sent: Wednesday, June 30, 2010 12:02 PM
>>>>>>> Subject: Re: Patch: EMI UUCP DLRs (final)
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>> 
>>>>>>>> IMO we don't need to handle no destination case in DLR lookup but 
>>>>>>>> maybe it's not a wrong idea to be able to ignore destination for some
>>>>>>>> reasons when SMSC send some junk to us.
>>>>>>>> 
>>>>>>> Not doing it, could miss some queries altogether. It would still work 
>>>>>>> for the large majority, but could miss a few matches that would have 
>>>>>>> gotten otherwise.
>>>>>>> 
>>>>>> this is ok for me, we make it optional...
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>> ok here is the review for your patch:
>>>>>>>> +    if (dst){
>>>>>>>> +       int len = octstr_len(dst);
>>>>>>>> +       char *p = octstr_get_cstr(dst);
>>>>>>>> 
>>>>>>> 
>>>>>>>> +       if (len>  MIN_DST_LEN)
>>>>>>>> +           p += len - MIN_DST_LEN;         /* get last MIN_DST_LEN 
>>>>>>>> digits */
>>>>>>>> +       like = octstr_create(strcat("%", p));
>>>>>>>> +       gwlist_append(binds, like);
>>>>>>>> +    }
>>>>>>>> 
>>>>>>> 
>>>>>>>> why is this in every dlr implementation? we have abstraction for this, 
>>>>>>>> see dlr.c
>>>>>>>> 
>>>>>>> I don't know where in dlr.c you are referring, but I see your reasoning.
>>>>>>> This is leftover from a previous implementation, where I passed 
>>>>>>> use_dest in the dlr_<DB>.  I considered it at the time important to 
>>>>>>> pass the whole dest to dlr_<db>  so that debug messages get the whole 
>>>>>>> dest. Since I started passing NULL for dest, this serves no more 
>>>>>>> purpose. I will abstract it in dlr_find and use octstr_delete instead. 
>>>>>>> Will also correct debug messages accordingly in dlr_db.c.
>>>>>>> 
>>>>>> you have to abstract it in dlr_find and not repeat the same code in each 
>>>>>> dlr_db driver.
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>> -    sql = octstr_format("SELECT `%S`, `%S`, `%S`, `%S`, `%S`, `%S` 
>>>>>>>> FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
>>>>>>>> +    if (dst)
>>>>>>>> +       sql = octstr_format("SELECT `%S`, `%S`, `%S`, `%S`, `%S`, `%S` 
>>>>>>>> FROM `%S` WHERE `%S`=? AND `%S`=? AND `%S`>LIKE ? LIMIT 1",
>>>>>>>>                   fields->field_mask, fields->field_serv,
>>>>>>>>                    fields->field_url, fields->field_src,
>>>>>>>>                    fields->field_dst, fields->field_boxc,
>>>>>>>>                    fields->table, fields->field_smsc,
>>>>>>>> +                        fields->field_ts, fields->field_dst);
>>>>>>>> ...
>>>>>>>> First of all: like ? doesn't work as you expect... it should be 
>>>>>>>> something like: LIKE CONCAT('%%', ?) and
>>>>>>>> 
>>>>>>> Thanks. I will look into it.
>>>>>>> 
>>>>>>> 
>>>>>>>> this is too much maintenance for SQL that defined two times, how about 
>>>>>>>> like this:
>>>>>>>> if (dst)
>>>>>>>> like = octstr_format('LIKE CONCAT('%%', ?)' ...);
>>>>>>>> else
>>>>>>>> like = octstr_create("");
>>>>>>>> 
>>>>>>> You probably mean:
>>>>>>> 
>>>>>>> like = octstr_create("=?");
>>>>>>> 
>>>>>> no, I mean octstr_create("") or better use octstr_imm("")
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>> sql = ...(".... %S", like)
>>>>>>>> 
>>>>>>> This is a classical maintenance vs overhead. Malloc is expensive, much 
>>>>>>> more so in Linux than in Solaris. Furthermore, sql="%s%S" is more 
>>>>>>> difficult to read and understand, since SQL mechanism is not explicit, 
>>>>>>> but hidden in variables. Do you really want that?
>>>>>>> 
>>>>>> yes, because maintenance is then easier and malloc overhead is in linux 
>>>>>> not so much expensive as you think because glibc has preallocated memory 
>>>>>> pools and not always is system call
>>>>>> needed.
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>> The same is for DELETE, UPDATE...
>>>>>>>> 
>>>>>>> 
>>>>>>>> +        if (like) octstr_destroy(like);
>>>>>>>> 
>>>>>>> 
>>>>>>>> octstr_destroy will check for NULL for you...
>>>>>>>> 
>>>>>>> I am aware of that, but it costs a function call and a few more 
>>>>>>> statements...Either way is fine. I can change it.
>>>>>>> 
>>>>>> function call is not really issue against code readability... and if 
>>>>>> this is really your argument then convert all calls to if (..!=NULL) 
>>>>>> bla... (just a joke)
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>> +       if (octstr_compare(dlr->smsc, smsc) == 0&&  
>>>>>>>> octstr_compare(dlr->
>>>>>>>> +           timestamp, ts) == 0&&  memcmp(p1 + len1 - size, p2 + len2 
>>>>>>>> - size,
>>>>>>>> +           size) == 0)
>>>>>>>> +           return 0;
>>>>>>>> 
>>>>>>> 
>>>>>>>> memcmp??? why not just use truncated destination and do: 
>>>>>>>> octstr_search???
>>>>>>>> 
>>>>>>> Actually octstr_truncate won't work since it truncates from the end. 
>>>>>>> octstr_delete, would work, however, destroying the original Octstr in 
>>>>>>> the process, unless I duplicated them. It would need to be done on both 
>>>>>>> destinations to work. Code would be more, and the malloc, free and 
>>>>>>> copy, have an overhead. Memcmp doesn't change the original Octstr and 
>>>>>>> is natural for such operations. However, it is out of kannel style, so 
>>>>>>> you have every right to ask me to change it. Do you?
>>>>>>> 
>>>>>> yes, please change it.
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>> +Msg *dlr_find(const Octstr *smsc, const Octstr *ts, const Octstr 
>>>>>>>> *dst, int typ, int use_dst)
>>>>>>>> 
>>>>>>> 
>>>>>>>> you don't need to change function. Just use dst = NULL and check it.
>>>>>>>> 
>>>>>>> No. dst is needed for debug msgs inside dlr_find. Furthermore, use_dst, 
>>>>>>> currently is set only for EMI. Decision is made at driver level so it 
>>>>>>> can easily change to an smsc configuration variable if needed.
>>>>>>> 
>>>>>> ok, maybe you are right. What other people think about this ?
>>>>>> 
>>>>>> 
>>>>>>> Am 26.06.2010 um 10:23 schrieb Nikos Balkanas:
>>>>>>> 
>>>>>>> 
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>>> I believe I have accounted for almost all your comments to produce the 
>>>>>>>> final working patch. I have no way of testing, other than compilation.
>>>>>>>> 
>>>>>>>> This patch will povide:
>>>>>>>> 
>>>>>>>> 1) Align dlr_oracle.c with the rest. Currently, Oracle does a full dst 
>>>>>>>> find/remove/update on each DLR.
>>>>>>>> 2) Dst use on find/remove/update is controlled in dlr_find by a single 
>>>>>>>> variable, use_dst. This is currently set only at driver level and only 
>>>>>>>> in the emi driver, while everyone else has it false. However, very 
>>>>>>>> easily, if need arises, it can be set in smsc configuration.
>>>>>>>> 3) All DLR handling for all smscs will remain as it used to be till 
>>>>>>>> now. Only emi handling changes, hopefully for the better (that is the 
>>>>>>>> purpose of the patch :-)).
>>>>>>>> 4) It will try to match the last 7 digits of the destination or the 
>>>>>>>> length of the destination if it smaller. This is defined in gw/dlr_p.h 
>>>>>>>> as MIN_DST_LEN. Didn't want to make it larger, wanted to avoid prefix 
>>>>>>>> territory at all costs, since I have seen a lot of mangling there by 
>>>>>>>> the SMScs. Besides, I believe that 7 digits give enough resolution
>>>>>>>> 5) People using emi, should rebuild their indeces, especially if they 
>>>>>>>> are running large batch jobs through EMI. The LIKE % construction is 
>>>>>>>> not very efficient.
>>>>>>>> 
>>>>>>>> Enjoy,
>>>>>>>> Nikos
>>>>>>>> <kannel.diff>
>>>>>>>> 
>>>>>>> 
>>>>>> <kannel.diff>
>>>>>> 
>>>>> 
>>>> <kannel.diff>
>>>> 
>>> 
>>> 
>> 
>> 
> 
> 



Reply via email to