質問
· 19 hr 前

IRISTEMPの拡張が 276MBあたりで停止し <FILEFULL> エラーが発生する件

1. 現象

>w $zv
IRIS for Windows (x86-64) 2024.3 (Build 217U) Thu Nov 14 2024 17:59:58 EST

大きなXMLファイル(約165MB)をライブラリー%XMLでパースすると、<FILEFULL>エラーが発生する。

エラーパート

    s libraryFile = "D:\iTunes3\iTunes Library.xml" ;サイズ=165M
    w !,"libraryFile = ",libraryFile
    w !,"##class(%File).GetFileSize(libraryFile)=",##class(%File).GetFileSize(libraryFile)
    w !,"s sc=##class(%XML.TextReader).ParseFile(libraryFile,.reader) 実行"
    Set sc = ##class(%XML.TextReader).ParseFile(libraryFile,.reader)
    w !,$SYSTEM.Status.GetErrorText(sc)
    q

libraryFile = D:\iTunes3\iTunes Library.xml
##class(%File).GetFileSize(libraryFile)=165739267
s sc=##class(%XML.TextReader).ParseFile(libraryFile,.reader) 実行
エラー #6301: SAX XMLパーサエラー: <FILEFULL>startElement+3^%XML.SAX.Utils.Sequencer.1 ^||IRIS.Temp(4,13592576),c:\intersystems\iris1\mgr\iristemp\  while processing D:\iTunes3\iTunes Library.xml at line 2280394 offset 34
USER>

上の処理と同時に同じネームスペースで、##Class(%Stream.TmpCharacter) の処理をしていて、それも

エラー #5002: ObjectScript エラー:<FILEFULL>SetupTmpGbl+3^%Stream.GlobalCharacter.1 ^||%IRIS.Stream,c:\intersystems\iris1\mgr\iristemp\

で止まる。

また、起動していた、システム管理ポータルも次の遷移時に

エラー #5002: ObjectScript エラー:<FILEFULL>GetCSPClassName+18^%SYS.cspServer ^IRIS.TempCSP("ClsN","%SYS","/iris1/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen","/iris1/csp/sys/%CSP.Broker.cls"),c:\intersystems\iris1\mgr\iristemp\

で止まる。この時、各処理をHALTしないで、IRISのSTOPをすると、止まらい場合があり、強制終了(iris force IRIS1)が必要な場合があった。

直接の原因は、IRISTEMP(c:\intersystems\iris1\mgr\iristemp\)のIRIS.DATで <FILEFULL>エラー(空きなし)が起こっている。

2. 再現検証テスト

いろいろ調べましたが、問題は、「IRISTEMP のサイズがある値(240M、276M、282M あたり)以上に拡張されない」ことにあるのでないかと思います。
以下、その簡単な検証テストです。

1) IRIS(インスタンス名=IRIS1)を停止

2)C:\InterSystems\IRIS1\mgr\iristemp\IRIS.DAT (現サイズ282.624KB) を削除

3) IRIS1 起動

4) ターミナル %SYS

%SYS>d ^DATABASE (管理ポータル > システムオペーレション > データベース > IRISTEMP の代わり)
  
 1) Create a database
 2) Edit a database
 3) List databases
 4) Delete a database
 5) Mount a database
 6) Dismount a database
 7) Compact globals in a database
 8) Show free space for a database
 9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database
13) Compact free space in a database
14) Defragment a database
15) Show background database tasks
16) Manage multi-volume database properties
 
Option? 9
Database directories? C:\InterSystems\IRIS1\mgr\iristemp\

