2010-09-25

Subversion 管理后台升级

Subversion 管理后台最近版本升级解决两个主要问题:Subversion版本库同步的同步锁清除,以及 IE8兼容性问题。

Subversion 版本库同步时同步锁的清除

Subversion版本库容灾备份,主版本库提交时,会临时在镜像版本库的 rev0 的版本属性中添加 svn:sync-lock 和 svn:sync-currently-copying 两个临时属性作为同步锁,避免针对一个版本库同时有多个同步进程。这么设计是因为 SVN 镜像可以是远程调用。 在特定情况下,会造成死锁:
  • 同步开始后,突然的网络中断,导致同步失败,而同步的目标版本库(镜像版本库)的 rev0的锁尚未删除。
  • 再次同步时,由于 rev0 的版本属性中的锁的存在,导致同步失败。
  • Subversion 的主从备份失效。
死锁发生后,客户端的感受
  • 客户端提交会发现速度很慢,会被阻塞10秒钟以上
  • 实际上,提交已经完成,在进行主从同步时被阻塞
  • Subversion的同步一旦发现被同步锁阻塞时,会持续尝试10次,每次间隔1秒钟
最新的同步机制,能够自动判断锁的有效性,避免主从同步失效
  • 在同步发起时,会记录同步进程的 PID 到一个临时文件
  • 当发现镜像中存在锁的时候,会检测本地锁文件,以及是否有对应的同步进程
  • 如果发现锁是僵尸锁,则删除镜像版本库rev0 中的僵尸锁,继续执行版本库同步
  • 如果同步过程有错误发生时,会通过钩子脚本(post-commit 或 post-revprop-change)将同步的错误会直接通过用户提交通知界面进行显示。
  • 管理员也可以设置 debug 诊断标志,当 debug 打开,同步成功的信息也会以“错误通知”的方式显示在提交后的通知界面中。(同步成功的消息显示为控制台错误,这是 Subversion 的 post-commit 等脚本的设计机制决定的)
同时,还为 subversion 钩子提供手工版本库同步的接口: (其中 /opt/svn/svnroot 是版本库的根目录)
  • 显示版本库的状态:
    $ sudo python /etc/subversion/hooks/scripts/svn_mirror.py  /opt/svn/svnroot/
  • 手工对配置了容灾的版本库进行同步:
    $ sudo python /etc/subversion/hooks/scripts/svn_mirror.py  sync /opt/svn/svnroot/

IE8 兼容性问题

部分界面在 IE8 不能正常显示。当打开 IE8 浏览器的“兼容视图”,则能够正常显示。 最终定位到是元素显隐,IE8的支持和以前不同。原来的实现是通过设置 element.style.visibility 为 'hidden' 或者 'visible' 实现 DIV 的消隐。当对 div 重复进行隐藏后,再设置显示时, DIV 中的表单域却不能显示出来! 通过 google 查询了半天,也对子元素的 style.visibility 设置为 inherit 也没有什么改观,对IE 恨的牙痒痒的。IE 的调试工具也很匮乏,FireBug lite 让 Firebug 可以在 IE 里运行,但毕竟是 CSS 的问题,也帮不了大忙。 忽的灵机一动,既然框架中已经用了 prototype, 为什么不采用 prototype 本身已经封装好的元素消隐呢,于是利用 Prototype 重写 Javascript,解决这个棘手的问题。 主要的 Javascript 修改,类似于:
-    $('path_list_box').style.visibility = 'hidden';
-    $('path_list_box').style.position = 'absolute';
+    $('path_list_box').hide();

-    $('path_input_box').style.visibility = 'visible';
-    $('path_input_box').style.position = 'relative';
+    $('path_input_box').show();
blog comments powered by Disqus