When our chat server machine was re-booted the other day some of the persistent chat rooms didn't recover correctly. Most clients got a "404" error but the owner was able to connect but always got a message saying the room was locked: This room is locked from entry until configuration is confirmed.
The machine is running Ubuntu 9.10 with jabber2 and jabber-muc and is configured to use LDAP for user authentication. There were no errors that I could see in the logs, so it was all very peculiar.
The root of the problem was, I think, down to an installation/configuration issue of the Multi-User Conference component. It uses a "spool" directory to store room related data. The directory is defined in /etc/jabberd2/muc.xml
... /var/spool/jabber-muc/rooms/ <!-- directory containing the rooms data --> ...
I'm not sure if it was me or the install process, but /var/spool/jabber-muc was correctly owned by the user running the jabber process, but rooms was owned by root and was not writeable by the jabber process. As a result, rooms that were supposed to be persistent appeared to work fine until we needed to restart the server.
After the server restart the first client that attempted to join a previously 'persistent' room would dynamically create a new room with the same name. The process for creating a new room requires the client to complete the room's configuration before it is unlocked. In Pidgin you get a window that asks you to confirm the rooms configuration, and until that confirmation is provided, the room remains locked to all other visitors.
I suspect that after our server was restarted, a client automatically connected to some of the persistent rooms, but the configuration was not completed, so the room got into a locked state.
After changing the permissions to ensure the spool directory is writeable to the jabber process, there are now a bunch of xml files in the spool directory that describe the configuration of our rooms, and after a machine restart all the rooms remain available. Hooray!