2016-08-11 2 views
0

Я хочу поместить новое значение ключа для текущей строки в BaseRegionObserver.postBatchMutate, но я застрял в MVCC, и возникает тупик. Вот мой код:положить в сопроцессор postBatchMutate

@Override 
public void postBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c, 
          MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException { 
    for (int i = 0 ; i < miniBatchOp.size(); i ++) { 
     Put put = null; 
     Mutation op = miniBatchOp.getOperation(i); 
     if (! (op instanceof Put)) 
      continue; 

     put = (Put) miniBatchOp.getOperation(0); 

     if (put.has(Bytes.toBytes("m"), Bytes.toBytes("id"))) 
      return; 

     Put put1 = new Put(put.getRow()); 
     put1.addColumn(Bytes.toBytes("m"), Bytes.toBytes("id"), 
      Bytes.toBytes(String.valueOf(UUID.randomUUID()))); 

     c.getEnvironment().getRegion().put(put1); 

    } 
} 

Вы можете найти это повторение WARN сообщение на выходе:

WARN regionserver.MultiVersionConcurrencyControl: STUCK: MultiVersionConcurrencyControl {readPoint = 3, writePoint = 5}

ответ

0

ли вы ум, отправляющий свой код? Вы всегда можете захватить область из сопроцессора и вручную выполнить пометку. Мне непонятно, какова ваша семантика неудачи ... У обоих должно быть успешное или неудачное?

+0

Моя проблема была на postBatchMutate. Кажется, что у меня нет проблем с postPut. – Malemi