[bdbxml] Segmentation fault in putDocument

"chehai wu" <[email protected]> Mon, 20 Feb 2006 11:16:45 +0800
Newsgroups gmane.comp.db.dbxml.general
Message-ID <[email protected]>
------=_Part_17718_5227686.1140405405190
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi,
    I use two threads to put XML documents into a  container by calling
XmlContainer::putDocument. The deadlock is possible, so I retry putDocument
when the deadlock is detected. But after the deadlock is resolved, the
program will  generate the segmentation fault error. GDB shows the
following:

#0  0xb758292c in Dbc::get () from /usr/lib/libdb_cxx-4.3.so
#1  0xb775402c in DbXml::DocumentDatabase::getAllMetaData (this=3D0x80a8238=
,
context=3D@0x80b7fd4,
    dictionary=3D0x80a6dd8, document=3D0x80b7f90, flags=3D30) at Cursor.hpp=
:49
#2  0xb76f6674 in DbXml::Document::setEagerMetaData (this=3D0x80b7f90) at
Document.cpp:145
#3  0xb76f67d3 in DbXml::Document::setMetaDataFromContainer (this=3D0x80b7f=
90,
container=3D0x80a5f28,
    id=3D@0x1e, txn=3D0x80aa290, flags=3D0) at Document.cpp:127
#4  0xb76db475 in DbXml::Container::addDocument (this=3D0x80a5f28,
txn=3D0x80aa290,
    document=3D@0x80b7f90, context=3D@0x80a5328, flags=3D536870912) at
Container.cpp:553
#5  0xb76e6a8f in AddDocumentFunctor::method (this=3D0x1e,
container=3D@0x80a5f28, txn=3D0x80aa290,
    flags=3D536870912) at TransactedContainer.cpp:99
#6  0xb76e59ae in DbXml::TransactedContainer::transactedMethod
(this=3D0x80a5f28, txn=3D0x0,
    flags=3D536870912, f=3D@0xb723b338) at TransactedContainer.cpp:217
#7  0xb76e5c90 in DbXml::TransactedContainer::addDocument (this=3D0x80a5f28=
,
txn=3D0x80aa290,
    document=3D@0x1e, context=3D@0x1e, flags=3D536870912) at
TransactedContainer.cpp:110
#8  0xb771ae53 in DbXml::XmlContainer::putDocument (this=3D0x804a2bc,
txn=3D@0xb723b420,
    document=3D@0x1e, context=3D@0x1e, flags=3D536870912) at XmlContainer.c=
pp:359
#9  0xb771b4e5 in DbXml::XmlContainer::putDocument (this=3D0x804a2bc,
txn=3D@0xb723b420,
    name=3D@0xb723b42c, contents=3D@0x804a2c8, context=3D@0xb723b424,
flags=3D536870912)
    at XmlContainer.cpp:392
#10 0x080497ce in dbWorker (arg=3D0x80a5ef8) at main.cpp:79
#11 0xb7317cfd in start_thread () from /lib/tls/libpthread.so.0
#12 0xb73f513e in clone () from /lib/tls/libc.so.6

I think there is something wrong in my code, but I cannot figure it out.

My code:

