blob: 73ba735199408a5e42b566aa47b65bf35eb29faf [file] [log] [blame]
Madan Jampani61056bc2014-09-27 09:07:26 -07001package org.onlab.onos.store.device.impl;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.concurrent.ConcurrentHashMap;
6import java.util.concurrent.ConcurrentMap;
7import java.util.concurrent.atomic.AtomicInteger;
8
9import org.apache.felix.scr.annotations.Activate;
10import org.apache.felix.scr.annotations.Component;
11import org.apache.felix.scr.annotations.Deactivate;
12import org.apache.felix.scr.annotations.Service;
Yuta HIGUCHI80912e62014-10-12 00:15:47 -070013import org.onlab.onos.mastership.MastershipTerm;
Madan Jampani61056bc2014-09-27 09:07:26 -070014import org.onlab.onos.net.DeviceId;
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -070015import org.onlab.onos.net.device.DeviceClockProviderService;
16import org.onlab.onos.net.device.DeviceClockService;
Madan Jampani61056bc2014-09-27 09:07:26 -070017import org.onlab.onos.store.Timestamp;
Yuta HIGUCHI8ce08732014-10-11 10:40:45 -070018import org.onlab.onos.store.impl.MastershipBasedTimestamp;
Madan Jampani61056bc2014-09-27 09:07:26 -070019import org.slf4j.Logger;
20
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070021/**
22 * Clock service to issue Timestamp based on Device Mastership.
23 */
Madan Jampani61056bc2014-09-27 09:07:26 -070024@Component(immediate = true)
25@Service
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -070026public class DeviceClockManager implements DeviceClockService, DeviceClockProviderService {
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070027
Madan Jampani61056bc2014-09-27 09:07:26 -070028 private final Logger log = getLogger(getClass());
29
30 // TODO: Implement per device ticker that is reset to 0 at the beginning of a new term.
31 private final AtomicInteger ticker = new AtomicInteger(0);
32 private ConcurrentMap<DeviceId, MastershipTerm> deviceMastershipTerms = new ConcurrentHashMap<>();
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070033
Madan Jampani61056bc2014-09-27 09:07:26 -070034 @Activate
35 public void activate() {
36 log.info("Started");
37 }
38
39 @Deactivate
40 public void deactivate() {
41 log.info("Stopped");
42 }
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070043
Madan Jampani61056bc2014-09-27 09:07:26 -070044 @Override
45 public Timestamp getTimestamp(DeviceId deviceId) {
46 MastershipTerm term = deviceMastershipTerms.get(deviceId);
Ayaka Koshibeb5c63a02014-10-18 18:42:27 -070047 log.info("term info for {} is: {}", deviceId, term);
48
Madan Jampani61056bc2014-09-27 09:07:26 -070049 if (term == null) {
50 throw new IllegalStateException("Requesting timestamp for a deviceId without mastership");
51 }
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070052 return new MastershipBasedTimestamp(term.termNumber(), ticker.incrementAndGet());
Madan Jampani61056bc2014-09-27 09:07:26 -070053 }
54
55 @Override
56 public void setMastershipTerm(DeviceId deviceId, MastershipTerm term) {
Ayaka Koshibeb5c63a02014-10-18 18:42:27 -070057 log.info("adding term info {} {}", deviceId, term.master());
Madan Jampani61056bc2014-09-27 09:07:26 -070058 deviceMastershipTerms.put(deviceId, term);
59 }
60}