Hi,
I wrote a little program that insert in a loop rows in to the DB, and in
another thread run wal_checkpoint.
After few minutes (6-7) I get (consistently) the following assert error:
sqlite_test: ..//src/wal.c:1364: walMerge: Assertion `iLeft>=nLeft ||
aContent[aLeft[iLeft]]>dbpage' failed.
I compiled sqlite from fossil, with -DSQLITE_DEBUG and -DSQLITE_TEST
I pasted below the program and the stacks.
Am I doing something wrong?
Yoni.
(gdb) info threads
2 Thread 26132 0x0804ed3b in pthreadMutexEnter (p=0x8103068)
at ..//src/mutex_unix.c:238
* 1 Thread 26133 0xb7734424 in __kernel_vsyscall ()
(gdb) bt
#0 0xb7734424 in __kernel_vsyscall ()
#1 0xb75e2640 in raise () from /lib/i686/cmov/libc.so.6
#2 0xb75e4018 in abort () from /lib/i686/cmov/libc.so.6
#3 0xb75db5be in __assert_fail () from /lib/i686/cmov/libc.so.6
#4 0x080776a8 in walMerge (aContent=0xb7729088, aLeft=0x96157b4, nLeft=2,
paRight=0xb759a898, pnRight=0xb759a89c, aTmp=0x9619cb8) at
..//src/wal.c:1364
#5 0x080778a0 in walMergesort (aContent=0xb7729088, aBuffer=0x9619cb8,
aList=0x9614654, pnList=0xb759a8f0) at ..//src/wal.c:1405
#6 0x08077c63 in walIteratorInit (pWal=0x93f5c60, pp=0xb759a984)
at ..//src/wal.c:1510
#7 0x08077d8b in walCheckpoint (pWal=0x93f5c60, sync_flags=2, nBuf=1024,
zBuf=0x93c3968 "\r") at ..//src/wal.c:1579
#8 0x08079c0b in sqlite3WalCheckpoint (pWal=0x93f5c60, sync_flags=2,
nBuf=1024,
zBuf=0x93c3968 "\r") at ..//src/wal.c:2647
#9 0x0805de51 in sqlite3PagerCheckpoint (pPager=0x93c2f08) at
..//src/pager.c:6558
#10 0x0809e68d in sqlite3BtreeCheckpoint (p=0x93c17a8) at
..//src/btree.c:7953
#11 0x0804b8fb in sqlite3Checkpoint (db=0x93c0af0, iDb=10) at
..//src/main.c:1402
#12 0x080dd80d in sqlite3VdbeExec (p=0x93c36d8) at ..//src/vdbe.c:5225
#13 0x0806b932 in sqlite3Step (p=0x93c36d8) at ..//src/vdbeapi.c:394
#14 0x0806bba9 in sqlite3_step (pStmt=0x93c36d8) at ..//src/vdbeapi.c:458
#15 0x080497af in sqlite3_exec (db=0x93c0af0, zSql=0x80e3e75 "PRAGMA
wal_checkpoint",
xCallback=0, pArg=0x0, pzErrMsg=0xb759b38c) at ..//src/legacy.c:70
#16 0x0804937b in _sql_exec (conn=0x93c0af0, query=0x80e3e75 "PRAGMA
wal_checkpoint",
fail_if_locked=0) at sqlite_large_wal.c:52
#17 0x080494d8 in thread_do () at sqlite_large_wal.c:104
#18 0xb75a34c0 in start_thread () from /lib/i686/cmov/libpthread.so.0
#19 0xb769784e in clone () from /lib/i686/cmov/libc.so.6
(gdb) thread 2
[Switching to thread 2 (Thread 26132)]#0 0x0804ed3b in pthreadMutexEnter (
p=0x8103068) at ..//src/mutex_unix.c:238
238 assert( p->nRef>0 || p->owner==0 );
(gdb) bt
#0 0x0804ed3b in pthreadMutexEnter (p=0x8103068) at
..//src/mutex_unix.c:238
#1 0x0804e6db in sqlite3_mutex_enter (p=0x8103068) at ..//src/mutex.c:112
#2 0x0804da91 in sqlite3_free (p=0x958de28) at ..//src/malloc.c:470
#3 0x0804dbcf in sqlite3DbFree (db=0x93b4068, p=0x958de28) at
..//src/malloc.c:503
#4 0x0806f289 in releaseMemArray (p=0x96130d8, N=6) at
..//src/vdbeaux.c:1018
#5 0x0807021f in closeAllCursors (p=0x94df2b8) at ..//src/vdbeaux.c:1538
#6 0x08070f21 in sqlite3VdbeHalt (p=0x94df2b8) at ..//src/vdbeaux.c:2042
#7 0x080d1991 in sqlite3VdbeExec (p=0x94df2b8) at ..//src/vdbe.c:861
#8 0x0806b932 in sqlite3Step (p=0x94df2b8) at ..//src/vdbeapi.c:394
#9 0x0806bba9 in sqlite3_step (pStmt=0x94df2b8) at ..//src/vdbeapi.c:458
#10 0x080497af in sqlite3_exec (db=0x93b4068,
zSql=0x80e3e24 "INSERT INTO tbl1 values('", 'a' <repeats 19 times>,
"', '", 'b' <repeats 19 times>, "')", xCallback=0, pArg=0x0,
pzErrMsg=0xbf9dd57c)
at ..//src/legacy.c:70
#11 0x0804937b in _sql_exec (conn=0x93b4068,
query=0x80e3e24 "INSERT INTO tbl1 values('", 'a' <repeats 19
times>, "', '", 'b' <repeats 19 times>, "')", fail_if_locked=1) at
sqlite_large_wal.c:52
#12 0x080493ed in sql_exec (conn=0x93b4068,
query=0x80e3e24 "INSERT INTO tbl1 values('", 'a' <repeats 19
times>, "', '", 'b' <repeats 19 times>, "')") at sqlite_large_wal.c:64
#13 0x0804945b in do_insert (conn=0x93b4068) at sqlite_large_wal.c:85
#14 0x08049663 in main (argc=<value optimized out>, argv=<value
optimized out>)
at sqlite_large_wal.c:139
(gdb)
#include "sqlite3.h"
#include "stdio.h"
#include "stdlib.h"
#include "fcntl.h"
#include "errno.h"
#define NSEC_PER_MS 1000000
#define MS_SEC 1000
#define NSEC_PER_SEC 1000000000
typedef unsigned long long u64;
static u64 _time_monotonic_nsec(void)
{
struct timespec t;
if (clock_gettime(1, &t))
{
printf("error clock_gettime\n");
exit(1);
}
return ((u64)t.tv_sec) * NSEC_PER_SEC + t.tv_nsec;
}
u64 _time_monotonic_ms(void)
{
return _time_monotonic_nsec()/NSEC_PER_MS;
}
void sleep_ms(int ms)
{
int start = _time_monotonic_ms(), diff = 0;
#ifndef __ZWIN32__
struct timespec req;
req.tv_nsec = (ms%MS_SEC)*NSEC_PER_MS;
req.tv_sec = ms/MS_SEC;
#endif
while (1)
{
req.tv_nsec = ((ms-diff)%MS_SEC)*NSEC_PER_MS;
req.tv_sec = (ms-diff)/MS_SEC;
if (nanosleep(&req, NULL) && errno!=EINTR)
break;
if ((diff = _time_monotonic_ms()-start) >= ms)
break;
}
}
static void _sql_exec(sqlite3 *conn, char *query, int fail_if_locked)
{
char *err;
int ret;
if ((ret = sqlite3_exec(conn, query, NULL, 0, &err)))
{
if (!fail_if_locked && (ret == SQLITE_BUSY || ret ==
SQLITE_LOCKED))
return;
printf("sqlite: failed exec (%p) %s. err: %s\n", pthread_self(),
query, err);
exit(1);
}
}
static void sql_exec(sqlite3 *conn, char *query)
{
_sql_exec(conn, query, 1);
}
static sqlite3 *sql_open_conn(void)
{
sqlite3 *conn;
if (sqlite3_open_v2("test.db", &conn, SQLITE_OPEN_READWRITE, NULL))
{
printf("sqlite3_open_v2 failed\n");
exit(1);
}
return conn;
}
static void do_insert(sqlite3 *conn)
{
int i;
while (1)
{
for (i=0; i<10000; i++)
{
sql_exec(conn, "INSERT INTO tbl1 values('aaaaaaaaaaaaaaaaaaa', "
"'bbbbbbbbbbbbbbbbbbb')");
}
sleep(1);
}
}
static int thread_do()
{
sqlite3 *conn = sql_open_conn();
int i;
sleep(1);
while (1)
{
sleep(1);
printf("checkpoint\n");
fflush(0);
for (i=0; i<20; i++)
{
_sql_exec(conn, "PRAGMA wal_checkpoint", 0);
sleep_ms(100);
}
}
}
int main(int argc, char **argv)
{
char *err_msg = NULL;
pthread_t thread;
int fd, i = 0;
time_t start;
sqlite3 *conn = NULL;
printf("Start\n");
if (unlink("test.db") || unlink("test.db-wal") ||
unlink("test.db-shm"))
printf("failed unlink test.db\n");
fd = open("test.db", O_CREAT|O_RDWR, 0666);
if (fd<0)
{
printf("could not open test.db\n");
exit(1);
}
close(fd);
sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
conn = sql_open_conn();
sql_exec(conn, "PRAGMA journal_mode=WAL");
sql_exec(conn, "PRAGMA synchronous=normal");
sql_exec(conn, "PRAGMA temp_store=memory");
sql_exec(conn, "PRAGMA wal_autocheckpoint=-1");
sql_exec(conn, "create table tbl1 (one varchar(20), two varchar(20))");
if (pthread_create(&thread, NULL, thread_do, NULL))
{
printf("could not start thread\n");
exit(1);
}
do_insert(conn);
sqlite3_close(conn);
printf("Finished\n");
return 0;
}
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users