package edu.berkeley.thebes.twopl.server; import org.apache.thrift.TException; import edu.berkeley.thebes.common.data.DataItem; import edu.berkeley.thebes.common.persistence.IPersistenceEngine; import edu.berkeley.thebes.common.thrift.ThriftDataItem; import edu.berkeley.thebes.twopl.common.thrift.TwoPLMasterReplicaService; import edu.berkeley.thebes.twopl.server.TwoPLLocalLockManager.LockType; public class TwoPLMasterServiceHandler implements TwoPLMasterReplicaService.Iface { private IPersistenceEngine persistenceEngine; private TwoPLLocalLockManager lockManager; private TwoPLSlaveReplicationService slaveReplicationService; public TwoPLMasterServiceHandler(IPersistenceEngine persistenceEngine, TwoPLLocalLockManager lockManager, TwoPLSlaveReplicationService slaveReplicationService) { this.persistenceEngine = persistenceEngine; this.lockManager = lockManager; this.slaveReplicationService = slaveReplicationService; } @Override public void write_lock(long sessionId, String key) throws TException { lockManager.lock(LockType.WRITE, key, sessionId); } @Override public void read_lock(long sessionId, String key) throws TException { lockManager.lock(LockType.READ, key, sessionId); } @Override public void unlock(long sessionId, String key) throws TException { lockManager.unlock(key, sessionId); } @Override public ThriftDataItem get(long sessionId, String key) throws TException { if (lockManager.ownsLock(LockType.READ, key, sessionId)) { return persistenceEngine.get(key).toThrift(); } else { throw new TException("Session " + sessionId + "does not own GET lock on '" + key + "'"); } } @Override public boolean put(long sessionId, String key, ThriftDataItem value) throws TException { if (lockManager.ownsLock(LockType.WRITE, key, sessionId)) { persistenceEngine.put_if_newer(key, new DataItem(value)); slaveReplicationService.sendToSlaves(key, value); return true; } else { throw new TException("Session " + sessionId + " does not own PUT lock on '" + key + "'"); } } @Override public boolean unsafe_load(String key, ThriftDataItem value) throws TException { persistenceEngine.put_if_newer(key, new DataItem(value)); slaveReplicationService.sendToSlaves(key, value); return true; } }