きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

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ダンプを取る。しぶしぶ。

SLIP SET,COMP=047,ACTION=SVCD,END

マニュアルではこれをやれってある。

パラメータが少ないという疑問はあったがまあいいか。

ちょっと後で消すのに困らないようにIDを付けとこう。

D SLIP=X999

これで現在X999が使われてないか確認。

使われてなかったらIDのオプションもつけておく。

SLIP SET,COMP=047,ACTION=SVCD,ID=X999,END

再現させてSVCダンプが取れたらSLIPトラップを消す。

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から途中切り替えてあるはず。