关于如何重现file member lock错误[CPF3130]
时间:2016-11-22 ┊ 阅读:6,370 次 ┊ 标签: 经验 , 系统 , 问题
这几天一直被一个job的小file lock问题困扰,本来是一个小得不能再小的问题,一个临时的file lock,只需要加点监控error message id,然后做异常处理就ok了,不过问题是一直无法重现这个lock。
通常我们遇到的是file lock,这次这个file lock有点不一样,是file member lock。
17800 - CLRPFM FILE(test/TEMPO080)
Member TEMPO080 already in use.
按f1进去看到:
Message ID . . . . . . : CPF3130 Severity . . . . . . . : 40
Message type . . . . . : Escape
Date sent . . . . . . : 22/11/16 Time sent . . . . . . : 17:59:52
Message . . . . : Member TEMPO080 already in use.
Cause . . . . . : Member TEMPO080 file TEMPO080 in library test is
already opened or allocated.
Recovery . . . : Try the request again when member TEMPO080 and all logical
members based on member TEMPO080 are available.
用尽各种办法,其中包括现在用的方法,都没法重现CPF3130,只能是file lock,error message id是CPF3156:
CPF3156
File &1 in library &3 in use.
为什么说现在的办法也用之前却没有重现出来呢,因为这个是程序内的,之前也想到过这个原因,就用了2个job,来跑看相互咬时能不能重现,结果出现的lock都是file lock,就是上面这个CPF3156。只能是在同一个程序里才能重现这个file member lock,切记!切记!切记!
在这不得不再次吐槽一下百度搜索,真是啥也搜索不到啊,不信你试试搜索cpf3130或cpf3156,看看除了广告还有什么有用的东西出来!bing都比它强百倍!再次怀念谷歌。
原来这是一个程序内的lock。我们都知道clp程序是由很多命令集合组成的,我们可知道其实在400系统之初这些命令都是由更细小的命令组成的。比如我们runsqlstm,以后可能要分好几步的,而在这几步完成之前,但这时control可能已经交给下一句代码命令了,因为系统内部命令没有结束(比如正在重建access path)member是被lock的,这时就抛出了CPF3130错误了。
runsql可是一瞬间的事,不好重现。
只好read file,read一条后,因为没有end of file,这时member 也是lock的,这时尝试clear pf,果然cpf3130出来了!
dclf tempo080
rcvf tempo080
至此,error重现工作完成了。