@@ -98,7 +98,7 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
98
98
let mut last_op: Option < i64 > = None ;
99
99
let mut add_checksum: i32 = 0 ;
100
100
let mut op_checksum: i32 = 0 ;
101
- let mut pending_compact : i32 = 0 ;
101
+ let mut remove_operations : i32 = 0 ;
102
102
103
103
while iterate_statement. step ( ) ? == ResultCode :: ROW {
104
104
let op_id = iterate_statement. column_int64 ( 0 ) ?;
@@ -181,7 +181,7 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
181
181
if opi == 4 {
182
182
// We persisted a REMOVE statement, so the bucket needs
183
183
// to be compacted at some point.
184
- pending_compact = 1 ;
184
+ remove_operations + = 1 ;
185
185
}
186
186
} else if op == "MOVE" {
187
187
add_checksum = add_checksum. wrapping_add ( checksum) ;
@@ -215,14 +215,14 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
215
215
SET last_op = ?2,
216
216
add_checksum = (add_checksum + ?3) & 0xffffffff,
217
217
op_checksum = (op_checksum + ?4) & 0xffffffff,
218
- pending_compact = (pending_compact OR ?5)
218
+ remove_operations = (remove_operations + ?5)
219
219
WHERE name = ?1" ,
220
220
) ?;
221
221
statement. bind_text ( 1 , bucket, sqlite:: Destructor :: STATIC ) ?;
222
222
statement. bind_int64 ( 2 , * last_op) ?;
223
223
statement. bind_int ( 3 , add_checksum) ?;
224
224
statement. bind_int ( 4 , op_checksum) ?;
225
- statement. bind_int ( 5 , pending_compact ) ?;
225
+ statement. bind_int ( 5 , remove_operations ) ?;
226
226
227
227
statement. exec ( ) ?;
228
228
}
@@ -244,15 +244,22 @@ SELECT
244
244
AND (oplog.superseded = 1 OR oplog.op != 3)
245
245
) as checksum
246
246
FROM ps_buckets
247
- WHERE ps_buckets.pending_delete = 0 AND ps_buckets.pending_compact = 1" ,
247
+ WHERE ps_buckets.pending_delete = 0 AND
248
+ ps_buckets.remove_operations >= CASE
249
+ WHEN ?1 = '' THEN 1
250
+ ELSE IFNULL(?1 ->> 'threshold', 1)
251
+ END" ,
248
252
) ?;
253
+ // Compact bucket if there are 50 or more operations
254
+ statement. bind_text ( 1 , _data, sqlite:: Destructor :: STATIC ) ;
249
255
250
256
// language=SQLite
251
257
let update_statement = db. prepare_v2 (
252
258
"
253
259
UPDATE ps_buckets
254
260
SET add_checksum = (add_checksum + ?2) & 0xffffffff,
255
- op_checksum = (op_checksum - ?2) & 0xffffffff
261
+ op_checksum = (op_checksum - ?2) & 0xffffffff,
262
+ remove_operations = 0
256
263
WHERE ps_buckets.name = ?1" ,
257
264
) ?;
258
265
0 commit comments