All Downloads are FREE. Search and download functionalities are using the official Maven repository.

xin.bluesky.leiothrix.server.action.allocate.RangeScanner Maven / Gradle / Ivy

The newest version!
package xin.bluesky.leiothrix.server.action.allocate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import xin.bluesky.leiothrix.server.bean.status.RangeStatus;
import xin.bluesky.leiothrix.server.bean.status.TableStatus;
import xin.bluesky.leiothrix.server.storage.RangeStorage;
import xin.bluesky.leiothrix.server.storage.TableStorage;

import java.util.List;

/**
 * @author 张轲
 */
public class RangeScanner {

    private static final Logger logger = LoggerFactory.getLogger(RangeScanner.class);

    private String taskId;

    private String tableName;

    public RangeScanner(String taskId, String tableName) {
        this.taskId = taskId;
        this.tableName = tableName;
    }

    /**
     * 扫描某个表的range,以找到尚未被分配的range.如果没有找到,则返回null.在扫描过程中,如果所有range都已结束,则更新表状态为结束
     *
     * @return {@link RangeScanResult} object
     */
    public RangeScanResult scan() {
        RangeScanResult result = new RangeScanResult();

        List rangeNames = RangeStorage.getAllRangesByTableName(taskId, tableName);
        boolean hasUnfinishedRange = false;

        for (String rangeName : rangeNames) {
            RangeStatus rangeStatus = RangeStorage.getRangeStatus(taskId, tableName, rangeName);
            switch (rangeStatus) {
                case UNALLOCATED:
                    hasUnfinishedRange = true;
                    result.addUnallocatedRangeName(rangeName);
                    break;
                case PRE_ALLOCATE:
                case PROCESSING:
                    hasUnfinishedRange = true;
                    break;
                case FINISHED:
                    break;
                default:
                    break;
            }
        }


        // 如果全部结束了,则更新table的状态
        if (!hasUnfinishedRange) {
            result.setIsTableFinished(true);
            TableStorage.setStatus(taskId, tableName, TableStatus.FINISHED);
            logger.info("任务[taskId={}]中的表{}被执行完毕", taskId, tableName);
        }

        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy