blob: e1e3692acb1960d504de47409648053450ba6bee [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 HIGUCHI68b34942014-10-02 23:23:21 -070015import org.onlab.onos.store.ClockProviderService;
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070016import org.onlab.onos.store.ClockService;
Madan Jampani61056bc2014-09-27 09:07:26 -070017import org.onlab.onos.store.Timestamp;
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070018import org.onlab.onos.store.common.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 HIGUCHI68b34942014-10-02 23:23:21 -070026public class DeviceClockManager implements ClockService, ClockProviderService {
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);
47 if (term == null) {
48 throw new IllegalStateException("Requesting timestamp for a deviceId without mastership");
49 }
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070050 return new MastershipBasedTimestamp(term.termNumber(), ticker.incrementAndGet());
Madan Jampani61056bc2014-09-27 09:07:26 -070051 }
52
53 @Override
54 public void setMastershipTerm(DeviceId deviceId, MastershipTerm term) {
55 deviceMastershipTerms.put(deviceId, term);
56 }
57}