Hi Lisa,

You did a good job of summarizing the situation. Let me try and fill in a few details, hopefully not making it too confusing.

There are two main kinds of locks that Qpopper uses (with some potential variances within them):

To make sure that only one process at a time is modifying the mail spool, a maillock is held only during the start and end of the session. Qpopper obtains a maillock on the spool, copies the spool to the temp drop, zeroes the spool, and releases the maillock. Local delivery agents delay mail delivery while the maillock is held.

At the end of the session, Qpopper again obtains a maillock on the spool, appends any mail that arrived during the session to the temp drop, copies the temp drop to the spool, removes or zeroes the temp drop, and releases the maillock.

Maillocks need to be interoperable between any program that accesses the spool. It wouldn't be good if Qpopper used one method while the local delivery agent used another. Not to mention all the other programs that could be used to modify the spool. Qpopper by default uses the ".lock" technique, which is compatible with maillock(3) as implemented on many platforms.

While the session is in use, Qpopper holds an advisory lock on the temp drop. The advisory lock is only needed to prevent multiple POP sessions from altering the temp drop.

Maillocks typically are a file which is the name of the spool with ".lock" appended. The modtime of the file must be less than five minutes, or the lock is considered stale and is discarded. There are other possible lock mechanisms, and variations in how the lock is created, that can be selected using obscure options in Qpopper.

Advisory locks use flock(2).

There are differences that depend on server mode and various obscure options. Server mode is the main and most used option that affects locking.

The key is that if the spool is maillocked, Qpopper waits a reasonable amount of time. So under normal circumstances, if a user checks mail at the exact moment that the local delivery agent (LDA) is appending new mail, Qpopper waits until the LDA is done, and then the POP sessions runs normally.

However, if Qpopper is unable to obtain the advisory lock on the temp drop, it assumes the user has another session active and issues an [IN-USE] error.

If the user gets an [IN-USE] error, the first thing to check is if there is an active popper process for that user and if the user is connected to it. If not, a ktrace(1), truss(1), or similar should be done to see what it is doing and why it has not gone away. If the user disconnects, Qpopper should get a signal and will then clean up and terminate. You can allow the user access by killing the popper process if it is running and removing the temp drop. Prepending the temp drop to the spool first should prevent loss of mail. You shouldn't ever have to do either, and there is always some risk of corruption or loss if you do either.

In server mode the spool isn't copied to the temp drop at the start of the session, but is still created and locked. At the end of the session, any undeleted mail is copied to the temp drop.

The "Performance" section in the Administrator's Guide (the GUIDE.pdf file) has more information on server mode.

--
Randall Gellens
Opinions are personal;    facts are suspect;    I speak for myself only
-------------- Randomly-selected tag: ---------------
DEFINITION: Computer -- A device designed to speed and automate errors.

Reply via email to