SGE + sqlite3:错误:数据库已锁定

时间:2012-11-23 08:17:31

标签: sqlite locking cluster-computing sungridengine

我正在尝试运行在群集中使用 sqlite3 的脚本( SGE )。

该脚本使用lockfile创建一个锁,填充数据库并释放锁。

  $cat test.sh

  #!/bin/sh
  lockfile /commun/data/_tmp.idp448.lock
  sqlite3 /commun/data/stats.sqlite "create table if not exists timeBeginDB(target text UNIQUE NOT NULL,inserted int);"
  rm -f /commun/data/_tmp.idp448.lock
  whoami

/ commun / data /在所有节点中都可见。 /commun/data/_tmp.idp448.lock是我创建的一个随机名称,我目前是唯一一个使用我们新集群的人。

没有qsub,脚本可以正常运行:

  [lindenb]$ sh test.sh
  lindenb #prints whoami, no error on stderr

调用 qsub 时:

  $ qsub -cwd -S /bin/sh test.sh
  Your job 673 ("test.sh") has been submitted

  $ cat test.sh.o673
  lindenb #prints 'whoami', so the lock have been created and deleted


  $ cat test.sh.e673
  Error: database is locked

这是一个sqlite3错误。

你是否有任何想法,建议什么,在SGE方面,可能是造成这个问题的原因,这种行为的差异?

谢谢 皮尔

更新

我已在群集的节点上以root用户身份登录。简单的以下命令失败: (/commun/data/stats2.sqlite不存在)

ssh root@node02
root@node02's password:
sqlite3 /commun/data/stats2.sqlite 'create table if not exists timeBeginDB(target text UNIQUE NOT NULL,inserted int);'
Error: database is locked

它适用于~root:

[root@node02 ~]# sqlite3 stats2.sqlite 'create table if not exists timeBeginDB(target text UNIQUE NOT NULL,inserted int);'
[root@node02 ~]# 

2 个答案:

答案 0 :(得分:1)

根据我在SGE上进行的测试,lockfile似乎无法在群集上运行。但是,似乎有用的是在bash-hackers描述的简单mkdir锁。

#!/bin/sh
DIR=/commun/data/
LOCK=$DIR/_tmp.idp448.lock
until mkdir $LOCK ; do
    sleep 4
done
(date ; hostname) >> $DIR/sge-test
rmdir $LOCK
whoami

使用lockfile,sge-test文件中报告的日期非常接近。

答案 1 :(得分:1)

/ commun / data是否在您的exec节点上安装了NFS?

您可能会在GridEngine设置中看到SQLite“错误:数据库被锁定”消息的一个原因是,通常有许多节点通过NFS写入共享文件系统,SQLite想要使用fcntl锁,这只是简单的<除非您在客户端和服务器上都运行锁定,否则em>无法正常运行。

我经常遇到这个问题,并且在每种情况下我都看到到目前为止只是在每个群集节点上启用lockd(或rpc.lockd或nfslock等,具体取决于你的环境)服务。服务共享文件系统将解决问题。