RFC3501 に記載のある IMAP4 の UID は 32bit の値で、32bit の UIDVALIDITY と合わせて 64bit で永久に重複しないようにとなっています。
この UID について質問です:
- この値が万が一 32bit 値を使いきった時にどうするかというのはどこかに定義されているのでしょうか?
セッションをまたいで UID の永続性が保てない場合は UIDVALIDITY を前より大きな値に変更できそうですが、RFC の記載はメッセージストアの性質上、UID を保持できないような場合には UIDVALIDITY をセッションごとに変えて、それまでの値と重複しないようにするための説明となっています。それとも 32bit の値なんて使いきるわけないという前提で考えられていない?
- 世の中の IMAP4 サーバの実装でどうなっているかご存じであれば教えてください
dovecot の場合は以下のように特に使い切った時に何らかの方法で更新するというような処理が実装されておらず、単にエラー終了するだけに見えますが、どこかに UID/UIDVALIDITY をどうにかして引き続きメールボックスを使えるようにする実装があるでしょうか?
dovecot の実装
UID は uint32_t
で定義されており、Next UID の値が UINT32_MAX となっているときに imap コマンドが実行されると maildir_uidlist_assign_uids
関数内の
i_assert(recs[dest]->uid == (uint32_t)-1);
というチェックでひっかかり、最後は lib/failures.c
の default_fatal_finish
内で呼ばれた abort()
で SIGABRT
が飛んでプログラム終了です。Maildir のディレクトリ内には lock ファイルなどが残ったままになります。
以上は dovecot-uidlist
の Next UID を手で書き換えてテストしたので、もしかしてそれでは処理できない対応が何か実装されていれば教えてください。
あなたの回答
tips
プレビュー