/**
   * 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;
  }
예제 #2
0
  /**
   * 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");
    }
  }
예제 #3
0
 void cancelMerge(MergeId id) {
   if (setMergeId(id, null)) {
     merge_task.stop();
     merge_rsps.reset();
     gms.getViewHandler().resume(id);
   }
 }
예제 #4
0
파일: Merger.java 프로젝트: wburns/JGroups
 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;
  }
예제 #6
0
  @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());
  }
예제 #7
0
 void stop() {
   merge_task.stop();
 }
예제 #8
0
파일: Merger.java 프로젝트: wburns/JGroups
 boolean isMergeTaskRunning() {
   return merge_task.isRunning();
 }