Skip to content

Commit

Permalink
working on CentralLockService
Browse files Browse the repository at this point in the history
  • Loading branch information
belaban committed Jan 17, 2011
1 parent 33c847e commit c6eabe6
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 18 deletions.
14 changes: 9 additions & 5 deletions src/org/jgroups/blocks/locking/AbstractLockService.java
Expand Up @@ -19,8 +19,8 @@
* @author Bela Ban
*/
abstract public class AbstractLockService extends ReceiverAdapter implements LockService {
protected JChannel ch;
protected View view;
protected JChannel ch;
protected View view;
protected final Log log=LogFactory.getLog(getClass());

// server side locks
Expand Down Expand Up @@ -79,6 +79,10 @@ public Lock getLock(String name) {
return getLock(name, getOwner(), true);
}

public Lock getLock(String name, boolean create_if_absent) {
return getLock(name, getOwner(), create_if_absent);
}

public void unlockAll() {
List<ClientLock> locks=new ArrayList<ClientLock>();
synchronized(client_locks) {
Expand Down Expand Up @@ -106,7 +110,7 @@ public void receive(Message msg) {
handleLockGrantedResponse(req.lock_name, req.owner, msg.getSrc());
break;
case LOCK_DENIED:
handleLockDeniedResponse(req.lock_name, req.owner, msg.getSrc());
handleLockDeniedResponse(req.lock_name, req.owner);
break;
default:
log.error("Request of type " + req.type + " not known");
Expand Down Expand Up @@ -180,7 +184,7 @@ protected Owner getOwner() {

protected void sendRequest(Address dest, Type type, String lock_name, Owner owner, long timeout, boolean is_trylock) {
Request req=new Request(type, lock_name, owner, timeout, is_trylock);
Message msg=new Message(null, null, req);
Message msg=new Message(dest, null, req);
if(bypass_bundling)
msg.setFlag(Message.DONT_BUNDLE);
if(log.isTraceEnabled())
Expand Down Expand Up @@ -234,7 +238,7 @@ protected void handleLockGrantedResponse(String lock_name, Owner owner, Address
lock.handleLockGrantedResponse(owner, sender);
}

protected void handleLockDeniedResponse(String lock_name, Owner owner, Address sender) {
protected void handleLockDeniedResponse(String lock_name, Owner owner) {
ClientLock lock=getLock(lock_name, owner, false);
if(lock != null)
lock.lockDenied();
Expand Down
16 changes: 13 additions & 3 deletions src/org/jgroups/blocks/locking/CentralLockService.java
@@ -1,5 +1,6 @@
package org.jgroups.blocks.locking;

import org.jgroups.Address;
import org.jgroups.JChannel;
import org.jgroups.View;

Expand All @@ -10,6 +11,8 @@
* @author Bela Ban
*/
public class CentralLockService extends AbstractLockService {
protected Address coord;
protected boolean is_coord;

public CentralLockService() {
super();
Expand All @@ -20,17 +23,24 @@ public CentralLockService(JChannel ch) {
}

protected void sendGrantLockRequest(String lock_name, Owner owner, long timeout, boolean is_trylock) {
sendRequest(null, Type.GRANT_LOCK, lock_name, owner, timeout, is_trylock);
if(coord != null)
sendRequest(coord, Type.GRANT_LOCK, lock_name, owner, timeout, is_trylock);
}

protected void sendReleaseLockRequest(String lock_name, Owner owner) {
sendRequest(null, Type.RELEASE_LOCK, lock_name, owner, 0, false);
if(coord != null)
sendRequest(coord, Type.RELEASE_LOCK, lock_name, owner, 0, false);
}


public void viewAccepted(View view) {
super.viewAccepted(view);

if(view.size() > 0) {
coord=view.getMembers().firstElement();
is_coord=coord.equals(ch.getAddress());
if(log.isDebugEnabled())
log.debug("local_addr=" + ch.getAddress() + ", coord=" + coord + ", is_coord=" + is_coord);
}
}


Expand Down
1 change: 1 addition & 0 deletions src/org/jgroups/blocks/locking/LockService.java
Expand Up @@ -7,4 +7,5 @@
*/
public interface LockService {
Lock getLock(String name);
Lock getLock(String name, boolean create_if_absent);
}
24 changes: 14 additions & 10 deletions src/org/jgroups/demos/LockServiceDemo.java
Expand Up @@ -2,10 +2,7 @@

import org.jgroups.ChannelException;
import org.jgroups.JChannel;
import org.jgroups.blocks.locking.AbstractLockService;
import org.jgroups.blocks.locking.LockNotification;
import org.jgroups.blocks.locking.Owner;
import org.jgroups.blocks.locking.PeerLockService;
import org.jgroups.blocks.locking.*;
import org.jgroups.util.Util;

import java.util.ArrayList;
Expand All @@ -28,11 +25,11 @@ public LockServiceDemo(String props, String name) {
this.name=name;
}

public void start() throws ChannelException {
public void start(boolean peer) throws ChannelException {
ch=new JChannel(props);
if(name != null)
ch.setName(name);
lock_service=new PeerLockService(ch);
lock_service=peer? new PeerLockService(ch) : new CentralLockService(ch);
lock_service.addLockListener(this);
ch.connect("lock-cluster");
try {
Expand Down Expand Up @@ -106,8 +103,9 @@ else if(line.startsWith("unlock")) {
break;
}
else {
Lock lock=lock_service.getLock(lock_name);
lock.unlock();
Lock lock=lock_service.getLock(lock_name, false);
if(lock != null)
lock.unlock();
}
}
}
Expand Down Expand Up @@ -136,6 +134,8 @@ protected void printLocks() {
public static void main(String[] args) throws ChannelException {
String props=null;
String name=null;
boolean peer=false;

for(int i=0; i < args.length; i++) {
if(args[i].equals("-props")) {
props=args[++i];
Expand All @@ -145,16 +145,20 @@ public static void main(String[] args) throws ChannelException {
name=args[++i];
continue;
}
if(args[i].equals("-peer")) {
peer=true;
continue;
}
help();
return;
}

LockServiceDemo demo=new LockServiceDemo(props, name);
demo.start();
demo.start(peer);
}

protected static void help() {
System.out.println("\nLockServiceDemo [-props properties] [-name name]\n" +
System.out.println("\nLockServiceDemo [-props properties] [-name name] [-peer]\n" +
"Valid commands:\n\n" +
"lock (<lock name>)+\n" +
"unlock (<lock name> | \"ALL\")+\n" +
Expand Down

0 comments on commit c6eabe6

Please sign in to comment.