I see. I think that makes sense! I've gone ahead and added these 2 functions to our local Tsan blacklist then. In researching this further, I found one more Tsan issue here in walTryBeginRead:
- One thread is here: http://www.sqlite.org/src/artifact/aa9cffc7a2bad?ln=2558 - One thread is here: http://www.sqlite.org/src/artifact/aa9cffc7a2bad?ln=2571 Is this one expected as well? If so, I'll also add this function to our blacklist. Thanks again! Ben On Wed, May 23, 2018 at 1:24 AM, Dan Kennedy <danielk1...@gmail.com> wrote: > On 05/23/2018 06:21 AM, Ben Asher wrote: > >> Hi there! I believe I've found a SQLite bug that triggers TSAN. I'm hoping >> to either confirm this bug or learn what I'm doing wrong. Some background: >> in our code, we make sure to synchronize writes to our database such that >> only one write can happen at any given time for the same database in our >> application (i.e. there's one synchronized writer connection). However, we >> allow any number of reads (readers create their own connections, which are >> similarly not shared with other threads) to happen on the same database >> (with a cap on the number of connections to respect resource limits). >> Additionally, the database has PRAGMA journal_mode=WAL; set. At the moment >> when TSAN is triggered, there is one reader and one writer each with their >> own connection to the same db performing a read and a write: >> >> - Reader is running: sqlite3WalFindFrame, specifically the line with this >> code (line 59679 in my sqlite.c): >> >> for(iKey=walHash(pgno); aHash[iKey]; iKey=walNextHash(iKey)){ >> >> >> - Writer is running walIndexAppend, specifically the line with this code >> (line 57856 in my sqlite.c): >> > > Thanks for the thread-testing. This one is a known condition. Tsan can't > see it, but we think it is safe. See the comment above the block in > sqlite3WalFindFrame() for details: > > http://www.sqlite.org/src/artifact/aa9cffc7a2bad?ln=2859..2883 > > Basically the race condition is only on the append-only hash-table. But > the hash-table is only used to accelerate lookups on the aPgno[] array. And > since the hash-table is append-only, it can only produce false-positives > (which are filtered out when aPgno[] is inspected). > > Dan. > > > > > >> aHash[iKey] = (ht_slot)idx; >> >> >> I apologize if those line numbers aren't helpful, however I hope the >> function names + code are unique enough to locate the lines in question. >> This is sqlite3 version 3.23.1. >> >> Please let me know if there's any other information I can provide. Thanks! >> >> Ben >> _______________________________________________ >> sqlite-users mailing list >> sqlite-users@mailinglists.sqlite.org >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >> > > > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > -- Ben _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users