@@ -89,7 +89,7 @@ impl Gtid {
89
89
self . intervals . push ( interval) ;
90
90
return ;
91
91
}
92
- if let Some ( & first) = self . intervals . first ( ) {
92
+ if let Some ( first) = self . intervals . first_mut ( ) {
93
93
// if interval is strictly before intervals
94
94
if interval. 1 < first. 0 {
95
95
self . intervals . insert ( 0 , interval) ;
@@ -98,25 +98,19 @@ impl Gtid {
98
98
99
99
// if interval merge before interval
100
100
if interval. 1 == first. 0 {
101
- // unwrapping is ok as intervals is not empty
102
-
103
- let first = self . intervals . first_mut ( ) . unwrap ( ) ;
104
- * first = ( interval. 0 , first. 1 ) ;
101
+ first. 0 = interval. 0 ;
105
102
return ;
106
103
}
107
104
}
108
105
109
- if let Some ( & last) = self . intervals . last ( ) {
106
+ if let Some ( last) = self . intervals . last_mut ( ) {
110
107
if interval. 0 > last. 1 {
111
108
self . intervals . push ( interval) ;
112
109
return ;
113
110
}
114
111
115
112
if interval. 0 == last. 1 {
116
- // unwrapping is ok as intervals is not empty
117
-
118
- let last = self . intervals . last_mut ( ) . unwrap ( ) ;
119
- * last = ( last. 0 , interval. 1 ) ;
113
+ last. 1 = interval. 1 ;
120
114
return ;
121
115
}
122
116
}
@@ -126,17 +120,12 @@ impl Gtid {
126
120
. binary_search_by ( |elem| elem. 1 . cmp ( & interval. 0 ) )
127
121
{
128
122
Err ( idx) => {
129
- // error case so it won't merge with previous
130
- // it may merge before the item currently at idx
131
- if idx == self . intervals . len ( ) {
132
- // previously treated
133
- unreachable ! ( )
134
- }
135
- // we can unwrap as the case interval is after the last element is treated before
136
- let next = self . intervals . get ( idx) . unwrap ( ) ;
123
+ // there is always a next element, otherwise we fall
124
+ // into the previous if let some last case
125
+ let next = & mut self . intervals [ idx] ;
137
126
// interval merges with next
138
127
if next. 0 == interval. 1 {
139
- * self . intervals . get_mut ( idx ) . unwrap ( ) = ( interval. 0 , next . 1 ) ;
128
+ next . 0 = interval. 0 ;
140
129
} else {
141
130
// just add interval, nothing to merge
142
131
self . intervals . insert ( idx, interval) ;
@@ -151,27 +140,30 @@ impl Gtid {
151
140
152
141
// interval merges with before and after
153
142
if interval. 0 == before. 1 && interval. 1 == after. 0 {
154
- * self . intervals . get_mut ( idx) . unwrap ( ) = ( before. 0 , after. 1 ) ;
143
+ self . intervals [ idx] = ( before. 0 , after. 1 ) ;
155
144
self . intervals . remove ( idx + 1 ) ;
156
145
} else if
157
146
// interval merges with before
158
147
interval. 0 == before. 1 {
159
- * self . intervals . get_mut ( idx) . unwrap ( ) = ( before. 0 , interval. 1 ) ;
148
+ self . intervals [ idx] = ( before. 0 , interval. 1 ) ;
160
149
} else if
161
150
// interval merges with after
162
151
interval. 1 == after. 0 {
163
- unreachable ! ( "should have been treated in the error branch before" ) ;
164
- // *self.intervals.get_mut(idx + 1).unwrap() = (interval.0, after.1);
152
+ unreachable ! ( "should have been treated in the error branch before: interval merges with after" ) ;
165
153
} else {
166
154
// interval does not merge
167
- unreachable ! ( "should have been treated in the error branch before" ) ;
168
- // self.intervals.insert(idx + 1, interval)
155
+ unreachable ! ( "should have been treated in the error branch before: interval does not merge" ) ;
169
156
}
170
157
}
171
158
}
172
159
}
173
160
174
161
/// Add a raw interval into the gtid.
162
+ ///
163
+ /// ## Safety
164
+ ///
165
+ /// Gtids must not overlap, and be ordered.
166
+ /// see https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-concepts.html
175
167
fn add_interval ( & mut self , interval : & ( u64 , u64 ) ) -> Result < ( ) , GtidError > {
176
168
if interval. 0 == 0 || interval. 1 == 0 {
177
169
return Err ( GtidError :: ZeroInInterval ) ;
0 commit comments