use of com.alibaba.otter.shared.common.model.config.channel.ChannelStatus in project otter by alibaba.
the class TransformMemoryArbitrateEvent method await.
public EtlEventData await(Long pipelineId) throws InterruptedException {
Assert.notNull(pipelineId);
PermitMonitor permitMonitor = ArbitrateFactory.getInstance(pipelineId, PermitMonitor.class);
// 阻塞等待授权
permitMonitor.waitForPermit();
MemoryStageController stageController = ArbitrateFactory.getInstance(pipelineId, MemoryStageController.class);
// 符合条件的processId
Long processId = stageController.waitForProcess(StageType.TRANSFORM);
ChannelStatus status = permitMonitor.getChannelPermit();
if (status.isStart()) {
// 即时查询一下当前的状态,状态随时可能会变
return stageController.getLastData(processId);
} else {
logger.warn("pipelineId[{}] transform ignore processId[{}] by status[{}]", new Object[] { pipelineId, processId, status });
// 递归调用
return await(pipelineId);
}
}
use of com.alibaba.otter.shared.common.model.config.channel.ChannelStatus in project otter by alibaba.
the class PermitMonitor method initChannelStatus.
private void initChannelStatus(byte[] bytes) {
ChannelStatus newChannelStatus = JsonUtils.unmarshalFromByte(bytes, ChannelStatus.class);
if (logger.isDebugEnabled()) {
logger.debug("pipeline[{}] newChannelStatus is [{}]", getPipelineId(), newChannelStatus);
}
synchronized (this) {
// 发生变化,才触发权限检查
if (!newChannelStatus.equals(channelStatus)) {
channelStatus = newChannelStatus;
permitSem();
}
}
}
use of com.alibaba.otter.shared.common.model.config.channel.ChannelStatus in project otter by alibaba.
the class LoadRpcArbitrateEvent method await.
public EtlEventData await(Long pipelineId) throws InterruptedException {
Assert.notNull(pipelineId);
PermitMonitor permitMonitor = ArbitrateFactory.getInstance(pipelineId, PermitMonitor.class);
// 阻塞等待授权
permitMonitor.waitForPermit();
RpcStageController stageController = ArbitrateFactory.getInstance(pipelineId, RpcStageController.class);
// 符合条件的processId
Long processId = stageController.waitForProcess(StageType.LOAD);
ChannelStatus status = permitMonitor.getChannelPermit();
if (status.isStart()) {
// 即时查询一下当前的状态,状态随时可能会变
return stageController.getLastData(processId);
} else {
// 需要进一步check,避免丢失load信号
status = permitMonitor.getChannelPermit(true);
if (status.isStart()) {
return stageController.getLastData(processId);
} else if (status.isPause()) {
String path = StagePathUtils.getProcess(pipelineId, processId);
if (zookeeper.exists(path)) {
// 如果存在process,那说明没有被rollback掉(可能刚好在做rollback),这种运行进行load处理
return stageController.getLastData(processId);
}
}
logger.warn("pipelineId[{}] load ignore processId[{}] by status[{}]", new Object[] { pipelineId, processId, status });
// 递归调用
return await(pipelineId);
}
}
use of com.alibaba.otter.shared.common.model.config.channel.ChannelStatus in project otter by alibaba.
the class SelectMemoryArbitrateEvent method await.
public EtlEventData await(Long pipelineId) throws InterruptedException {
Assert.notNull(pipelineId);
PermitMonitor permitMonitor = ArbitrateFactory.getInstance(pipelineId, PermitMonitor.class);
// 阻塞等待授权
permitMonitor.waitForPermit();
MemoryStageController stageController = ArbitrateFactory.getInstance(pipelineId, MemoryStageController.class);
// 符合条件的processId
Long processId = stageController.waitForProcess(StageType.SELECT);
ChannelStatus status = permitMonitor.getChannelPermit();
if (status.isStart()) {
// 即时查询一下当前的状态,状态随时可能会变
EtlEventData eventData = new EtlEventData();
eventData.setPipelineId(pipelineId);
eventData.setProcessId(processId);
// 返回当前时间
eventData.setStartTime(new Date().getTime());
Long nid = ArbitrateConfigUtils.getCurrentNid();
eventData.setCurrNid(nid);
eventData.setNextNid(nid);
// 只有这一条路返回
return eventData;
} else {
logger.warn("pipelineId[{}] select ignore processId[{}] by status[{}]", new Object[] { pipelineId, processId, status });
//将progress中清理掉,避免阻塞后续调度,因为最小的Id一直处于extract未完成阶段
stageController.clearProgress(processId);
// 递归调用
return await(pipelineId);
}
}
use of com.alibaba.otter.shared.common.model.config.channel.ChannelStatus in project otter by alibaba.
the class MainStemArbitrateEvent method await.
/**
* <pre>
* 算法:
* 1. 检查当前的Permit,阻塞等待其授权(解决Channel的pause状态处理)
* 2. 尝试创建对应的mainStem节点(非持久化节点)
* a. 如果创建成功,则直接构造结果返回
* b. 如果创建失败,则关注该节点的exist信号. 继续执行步骤2
* </pre>
*/
public void await(Long pipelineId) throws InterruptedException {
Assert.notNull(pipelineId);
PermitMonitor permitMonitor = ArbitrateFactory.getInstance(pipelineId, PermitMonitor.class);
ChannelStatus status = permitMonitor.getChannelPermit(true);
boolean isRuning = check(pipelineId);
if (!status.isStart() && isRuning) {
// 当前状态不为启动,强制设置为taking,下次授权启动后重新追数据
MainStemEventData data = new MainStemEventData();
data.setPipelineId(pipelineId);
data.setStatus(MainStemEventData.Status.TAKEING);
single(data);
// 阻塞等待挂起
permitMonitor.waitForChannelPermit();
return;
} else if (status.isStart() && isRuning) {
// 正常状态
return;
} else if (isRuning == false) {
if (!status.isStart()) {
// 阻塞等待挂起
permitMonitor.waitForChannelPermit();
}
MainstemMonitor mainstemMonitor = ArbitrateFactory.getInstance(pipelineId, MainstemMonitor.class);
// 等待自己成为active
mainstemMonitor.waitForActive();
status = permitMonitor.getChannelPermit(false);
if (status.isStart()) {
return;
} else {
logger.info("pipelineId[{}] mainstem ignore by status[{}]", new Object[] { pipelineId, status });
// 重新进行check一次
await(pipelineId);
}
}
}
Aggregations