/** * Generate a major compact task * * @param sstables * @return */ protected MergeTask generateMajorCompactTask(final List<SSTableFacade> sstables) { // In a major compact, all tables needs to be merged final List<SSTableFacade> bigCompacts = new ArrayList<SSTableFacade>(); bigCompacts.addAll(sstables); final MergeTask mergeTask = new MergeTask(); // One table can't be merged if (bigCompacts.size() > 1) { mergeTask.setMajorCompactTables(bigCompacts); } return mergeTask; }
/** * Invoked upon receiving a MERGE event from the MERGE layer. Starts the merge protocol. See * description of protocol in DESIGN. * * @param views A List of <em>different</em> views detected by the merge protocol */ public void merge(Map<Address, View> views) { if (isMergeInProgress()) { if (log.isTraceEnabled()) log.trace(gms.local_addr + ": merge is already running (merge_id=" + merge_id + ")"); return; } // we need the merge *coordinators* not merge participants because not everyone can lead a merge // ! Collection<Address> coords = Util.determineMergeCoords(views); Collection<Address> merge_participants = Util.determineMergeParticipants(views); Membership tmp = new Membership(coords); // establish a deterministic order, so that coords can elect leader tmp.sort(); Address merge_leader = tmp.elementAt(0); if (log.isDebugEnabled()) log.debug("determining merge leader from " + merge_participants); if (merge_leader.equals(gms.local_addr)) { if (log.isDebugEnabled()) log.debug( "I (" + gms.local_addr + ") will be the leader. Starting the merge task for " + merge_participants); merge_task.start(views); } else { if (log.isDebugEnabled()) log.debug( "I (" + gms.local_addr + ") am not the merge leader, " + "waiting for merge leader (" + merge_leader + ") to initiate merge"); } }
void cancelMerge(MergeId id) { if (setMergeId(id, null)) { merge_task.stop(); merge_rsps.reset(); gms.getViewHandler().resume(id); } }
void cancelMerge(MergeId id) { if (setMergeId(id, null)) { merge_task.stop(); stopMergeKiller(); merge_rsps.reset(); gms.getViewHandler().resume(); gms.getDownProtocol().down(new Event(Event.RESUME_STABLE)); } }
/** * Generate a minor compact task * * @param sstables * @return */ protected MergeTask generateMinorCompactTask(final List<SSTableFacade> sstables) { final List<SSTableFacade> smallCompacts = new ArrayList<SSTableFacade>(); for (final SSTableFacade facade : sstables) { if (facade.getSsTableMetadata().getTuples() < SMALL_TABLE_THRESHOLD) { smallCompacts.add(facade); if (smallCompacts.size() >= MAX_MERGE_TABLES_PER_JOB) { break; } } } // Create compact task final MergeTask mergeTask = new MergeTask(); // One table can't be merged if (smallCompacts.size() > 1) { mergeTask.setMinorCompactTables(smallCompacts); } return mergeTask; }
@Test public void testMergeTaskSerde() throws Exception { final List<DataSegment> segments = ImmutableList.<DataSegment>of( DataSegment.builder() .dataSource("foo") .interval(new Interval("2010-01-01/P1D")) .version("1234") .build()); final List<AggregatorFactory> aggregators = ImmutableList.<AggregatorFactory>of(new CountAggregatorFactory("cnt")); final MergeTask task = new MergeTask(null, "foo", segments, aggregators, indexSpec, null); final String json = jsonMapper.writeValueAsString(task); Thread.sleep(100); // Just want to run the clock a bit to make sure the task id doesn't change final MergeTask task2 = (MergeTask) jsonMapper.readValue(json, Task.class); Assert.assertEquals("foo", task.getDataSource()); Assert.assertEquals(new Interval("2010-01-01/P1D"), task.getInterval()); Assert.assertEquals(task.getId(), task2.getId()); Assert.assertEquals(task.getGroupId(), task2.getGroupId()); Assert.assertEquals(task.getDataSource(), task2.getDataSource()); Assert.assertEquals(task.getInterval(), task2.getInterval()); Assert.assertEquals(task.getSegments(), task2.getSegments()); Assert.assertEquals( task.getAggregators().get(0).getName(), task2.getAggregators().get(0).getName()); final MergeTask task3 = (MergeTask) jsonMapper.readValue( jsonMapper.writeValueAsString(new ClientMergeQuery("foo", segments, aggregators)), Task.class); Assert.assertEquals("foo", task3.getDataSource()); Assert.assertEquals(new Interval("2010-01-01/P1D"), task3.getInterval()); Assert.assertEquals(segments, task3.getSegments()); Assert.assertEquals(aggregators, task3.getAggregators()); }
void stop() { merge_task.stop(); }
boolean isMergeTaskRunning() { return merge_task.isRunning(); }