Core dump from cyrusdb_skiplist.c
DEMBKOWSKI, Henryk (Henryk)
hdembkowski at alcatel-lucent.com
Tue Sep 9 04:20:13 EDT 2008
Bron,
Thanks for help.
Yes, we have backup and we successfully recovered our annotations
database.
However it could be good if we could have fix for cyrusdb_skiplist.c and
core will
not be seen anymore.
Kind Regards,
Henryk
-----Original Message-----
From: Bron Gondwana [mailto:brong at fastmail.fm]
Sent: Tuesday, September 09, 2008 3:12 AM
To: DEMBKOWSKI, Henryk (Henryk); Info Cyrus; Cyrus Devel
Cc: DEMBEK, Adam (Adam)
Subject: Re: Core dump from cyrusdb_skiplist.c
Yeah, you've got a corrupted skiplist file. There are a variety of
reasons why this could be the case, but most of all, the skiplist
library in 2.3.7 is pretty buggy. Well, no more buggy than it had been
for ages, but I got a LOT of fixes added since then.
Probably the best skiplist library in current use is 2.3.11. 2.3.12 is
theoretically better, but it actually exposes a bug that just silently
worked in 2.3.11.
Hopefully, if Wes and Ken are happy that the locking refactor is tested
enough, there will be a 2.3.13 soonish with a "perfect"
skiplist library.
Meanwhile - that doesn't fix your problem! How attached are you to the
data in the skiplist file? It's your annotations DB. Do you have a
recent backup before it got corrupted? It's sometimes hard to tell.
I can probably repair it for you, but I haven't got a good working
automated tool for it. I'd be going in and fiddling the bits by hand!
Bron.
On Mon, 8 Sep 2008 16:07:41 +0200, "DEMBKOWSKI, Henryk (Henryk)"
<hdembkowski at alcatel-lucent.com> said:
> Hi,
>
>
> We are using cyrus-imapd-2.3.7 to store our messages.
> And we got core from imap - file cyrusdb_skiplist.c
>
>
> #0 myforeach (db=0x814b618, prefix=0xbfffb8c0 "user.6165602930",
> prefixlen=16, goodp=0x8087dc0 <find_p>,
> cb=0x80871d0 <find_cb>, rock=0xbfffb8b0, tid=0xbfffc91c) at
> cyrusdb_skiplist.c:1019
> 1019 ptr = db->map_base + FORWARD(ptr, 0);
> (gdb) t 1
> [Switching to thread 1 (process 14237)]#0 myforeach (db=0x814b618,
> prefix=0xbfffb8c0 "user.6165602930", prefixlen=16,
> goodp=0x8087dc0 <find_p>, cb=0x80871d0 <find_cb>, rock=0xbfffb8b0,
> tid=0xbfffc91c) at cyrusdb_skiplist.c:1019
> 1019 ptr = db->map_base + FORWARD(ptr, 0);
> (gdb) where
> #0 myforeach (db=0x814b618, prefix=0xbfffb8c0 "user.6165602930",
> prefixlen=16, goodp=0x8087dc0 <find_p>,
> cb=0x80871d0 <find_cb>, rock=0xbfffb8b0, tid=0xbfffc91c) at
> cyrusdb_skiplist.c:1019
> #1 0x08087ecf in annotatemore_findall (mailbox=0x814b618
> "@ş\024\b\a",
> entry=0x80b4834 "*", proc=0x4effb8, rock=0x4effb8,
> tid=0xbfffc91c) at annotate.c:391
> #2 0x0808801b in annotatemore_rename (oldmboxname=0xbfffd730
> "user.6165602930",
> newmboxname=0x4effb8 <Address 0x4effb8 out of bounds>,
> olduserid=0x4effb8 <Address 0x4effb8 out of bounds>,
> newuserid=0x4effb8 <Address 0x4effb8 out of bounds>) at
> annotate.c:2093
> #3 0x08055e39 in cmd_rename (tag=0x8151a28 "1", oldname=0x8151b08
> "user.6165602930", newname=0x81c6010 "user.6163078011",
> partition=0x0) at imapd.c:5408
> #4 0x0805e3ac in cmdloop () at imapd.c:1532
> #5 0x08060a57 in service_main (argc=1, argv=0x8149008,
> envp=0xbffffd64) at imapd.c:789
> #6 0x0804c3a8 in main (argc=3, argv=0xbffffd54, envp=0xbffffd64) at
> service.c:532
>
>
> It refers to function myforeach() and code
>
>
> 980 /* save KEY, KEYLEN */
> 981 if (KEYLEN(ptr) > savebuflen) {
> 982 savebuflen = KEYLEN(ptr) + 1024;
> 983 savebuf = xrealloc(savebuf, savebuflen);
> 984 }
> 985 memcpy(savebuf, KEY(ptr), KEYLEN(ptr));
> 986 savebufsize = KEYLEN(ptr);
> 987
> 988 /* make callback */
> 989 cb_r = cb(rock, KEY(ptr), KEYLEN(ptr), DATA(ptr),
> DATALEN(ptr));
> 990 if (cb_r) break;
> 991
> 992 if (!tid) {
> 993 /* grab a r lock */
> 994 if ((r = read_lock(db)) < 0) {
> 995 return r;
> 996 }
> 997 } else {
> 998 /* make sure we're up to date */
> 999 update_lock(db, tp);
> 1000 }
> 1001
> 1002 /* reposition */
> 1003 if (!(ino == db->map_ino && sz == db->map_size)) {
> 1004 /* something changed in the file; reseek */
> 1005 ptr = find_node(db, savebuf, savebufsize, 0);
> 1006
> 1007 /* 'ptr' might not equal 'savebuf'. if it's
> different,
> 1008 we want to stay where we are. if it's the
> same, we
> 1009 should move on to the next one */
> 1010 if (savebufsize == KEYLEN(ptr) &&
> 1011 !memcmp(savebuf, KEY(ptr), savebufsize)) {
> 1012 ptr = db->map_base + FORWARD(ptr, 0);
> 1013 } else {
> 1014 /* 'savebuf' got deleted, so we're now
> pointing at the
> 1015 right thing */
> 1016 }
> 1017 } else {
> 1018 /* move to the next one */
> 1019 ptr = db->map_base + FORWARD(ptr, 0);
> 1020 }
> 1021 } else {
> 1022 /* we didn't make the callback; keep going */
> 1023 ptr = db->map_base + FORWARD(ptr, 0);
> 1024 }
> 1025 }
>
>
>
> Do you know something about it?
>
>
>
> Kind Regards,
> Henryk
--
Bron Gondwana
brong at fastmail.fm
More information about the Cyrus-devel
mailing list