[ 
https://issues.apache.org/jira/browse/ROCKETMQ-98?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15871419#comment-15871419
 ] 

ASF GitHub Bot commented on ROCKETMQ-98:
----------------------------------------

Github user Jaskey commented on a diff in the pull request:

    https://github.com/apache/incubator-rocketmq/pull/61#discussion_r101707096
  
    --- Diff: common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java 
---
    @@ -47,6 +47,7 @@
         private boolean autoCreateSubscriptionGroup = true;
         private String messageStorePlugIn = "";
     
    +    //thread counts for sending message, if large number threads are 
needed, we suggest setting useReentrantLockWhenPutMessage=true(in 
MessageStoreConfig)
    --- End diff --
    
    @shroman 
    
    This is to make hints to developer after discuss with @zhouxinyu , since if 
developer hopes to change the sendNums, which may means propobly very feriece 
race conditions which by default using spin lock is not quite good enough. 
    
    Accoring to the current spin lock implementations, the cpu will be runnig 
all the time without any sleep when trying to get spin lock, which may cause 
cpu problem when they set sendNums to a very large number with high concurrent 
message writing.
    
    The comment to pointout that.


> Risk of unable to release putMessage Lock forever
> -------------------------------------------------
>
>                 Key: ROCKETMQ-98
>                 URL: https://issues.apache.org/jira/browse/ROCKETMQ-98
>             Project: Apache RocketMQ
>          Issue Type: Bug
>    Affects Versions: 4.1.0-incubating
>            Reporter: Jaskey Lam
>            Assignee: vongosling
>             Fix For: 4.1.0-incubating
>
>
> In current implemenation, there are two kind of locks dev can choose. If I 
> choose reentrantLock, and lock it then put message, in this time I change the 
> config through admin interface to use spin lock. When trying to unlock, 
> rocketmq will try to unlock the spin lock though actually the reentrantlock 
> is locked, this will cause the reentrantlock not able to release forever and 
> trying to release the wrong spin lock but actully it is not locked!
>     /**
>      * Spin util acquired the lock.
>      */
>     private void lockForPutMessage() {
>         if 
> (this.defaultMessageStore.getMessageStoreConfig().isUseReentrantLockWhenPutMessage())
>  {
>             putMessageNormalLock.lock();
>         } else {
>             boolean flag;
>             do {
>                 flag = this.putMessageSpinLock.compareAndSet(true, false);
>             }
>             while (!flag);
>         }
>     }
>     private void releasePutMessageLock() {
>         if 
> (this.defaultMessageStore.getMessageStoreConfig().isUseReentrantLockWhenPutMessage())
>  {
>             putMessageNormalLock.unlock();
>         } else {
>             this.putMessageSpinLock.compareAndSet(false, true);
>         }
>     }



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to