[Net-IMAP-Server] having issues with managing memory for large accounts

Sachin Sebastian sachin at gt.net
Thu May 26 19:20:36 EDT 2011


Thanks Alex. That was very helpful. I also sub-classed Messages 
overriding mime() to read from files.

Sachin.
On 11-05-25 01:09 PM, Alex Vandiver wrote:
> On Wed, 2011-05-25 at 10:53 -0700, Sachin Sebastian wrote:
>> Thanks Alex. I'll try them out. Any code sample will be of great help.
> It's possibly something that should get rolled into the default
> Net::IMAP::Server::Mailbox class, thinking about it -- though it would
> mean doing all loading through ->poll, which is a slight change from how
> we suggest you do it now.  Anyways, I've included the (totally untested)
> relevant bits below.
>   - Alex
>
>
> ---------8<---------------
> package Net::IMAP::Server::Mailbox::Lazy;
>
> use warnings;
> use strict;
>
> use Net::IMAP::Server::Message;
> use base 'Net::IMAP::Server::Mailbox';
>
> __PACKAGE__->mk_accessors( qw/is_loaded/ );
>
> =head1 NAME
>
> Net::IMAP::Server::Mailbox::Lazy - Drop messages from memory when possible
>
> =head1 METHODS
>
> =head2 is_loaded
>
> Returns true if the mailbox currently has messages populated in it
>
> =head2 poll
>
> Notes that there are messages in the mailbox.  Subclasses should likely
> override this to populate messages into the mailbox, paying attention to
> L</is_loaded>  -- if it is false, this is the initial load of the
> mailbox.  If it is true, it is a later poll looking for updates to the
> mailbox.  After their own logic, subclasses should be sure to call
> C<$self->SUPER::poll>  such that L</is_loaded>  is set correctly.
>
> =cut
>
> sub poll {
>      my $self = shift;
>      $self->is_loaded(1);
>      $self->SUPER::poll();
> }
>
> =head2 status
>
> Make sure that messages get purged from memory after STATUS operation if
> there are no other connections with this mailbox open.
>
> =cut
>
> sub status {
>      my $self = shift;
>      my $loaded = defined $self->is_loaded;
>      my %keys = $self->SUPER::status(@_);
>      $self->unload unless $is_loaded;
>      return %keys;
> }
>
> =head2 close
>
> When a session closes a mailbox, call L</unload>  unless there are other
> active connections to the mailbox.
>
> =cut
>
> sub close {
>      my $self = shift;
>      return unless $Net::IMAP::Server::Server->connection;
>      my @concurrent = grep { $_ ne $Net::IMAP::Server::Server->connection }
>          Net::IMAP::Server->concurrent_mailbox_connections($self);
>      $self->unload unless @concurrent;
> }
>
> =head2 unload
>
> Called when no sessions from this user are observing the mailbox; drops
> all of the messages.
>
> =cut
>
> sub unload {
>      my $self = shift;
>      $self->is_loaded(undef);
>      my @messages = @{$self->messages || []};
>      $self->messages( [] );
>      $self->uids( {} );
>      $_->prep_for_destroy for @messages;
> }
>
> 1;
>
>



More information about the Net-IMAP-Server mailing list