Index: src/pager.c ================================================================== --- src/pager.c +++ src/pager.c @@ -7548,11 +7548,13 @@ rc = pagerOpenWal(pPager); if( rc==SQLITE_OK ){ pPager->journalMode = PAGER_JOURNALMODE_WAL; pPager->eState = PAGER_OPEN; +#ifdef SQLITE_SERVER_EDITION sqlite3WalServer(pPager->pWal, pPager->pServer); +#endif } }else{ *pbOpen = 1; } Index: src/server.c ================================================================== --- src/server.c +++ src/server.c @@ -91,11 +91,12 @@ struct Server { ServerHMA *pHma; /* Hma file object */ int iClient; /* Client id */ Pager *pPager; /* Associated pager object */ - + i64 nUsWrite; /* Cumulative us holding WRITER lock */ + i64 iUsWrite; /* Time WRITER lock was taken */ int nAlloc; /* Allocated size of aLock[] array */ int nLock; /* Number of entries in aLock[] */ u32 *aLock; /* Mapped lock file */ }; @@ -452,10 +453,22 @@ n = n & ((1 << HMA_CLIENT_SLOTS)-1); } n = n & ~(1 << p->iClient); if( __sync_val_compare_and_swap(pSlot, v, n)==v ) break; } + if( p->aLock[i]==0 ){ + struct timeval t2; + i64 nUs; + gettimeofday(&t2, 0); + nUs = (i64)t2.tv_sec * 1000000 + t2.tv_usec - p->iUsWrite; + p->nUsWrite += nUs; + if( (p->nUsWrite / 1000000)!=((p->nUsWrite + nUs)/1000000) ){ + sqlite3_log(SQLITE_WARNING, + "Cumulative WRITER time: %lldms\n", p->nUsWrite/1000 + ); + } + } } p->nLock = 0; #if 1 return posixLock(p->pHma->fd, p->iClient+1, SERVER_READ_LOCK, 0); #endif @@ -566,10 +579,15 @@ assert( serverWriteLocker(v)==p->iClient ); n = v & ((1<iUsWrite = ((i64)t1.tv_sec * 1000000) + (i64)t1.tv_usec; + } assert( rc!=SQLITE_OK || sqlite3ServerHasLock(p, pgno, bWrite) ); return rc; } int sqlite3ServerHasLock(Server *p, Pgno pgno, int bWrite){