Directory:               c:\intersystems\iris1\mgr\iristemp\
MirrorDBName:
MaxSize:                 0
Size:                    1
Status:                  マウント/RW
BlockSize:               8192
ClusterMountMode:        0
ClusterMounted:          0
ExpansionSize:           0
LastExpansionTime:
Mounted:                 1
NewGlobalCollation:      IRIS standard
NewGlobalGrowthBlock:    50
NewGlobalIsKeep:         0
GlobalJournalState:      いいえ
NewGlobalPointerBlock:   16
ReadOnly:                0
ResourceName:            %DB_IRISTEMP
MountedReadOnly:         0
EncryptedDB:             0
EncryptionKeyID:
NewVolumeThreshold:      0
NewVolumeDirectory:      c:\intersystems\iris1\mgr\iristemp\
MultiVolume:             0
Configured DB Name:      IRISTEMP
Mount Required At Startup: Yes
  
 8) Show free space for a database
Option? 8
Database directory to show free space for (*=All)? C:\InterSystems\IRIS1\mgr\iristemp\
 
                              Database Free Space
                              Sep 01 2025  9:10 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    1MB     0.17MB    17      70.25GB
 
IRIS.DATのエクスプローラサイズ 初期値 1M

5) ターミナル USER

テンポラリーグローバル ^||...に大量書き込み

USER>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

同様 IRISTEMPで <FILEFULL> エラー
i=300 まで行かない。IRISTEMPのサイズ拡張が止まり、空き領域なしでエラー?

6) ターミナル %SYS>d ^DATABASE

                              Database Free Space
                              Sep 01 2025  9:16 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   0.62MB    0    <- 69.98GB
 
%Free=0
エクスプローラ IRIS.DAT サイズ 282.624KB

7) ターミナル USER HALT

空き領域は回復

8) ターミナル %SYS>d ^DATABASE

                              Database Free Space
                              Sep 01 2025  9:18 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   275MB     100     69.98GB

9) %SYS で 実行

%SYS>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

同様にエラー。%SYSでも、テンプグローバル ^||... は、IRISTEMを使っている。

                              Database Free Space
                              Sep 01 2025  9:21 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   0.57MB    0    <- 69.98GB
 
%SYS>k ^||temp
 
%SYS>d ^DATABASE 
                              Database Free Space
                              Sep 01 2025  9:22 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   275MB     100     69.98GB
 
エクスプローラ IRIS.DAT サイズ 282.624KB 変わらず。

%SYSも含め、すべてのネームスペースのTemp Storageは、同じ IRISTEMP にマップされている。

3. その他テスト

3.1 管理ポータル/ローカルデータベースでサイズ拡大処理

管理ポータル > システム管理 > 構成 > システム構成 > ローカルデータベース

名前    IRISTEMP
ディレクトリ    c:\intersystems\iris1\mgr\iristemp\
ブロックサイズ    8192 バイト
サイズ (MB)    現在    240 (>=240)
拡張                0        デフォルトは0
最大                0        0で無制限になります
リソース名            %DB_IRISTEMP

で、現在の値を、500等、より大きな値を入れるが、270 -> 276 になるが、これ以上大きくならない。拡張に10,100等を指定するが効果なし。
ちなみに、IRIS.DATサイズの初期値が 1M の時は、現値に、500 入れると、一覧表示のステータスが 拡大中となる。しかし、276M で拡張が止まる。

3.2 新データベース MYTEMP を作成、Temp Storage にマップするが、マップされていない

通常のIRIS.DATの様に拡張可能性を期待してMYTEMPという別のデータベースを新規に作り、管理ポータル > ネームスペースで 
既存別ネームスペース(USER2) のTemp Storageを IRISTEMP から MYTEMP に設定、テストしました。

管理ポータル > システム管理 > 構成 > システム構成 > ネームスペース

       Namespace     Globals     Routines     Temp Storage                         
     %SYS    IRISSYS    IRISSYS    IRISTEMP    グローバルマッピング    ルーチンマッピング    パッケージマッピング    - (変更削除不可)
     USER    USER    USER    IRISTEMP    グローバルマッピング    ルーチンマッピング    パッケージマッピング    削除
     USER2    USER2    USER2    MYTEMP        グローバルマッピング    ルーチンマッピング    パッケージマッピング    削除
 
