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

Reply via email to