§ James 0.6 이하 제공되는 mailbox path locker 는 single JVM 에서 사용되는 locker.
- org.apache.james.mailbox.store.JVMMailboxPathLocker extends AbstractMailboxPathLocker
여러대의 메일 엔진이 구성되는 경우 메일박스 점유에 따른 여러가지 문제가 발생한다.
1. 제일 큰 이슈는 mailbox 마다 존재하는 james-uidlist 의 File locking 이 되지 않아 uid 를 write 하다 깨지는 현상이 발생한다.
- IMAP SELECT 가 되지 않아 오류가 발생하고 본문을 주지 않는다.
2. 메일의 Flag 변경과 삭제, 박스 이동 등이 동시에 발생하는 경우
- JPA 를 사용하는데 낙관적 동시성으로 인해 문제가 발생 한다. 비관적 동시성인 PESSIMISTIC_WRITE 로 변경한다.
※ mailboxPathLock 은 Hazelcast.getLock + JVMMailboxPathLocker 를 혼용하여 사용하며
SELECT + UPDATE , SELECT + DELETE 가 동시에 발생하는 부분은
Query q = em.createNamedQuery("................");
q.setLockMode(LockModeType.PESSIMISTIC_WRITE);
문제는 org.apache.james.mailbox.maildir.MaildirStoreImpl 생성자에서 MailboxPathLocker 를 JVMMailboxPathLocker 로 객체를
생성하는 것을 볼 수 있다. MailboxPathLockerFactory 를 만들어 해결한다.
application 과 database 에서 동시적으로 lock 문제가 발생하니 원인 분석이 힘들었다.