From c6eabe6ce53e8ec0ece03350291ca56d2a230e4c Mon Sep 17 00:00:00 2001 From: Bela Ban Date: Mon, 17 Jan 2011 14:23:04 +0100 Subject: [PATCH] working on CentralLockService --- .../blocks/locking/AbstractLockService.java | 14 +++++++---- .../blocks/locking/CentralLockService.java | 16 ++++++++++--- .../jgroups/blocks/locking/LockService.java | 1 + src/org/jgroups/demos/LockServiceDemo.java | 24 +++++++++++-------- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/org/jgroups/blocks/locking/AbstractLockService.java b/src/org/jgroups/blocks/locking/AbstractLockService.java index 33d7a1da400..7e832061ec4 100644 --- a/src/org/jgroups/blocks/locking/AbstractLockService.java +++ b/src/org/jgroups/blocks/locking/AbstractLockService.java @@ -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 @@ -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 locks=new ArrayList(); synchronized(client_locks) { @@ -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"); @@ -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()) @@ -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(); diff --git a/src/org/jgroups/blocks/locking/CentralLockService.java b/src/org/jgroups/blocks/locking/CentralLockService.java index fc7753246c8..73be697a860 100644 --- a/src/org/jgroups/blocks/locking/CentralLockService.java +++ b/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; @@ -10,6 +11,8 @@ * @author Bela Ban */ public class CentralLockService extends AbstractLockService { + protected Address coord; + protected boolean is_coord; public CentralLockService() { super(); @@ -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); + } } diff --git a/src/org/jgroups/blocks/locking/LockService.java b/src/org/jgroups/blocks/locking/LockService.java index 208a8565a3f..8d0a387eb5d 100644 --- a/src/org/jgroups/blocks/locking/LockService.java +++ b/src/org/jgroups/blocks/locking/LockService.java @@ -7,4 +7,5 @@ */ public interface LockService { Lock getLock(String name); + Lock getLock(String name, boolean create_if_absent); } diff --git a/src/org/jgroups/demos/LockServiceDemo.java b/src/org/jgroups/demos/LockServiceDemo.java index a5b5b719e31..6e3bb28116b 100644 --- a/src/org/jgroups/demos/LockServiceDemo.java +++ b/src/org/jgroups/demos/LockServiceDemo.java @@ -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; @@ -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 { @@ -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(); } } } @@ -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]; @@ -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 ()+\n" + "unlock ( | \"ALL\")+\n" +