2010年7月28日水曜日

すべてのビューのサイズを調べる

Notesのアプリケーションには「ビュー」という登録されている文書をリスト表示するのに便利な設計要素がありますが、最近になってビューに関連すると思われる不具合が1週間に2度も発生しました。

ユーザーがDBを開こうとしたりすると
「メモリが足りません。インデックスプールがいっぱいです」
といったメッセージが表示されるようになったのです。※表示されないユーザーもいました

IBMの情報(下のリンク)によると、当現象は Domino 6.5.3 の不具合とのこと。
定期的に「インデックスプールがいっぱいです」というメッセージが表示される
http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/729123

どうやら NIF Pool が制限値の128MBに達すると発生するようです。

確かに、2度目に発生した時の統計情報の値 (Database.NIFPool.Used) は8MB付近から一気に制限値へ増加していました...

そもそもこの不具合がどうして突然発生するようになったのか...??
最近作成したアプリケーションでどでかいビュー索引を作った覚えもないし...??

まずはサーバー上にある全てのビューのサイズをチェックしようと考え、次のようなスクリプトを作りました。
Sub Initialize
    Dim ss As New NotesSession
    Dim logdb As NotesDatabase
    Dim logdoc As NotesDocument, doc As NotesDocument
    Dim logdc As NotesDocumentCollection
    Dim item As NotesItem
    Dim views As Variant
    dlmCRLF = Chr( 13 ) & Chr( 10 )
    
    Set logdb = New NotesDatabase( "hogehoge/org", "log.nsf" )
    If logdb Is Nothing Then Exit Sub
    Set logdc = logdb.Search( |Form = "Activity"|, Nothing, 0 )
    If logdc.Count = 0 Then Exit Sub
    Set logdoc = logdc.GetFirstDocument
    While Not ( logdoc Is Nothing )
        If logdoc.HasItem( "AllViewInfo" ) Then
            Set item = logdoc.GetFirstItem( "AllViewInfo" )
            views = Split( item.Values, dlmCRLF )
            Forall o In views
                Set doc = New NotesDocument( ss.CurrentDatabase )
                doc.Form = "view"
                doc.Title = logdoc.Title( 0 )
                doc.PathName = logdoc.PathName( 0 )
                doc.ViewName = Strleftback( o, " ", 1 )
                doc.ViewSize = Strrightback( o, " ", 2 )
                Call doc.Save( True, False )
                Set doc = Nothing
            End Forall
        End If
        Set logdoc = logdc.GetNextDocument( logdoc )
    Wend
End Sub
簡単に説明します。

log.nsf には毎朝5時に statlog タスクにて作成・更新される Activity というフォームの文書があり、ここに各アプリケーション内にあるすべてのビューやフォルダの名前とサイズが記録されています。
log.nsf にある全ての Activity 文書を参照して、改行で区切られた各ビューの情報を分解して書き出します。
こうして書き出した情報をビューで工夫するとビューの数が多いアプリケーションやサイズが大きいビューがわかります。

不具合に関しては現在のところ、アップデートするまでに再現した場合に何かの参考になるかと考え LOG_UPDATE=1 を設定して様子をみていますが、近い将来Domino を 6.5.6 へアップデートします。