読者です 読者をやめる 読者になる 読者になる

きどたかのブログ

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

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