@@ -45,14 +45,29 @@ final class Checkpoint {
45
45
final long maxSeqNo ;
46
46
final long globalCheckpoint ;
47
47
final long minTranslogGeneration ;
48
+ final long trimmedAboveSeqNo ;
48
49
49
50
private static final int INITIAL_VERSION = 1 ; // start with 1, just to recognize there was some magic serialization logic before
50
- private static final int CURRENT_VERSION = 2 ; // introduction of global checkpoints
51
+ private static final int VERSION_6_0_0 = 2 ; // introduction of global checkpoints
52
+ private static final int CURRENT_VERSION = 3 ; // introduction of global checkpoints
51
53
52
54
private static final String CHECKPOINT_CODEC = "ckp" ;
53
55
54
- // size of 6.0.0 checkpoint
56
+ // size of 6.4.0 checkpoint
57
+
55
58
static final int FILE_SIZE = CodecUtil .headerLength (CHECKPOINT_CODEC )
59
+ + Integer .BYTES // ops
60
+ + Long .BYTES // offset
61
+ + Long .BYTES // generation
62
+ + Long .BYTES // minimum sequence number, introduced in 6.0.0
63
+ + Long .BYTES // maximum sequence number, introduced in 6.0.0
64
+ + Long .BYTES // global checkpoint, introduced in 6.0.0
65
+ + Long .BYTES // minimum translog generation in the translog - introduced in 6.0.0
66
+ + Long .BYTES // maximum reachable (trimmed) sequence number, introduced in 6.4.0
67
+ + CodecUtil .footerLength ();
68
+
69
+ // size of 6.0.0 checkpoint
70
+ static final int V2_FILE_SIZE = CodecUtil .headerLength (CHECKPOINT_CODEC )
56
71
+ Integer .BYTES // ops
57
72
+ Long .BYTES // offset
58
73
+ Long .BYTES // generation
@@ -79,9 +94,12 @@ final class Checkpoint {
79
94
* @param maxSeqNo the current maximum sequence number of all operations in the translog
80
95
* @param globalCheckpoint the last-known global checkpoint
81
96
* @param minTranslogGeneration the minimum generation referenced by the translog at this moment.
97
+ * @param trimmedAboveSeqNo the current maximum reachable (trimmed) sequence number of all operations in the translog
82
98
*/
83
- Checkpoint (long offset , int numOps , long generation , long minSeqNo , long maxSeqNo , long globalCheckpoint , long minTranslogGeneration ) {
99
+ Checkpoint (long offset , int numOps , long generation , long minSeqNo , long maxSeqNo , long globalCheckpoint ,
100
+ long minTranslogGeneration , long trimmedAboveSeqNo ) {
84
101
assert minSeqNo <= maxSeqNo : "minSeqNo [" + minSeqNo + "] is higher than maxSeqNo [" + maxSeqNo + "]" ;
102
+ assert trimmedAboveSeqNo <= maxSeqNo : "trimmedAboveSeqNo [" + trimmedAboveSeqNo + "] is higher than maxSeqNo [" + maxSeqNo + "]" ;
85
103
assert minTranslogGeneration <= generation :
86
104
"minTranslogGen [" + minTranslogGeneration + "] is higher than generation [" + generation + "]" ;
87
105
this .offset = offset ;
@@ -91,6 +109,7 @@ final class Checkpoint {
91
109
this .maxSeqNo = maxSeqNo ;
92
110
this .globalCheckpoint = globalCheckpoint ;
93
111
this .minTranslogGeneration = minTranslogGeneration ;
112
+ this .trimmedAboveSeqNo = trimmedAboveSeqNo ;
94
113
}
95
114
96
115
private void write (DataOutput out ) throws IOException {
@@ -101,26 +120,49 @@ private void write(DataOutput out) throws IOException {
101
120
out .writeLong (maxSeqNo );
102
121
out .writeLong (globalCheckpoint );
103
122
out .writeLong (minTranslogGeneration );
123
+ out .writeLong (trimmedAboveSeqNo );
104
124
}
105
125
106
126
static Checkpoint emptyTranslogCheckpoint (final long offset , final long generation , final long globalCheckpoint ,
107
127
long minTranslogGeneration ) {
108
128
final long minSeqNo = SequenceNumbers .NO_OPS_PERFORMED ;
109
129
final long maxSeqNo = SequenceNumbers .NO_OPS_PERFORMED ;
110
- return new Checkpoint (offset , 0 , generation , minSeqNo , maxSeqNo , globalCheckpoint , minTranslogGeneration );
130
+ return new Checkpoint (offset , 0 , generation , minSeqNo , maxSeqNo , globalCheckpoint , minTranslogGeneration , maxSeqNo );
131
+ }
132
+
133
+ static Checkpoint readCheckpointV6_4_0 (final DataInput in ) throws IOException {
134
+ final long offset = in .readLong ();
135
+ final int numOps = in .readInt ();
136
+ final long generation = in .readLong ();
137
+ final long minSeqNo = in .readLong ();
138
+ final long maxSeqNo = in .readLong ();
139
+ final long globalCheckpoint = in .readLong ();
140
+ final long minTranslogGeneration = in .readLong ();
141
+ final long trimmedAboveSeqNo = in .readLong ();
142
+ return new Checkpoint (offset , numOps , generation , minSeqNo , maxSeqNo , globalCheckpoint , minTranslogGeneration , trimmedAboveSeqNo );
111
143
}
112
144
113
145
static Checkpoint readCheckpointV6_0_0 (final DataInput in ) throws IOException {
114
- return new Checkpoint (in .readLong (), in .readInt (), in .readLong (), in .readLong (), in .readLong (), in .readLong (), in .readLong ());
146
+ final long offset = in .readLong ();
147
+ final int numOps = in .readInt ();
148
+ final long generation = in .readLong ();
149
+ final long minSeqNo = in .readLong ();
150
+ final long maxSeqNo = in .readLong ();
151
+ final long globalCheckpoint = in .readLong ();
152
+ final long minTranslogGeneration = in .readLong ();
153
+ return new Checkpoint (offset , numOps , generation , minSeqNo , maxSeqNo , globalCheckpoint , minTranslogGeneration , maxSeqNo );
115
154
}
116
155
117
156
// reads a checksummed checkpoint introduced in ES 5.0.0
118
157
static Checkpoint readCheckpointV5_0_0 (final DataInput in ) throws IOException {
158
+ final long offset = in .readLong ();
159
+ final int numOps = in .readInt ();
160
+ final long generation = in .readLong ();
119
161
final long minSeqNo = SequenceNumbers .NO_OPS_PERFORMED ;
120
162
final long maxSeqNo = SequenceNumbers .NO_OPS_PERFORMED ;
121
163
final long globalCheckpoint = SequenceNumbers .UNASSIGNED_SEQ_NO ;
122
- final long minTranslogGeneration = - 1L ;
123
- return new Checkpoint (in . readLong (), in . readInt (), in . readLong () , minSeqNo , maxSeqNo , globalCheckpoint , minTranslogGeneration );
164
+ final long minTranslogGeneration = SequenceNumbers . UNASSIGNED_SEQ_NO ;
165
+ return new Checkpoint (offset , numOps , generation , minSeqNo , maxSeqNo , globalCheckpoint , minTranslogGeneration , maxSeqNo );
124
166
}
125
167
126
168
@ Override
@@ -133,6 +175,7 @@ public String toString() {
133
175
", maxSeqNo=" + maxSeqNo +
134
176
", globalCheckpoint=" + globalCheckpoint +
135
177
", minTranslogGeneration=" + minTranslogGeneration +
178
+ ", trimmedAboveSeqNo=" + trimmedAboveSeqNo +
136
179
'}' ;
137
180
}
138
181
@@ -145,10 +188,13 @@ public static Checkpoint read(Path path) throws IOException {
145
188
if (fileVersion == INITIAL_VERSION ) {
146
189
assert indexInput .length () == V1_FILE_SIZE : indexInput .length ();
147
190
return Checkpoint .readCheckpointV5_0_0 (indexInput );
191
+ } else if (fileVersion == VERSION_6_0_0 ) {
192
+ assert indexInput .length () == V2_FILE_SIZE : indexInput .length ();
193
+ return Checkpoint .readCheckpointV6_0_0 (indexInput );
148
194
} else {
149
195
assert fileVersion == CURRENT_VERSION : fileVersion ;
150
196
assert indexInput .length () == FILE_SIZE : indexInput .length ();
151
- return Checkpoint .readCheckpointV6_0_0 (indexInput );
197
+ return Checkpoint .readCheckpointV6_4_0 (indexInput );
152
198
}
153
199
}
154
200
}
@@ -164,7 +210,7 @@ public synchronized byte[] toByteArray() {
164
210
};
165
211
final String resourceDesc = "checkpoint(path=\" " + checkpointFile + "\" , gen=" + checkpoint + ")" ;
166
212
try (OutputStreamIndexOutput indexOutput =
167
- new OutputStreamIndexOutput (resourceDesc , checkpointFile .toString (), byteOutputStream , FILE_SIZE )) {
213
+ new OutputStreamIndexOutput (resourceDesc , checkpointFile .toString (), byteOutputStream , V2_FILE_SIZE )) {
168
214
CodecUtil .writeHeader (indexOutput , CHECKPOINT_CODEC , CURRENT_VERSION );
169
215
checkpoint .write (indexOutput );
170
216
CodecUtil .writeFooter (indexOutput );
@@ -196,7 +242,8 @@ public boolean equals(Object o) {
196
242
if (generation != that .generation ) return false ;
197
243
if (minSeqNo != that .minSeqNo ) return false ;
198
244
if (maxSeqNo != that .maxSeqNo ) return false ;
199
- return globalCheckpoint == that .globalCheckpoint ;
245
+ if (globalCheckpoint != that .globalCheckpoint ) return false ;
246
+ return trimmedAboveSeqNo == that .trimmedAboveSeqNo ;
200
247
}
201
248
202
249
@ Override
@@ -207,6 +254,7 @@ public int hashCode() {
207
254
result = 31 * result + Long .hashCode (minSeqNo );
208
255
result = 31 * result + Long .hashCode (maxSeqNo );
209
256
result = 31 * result + Long .hashCode (globalCheckpoint );
257
+ result = 31 * result + Long .hashCode (trimmedAboveSeqNo );
210
258
return result ;
211
259
}
212
260
0 commit comments