blob: 9721024a651e01aa7831981511a5f53cc40801c7 [file] [log] [blame]
Yuta HIGUCHI8ce08732014-10-11 10:40:45 -07001package org.onlab.onos.store.impl;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -07002
Yuta HIGUCHI497c8842014-09-25 14:23:34 -07003import static com.google.common.base.Preconditions.checkArgument;
4
5import java.util.Objects;
6
Yuta HIGUCHI497c8842014-09-25 14:23:34 -07007import org.onlab.onos.store.Timestamp;
8
9import com.google.common.base.MoreObjects;
10import com.google.common.collect.ComparisonChain;
11
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070012/**
Madan Jampanifd26ffb2014-10-13 14:08:55 -070013 * A logical timestamp that derives its value from two things:
14 * <ul>
15 * <li> The current mastership term of the device.</li>
16 * <li> The value of the counter used for tracking topology events observed from
17 * the device during that current time of a device. </li>
18 * </ul>
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070019 */
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070020public final class MastershipBasedTimestamp implements Timestamp {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070021
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070022 private final int termNumber;
23 private final int sequenceNumber;
24
25 /**
26 * Default version tuple.
27 *
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070028 * @param termNumber the mastership termNumber
29 * @param sequenceNumber the sequenceNumber number within the termNumber
30 */
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070031 public MastershipBasedTimestamp(int termNumber, int sequenceNumber) {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070032 this.termNumber = termNumber;
33 this.sequenceNumber = sequenceNumber;
34 }
35
36 @Override
37 public int compareTo(Timestamp o) {
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070038 checkArgument(o instanceof MastershipBasedTimestamp,
39 "Must be MastershipBasedTimestamp", o);
40 MastershipBasedTimestamp that = (MastershipBasedTimestamp) o;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070041
42 return ComparisonChain.start()
43 .compare(this.termNumber, that.termNumber)
44 .compare(this.sequenceNumber, that.sequenceNumber)
45 .result();
46 }
47
48 @Override
49 public int hashCode() {
Madan Jampani61056bc2014-09-27 09:07:26 -070050 return Objects.hash(termNumber, sequenceNumber);
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070051 }
52
53 @Override
54 public boolean equals(Object obj) {
55 if (this == obj) {
56 return true;
57 }
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070058 if (!(obj instanceof MastershipBasedTimestamp)) {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070059 return false;
60 }
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070061 MastershipBasedTimestamp that = (MastershipBasedTimestamp) obj;
Madan Jampani61056bc2014-09-27 09:07:26 -070062 return Objects.equals(this.termNumber, that.termNumber) &&
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070063 Objects.equals(this.sequenceNumber, that.sequenceNumber);
64 }
65
66 @Override
67 public String toString() {
68 return MoreObjects.toStringHelper(getClass())
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070069 .add("termNumber", termNumber)
70 .add("sequenceNumber", sequenceNumber)
71 .toString();
72 }
73
74 /**
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070075 * Returns the termNumber.
76 *
77 * @return termNumber
78 */
79 public int termNumber() {
80 return termNumber;
81 }
82
83 /**
84 * Returns the sequenceNumber number.
85 *
86 * @return sequenceNumber
87 */
88 public int sequenceNumber() {
89 return sequenceNumber;
90 }
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070091
92 // Default constructor for serialization
93 @Deprecated
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070094 protected MastershipBasedTimestamp() {
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070095 this.termNumber = -1;
96 this.sequenceNumber = -1;
97 }
Yuta HIGUCHI2e963892014-09-27 13:00:39 -070098}