%SYS>d ^DATABASE   
                              Database Free Space
                              Sep 01 2025  9:30 AM
Database                           Max Size  Size    Available %Free   Disk Free
d:\intersystems\iris1\mytemp\      無制限    240MB   239MB     100     155.09GB
 
エクスプローラ IRIS.DAT サイズ 282.624KB

(管理ポータル > ローカルデータベースで 現在の値を、500に入れても、240Mのまま、無駄な?拡張は避けている模様?)

USER2 >s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

エラーから、Temp Strage が D:\InterSystems\IRIS1\MYTEMP\ でなく c:\intersystems\iris1\mgr\iristemp\
Temp Storageが指定通りにマップされていない模様? 

3.3 IRIS修理再インストール

c:\intersystems\iris1\mgr\iristemp\IRIS.DAT を削除後
IRIS_Community-2024.3.0.217.0-win_x64.exe
を修理再インストールするが、システム変更されていませんとなり、¥iristemp¥ には、何も作られない状態でした。

起動後

message.logに
09/01/25-13:55:51:991 (6084) 0 [Utility.Event] Creating missing IRISTEMP database in C:\InterSystems\IRIS1\mgr\iristemp
09/01/25-13:55:52:017 (6084) 0 [Database.MountedRW] Mounted database c:\intersystems\iris1\mgr\iristemp\ (SFN 3) read-write.
09/01/25-13:55:52:021 (6084) 0 [Utility.Event] C:\InterSystems\IRIS1\mgr\iristemp\ initialized as IRISTEMP
のログあり

管理ポータル > システムオペーレション > データベース > IRISTEMP

    ディレクトリ:    c:\intersystems\iris1\mgr\iristemp\
    リソース名:    %DB_IRISTEMP
    マウント:    はい
    読込専用:    いいえ
    読み取り専用の理由:     
    暗号化:    いいえ
    暗号化キーID:     
        
データベースサイズ
    ブロックサイズ:    8192
    ブロック:    1408
    最大サイズ:    無制限
    サイズ:    11MB
    拡張サイズ:    システムデフォルト
    利用可能空き容量:    9.9MB
    % 空き容量:    90%
    ディスク空き容量:    69.63GB
    最終拡張時刻:    09/01/2025 13:56:24
    フル:    いいえ
    新しいボリュームしきい値サイズ(MB):    0

でした。

%SYS>d ^DATABASE
                              Database Free Space
                              Sep 01 2025  1:57 PM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    11MB    9.9MB     90      69.63GB
         
USER>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

4. 問題

問題1:IRISTEMP のサイズが拡張されない

管理画面や ^DATABASE で「無制限」と表示されていても、IRISTEMP の実際の物理ファイル(IRIS.DAT)は 276MB までで拡張が止まる。
拡張サイズ設定(10MB、100MB)を変更しても意味がなかった。0 指定は、あるデフォルトの拡張サイズがある?
このため、大容量処理(例:165MB の XML パース)で TEMP が不足し <FILEFULL> が発生する。

問題2:Temp Storage に MYTEMP を設定しても無視される

管理画面で名前空間の Temp Storage を MYTEMP に設定しても、実際には IRISTEMP にマップされている。
IRISTEMPは、%SYS他のすべてのネームスペースで、Temp Storageとし共有されているため、特別な保護処置や制約等があるのでは?

確認してほしい事

a) IRISTEMP が物理的に 276MB 以上拡張されない理由
 (設定は無制限、拡張サイズも十分、ディスク空きもあるにもかかわらず)

b) Temp Storage に別データベース(MYTEMP)を指定しても、IRISTEMP が使用される理由

c) TEMP 領域が大量に必要となる処理(例:XML パース)への対応策

d) IRISTEMP の安全な拡張手順または再作成方法

よろしくお願いします。

Product version: IRIS 2024.3
$ZV: IRIS for Windows (x86-64) 2024.3 (Build 217U) Thu Nov 14 2024 17:59:58 EST
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください