본문 바로가기

카테고리 없음

[James clustering] MailboxPathLocker 문제.

 

§ 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 문제가 발생하니 원인 분석이 힘들었다.