2 * ============LICENSE_START========================================== org.onap.music
3 * =================================================================== Copyright (c) 2017 AT&T
4 * Intellectual Property ===================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
6 * in compliance with the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software distributed under the License
11 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12 * or implied. See the License for the specific language governing permissions and limitations under
15 * ============LICENSE_END=============================================
16 * ====================================================================
19 package org.onap.music.lockingservice;
22 import java.io.IOException;
23 import java.util.StringTokenizer;
24 import java.util.concurrent.CountDownLatch;
26 import org.apache.zookeeper.KeeperException;
27 import org.apache.zookeeper.WatchedEvent;
28 import org.apache.zookeeper.Watcher;
29 import org.apache.zookeeper.Watcher.Event.KeeperState;
30 import org.apache.zookeeper.ZooKeeper;
31 import org.onap.music.eelf.logging.EELFLoggerDelegate;
32 import org.onap.music.eelf.logging.format.AppMessages;
33 import org.onap.music.eelf.logging.format.ErrorSeverity;
34 import org.onap.music.eelf.logging.format.ErrorTypes;
35 import org.onap.music.exceptions.MusicLockingException;
36 import org.onap.music.exceptions.MusicServiceException;
37 import org.onap.music.main.MusicUtil;
38 import java.util.concurrent.TimeUnit;
41 public class MusicLockingService implements Watcher {
44 private static final int SESSION_TIMEOUT = 180000;
45 ZkStatelessLockService zkLockHandle = null;
46 private CountDownLatch connectedSignal = new CountDownLatch(1);
47 private static EELFLoggerDelegate logger =
48 EELFLoggerDelegate.getLogger(MusicLockingService.class);
50 public MusicLockingService() throws MusicServiceException {
52 ZooKeeper zk = new ZooKeeper(MusicUtil.getMyZkHost(), SESSION_TIMEOUT, this);
53 connectedSignal.await();
54 zkLockHandle = new ZkStatelessLockService(zk);
55 } catch (IOException e) {
56 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
57 throw new MusicServiceException("IO Error has occured" + e.getMessage());
58 } catch (InterruptedException e) {
59 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
60 throw new MusicServiceException("Exception Occured " + e.getMessage());
64 public MusicLockingService(int timeout) throws MusicServiceException {
65 CountDownLatch connectedSignal1 = new CountDownLatch(1);
67 ZooKeeper zk1 = new ZooKeeper(MusicUtil.getMyZkHost(), SESSION_TIMEOUT, this);
68 connectedSignal1.await(timeout, TimeUnit.SECONDS);
69 if(!zk1.getState().isConnected()) {
70 throw new MusicServiceException("Unable to Connect. Some nodes are down.");
72 } catch (IOException e ) {
73 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
74 throw new MusicServiceException("IO Error has occured" + e.getMessage());
75 } catch (InterruptedException e) {
76 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
77 throw new MusicServiceException("Exception Occured " + e.getMessage());
81 public ZkStatelessLockService getzkLockHandle() {
85 public MusicLockingService(String lockServer) {
87 ZooKeeper zk = new ZooKeeper(lockServer, SESSION_TIMEOUT, this);
88 connectedSignal.await();
89 zkLockHandle = new ZkStatelessLockService(zk);
90 } catch (IOException e) {
91 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
92 }catch( InterruptedException e) {
93 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
95 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
99 public void createLockaIfItDoesNotExist(String lockName) {
100 if (!zkLockHandle.checkIfLockExists(lockName)) {
101 String lockHolder = null;
102 MusicLockState ml = new MusicLockState(MusicLockState.LockStatus.UNLOCKED, lockHolder);
103 byte[] data = ml.serialize();
104 zkLockHandle.createLock(lockName, data);
108 public void setLockState(String lockName, MusicLockState mls) {
109 byte[] data = mls.serialize();
110 zkLockHandle.setNodeData(lockName, data);
113 public MusicLockState getLockState(String lockName) throws MusicLockingException {
117 data = zkLockHandle.getNodeData(lockName);
118 }catch (Exception ex){
119 logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
122 return MusicLockState.deSerialize(data);
124 logger.error(EELFLoggerDelegate.errorLogger,"",AppMessages.INVALIDLOCK, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
125 throw new MusicLockingException("Invalid lock or acquire failed");
129 public String createLockId(String lockName) {
130 String lockIdWithSlash = zkLockHandle.createLockId(lockName);
131 return lockIdWithSlash.replace('/', '$');
134 public boolean isMyTurn(String lockIdWithDollar) {
135 String lockId = lockIdWithDollar.replace('$', '/');
136 StringTokenizer st = new StringTokenizer(lockId);
137 String lockName = "/" + st.nextToken("/");
139 return zkLockHandle.lock(lockName, lockId);
140 } catch (KeeperException e) {
141 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.LOCKINGERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
142 }catch( InterruptedException e) {
143 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
144 }catch(Exception e) {
145 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
150 public void unlockAndDeleteId(String lockIdWithDollar) throws KeeperException.NoNodeException {
151 String lockId = lockIdWithDollar.replace('$', '/');
152 zkLockHandle.unlock(lockId);
155 public void deleteLock(String lockName) throws MusicLockingException {
156 if(lockIdExists(lockName))
157 zkLockHandle.deleteLock(lockName);
159 throw new MusicLockingException("Lock does not exist.Please check the lock: " + lockName + " and try again");
163 public String whoseTurnIsIt(String lockName) {
164 String lockHolder = zkLockHandle.currentLockHolder(lockName);
165 return lockHolder.replace('/', '$');
169 public void process(WatchedEvent event) { // Watcher interface
170 if (event.getState() == KeeperState.SyncConnected) {
171 connectedSignal.countDown();
176 public void close() {
177 zkLockHandle.close();
180 public boolean lockIdExists(String lockIdWithDollar) {
181 String lockId = lockIdWithDollar.replace('$', '/');
182 return zkLockHandle.checkIfLockExists(lockId);