Skip to content

Commit 7aef64e

Browse files
committed
Only compact buckets when we need to.
1 parent 61d0b54 commit 7aef64e

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

crates/core/src/operations.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
9898
let mut last_op: Option<i64> = None;
9999
let mut add_checksum: i32 = 0;
100100
let mut op_checksum: i32 = 0;
101+
let mut pending_compact: i32 = 0;
101102

102103
while iterate_statement.step()? == ResultCode::ROW {
103104
let op_id = iterate_statement.column_int64(0)?;
@@ -176,6 +177,12 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
176177
insert_statement.exec()?;
177178

178179
op_checksum = op_checksum.wrapping_add(checksum);
180+
181+
if opi == 4 {
182+
// We persisted a REMOVE statement, so the bucket needs
183+
// to be compacted at some point.
184+
pending_compact = 1;
185+
}
179186
} else if op == "MOVE" {
180187
add_checksum = add_checksum.wrapping_add(checksum);
181188
} else if op == "CLEAR" {
@@ -207,13 +214,15 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
207214
"UPDATE ps_buckets
208215
SET last_op = ?2,
209216
add_checksum = (add_checksum + ?3) & 0xffffffff,
210-
op_checksum = (op_checksum + ?4) & 0xffffffff
217+
op_checksum = (op_checksum + ?4) & 0xffffffff,
218+
pending_compact = (pending_compact OR ?5)
211219
WHERE name = ?1",
212220
)?;
213221
statement.bind_text(1, bucket, sqlite::Destructor::STATIC)?;
214222
statement.bind_int64(2, *last_op)?;
215223
statement.bind_int(3, add_checksum)?;
216224
statement.bind_int(4, op_checksum)?;
225+
statement.bind_int(5, pending_compact)?;
217226

218227
statement.exec()?;
219228
}
@@ -235,7 +244,7 @@ SELECT
235244
AND (oplog.superseded = 1 OR oplog.op != 3)
236245
) as checksum
237246
FROM ps_buckets
238-
WHERE ps_buckets.pending_delete = 0",
247+
WHERE ps_buckets.pending_delete = 0 AND ps_buckets.pending_compact = 1",
239248
)?;
240249

241250
// language=SQLite
@@ -264,7 +273,6 @@ WHERE ps_buckets.pending_delete = 0",
264273

265274
update_statement.bind_text(1, name, sqlite::Destructor::STATIC)?;
266275
update_statement.bind_int(2, checksum)?;
267-
268276
update_statement.exec()?;
269277

270278
// Must use the same values as above

crates/core/src/view_admin.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,19 @@ INSERT INTO ps_migration(id, down_migrations) VALUES(3, json_array(json_object('
252252
// language=SQLite
253253
local_db.exec_safe("\
254254
ALTER TABLE ps_buckets ADD COLUMN op_checksum INTEGER NOT NULL DEFAULT 0;
255+
ALTER TABLE ps_buckets ADD COLUMN pending_compact INTEGER NOT NULL DEFAULT 0;
255256
256257
UPDATE ps_buckets SET op_checksum = (
257258
SELECT IFNULL(SUM(ps_oplog.hash), 0) & 0xffffffff FROM ps_oplog WHERE ps_oplog.bucket = ps_buckets.name
258259
);
259260
260-
INSERT INTO ps_migration(id, down_migrations) VALUES(4, json_array(json_object('sql', 'DELETE FROM ps_migration WHERE id >= 4'), json_object('sql', 'ALTER TABLE ps_buckets DROP COLUMN op_checksum')));
261+
INSERT INTO ps_migration(id, down_migrations)
262+
VALUES(4,
263+
json_array(
264+
json_object('sql', 'DELETE FROM ps_migration WHERE id >= 4'),
265+
json_object('sql', 'ALTER TABLE ps_buckets DROP COLUMN op_checksum'),
266+
json_object('sql', 'ALTER TABLE ps_buckets DROP COLUMN pending_compact')
267+
));
261268
").into_db_result(local_db)?;
262269
}
263270

0 commit comments

Comments
 (0)