blob: 4dfc88b8f2b55f5702691be23e24959dc73acd01 [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;
13import org.onlab.onos.cluster.MastershipTerm;
14import org.onlab.onos.net.DeviceId;
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070015import org.onlab.onos.store.ClockService;
Madan Jampani61056bc2014-09-27 09:07:26 -070016import org.onlab.onos.store.Timestamp;
Madan Jampani61056bc2014-09-27 09:07:26 -070017import org.onlab.onos.store.impl.OnosTimestamp;
18import org.slf4j.Logger;
19
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070020/**
21 * Clock service to issue Timestamp based on Device Mastership.
22 */
Madan Jampani61056bc2014-09-27 09:07:26 -070023@Component(immediate = true)
24@Service
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070025public class DeviceClockManager implements ClockService {
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070026
Madan Jampani61056bc2014-09-27 09:07:26 -070027 private final Logger log = getLogger(getClass());
28
29 // TODO: Implement per device ticker that is reset to 0 at the beginning of a new term.
30 private final AtomicInteger ticker = new AtomicInteger(0);
31 private ConcurrentMap<DeviceId, MastershipTerm> deviceMastershipTerms = new ConcurrentHashMap<>();
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070032
Madan Jampani61056bc2014-09-27 09:07:26 -070033 @Activate
34 public void activate() {
35 log.info("Started");
36 }
37
38 @Deactivate
39 public void deactivate() {
40 log.info("Stopped");
41 }
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070042
Madan Jampani61056bc2014-09-27 09:07:26 -070043 @Override
44 public Timestamp getTimestamp(DeviceId deviceId) {
45 MastershipTerm term = deviceMastershipTerms.get(deviceId);
46 if (term == null) {
47 throw new IllegalStateException("Requesting timestamp for a deviceId without mastership");
48 }
49 return new OnosTimestamp(term.termNumber(), ticker.incrementAndGet());
50 }
51
52 @Override
53 public void setMastershipTerm(DeviceId deviceId, MastershipTerm term) {
54 deviceMastershipTerms.put(deviceId, term);
55 }
56}