Hi

At 11:57 AM 2004/10/29, Alexander Malysh wrote:
Hi Kalle,

some comments to your patch...

1) don't use dict if you don't know how many items will be stored (dict
filled to more as 80% works very slow). Here we should use something like
red-black-tree.


Or just change the hash function the dict code uses.
I have attached some code for a different hash key.
Under testing with 200,000 items in the dict. Test inserts, gets and then deletes all the items.
uuid keys: new hash +-9secs; current 75secs
int keys: new hash +-5secs; current +-11mins



I can pass on the dict patches to implement this.

Nisan
2) don't call any functions in signal handler that are not signal safe (you
call gwthread_wakeup_all())
3) check for 'file != NULL' in 'int store_save(Msg *msg)'. Because file !=
NULL is our marker for enabled store-file support (store-file support is
optional).


Kalle Marjola wrote:

> Attached a patch (against CVS) that greatly improves store-file:
> It uses Dict instead of List to save messages to memory.
> Moreover, acknowledged messages are immediately cleaned from
> memory, instead of being done in a background thread (that thread
> simple dumps current state to file to reduce startup-times).
> And, above this all, now it is possible to define the frequency
> how often this 'cleanup' is done..
>
> Thus it is far more powerful if queues are created, and I
> greatly encourage all kannel instances to use it, at least
> after it has gained adequate extra testing (I have done some
> tests but more are naturally needed)
>
> As part of the patch, smskannel.conf is updated to enable
> store-file - I know that lots of Kannel installation are based
> on smskannel.conf which is then modified...
>
> Comments?
> I can put this into CVS immediately after Stipe puts out 1.4.0,..
>

--
Thanks,
Alex


--------------------------------
www.clickatell.com
Any message, anywhere
Phone: +27 21 9487150

#define hashsize(n) ((unsigned long)1<<(n))
#define hashmask(n) (hashsize(n)-1)
#define mix(a,b,c) \
{ \
  a -= b; a -= c; a ^= (c>>13); \
  b -= c; b -= a; b ^= (a<<8); \
  c -= a; c -= b; c ^= (b>>13); \
  a -= b; a -= c; a ^= (c>>12);  \
  b -= c; b -= a; b ^= (a<<16); \
  c -= a; c -= b; c ^= (b>>5); \
  a -= b; a -= c; a ^= (c>>3);  \
  b -= c; b -= a; b ^= (a<<10); \
  c -= a; c -= b; c ^= (b>>15); \
}

unsigned long dict_hash( register unsigned char *k, register unsigned long  length)
{
   register unsigned long a,b,c,len;

   /* Set up the internal state */
   len = length;
   a = b = 0x9e3779b9;  /* the golden ratio; an arbitrary value */
   c = 0;           /* the previous hash value */

   /*---------------------------------------- handle most of the key */
   while (len >= 12)
   {
      a += (k[0] +((unsigned long)k[1]<<8) +((unsigned long)k[2]<<16) +((unsigned 
long)k[3]<<24));
      b += (k[4] +((unsigned long)k[5]<<8) +((unsigned long)k[6]<<16) +((unsigned 
long)k[7]<<24));
      c += (k[8] +((unsigned long)k[9]<<8) +((unsigned long)k[10]<<16)+((unsigned 
long)k[11]<<24));
      mix(a,b,c);
      k += 12; len -= 12;
   }

   /*------------------------------------- handle the last 11 bytes */
   c += length;
   switch(len)              /* all the case statements fall through */
   {
   case 11: c+=((unsigned long)k[10]<<24);
   case 10: c+=((unsigned long)k[9]<<16);
   case 9 : c+=((unsigned long)k[8]<<8);
      /* the first byte of c is reserved for the length */
   case 8 : b+=((unsigned long)k[7]<<24);
   case 7 : b+=((unsigned long)k[6]<<16);
   case 6 : b+=((unsigned long)k[5]<<8);
   case 5 : b+=k[4];
   case 4 : a+=((unsigned long)k[3]<<24);
   case 3 : a+=((unsigned long)k[2]<<16);
   case 2 : a+=((unsigned long)k[1]<<8);
   case 1 : a+=k[0];
     /* case 0: nothing left to add */
   }
   mix(a,b,c);
   /*-------------------------------------------- report the result */
   return c;
}

Reply via email to