2 * ============LICENSE_START==========================================
4 * ===================================================================
5 * Copyright (c) 2017 AT&T Intellectual Property
6 * ===================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * ============LICENSE_END=============================================
20 * ====================================================================
23 package org.onap.music.lockingservice.zookeeper;
26 import java.io.IOException;
27 import java.util.StringTokenizer;
28 import java.util.concurrent.CountDownLatch;
30 import org.apache.zookeeper.KeeperException;
31 import org.apache.zookeeper.WatchedEvent;
32 import org.apache.zookeeper.Watcher;
33 import org.apache.zookeeper.Watcher.Event.KeeperState;
34 import org.apache.zookeeper.ZooKeeper;
35 import org.onap.music.eelf.logging.EELFLoggerDelegate;
36 import org.onap.music.eelf.logging.format.AppMessages;
37 import org.onap.music.eelf.logging.format.ErrorSeverity;
38 import org.onap.music.eelf.logging.format.ErrorTypes;
39 import org.onap.music.exceptions.MusicLockingException;
40 import org.onap.music.exceptions.MusicServiceException;
41 import org.onap.music.lockingservice.cassandra.MusicLockState;
42 import org.onap.music.main.CachingUtil;
43 import org.onap.music.main.MusicUtil;
46 public class MusicLockingService implements Watcher {
49 private static final int SESSION_TIMEOUT = 180000;
50 ZkStatelessLockService zkLockHandle = null;
51 private CountDownLatch connectedSignal = new CountDownLatch(1);
52 private static EELFLoggerDelegate logger =
53 EELFLoggerDelegate.getLogger(MusicLockingService.class);
55 public MusicLockingService() throws MusicServiceException {
57 ZooKeeper zk = new ZooKeeper(MusicUtil.getMyZkHost(), SESSION_TIMEOUT, this);
58 connectedSignal.await();
59 zkLockHandle = new ZkStatelessLockService(zk);
60 } catch (IOException e) {
61 logger.error("Error", e);
62 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
63 throw new MusicServiceException("IO Error has occured" + e.getMessage());
64 } catch (InterruptedException e) {
65 logger.error("Error", e);
66 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
67 throw new MusicServiceException("Exception Occured " + e.getMessage());
71 public MusicLockingService(String lockServer) {
73 ZooKeeper zk = new ZooKeeper(lockServer, SESSION_TIMEOUT, this);
74 connectedSignal.await();
75 zkLockHandle = new ZkStatelessLockService(zk);
76 } catch (IOException e) {
77 logger.error("Error", e);
78 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
79 }catch( InterruptedException e) {
80 logger.error("Error", e);
81 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
83 logger.error("Error", e);
84 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
88 public ZkStatelessLockService getzkLockHandle() {
92 public void createLockaIfItDoesNotExist(String lockName) {
93 if (!zkLockHandle.checkIfLockExists(lockName)) {
94 String lockHolder = null;
95 MusicLockState ml = new MusicLockState(MusicLockState.LockStatus.UNLOCKED, lockHolder);
96 byte[] data = ml.serialize();
97 zkLockHandle.createLock(lockName, data);
101 public void setLockState(String lockName, MusicLockState mls) {
102 byte[] data = mls.serialize();
103 zkLockHandle.setNodeData(lockName, data);
106 public MusicLockState getLockState(String lockName) throws MusicLockingException {
110 data = zkLockHandle.getNodeData(lockName);
111 }catch (Exception ex){
112 logger.error(EELFLoggerDelegate.errorLogger, ex,AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
115 return MusicLockState.deSerialize(data);
117 logger.error(EELFLoggerDelegate.errorLogger,"Invalid lock or acquire failed",AppMessages.INVALIDLOCK, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
118 throw new MusicLockingException("Invalid lock or acquire failed");
122 public String createLockId(String lockName) {
123 String lockIdWithSlash = zkLockHandle.createLockId(lockName);
124 return lockIdWithSlash.replace('/', '$');
127 public boolean isMyTurn(String lockIdWithDollar) {
128 String lockId = lockIdWithDollar.replace('$', '/');
129 StringTokenizer st = new StringTokenizer(lockId);
130 String lockName = "/" + st.nextToken("/");
132 return zkLockHandle.lock(lockName, lockId);
133 } catch (KeeperException e) {
134 logger.error("Error", e);
135 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.LOCKINGERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
136 }catch( InterruptedException e) {
137 logger.error("Error", e);
138 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
139 }catch(Exception e) {
140 logger.error("Error", e);
141 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
146 public void unlockAndDeleteId(String lockIdWithDollar) throws KeeperException.NoNodeException {
147 String lockId = lockIdWithDollar.replace('$', '/');
148 zkLockHandle.unlock(lockId);
149 CachingUtil.deleteKeysFromDB("'"+lockId+"'");
152 public void deleteLock(String lockName) throws MusicLockingException {
153 if(lockIdExists(lockName))
154 zkLockHandle.deleteLock(lockName);
156 throw new MusicLockingException("Lock does not exist.Please check the lock: " + lockName + " and try again");
160 public String whoseTurnIsIt(String lockName) {
161 String lockHolder = zkLockHandle.currentLockHolder(lockName);
162 return lockHolder.replace('/', '$');
166 public void process(WatchedEvent event) { // Watcher interface
167 if (event.getState() == KeeperState.SyncConnected) {
168 connectedSignal.countDown();
173 public void close() {
174 zkLockHandle.close();
177 public boolean lockIdExists(String lockIdWithDollar) {
178 String lockId = lockIdWithDollar.replace('$', '/');
179 return zkLockHandle.checkIfLockExists(lockId);