I only call sqlite3_finalize() when the thread has finished with the connection, which is when the thread is deleted. sqlite3_reset is used on B after it it been notified, and when a query is a success. It looks like B returns a code 100 in the step function sometimes, should I do something different with this code? When it is returned with this code it seems to not go into sqlite3ConnectionUnlocked.
Owen On 9 July 2013 17:28, Dan Kennedy <[email protected]> wrote: > On 07/09/2013 11:10 PM, Owen Haynes wrote: > >> Here is some information I have gathered. >> >> We have a writer thread connection called A and a reader called B, another >> reader called C. >> >> >> A is writing >> B is waiting on A with pBlockingConnection = A, and pUnlockConnection A >> A is Now done, >> A is waiting on B with pBlockingConnection = B and pUnlockConnection B >> B is now done but never goes to check to see if any connections are >> waiting >> to be unblocked, sqlite3ConnectionUnlocked never gets called. I have a >> print out every time it gets called with the connection which calls it. >> C then wants to read and has a pBlockingConnection = B and >> pUnlockConnection = >> B. >> >> And all the connections are then locked up. >> >> This information was gathered from pUnlockConnection and >> pBlockingConnection >> and by examining the blocked list. All writes are done using "BEGIN >> IMMEDIATE TRANSACTION" >> > > Never called... > > What is the value of B->autoCommit? > > Also, how do we know that B is actually "done"? > > If it has no explicitly opened transaction (i.e. if B->autoCommit==1), > then the sqlite3ConnectionUnlocked() function should be called every > time B halts an SQL statement (which happens either in the > sqlite3_reset() or sqlite3_finalize() call, or sometimes from within > sqlite3_step() if it returns SQLITE_DONE or an error). > > Is B calling sqlite3_reset() or sqlite3_finalize() on its statement > handles when it is finished with them? > > Dan. > > > > > > >> Owen >> >> >> On 9 July 2013 12:51, Dan Kennedy <[email protected]> wrote: >> >> On 07/09/2013 06:41 PM, Owen Haynes wrote: >>> >>> I have been using a debugger to look at pBlockedConnection and >>>> pUnlockConnection >>>> also added some extra print statements to the code, sqlite is also >>>> compiled >>>> with debug enabled, and no asserts seem to get triggered. >>>> >>>> >>> How do you know A has finished? Does "PRAGMA lock_status" >>> indicate that it is holding no locks at all? >>> >>> So in "deadlock 1", when you have: >>> >>> >>> Connection A is has finished >>> Connection B is waiting on Connection A >>> Connection C is waiting on Connection B >>> >>> Then the following are all true? >>> >>> B->pUnlockConnection = A; >>> B->pBlockingConnection = A; >>> C->pUnlockConnection = B; >>> C->pBlockingConnection = B; >>> >>> Are both B and C in the linked list that starts at global >>> variable sqlite3BlockedList (and connected by pNextBlocked)? >>> >>> Dan. >>> >>> >>> >>> >>> >>> >>> Owen >>>> >>>> >>>> >>>> >>>> On 9 July 2013 11:20, Dan Kennedy <[email protected]> wrote: >>>> >>>> On 07/09/2013 04:08 PM, Dan Kennedy wrote: >>>> >>>>> On 06/20/2013 03:20 PM, Owen Haynes wrote: >>>>> >>>>>> Hello, >>>>>> >>>>>>> I am currently having some problems with the unlock notify and >>>>>>> getting >>>>>>> in a >>>>>>> state of deadlock. >>>>>>> >>>>>>> I am using code based on http://www.sqlite.org/unlock_*** >>>>>>> ***notify.html <http://www.sqlite.org/unlock_****notify.html>< >>>>>>> http://www.**sqlite.org/unlock_**notify.**html<http://www.sqlite.org/unlock_**notify.html> >>>>>>> > >>>>>>> <http://www.**sqlite.org/**unlock_notify.html<http://sqlite.org/unlock_notify.html> >>>>>>> <http://www.**sqlite.org/unlock_notify.html<http://www.sqlite.org/unlock_notify.html> >>>>>>> > >>>>>>> >>>>>>>> **, >>>>>>>> >>>>>>> with >>>>>>> the latest sqlite. >>>>>>> >>>>>>> The setup is as follows: >>>>>>> - WAL is on >>>>>>> - Multi Threaded is on >>>>>>> - Temp store is memory >>>>>>> - Database is stored in /dev/shm >>>>>>> - Synchronous is set as normal >>>>>>> - Multi-threading is on >>>>>>> - connection is set as SQLITE_OPEN_READWRITE | >>>>>>> SQLITE_OPEN_CREATE | >>>>>>> SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE >>>>>>> >>>>>>> Unlock notify does work I can see my log messages printed when the >>>>>>> callback >>>>>>> is called but sometimes I can end up in the following dead lock >>>>>>> situation. >>>>>>> >>>>>>> Each connection is in its own thread >>>>>>> >>>>>>> *Deadlock 1* >>>>>>> Connection A is using database >>>>>>> Connection B is waiting on Connection A >>>>>>> Connection C is waiting on Connection B >>>>>>> >>>>>>> Connection A is has finished >>>>>>> Connection B is waiting on Connection A >>>>>>> Connection C is waiting on Connection B >>>>>>> >>>>>>> How do you know this is what is happening? Are you looking >>>>>>> >>>>>> at the sqlite3.pBlockedConnection and sqlite3.pUnlockConnection >>>>> pointers in a debugger? Or some other method? >>>>> >>>>> Also, if this is easy to reproduce, try running with SQLITE_DEBUG >>>>> defined. This will enable some complex asserts that check for >>>>> various problems in the unlock-notify code. >>>>> >>>>> Dan. >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> *Deadlock 2* >>>>> >>>>>> Connection A is using database >>>>>>> Connection B is waiting on Connection A >>>>>>> Connection C is waiting on Connection A >>>>>>> >>>>>>> Connection A is has finished >>>>>>> Connection B is waiting on Connection A >>>>>>> Connection C is waiting on Connection A >>>>>>> >>>>>>> For some reason sometimes the notify callback does not get issued and >>>>>>> end >>>>>>> up with 2 threads waiting for the callback back to be issued. >>>>>>> >>>>>>> Connection B is a writer thread the others only read. >>>>>>> >>>>>>> Any ideas? >>>>>>> >>>>>>> Are you handling the case where the xNotify callback is invoked by >>>>>>> >>>>>> sqlite3_unlock_notify() before it returns? >>>>>> >>>>>> Dan. >>>>>> >>>>>> >>>>>> ______________________________******_________________ >>>>>> >>>>> sqlite-users mailing list >>>>> [email protected] >>>>> http://sqlite.org:8080/cgi-******bin/mailman/listinfo/sqlite-*** >>>>> ***users<http://sqlite.org:8080/cgi-****bin/mailman/listinfo/sqlite-****users> >>>>> <http://sqlite.org:**8080/cgi-**bin/mailman/**listinfo/sqlite-**users<http://sqlite.org:8080/cgi-**bin/mailman/listinfo/sqlite-**users> >>>>> > >>>>> <http://sqlite.org:8080/**cgi-**bin/mailman/listinfo/**sqlite-**users<http://sqlite.org:8080/**cgi-bin/mailman/listinfo/**sqlite-users> >>>>> <http://sqlite.org:8080/**cgi-bin/mailman/listinfo/**sqlite-users<http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users> >>>>> > >>>>> ______________________________****_________________ >>>>> >>>> sqlite-users mailing list >>>> [email protected] >>>> http://sqlite.org:8080/cgi-****bin/mailman/listinfo/sqlite-****users<http://sqlite.org:8080/cgi-**bin/mailman/listinfo/sqlite-**users> >>>> <http://sqlite.org:8080/**cgi-bin/mailman/listinfo/**sqlite-users<http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users> >>>> > >>>> >>>> ______________________________****_________________ >>> sqlite-users mailing list >>> [email protected] >>> http://sqlite.org:8080/cgi-****bin/mailman/listinfo/sqlite-****users<http://sqlite.org:8080/cgi-**bin/mailman/listinfo/sqlite-**users> >>> <http://sqlite.org:8080/**cgi-bin/mailman/listinfo/**sqlite-users<http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users> >>> > >>> >>> ______________________________**_________________ >> sqlite-users mailing list >> [email protected] >> http://sqlite.org:8080/cgi-**bin/mailman/listinfo/sqlite-**users<http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users> >> > > ______________________________**_________________ > sqlite-users mailing list > [email protected] > http://sqlite.org:8080/cgi-**bin/mailman/listinfo/sqlite-**users<http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users> > _______________________________________________ sqlite-users mailing list [email protected] http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

