Class DistributedLockManager

java.lang.Object
org.jgroups.blocks.DistributedLockManager
All Implemented Interfaces:
LockManager, TwoPhaseVotingListener, VoteResponseProcessor, MembershipListener

public class DistributedLockManager extends Object implements TwoPhaseVotingListener, LockManager, VoteResponseProcessor, MembershipListener
Distributed lock manager is responsible for maintaining the lock information consistent on all participating nodes.
Version:
$Id: DistributedLockManager.java,v 1.9.4.2 2008/05/22 09:51:25 belaban Exp $
Author:
Roman Rokytskyy (rrokytskyy@acm.org), Robert Schaffar-Taurok (robert@fusion.at)
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    This class represents the lock to be released.
    static class 
    This class represents the lock
    static class 
    This class represents the lock that has to be marked as multilocked
    static class 
    This class represents the lock to be released.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected final org.apache.commons.logging.Log
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    Constructor for the DistributedLockManager_cl object.
    Create instance of this class.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    abort(Object decree)
    Abort phase for the lock acquisition or release.
    void
    Called (usually by the FLUSH protocol), as an indication that the member should stop sending messages.
    boolean
    commit(Object decree)
    Commit phase for the lock acquisition or release.
    void
    lock(Object lockId, Object owner, int timeout)
    Locks an object with lockId on behalf of the specified owner.
    boolean
    prepare(Object decree)
    Prepare phase for the lock acquisition or release.
    boolean
    processResponses(RspList responses, int consensusType, Object decree)
    Processes the response list and votes like the default processResponses method with the consensusType VOTE_ALL If the result of the voting is false, but this DistributedLockManager owns the lock, the result is changed to true and the lock is released, but marked as multiple locked.
    void
    suspect(Address suspected_mbr)
    Called whenever a member is suspected of having crashed, but has not yet been excluded.
    void
    unlock(Object lockId, Object owner)
    Unlocks an object with lockId on behalf of the specified owner.
    void
    unlock(Object lockId, Object owner, boolean releaseMultiLocked)
    Unlocks an object with lockId on behalf of the specified owner.
    void
    unlock(Object lockId, Object owner, boolean releaseMultiLocked, long timeout)
     
    void
    unlock(Object lockId, Object owner, long timeout)
     
    void
    viewAccepted(View new_view)
    Remove all locks held by members who left the previous view

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • log

      protected final org.apache.commons.logging.Log log
  • Constructor Details

    • DistributedLockManager

      public DistributedLockManager(VotingAdapter voteChannel, Object id)
      Create instance of this class.
      Parameters:
      voteChannel - instance of VotingAdapter that will be used for voting purposes on the lock decrees. voteChannel() will be wrapped by the instance of the TwoPhaseVotingAdapter.
      id - the unique identifier of this lock manager. todo check if the node with the same id is already in the group.
    • DistributedLockManager

      public DistributedLockManager(TwoPhaseVotingAdapter channel, Object id)
      Constructor for the DistributedLockManager_cl object.
      Parameters:
      channel - instance of TwoPhaseVotingAdapter that will be used for voting purposes on the lock decrees.
      id - the unique identifier of this lock manager.
      To do:
      check if the node with the same id is already in the group.
  • Method Details

    • lock

      public void lock(Object lockId, Object owner, int timeout) throws LockNotGrantedException, ChannelException
      Locks an object with lockId on behalf of the specified owner.
      Specified by:
      lock in interface LockManager
      Parameters:
      lockId - Object representing the object to be locked.
      owner - object that requests the lock. This should be the Address of a JGroups member, otherwise we cannot release the locks for a crashed member !
      timeout - time during which group members should decide whether to grant a lock or not.
      Throws:
      LockNotGrantedException - when the lock cannot be granted.
      ClassCastException - if lockId or owner are not serializable.
      ChannelException - if something bad happened to underlying channel.
    • unlock

      public void unlock(Object lockId, Object owner) throws LockNotReleasedException, ChannelException
      Unlocks an object with lockId on behalf of the specified owner. since 2.2.9 this method is only a wrapper for unlock(Object lockId, Object owner, boolean releaseMultiLocked). Use that with releaseMultiLocked set to true if you want to be able to release multiple locked locks (for example after a merge)
      Specified by:
      unlock in interface LockManager
      Parameters:
      lockId - long representing the object to be unlocked.
      owner - object that releases the lock.
      Throws:
      LockNotReleasedException - when the lock cannot be released.
      ClassCastException - if lockId or owner are not serializable.
      ChannelException
    • unlock

      public void unlock(Object lockId, Object owner, long timeout) throws LockNotReleasedException, ChannelException
      Throws:
      LockNotReleasedException
      ChannelException
    • unlock

      public void unlock(Object lockId, Object owner, boolean releaseMultiLocked) throws LockNotReleasedException, ChannelException, LockMultiLockedException
      Unlocks an object with lockId on behalf of the specified owner.
      Specified by:
      unlock in interface LockManager
      Parameters:
      lockId - long representing the object to be unlocked.
      owner - object that releases the lock.
      releaseMultiLocked - releases also multiple locked locks. (eg. locks that are locked by another DLM after a merge)
      Throws:
      LockNotReleasedException - when the lock cannot be released.
      ClassCastException - if lockId or owner are not serializable.
      LockMultiLockedException - if releaseMultiLocked is true and a multiple locked lock has been released.
      ChannelException
    • unlock

      public void unlock(Object lockId, Object owner, boolean releaseMultiLocked, long timeout) throws LockNotReleasedException, ChannelException, LockMultiLockedException
      Throws:
      LockNotReleasedException
      ChannelException
      LockMultiLockedException
    • prepare

      public boolean prepare(Object decree) throws VoteException
      Prepare phase for the lock acquisition or release.
      Specified by:
      prepare in interface TwoPhaseVotingListener
      Parameters:
      decree - should be an instance LockDecree, if not, we throw VoteException to be ignored by the VoteChannel.
      Returns:
      true when preparing the lock operation succeeds.
      Throws:
      VoteException - if we should be ignored during voting.
    • commit

      public boolean commit(Object decree) throws VoteException
      Commit phase for the lock acquisition or release.
      Specified by:
      commit in interface TwoPhaseVotingListener
      Parameters:
      decree - should be an instance LockDecree, if not, we throw VoteException to be ignored by the VoteChannel.
      Returns:
      true when commiting the lock operation succeeds.
      Throws:
      VoteException - if we should be ignored during voting.
    • abort

      public void abort(Object decree) throws VoteException
      Abort phase for the lock acquisition or release.
      Specified by:
      abort in interface TwoPhaseVotingListener
      Parameters:
      decree - should be an instance LockDecree, if not, we throw VoteException to be ignored by the VoteChannel.
      Throws:
      VoteException - if we should be ignored during voting.
    • processResponses

      public boolean processResponses(RspList responses, int consensusType, Object decree) throws ChannelException
      Processes the response list and votes like the default processResponses method with the consensusType VOTE_ALL If the result of the voting is false, but this DistributedLockManager owns the lock, the result is changed to true and the lock is released, but marked as multiple locked. (only in the prepare state to reduce traffic)

      Note: we do not support voting in case of Byzantine failures, i.e. when the node responds with the fault message.

      Specified by:
      processResponses in interface VoteResponseProcessor
      Parameters:
      responses - The responses
      consensusType - The consensusType of the vote
      decree - The vote decree
      Returns:
      boolean
      Throws:
      ChannelException
    • viewAccepted

      public void viewAccepted(View new_view)
      Remove all locks held by members who left the previous view
      Specified by:
      viewAccepted in interface MembershipListener
    • suspect

      public void suspect(Address suspected_mbr)
      Description copied from interface: MembershipListener
      Called whenever a member is suspected of having crashed, but has not yet been excluded.
      Specified by:
      suspect in interface MembershipListener
    • block

      public void block()
      Description copied from interface: MembershipListener
      Called (usually by the FLUSH protocol), as an indication that the member should stop sending messages. Any messages sent after returning from this callback might get blocked by the FLUSH protocol. When the FLUSH protocol is done, and messages can be sent again, the FLUSH protocol will simply unblock all pending messages. If a callback for unblocking is desired, implement ExtendedMembershipListener.unblock(). Note that block() is the equivalent of reception of a BlockEvent in the pull mode.
      Specified by:
      block in interface MembershipListener