void*
dbWorker(void* arg)
{
        int id =3D *(int*)arg;
        std::string name;
        DbXml::XmlUpdateContext dbUpdateContext;
        bool failed;
        DbXml::XmlTransaction txn;
        try {
                dbUpdateContext =3D dbManager->createUpdateContext();
        } catch (DbXml::XmlException &xe) {
                std::cerr << xe.what() << std::endl;
        }
        for (;;) {
                failed =3D true;
                while(failed) {
                        try {
                                txn =3D dbManager->createTransaction();
                                printf("thread %d %s\n", id, "before
putDocument");
                                dbContainer.putDocument(txn, name, XmlFile,
dbUpdateContext, DbXml::
DBXML_GEN_NAME);
                                printf("thread %d %s\n", id, "after
putDocument");
                                txn.commit();
                        } catch (DbXml::XmlException &xe) {
                                txn.abort();
                                if (xe.getDbErrno() =3D=3D DB_LOCK_DEADLOCK=
) {
                                        printf("thread %d %s\n", id,
"deadlock detected");
                                        continue;
                                }
                                std::cerr << xe.what() << std::endl;
                        }
                        failed =3D false;
                }
        }
}

------=_Part_17718_5227686.1140405405190
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi,<br>&nbsp;&nbsp;&nbsp;&nbsp;I use two threads to put XML documents into =
a&nbsp; container by calling XmlContainer::putDocument. The deadlock is pos=
sible, so I retry putDocument when the deadlock is detected. But after the =
deadlock is resolved, the program will&nbsp; generate the segmentation faul=
t error.&nbsp;GDB shows the following:
<br><br>#0&nbsp; 0xb758292c in Dbc::get () from /usr/lib/libdb_cxx-<a href=
=3D"http://4.3.so">4.3.so</a><br>#1&nbsp; 0xb775402c in DbXml::DocumentData=
base::getAllMetaData (this=3D0x80a8238, context=3D@0x80b7fd4, <br>&nbsp;&nb=
sp;&nbsp; dictionary=3D0x80a6dd8, document=3D0x80b7f90, flags=3D30) at=20
Cursor.hpp:49<br>#2&nbsp; 0xb76f6674 in DbXml::Document::setEagerMetaData (=
this=3D0x80b7f90) at Document.cpp:145<br>#3&nbsp; 0xb76f67d3 in DbXml::Docu=
ment::setMetaDataFromContainer (this=3D0x80b7f90, container=3D0x80a5f28, <b=
r>&nbsp;&nbsp;&nbsp; id=3D@0x1e, txn=3D0x80aa290, flags=3D0) at=20
Document.cpp:127<br>#4&nbsp; 0xb76db475 in DbXml::Container::addDocument (t=
his=3D0x80a5f28, txn=3D0x80aa290, <br>&nbsp;&nbsp;&nbsp; document=3D@0x80b7=
f90, context=3D@0x80a5328, flags=3D536870912) at Container.cpp:553<br>#5&nb=
sp; 0xb76e6a8f in AddDocumentFunctor::method (this=3D0x1e, container=3D@0x8=
0a5f28, txn=3D0x80aa290,=20
<br>&nbsp;&nbsp;&nbsp; flags=3D536870912) at TransactedContainer.cpp:99<br>=
#6&nbsp; 0xb76e59ae in DbXml::TransactedContainer::transactedMethod (this=
=3D0x80a5f28, txn=3D0x0, <br>&nbsp;&nbsp;&nbsp; flags=3D536870912, f=3D@0xb=
723b338) at TransactedContainer.cpp:217<br>
#7&nbsp; 0xb76e5c90 in DbXml::TransactedContainer::addDocument (this=3D0x80=
a5f28, txn=3D0x80aa290, <br>&nbsp;&nbsp;&nbsp; document=3D@0x1e, context=3D=
@0x1e, flags=3D536870912) at TransactedContainer.cpp:110<br>#8&nbsp; 0xb771=
ae53 in DbXml::XmlContainer::putDocument (this=3D0x804a2bc, txn=3D@0xb723b4=
20,=20
<br>&nbsp;&nbsp;&nbsp; document=3D@0x1e, context=3D@0x1e, flags=3D536870912=
) at XmlContainer.cpp:359<br>#9&nbsp; 0xb771b4e5 in DbXml::XmlContainer::pu=
tDocument (this=3D0x804a2bc, txn=3D@0xb723b420, <br>&nbsp;&nbsp;&nbsp; name=
=3D@0xb723b42c, contents=3D@0x804a2c8, context=3D@0xb723b424, flags=3D53687=
0912)
<br>&nbsp;&nbsp;&nbsp; at XmlContainer.cpp:392<br>#10 0x080497ce in dbWorke=
r (arg=3D0x80a5ef8) at main.cpp:79<br>#11 0xb7317cfd in start_thread () fro=
m /lib/tls/libpthread.so.0<br>#12 0xb73f513e in clone () from /lib/tls/libc=
.so.6<br><br>
I think there is something wrong in my code, but I&nbsp;cannot figure it ou=
t.<br><br>My code:<br><br>void*<br>dbWorker(void* arg)<br>{<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int id =3D *(int*)arg;<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp; std::string name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp; DbXml::XmlUpdateContext dbUpdateContext;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool failed;<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DbXml::XmlTransaction txn;<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbUpdateContext =3D d=
bManager-&gt;createUpdateContext();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp; } catch (DbXml::XmlException &amp;xe) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr=
 &lt;&lt;=20
xe.what() &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
 }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (;;) {<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp; failed =3D true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(failed) {<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp; txn =3D dbManager-&gt;createTransaction();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;thread %d %s\n&quot;,=
 id, &quot;before putDocument&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p; dbContainer.putDocument(txn, name, XmlFile, dbUpdateContext, DbXml::<br>=
DBXML_GEN_NAME);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;thread %d %s\n&quot;,=
 id, &quot;after putDocument&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
; txn.commit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp; } catch (DbXml::XmlException &amp;xe) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txn.abort();<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp; if (xe.getDbErrno() =3D=3D DB_LOCK_DEADLOCK) {<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp; printf(&quot;thread %d %s\n&quot;, id, &quot;deadlock detected&quot;);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; xe.what() &lt;&lt; std::e=
ndl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; failed =
=3D false;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<=
br>

------=_Part_17718_5227686.1140405405190--