blob: e0b557127bbcd21b12351e7f29ec4c479795d5bc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.cache.locks;
import java.util.List;
import java.util.Set;
import org.apache.geode.annotations.internal.MakeNotStatic;
import org.apache.geode.cache.CommitConflictException;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.distributed.internal.locks.DLockService;
/**
* Provides transaction locking service for coordinating transactions.
* <p>
* This is an abstract class defining the public facade for the transaction locking service.
*
*/
public abstract class TXLockService {
// -------------------------------------------------------------------------
// TLS instances
// -------------------------------------------------------------------------
/** The distributed transaction lock service */
@MakeNotStatic
static TXLockService DTLS = null;
// -------------------------------------------------------------------------
// Static methods
// -------------------------------------------------------------------------
/** Returns the instance of the distributed TXLockService */
public static TXLockService getDTLS() {
return DTLS;
}
/** Returns (or creates) the instance of the distributed TXLockService */
public static TXLockService createDTLS(InternalDistributedSystem system) {
synchronized (TXLockService.class) {
if (DTLS == null || DTLS.isDestroyed()) {
DTLS = new TXLockServiceImpl(DLockService.DTLS, system);
}
return DTLS;
}
}
/** Destroys DTLS in this process to free up resources */
public static void destroyServices() {
synchronized (TXLockService.class) {
if (DTLS != null) {
DTLS.destroy();
DTLS = null;
}
}
}
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
/**
* Requests batch of try locks as scoped by a region.
*
* @param regionLockReqs list of TXRegionLockRequests
*
* @param participants set of members participating in tx; each member is identified by a
* serializable <code>IpAddress</code> from JGroups; the grantor will use this to recover
* if the tx originator departs; null or empty is allowed
*
* @return a generated serializable object to be used as the tx lock reference (txLockId)
*
* @throws IllegalStateException if service is destroyed
*
* @throws IllegalArgumentException if regionLockReqs is null or or if either arguments contain
* instances of unexpected classes
*/
public abstract TXLockId txLock(List regionLockReqs, Set participants)
throws CommitConflictException;
/**
* Releases all locks represented by tx lock reference.
*
* @param txLockId the tx lock reference as generated from the call to <code>txLock</code>
*
* @throws IllegalStateException if service is destroyed
*
* @throws IllegalArgumentException if argument is null or invalid
*/
public abstract void release(TXLockId txLockId);
/**
* Updates the set of participants for a given tx lock reference.
*
* @param txLockId the tx lock reference as generated from the call to <code>txLock</code>
*
* @param updatedParticipants the set of new participants generated from the advisor for each
* <code>Region</code> in the transaction.
*
* @throws IllegalStateException if service is destroyed
*
* @throws IllegalArgumentException if arguments are null or invalid
*/
public abstract void updateParticipants(TXLockId txLockId, Set updatedParticipants);
/**
* Returns true if this process is the lock grantor for this service.
*
* @throws IllegalStateException if service is destroyed
*/
public abstract boolean isLockGrantor();
/**
* Makes this process explicitly become the lock grantor for this service.
*
* @throws IllegalStateException if service is destroyed
*/
public abstract void becomeLockGrantor();
/** Returns true if this lock service is destroyed. */
public abstract boolean isDestroyed();
/**
* Destroys this tx lock service and removes the static reference to it.
*/
public void destroy() {
synchronized (TXLockService.class) {
if (!isDestroyed()) {
basicDestroy();
if (this == DTLS)
DTLS = null;
}
}
}
// -------------------------------------------------------------------------
// Hidden template methods
// -------------------------------------------------------------------------
/** Perfoms basic destroy of this tx lock service */
abstract void basicDestroy();
}