我有分寸

用SVM同步SVN仓库及解决锁问题

gnawux apachehadoopmirrorrevpropsubversionsvmsvnlinux

这两天用svm同步hadoop上游的svn仓库的时候遇到个小问题,刚刚fix了,特此贴出来:

同步仓库

如果是RHEL/CentOS 5的话,安装 perl-SVN-Mirror 包,其他 distro 未尝试,应该类似,然后用 svnadmin 创建一个仓库,这个应该不用教,呵呵

mkdir –p /state/partion1/repo/

svnadmin create mirror

这个仓库mirror就是我们准备用于做镜像的仓库了,然后初始化仓库,需要先设置环境变量

export SVMREPOS=”/state/partion1/repo/mirror”

然后初始化

svm init hadoop-common http://svn.apache.org/repos/asf/hadoop/common

这里的hadoop-common是在新仓库里的路径,现在,就可以来同步仓库了

svm sync hadoop-common

如果一切顺利的话,经过相当长一段时间的同步,镜像仓库就可以顺利使用了,新仓库的路径是:

file:///state/partion1/repo/mirror/hadoop-common

至于如果需要HTTP访问或是其他什么特殊的定制的话,可以自行配置了。可以重复执行上面的同步命令来追加同步上游仓库里的更新

仓库锁定的问题及修复

昨天遇到的一个问题是仓库同步的时候,被我用C-c中断了,于是出现了一个无法解锁的问题,重复打印错误:

Waiting for sync lock on /hadoop-common: wang.xu:9660.

经过大约2小时的源码和命令研究,大致明白了问题,首先分解上面的这句话:

  • sync是加锁的命令,svm sync
  • /hadoop-common是同步的路径
  • wang.xu是出错的主机的hostname
  • 9660是加锁的进程的PID

试图直接利用svm自己来解锁失败后,改为研究它是怎么加锁的,最终证明:

  • 所谓的锁是一个加在 revision 0 上的 revision property
  • 锁的名字由加锁命令和路径构成,形式如 svm:lock:sync:_hadoop-common ,路径里的 _ 会被替换为 __,而/则会替换为_
  • 锁的内容由主机和PID构成,形式如wang.xu:9660

可以这样看到:

$ svnlook pg –revprop –r0 mirror/ svm:lock:sync:_hadoop-common
wang.xu:9660

上面的mirror/是仓库的文件系统路径。自然地,应该这么去掉这个属性就可以解锁了:

svn pd svm:lock:sync:_hadoop-common –revprop –r 0 file:///state/partion1/repo/mirror/

不过,大部分svn仓库缺省不允许revision property随便写的,所以,这个命令无法成功,需要编辑这个hook文件

/state/partion1/repo/mirror/hook/pre-revprop-change

让这个文件对于我们的编辑返回0,甚至临时改成就一行 exit 0 也行,以后记得改过来就好。然后,务必给这个文件加执行权限,并且,上述svn命令的执行者需要可以访问这个目录且有执行权限。

这样,执行上述svn pd命令即可。现在,锁被消灭了,可以正常更新了。

gnawux
me!#$!@#$@#$wangxu!@#$%^&*()_me