@@ -20,48 +20,11 @@ use itertools::Itertools;
20
20
use crate :: {
21
21
catalog, deployment,
22
22
relational:: { Table , VID_COLUMN } ,
23
- vid_batcher:: AdaptiveBatchSize ,
23
+ vid_batcher:: { AdaptiveBatchSize , VidRange } ,
24
24
} ;
25
25
26
26
use super :: { Catalog , Layout , Namespace } ;
27
27
28
- // Additions to `Table` that are useful for pruning
29
- impl Table {
30
- /// Return the first and last vid of any entity that is visible in the
31
- /// block range from `first_block` (inclusive) to `last_block`
32
- /// (exclusive)
33
- fn vid_range (
34
- & self ,
35
- conn : & mut PgConnection ,
36
- first_block : BlockNumber ,
37
- last_block : BlockNumber ,
38
- ) -> Result < ( i64 , i64 ) , StoreError > {
39
- #[ derive( QueryableByName ) ]
40
- struct VidRange {
41
- #[ diesel( sql_type = BigInt ) ]
42
- min_vid : i64 ,
43
- #[ diesel( sql_type = BigInt ) ]
44
- max_vid : i64 ,
45
- }
46
-
47
- // Determine the last vid that we need to copy
48
- let VidRange { min_vid, max_vid } = sql_query ( format ! (
49
- "/* controller=prune,first={first_block},last={last_block} */ \
50
- select coalesce(min(vid), 0) as min_vid, \
51
- coalesce(max(vid), -1) as max_vid from {src} \
52
- where lower(block_range) <= $2 \
53
- and coalesce(upper(block_range), 2147483647) > $1 \
54
- and coalesce(upper(block_range), 2147483647) <= $2 \
55
- and block_range && int4range($1, $2)",
56
- src = self . qualified_name,
57
- ) )
58
- . bind :: < Integer , _ > ( first_block)
59
- . bind :: < Integer , _ > ( last_block)
60
- . get_result :: < VidRange > ( conn) ?;
61
- Ok ( ( min_vid, max_vid) )
62
- }
63
- }
64
-
65
28
/// Utility to copy relevant data out of a source table and into a new
66
29
/// destination table and replace the source table with the destination
67
30
/// table
@@ -122,12 +85,12 @@ impl TablePair {
122
85
let column_list = self . column_list ( ) ;
123
86
124
87
// Determine the last vid that we need to copy
125
- let ( min_vid , max_vid ) = self . src . vid_range ( conn , earliest_block, final_block) ?;
88
+ let range = VidRange :: for_prune ( conn , & self . src , earliest_block, final_block) ?;
126
89
127
90
let mut batch_size = AdaptiveBatchSize :: new ( & self . src ) ;
128
91
// The first vid we still need to copy
129
- let mut next_vid = min_vid ;
130
- while next_vid <= max_vid {
92
+ let mut next_vid = range . min ;
93
+ while next_vid <= range . max {
131
94
let start = Instant :: now ( ) ;
132
95
let rows = conn. transaction ( |conn| {
133
96
// Page through all rows in `src` in batches of `batch_size`
@@ -167,7 +130,7 @@ impl TablePair {
167
130
self . src . name . as_str ( ) ,
168
131
rows,
169
132
PrunePhase :: CopyFinal ,
170
- next_vid > max_vid ,
133
+ next_vid > range . max ,
171
134
) ;
172
135
}
173
136
Ok ( ( ) )
@@ -185,14 +148,12 @@ impl TablePair {
185
148
let column_list = self . column_list ( ) ;
186
149
187
150
// Determine the last vid that we need to copy
188
- let ( min_vid, max_vid) = self
189
- . src
190
- . vid_range ( conn, final_block + 1 , BLOCK_NUMBER_MAX ) ?;
151
+ let range = VidRange :: for_prune ( conn, & self . src , final_block + 1 , BLOCK_NUMBER_MAX ) ?;
191
152
192
153
let mut batch_size = AdaptiveBatchSize :: new ( & self . src ) ;
193
154
// The first vid we still need to copy
194
- let mut next_vid = min_vid ;
195
- while next_vid <= max_vid {
155
+ let mut next_vid = range . min ;
156
+ while next_vid <= range . max {
196
157
let start = Instant :: now ( ) ;
197
158
let rows = conn. transaction ( |conn| {
198
159
// Page through all the rows in `src` in batches of
@@ -227,7 +188,7 @@ impl TablePair {
227
188
self . src . name . as_str ( ) ,
228
189
rows,
229
190
PrunePhase :: CopyNonfinal ,
230
- next_vid > max_vid ,
191
+ next_vid > range . max ,
231
192
) ;
232
193
}
233
194
Ok ( ( ) )
@@ -459,10 +420,10 @@ impl Layout {
459
420
PruningStrategy :: Delete => {
460
421
// Delete all entity versions whose range was closed
461
422
// before `req.earliest_block`
462
- let ( min_vid , max_vid ) = table . vid_range ( conn, 0 , req. earliest_block ) ?;
423
+ let range = VidRange :: for_prune ( conn, & table , 0 , req. earliest_block ) ?;
463
424
let mut batch_size = AdaptiveBatchSize :: new ( & table) ;
464
- let mut next_vid = min_vid ;
465
- while next_vid <= max_vid {
425
+ let mut next_vid = range . min ;
426
+ while next_vid <= range . max {
466
427
let start = Instant :: now ( ) ;
467
428
let rows = sql_query ( format ! (
468
429
"/* controller=prune,phase=delete,start_vid={next_vid},batch_size={batch_size} */ \
@@ -485,7 +446,7 @@ impl Layout {
485
446
table. name . as_str ( ) ,
486
447
rows as usize ,
487
448
PrunePhase :: Delete ,
488
- next_vid > max_vid ,
449
+ next_vid > range . max ,
489
450
) ;
490
451
}
491
452
}
0 commit comments