JZOSでデータセットの動的アロケーション
日本に帰ってきてて、
息抜きもかねて動的アロケーションするコードを書いた。
しかし、失敗。およよ?
JZOSで動的アロケーションの方法として考えられるのは2種類ある。
自分の過去の経験だと片方(bpxwyn)がうまくいかなかったので、
com.ibm.jzos.AccessMethodServicesを使う方法に行きついていた。
ようはIDCAMSをJavaから呼ぶってことだ。
昔はこれで動的アロケーションに成功していたのだが、
今回は失敗してしまった。少なくても2年前は動いてた。
なぜにー?なぜにー?
AccessMethodServicesに渡すSYSINの情報は、
いったんJCLを書いてその妥当性も確認してある。
参考にしたマニュアルはDFSMS Access Method Services for Catalogs。
ZFile.bpxwdynは見るマニュアル違うので注意。説明せんけど。
コードの内容的にはだいたいこんなイメージ。
SYSPRINT相当に使うためのダミーDDを作成する。(まだ名前だけ)
ダミーDDに対してテンポラリデータセットをアロケーションする。
IDCAMS使うJCLのSYSINを参考にSYSINを渡す。
ここは毎回迷う箇所で、改行を意味する"-"を念のため付けるようにしてる。
どっちが正しいかはいま分からない状態になってる・・・。
そこはトライ&エラーですぐ分かるから。
String dummyDD = ZFile.allocDummyDDName(); ZFile.bpxwdyn("ALLOC FI(" + dummyDD + ") DA(&&IDTEMP) NEW DELETE REUSE MSG(2)"); AccessMethodServices ams = new AccessMethodServices(); ams.setOutputDDName(dummyDD); ams.addInputLine("ALLOCATE -"); ams.addInputLine("DATASET('HLQ.PS.FB') -"); ams.addInputLine("NEW CATALOG -"); ams.addInputLine("SPACE(10,5) TRACKS -"); ams.addInputLine("BLKSIZE(800) -"); ams.addInputLine("LRECL(80) -"); ams.addInputLine("DSORG(PS) -"); ams.addInputLine("UNIT(3390) -"); ams.addInputLine("VOL(VOLxxx) -"); ams.addInputLine("RECFM(F,B)"); int rc = ams.execute(); System.out.println("RC=" + rc ); System.out.println("SYSPRINT=" + ams.getOutputLines()); ZFile.bpxwdyn("FREE FI(" + dummyDD + ") MSG(2)")
本来、こういうイメージのコードでOKなわけですよ。
USS上でjava叩いて、
ams.execute()を呼ぶ箇所でプツリと終わる。
ちなみに上の例では書いてないがThrowableでもcatchできない。
どうやらSYSLOGに情報がでていたようだ。どれどれ・・・。
SYMPTOMでてる。プログラムはIDCAMSだった。
SYSTEM COMPLETION CODEが047。
マニュアル(MVS System Codes)調べると、
非許可プログラムが使ってはダメなSVC命令を使った模様。
さてアメリカで度胸がついた(?)私の次の行動は・・・。
しぶしぶSLIPダンプを取る。しぶしぶ。
SLIP SET,COMP=047,ACTION=SVCD,END
マニュアルではこれをやれってある。
パラメータが少ないという疑問はあったがまあいいか。
ちょっと後で消すのに困らないようにIDを付けとこう。
D SLIP=X999
これで現在X999が使われてないか確認。
使われてなかったらIDのオプションもつけておく。
SLIP SET,COMP=047,ACTION=SVCD,ID=X999,END
SLIP DEL,ID=X999
IPCSでSVCダンプを分析。
問題となっているのはSVC 6B (ModeSet)であった。
PSWからINSTRUCTION ADDRESSをひっぱってきた。
どうやらそのアドレスではSVC命令がなかったので、
適当にさかのぼってみたらSVC命令がおった。
IP LIST PSWにあるアドレス-10 LENGTH(X'20') INSTRUCTION
ほかにもこれとか。
IP SYSTRACE
SYSTRACEからSVC 6BのあとにABTしているのが分かった。
IP SUMM FORMATも使った。
IP VERBX LEDATA 'CEEDUMP NTHREADS(*)'も使った。
JZOSがlibjzos.soに組み込んでるっぽいアセンブラプログラムを呼んでる。
CALL_IDCAMSだったっけな。
しかし、LEのスタック的にはそこで終わっているように見えるんだけど、
そのモジュールからSVC 6Bが出てるように見えない。
インストラクションアドレスがあわない気がする。
IDCAMS本体で問題が起きてるんじゃないかってのがいまの見解。
IP WするとIDCAMSっぽいので。
PSW Keyが8なのがダメな気がする。0-7でないと。
IDCAMSはAPF Libraryと見なされているようだけどなぁ。
Supervisor Stateは見忘れてた。PSWの何bit目だったっけ。
はたしてJZOSの問題か?IDCAMSの問題か?
他の気になる点。
IDCAMSはAMODE31で呼ばないといけないみたいなんで、
AMODE64から途中切り替えてあるはず。