_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Vladimir Butenko 2:5020/400 Sun 29 Nov 98 07:44
Subj : Re: Cтaтeйкa :(
________________________________________________________________________________
From: [email protected] (Vladimir Butenko)
In article <[email protected]>, Igor Nikolaev
<[email protected]> wrote:
> Да я почти ничего не понял, что же по сути до с точки зрения
> этого самого mbox делается? Он заблокирован или нет? Что будет
> если Вася удалил 1 и 3 сообщение, а Петя 2 и 3 (в ящике были
> 1..4 и во время этого безобразия sendmail пытается добавить
> пятое) ?
:-((((. Это грустно. Че делать будем? Давайте так - если это только Вы не
поняли, то как-нибудь в феврале ко мне под"едете (не с пустыми руками, как
понятно), и я Вам это на бумажке за пять минут нарисую - под рюмочку
чайка. А если это хотя бы 10 людям интересно - то я напрягусь и попробую
тогда с самого начала описать все подробно (это часов пять писАть, на
бумажке - полчаса - но welcome to the Unix world - we are text-only). Тем
более таланты мои лекторские весьма ограниченны, так что - пять часов -
это я не шучу :-(
Проблема в том, что Вы так и не смогли отрешиться от терминов
"майлбокс-файл", "блокировка файла" и прочего. А их ведь просто может не
быть - майлбокс-файлов-то. Тут вот про maildir поминали - так все, что я
говорил, это и к ним подходит. Попробуйте еще раз мое сумбурное
перечитать, а я пока повторю основное:
а) есть об"ект - майлбокс. Как он устроен - не Ваше дело.
б) клиенты общаются не напрямую с майлбоксом, а каждый клиент получает
некий "view". В общем случае - они у всех разные.
в) То, что мессадж появился в майлбоксе (сендмайл добавил или другой клиент) -
вовсе не означает, что он появится в чьем-то view.
г) То, что мессадж удалился из чьего-то view - вовсе не означает, что он
тут же удалился и из майлбокса.
д) То, что мессадж удалился из майлбокса - не означает, что он исчез из
view - там от него может остаться "затычка" (как сейчас происходит со view
POP клиентов, когда кто-то удаляет мессадж из того майлбокса, которые они
уже получили по команде LIST, и удалений не ожидают).
Вот так примерно выглядит доступ к одному майлбоксу из 3 клиентов...
+--------------+ +--------------+ +--------------+
| POP client | | POP client | | IMAP client |
+--------------+ +--------------+ +--------------+
| | |
| | |
---------------------------Server-----------------------------------
| | |
+--------------+ +--------------+ +--------------+
| POP client | | POP client | | IMAP client |
| agent | | agent | | agent |
+--------------+ +--------------+ +--------------+
| | |
| | |
| | |
+--------------+ +--------------+ +--------------+
| VMailboxView | | VMailboxView | | VMailboxView |
+--------------+ +--------------+ +--------------+
| ID, flags | | ID, flags | | ID, flags | - Таблицы мессаджей,
| ID, flags | | ID, flags | | ID, flags | у каждого - свои.
+--------------+ +--------------+ +--------------+
\ | /
\ | /
\ | /
\ | /
\ | /
\ | /
\ | /
Appends (SMTP, +------------------+
-----------> | VMailbox | абстрактный об"кт "майлбокс"
append,copy) +------------------+\
|| \ Таблица мессаджей в РЕАЛЬHОМ майлбоксе
|| +--------------------------+
|| | ID, flags, specific data |
|| | ID, flags, specific data |
|| +--------------------------+
\/
+------------------+
| | конкретные манагеры, которые
+-----------| VUnixMailBox | выполняют операции над конкретными
| +------------------+ майлбоксами - Unix (BSD), Folder
| VFolderMailbox | (MailDir)
+---------------------+
Вся основная логика в - VMailbox. Один сказал - удали мессадж (POP в конце
сессии). Он (сейчас) - удаляет (обращением к конкретному манагеру этого
типа
майлбокса - файл перетрясает для BSD, мессадж-файл стирает для MailDir -
не важно, а во все mailView - подставляет для этого ID флажок "тю-тю" - то
есть - "ты думаешь, что он еще есть? таки ты совсем не ничего не еще не
знаешь". IMAP клиенты в нужный момент просмотрит свой view - и навыдает
expunge- клиенту, а из свой таблички ID, flags - удалит: клиент видит
стираение "мгновенно". POP так не может, поэтому.... - далее перечитывайте
мой мессадж с начала, я думаю, так будет понятно.
Я, конечно, предвижу вопрос - "а где же все это - все эти "об"екты" лежат?
А ответ прост - это все - в памяти. В ОЗУ, так сказать. Когда майлбокс
открывается - кем угодно, то создается об"ект VMailbox для него, и
генерится первый view. Когда подлетают новые клиенты - им выдается просто
новый view (по теперешним правилам сгенеренный - это просто копия таблицы
из VMailbox на данный момент, для реализации Вашей семантики - копия
таблицы, за исключением элементов с пометкой "был грохнут, но кому-то еще
нужен"). При закрытии последнего view - закрывается и VMailbox.
Поэтому, кстати, если два POP-a полезут одновременно к 100МБ ящику, то
парсится он будет только один раз - потом таблица разбора лежит в памяти
(ID/flags у VMailbox) и обновляется по мере стирания/добавления.
Вот, кстати, для VAccount это сделано, а тут - еще нет. Когда последний
view отлетел - надо бы не удалять VMailbox, а - кэшировать. Оченно
помогает для больших майлбоксов (архив майл листов - это тоже майлбокс).
Hо - не сделано пока. А - надо. Чтобы если я потратил 30 сек. серверного
времени на открытие майлбокса, а потом отлетел и через минуту опять к нему
полез - чтобы он не пересканировал опять. Кэшик нужен. Он почти есть, но
раз "почти" - значит нету. Там кэшик похитрее - он с учетом времени,
затраченного на разбор майлбокса должен работать. Если майлбокс - 50К, то
его проще разобрать опять, чем кэшировать. Точнее, он должен из кэша
раньше вылетать, чем тот, который минуту разбирали.
Вот такие тут гитики.... Так что - попробуйте теперь понять, что я тогда
написал - искренне надеюсь, что теперь будет понятнее. А нет -
спрашивайте.
> Игорь Hиколаев
--
Vladimir Butenko
Stalker Software, Inc.
--- ifmail v.2.14dev2 * Origin: Stalker Software, Inc. (2:5020/400@fidonet)