@@ -120,14 +120,15 @@ public void setup()
120
120
repairExecutors = new EnumMap <>(AutoRepairConfig .RepairType .class );
121
121
repairRunnableExecutors = new EnumMap <>(AutoRepairConfig .RepairType .class );
122
122
repairStates = new EnumMap <>(AutoRepairConfig .RepairType .class );
123
+ AutoRepairConfig config = DatabaseDescriptor .getAutoRepairConfig ();
124
+
123
125
for (AutoRepairConfig .RepairType repairType : AutoRepairConfig .RepairType .values ())
124
126
{
125
127
repairExecutors .put (repairType , executorFactory ().scheduled (false , "AutoRepair-Repair-" + repairType .getConfigName (), Thread .NORM_PRIORITY ));
126
128
repairRunnableExecutors .put (repairType , executorFactory ().scheduled (false , "AutoRepair-RepairRunnable-" + repairType .getConfigName (), Thread .NORM_PRIORITY ));
127
- repairStates .put (repairType , AutoRepairConfig .RepairType .getAutoRepairState (repairType ));
129
+ repairStates .put (repairType , AutoRepairConfig .RepairType .getAutoRepairState (repairType , config ));
128
130
}
129
131
130
- AutoRepairConfig config = DatabaseDescriptor .getAutoRepairConfig ();
131
132
AutoRepairUtils .setup ();
132
133
133
134
for (AutoRepairConfig .RepairType repairType : AutoRepairConfig .RepairType .values ())
@@ -223,23 +224,29 @@ public void repair(AutoRepairConfig.RepairType repairType)
223
224
}
224
225
225
226
// Separate out the keyspaces and tables to repair based on their priority, with each repair plan representing a uniquely occuring priority.
226
- List <PrioritizedRepairPlan > repairPlans = PrioritizedRepairPlan .build (keyspacesAndTablesToRepair , repairType , shuffleFunc );
227
+ List <PrioritizedRepairPlan > repairPlans = PrioritizedRepairPlan .build (keyspacesAndTablesToRepair , repairType , shuffleFunc , primaryRangeOnly );
228
+
229
+ repairState .updateRepairScheduleStatistics (repairPlans );
227
230
228
231
// calculate the repair assignments for each priority:keyspace.
229
232
Iterator <KeyspaceRepairAssignments > repairAssignmentsIterator = config .getTokenRangeSplitterInstance (repairType ).getRepairAssignments (primaryRangeOnly , repairPlans );
230
233
234
+ int keyspaceRepairAssignmentsAlreadyRepaired = 0 ;
231
235
while (repairAssignmentsIterator .hasNext ())
232
236
{
233
237
KeyspaceRepairAssignments repairAssignments = repairAssignmentsIterator .next ();
234
238
List <RepairAssignment > assignments = repairAssignments .getRepairAssignments ();
235
239
if (assignments .isEmpty ())
236
240
{
241
+ keyspaceRepairAssignmentsAlreadyRepaired ++;
237
242
logger .info ("Skipping repairs for priorityBucket={} for keyspace={} since it yielded no assignments" , repairAssignments .getPriority (), repairAssignments .getKeyspaceName ());
238
243
continue ;
239
244
}
240
245
241
246
logger .info ("Submitting repairs for priorityBucket={} for keyspace={} with assignmentCount={}" , repairAssignments .getPriority (), repairAssignments .getKeyspaceName (), repairAssignments .getRepairAssignments ().size ());
242
247
repairKeyspace (repairType , primaryRangeOnly , repairAssignments .getKeyspaceName (), repairAssignments .getRepairAssignments (), collectedRepairStats );
248
+ keyspaceRepairAssignmentsAlreadyRepaired ++;
249
+ repairState .setKeyspaceRepairPlansAlreadyRepaired (keyspaceRepairAssignmentsAlreadyRepaired );
243
250
}
244
251
245
252
cleanupAndUpdateStats (turn , repairType , repairState , myId , startTime , collectedRepairStats );
@@ -269,6 +276,7 @@ private void repairKeyspace(AutoRepairConfig.RepairType repairType, boolean prim
269
276
long tableStartTime = timeFunc .get ();
270
277
int totalProcessedAssignments = 0 ;
271
278
Set <Range <Token >> ranges = new HashSet <>();
279
+ long bytesAlreadyRepaired = 0 ;
272
280
for (RepairAssignment curRepairAssignment : repairAssignments )
273
281
{
274
282
try
@@ -372,7 +380,9 @@ else if (retryCount < config.getRepairMaxRetries(repairType))
372
380
}
373
381
ranges .clear ();
374
382
}
375
- logger .info ("Repair completed for {} tables {}, range {}" , keyspaceName , curRepairAssignment .getTableNames (), curRepairAssignment .getTokenRange ());
383
+ bytesAlreadyRepaired += curRepairAssignment .getEstimatedBytes ();
384
+ repairState .setBytesAlreadyRepaired (bytesAlreadyRepaired );
385
+ logger .info ("Repair completed for {} tables {}, range {}, bytesAlreadyRepaired {}" , keyspaceName , curRepairAssignment .getTableNames (), curRepairAssignment .getTokenRange (), bytesAlreadyRepaired );
376
386
}
377
387
catch (Exception e )
378
388
{
@@ -462,7 +472,6 @@ private void cleanupAndUpdateStats(RepairTurn turn, AutoRepairConfig.RepairType
462
472
repairState .setSucceededTokenRangesCount (collectedRepairStats .succeededTokenRanges );
463
473
repairState .setSkippedTokenRangesCount (collectedRepairStats .skippedTokenRanges );
464
474
repairState .setSkippedTablesCount (collectedRepairStats .skippedTables );
465
- repairState .setNodeRepairTimeInSec ((int ) TimeUnit .MILLISECONDS .toSeconds (timeFunc .get () - startTime ));
466
475
long timeInHours = TimeUnit .SECONDS .toHours (repairState .getNodeRepairTimeInSec ());
467
476
logger .info ("Local {} repair time {} hour(s), stats: repairKeyspaceCount {}, " +
468
477
"repairTokenRangesSuccessCount {}, repairTokenRangesFailureCount {}, " +
@@ -484,6 +493,7 @@ private void cleanupAndUpdateStats(RepairTurn turn, AutoRepairConfig.RepairType
484
493
logger .info ("Wait for {} for repair type {}." , SLEEP_IF_REPAIR_FINISHES_QUICKLY , repairType );
485
494
Thread .sleep (SLEEP_IF_REPAIR_FINISHES_QUICKLY .toMilliseconds ());
486
495
}
496
+ repairState .setNodeRepairTimeInSec ((int ) TimeUnit .MILLISECONDS .toSeconds (timeFunc .get () - startTime ));
487
497
repairState .setRepairInProgress (false );
488
498
AutoRepairUtils .updateFinishAutoRepairHistory (repairType , myId , timeFunc .get ());
489
499
}
0 commit comments