2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.openecomp.appc.lockmanager.impl.inmemory;
25 import java.util.concurrent.ConcurrentHashMap;
27 import org.openecomp.appc.lockmanager.api.LockException;
28 import org.openecomp.appc.lockmanager.api.LockManager;
29 import com.att.eelf.configuration.EELFLogger;
30 import com.att.eelf.configuration.EELFManager;
33 public class LockManagerInMemoryImpl implements LockManager {
35 private static LockManagerInMemoryImpl instance = null;
36 private Map<String, LockValue> lockedVNFs;
38 private static final EELFLogger debugLogger = EELFManager.getInstance().getDebugLogger();
40 private LockManagerInMemoryImpl() {
41 lockedVNFs = new ConcurrentHashMap<>();
44 public static LockManager getLockManager() {
45 if(instance == null) {
46 instance = new LockManagerInMemoryImpl();
52 public boolean acquireLock(String resource, String owner) throws LockException {
53 return acquireLock(resource, owner, 0);
57 public boolean acquireLock(String resource, String owner, long timeout) throws LockException {
58 debugLogger.debug("Try to acquire lock on resource " + resource + " with owner " + owner);
59 long now = System.currentTimeMillis();
60 LockValue lockValue = lockedVNFs.get(resource);
61 if (lockValue != null) {
62 if (lockIsMine(lockValue, owner, now) || hasExpired(lockValue, now)) {
63 setExpirationTime(resource, owner, timeout, now);
64 debugLogger.debug("Locked successfully resource " + resource + " with owner " + owner + " for " + timeout + " ms");
65 return hasExpired(lockValue, now);
68 debugLogger.debug("Owner " + owner + " tried to lock resource " + resource + " but it is already locked by owner " + lockValue.getOwner());
69 throw new LockException("Owner " + owner + " tried to lock resource " + resource + " but it is already locked by owner " + lockValue.getOwner());
73 setExpirationTime(resource, owner, timeout, now);
74 debugLogger.debug("Locked successfully resource " + resource + " with owner " + owner + " for " + timeout + " ms");
80 public void releaseLock(String resource, String owner) throws LockException {
81 debugLogger.debug("Try to release lock on resource " + resource + " with owner " + owner);
82 long now = System.currentTimeMillis();
83 LockValue lockValue = lockedVNFs.get(resource);
84 if (lockValue != null) {
85 if (!hasExpired(lockValue, now)) {
86 if (isOwner(lockValue, owner)) {
87 debugLogger.debug("Unlocked successfully resource " + resource + " with owner " + owner);
88 lockedVNFs.remove(resource);
91 debugLogger.debug("Unlock failed. Tried to release lock on resource " + resource + " from owner " + owner + " but it is held by a different owner");
92 throw new LockException("Unlock failed. Tried to release lock on resource " + resource + " from owner " + owner + " but it is held by a different owner");
96 lockedVNFs.remove(resource);
97 debugLogger.debug("Unlock failed. lock on resource " + resource + " has expired");
98 throw new LockException("Unlock failed. lock on resource " + resource + " has expired");
103 debugLogger.debug("Tried to release lock on resource " + resource + " from owner " + owner + " but there is not lock on this resource");
104 throw new LockException("Tried to release lock on resource " + resource + " from owner " + owner + " but there is not lock on this resource");
109 public boolean isLocked(String resource) {
110 return lockedVNFs.get(resource)!=null?true:false;
113 private boolean lockIsMine(LockValue lockValue, String owner, long now) {
114 return isOwner(lockValue, owner) && !hasExpired(lockValue, now);
117 private boolean isOwner(LockValue lockValue, String owner) {
118 return lockValue.getOwner() != null && lockValue.getOwner().equals(owner);
121 private boolean hasExpired(LockValue lockValue, long now) {
122 return (lockValue.getExpirationTime() != 0 && now > lockValue.getExpirationTime());
125 private void setExpirationTime(String resource, String owner, long timeout, long now) {
126 long expirationTime = timeout == 0 ? 0 : now + timeout;
127 LockValue lockValue = new LockValue(owner, expirationTime);
128 lockedVNFs.put(resource, lockValue);