前段时间给公司移植的linux-3.0.4.交给别人测试,一直没有什么意外情况。今天忽然把俺喊过去。让看看sqlite3的问题。
一直打印“database is locked”,只要create table就会出现。
开始我怀疑是并发引起的。经过确定压根就没有并发。
测试人员用新版本的sqlite和以前的sqlite比较。都用buildroot新制作的工具链来编译,结果以前可以运行的老版本sqlite也出现类似的问题。所以和我说基本可以定位应该是工具链的问题。
我把老版本的Makefile和新版本的Makefile对比了一下,参数没有太大的区别。
数据库这东西,咱根本一点都不懂啊。
根据经验,create table应该是第一次建立表的时候某个锁没有获得到造成的。
大概看了一眼sqlite源代码,确实,有pthread_mutex_t线程锁和fcntl文件锁。并且看了下数据库中对锁的应用,然后估计重点应该在文件锁这块内容。
既然没有头绪,那先看看这两个锁是否正常。
马上写两个小测试程序验证一下系统的这两个锁是否正常。
1 线程锁正常
2 文件锁不正常
当测试文件锁的时候,一直显示error 是 Permission denied。chmod 777也不行。不应该啊。同样的代码在主机上测试,挺好用呀。难道真是工具链的原因。文件锁应该是内核提供的吧。于是进入内核目录。make menuconfig,看看有没有提供。在file system选项下看到这个enable posix file locking API选项,嗯,有哦点意思,看看help,for the flock() system call,应该就是他。选上,make,然后下载板子上。重新用测试程序验证。这下还行,和主机上运行效果一样。
然后再试试
create table
insert A
insert B
select * from
。。。
显示正常。
原因找到,内核不支持文件锁造成,原来我以为如果内核不支持的话,应该会报内核相关错误或者提示。
但是报的确实database is locked。并且测试的话,提示是Permission denied。
阅读(7519) | 评论(2) | 转发(0) |