本日は、ノーツコンソーシアム の Domino Lounge(旧 研究会)でネタにしたお話です。今年 5 月に、Domino 11 から 14 にアップデートした時に発生した現象についてご紹介します。
発生した現象
DJX の管理ツールからのユーザ登録は、有効期限を設定できる最大値の 68 年で運用していました。
14.0 にアップデート後、ユーザを登録したところ、『認証の有効期限が、設定の範囲(現在時刻~68年後)を超えています』とエラーが発生しました。
アップデート前は正常に登録できていましたし、設定の変更は行っていません。そもそもエラーメッセージに表示されている日付は、ちょうど 68 年後なので、何がエラーなのかさっぱりわかりません。
エラーの発生個所
原因調査のため、DJX 管理ツールの設計をのぞいてみたところ、ExtReadLib スクリプトライブラリの CreateReqUserCSV 関数の中でエラーを出力していることがわかりました。
このエラーを出力するためには、その直前の If 文でエラーだと判定される必要があります。ということはその値を演算している TimeDifference メソッドに起因する現象ということがわかります。
エラーの原因
このままでは検証しづらいので、この部分だけを抜き出して確認します。変数 dt には 68 年後の日付、dtnow には SetNow メソッドで現在の時刻がセットされています。この部分だけのサンプルプログラムを作成します。
|
Sub Initialize Dim ns As New NotesSession Dim dt As New NotesDateTime("2093/05/26 12:57:54") Dim dtnow As New NotesDateTime("2025/05/26 12:57:54") diffs& = dt.TimeDifference(dtnow) MsgBox CStr(diffs&), 0, ns.Notesversion End Sub |
このプログラムを移行前の環境である Notes 11 と 移行後の環境である Notes 14 で実行します。すると、結果が違ってました!
誤差(?)は 1,566,847 秒でした(換算すると18 日 と 3 時間 14 分 7 秒)。68 年間にあるうるう年の回数に近いです(68 / 4 = 17)。うるう年計算を忘れているなんてバカなことはないと思いながら、おそるおそるテクニカルサポートに問い合わせてみました。
誤差の原因はバグ
返答は次の通りでした。
| サンプルコードを実行すると、Notes 14 では Long 型の最大値 2,147,483,647 が戻り値となっており、オーバーフローしている。 本来、TimeDifference の値は戻り値が 68 年と 20 日程度を超えると Long 値の最大となるが、Notes 14 ではそれよりも短い期間でオーバーフローしてしまっている。 この問題は、問題報告番号 JPKRDEVSGW として報告され、Notes 14.5、14.0FP5、12.0.2FP7 にて修正が予定されている。 |
オーバーフローって桁あふれが原因の現象と理解しているのですが、今回の現象は、Notes 14 の方が大きな値が出力されています。どんな演算を行うと ”早く桁があふれる” のか気になりながらも、バグなら仕方がないと飲み込みました。
ちなみにこの問題、記載通り Notes 14.5 では修正されていることを確認しました。
また、サポートの方からは TimeDifferenceDouble というメソッドを使用すると改善するとの提案もいただきました。NotesDatetime クラスは使用したことがないのですが、さまざまな機能がありそうですねぇ...
DJX の対応
ユーザ登録時の意味不明のエラー原因は明確になりました。また、14.5 でも治っていることは確認したのですが、これだけを理由にバージョンアップをするわけにはいかないですね。
仕方がないので、有効期限の設定を 67 年と 11 ヶ月に変更して運用を継続しています。
Notes/Domino 11 のサポート終了に伴い、バージョンアップを実施される環境は多いかと思います。14 を選択される場合、DJX + 68 年のユーザ登録にはご注意ください。レアケースかもしれませんが...





0 件のコメント:
コメントを投稿