Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1725752
  • 博文数量: 98
  • 博客积分: 667
  • 博客等级: 上士
  • 技术积分: 1631
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-27 15:59
个人简介

一沙一世界 一树一菩提

文章分类

全部博文(98)

文章存档

2021年(8)

2020年(16)

2019年(8)

2017年(1)

2016年(11)

2015年(17)

2014年(9)

2013年(4)

2012年(19)

2011年(1)

2009年(4)

分类: LINUX

2012-07-30 16:43:45

前段时间给公司移植的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) |
给主人留下些什么吧!~~

shiyigudong2012-08-06 09:14:26

同喜啊,共同进步

MoWaters2012-08-05 23:38:59

我最近也在给产品升级内核,这两天也遇到相同的问题,sqlite3也用不了,排查了好久,也没找到原因,今天网上搜素了一下,找到你的博客,然后再检查我的内核配置文件,果然文件锁也没选上,选上重新编译,下版本测试,ok了,多谢了哈。比较早的内核版本文件锁默认是有的,后来改成可配置了,改成可配置能节省点内存。