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

xin.bluesky.leiothrix.server.storage.RangeStorage Maven / Gradle / Ivy

The newest version!
package xin.bluesky.leiothrix.server.storage;

import xin.bluesky.leiothrix.model.task.partition.ExecutionStatistics;
import xin.bluesky.leiothrix.model.task.partition.PartitionTask;
import xin.bluesky.leiothrix.server.Constant;
import xin.bluesky.leiothrix.server.bean.status.RangeStatus;
import xin.bluesky.leiothrix.server.bean.task.TaskRanges;
import xin.bluesky.leiothrix.server.cache.TaskRangesCache;
import xin.bluesky.leiothrix.server.lock.LockFactory;
import xin.bluesky.leiothrix.server.storage.zk.ZookeeperUtils;

import java.util.Date;
import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import static xin.bluesky.leiothrix.server.storage.TableStorage.NAME_TABLES;
import static xin.bluesky.leiothrix.server.storage.zk.ZookeeperUtils.*;

/**
 * @author 张轲
 */
public class RangeStorage {
    public static final String NAME_RANGE_START_INDEX = "startIndex";

    public static final String NAME_RANGE_END_INDEX = "endIndex";

    public static final String NAME_STATUS = "status";

    public static final String NAME_RANGES = "ranges";

    /**
     * 判断range是否处理超时的标志字段
     */
    public static final String NAME_TIMEOUT_FLAG = "timeoutFlag";

    public static final String NAME_RANGE_RECORD_NUM = "recordNum";

    public static final String NAME_STAT = "statistics";

    public static final String NAME_STAT_RECORD_NUM = "handledRecordNum";

    public static final String NAME_STAT_RECORD_NUM_SUCCESS = "successRecordNum";

    public static final String NAME_STAT_RECORD_NUM_FAIL = "failRecordNum";

    public static final String NAME_STAT_FAIL_PAGE = "failPage";

    public static final String NAME_STAT_EXCEPTION_STACK_TRACE = "exceptionStackTrace";

    public static final String NAME_STAT_QUERY_USING_TIME = "queryUsingTime";

    public static final String NAME_STAT_HANDLE_USING_TIME = "handleUsingTime";

    public static final String NAME_STAT_TOTAL_TIME = "totalTime";

    public static void createRange(String taskId, String tableName, String rangeName) {
        String[] r = rangeName.split(Constant.RANGE_SEPARATOR);
        final String rangePath = getRangePath(taskId, tableName, rangeName);
        createNodeAndSetData(rangePath, NAME_RANGE_START_INDEX, r[0]);
        createNodeAndSetData(rangePath, NAME_RANGE_END_INDEX, r[1]);
        createNodeAndSetData(rangePath, NAME_STATUS, RangeStatus.UNALLOCATED.name());
        createNodeAndSetData(rangePath, NAME_TIMEOUT_FLAG, String.valueOf(new Date().getTime()));
    }

    public static void createRange(String taskId, String tableName, String rangeName, int recordNum) {
        createRange(taskId, tableName, rangeName);

        final String rangePath = getRangePath(taskId, tableName, rangeName);
        createNodeAndSetData(rangePath, NAME_RANGE_RECORD_NUM, String.valueOf(recordNum));
    }

    public static PartitionTask getPartitionTask(String taskId, String tableName, String rangeName) {
        String rangePath = getRangePath(taskId, tableName, rangeName);

        int startIndex = getDataInteger(makePath(rangePath, NAME_RANGE_START_INDEX));
        int endIndex = getDataInteger(makePath(rangePath, NAME_RANGE_END_INDEX));
        String primaryKey = TableStorage.getTableMeta(taskId, tableName).getPrimaryKey();

        PartitionTask partitionTask = new PartitionTask();
        partitionTask.setTaskId(taskId);
        partitionTask.setTableName(tableName);
        partitionTask.setPrimaryKey(primaryKey);
        partitionTask.setRangeName(rangeName);
        partitionTask.setRowStartIndex(startIndex);
        partitionTask.setRowEndIndex(endIndex);

        return partitionTask;
    }

    public static void setRangeStatus(String taskId, String tableName, String rangeName, RangeStatus status) {
        String rangeStatusPath = getRangeStatusPath(taskId, tableName, rangeName);
        ZookeeperUtils.setData(rangeStatusPath, status.name());
    }

    public static List getAllRangesByTableName(String taskId, String tableName) {
        TaskRanges cached = TaskRangesCache.get(taskId, tableName);
        if (cached != null) {
            return cached.getRangeNameList();
        }

        ReentrantReadWriteLock lock = LockFactory.getTaskRangesCacheLock(taskId, tableName);
        lock.writeLock().lock();
        try {
            cached = TaskRangesCache.get(taskId, tableName);
            if (cached != null) {
                return cached.getRangeNameList();
            }
            String rangesPath = makePath(TaskStorage.TASKS, taskId, NAME_TABLES, tableName, NAME_RANGES);
            List rangeNameList = getChildrenWithSimplePath(rangesPath);
            TaskRangesCache.put(new TaskRanges(taskId, tableName, rangeNameList));
            return rangeNameList;
        } finally {
            lock.writeLock().unlock();
        }
    }

    public static RangeStatus getRangeStatus(String taskId, String tableName, String rangeName) {
        String rangeStatusPath = getRangeStatusPath(taskId, tableName, rangeName);
        if (!checkExists(rangeStatusPath)) {
            return RangeStatus.NOT_EXIST;
        }
        String rangeStatus = getDataString(rangeStatusPath);
        return RangeStatus.valueOf(rangeStatus);
    }

    public static long getRangeLastUpdateTime(String taskId, String tableName, String rangeName) {
        String timeoutFlagPath = makePath(getRangePath(taskId, tableName, rangeName), NAME_TIMEOUT_FLAG);
        return ZookeeperUtils.getNodeStat(timeoutFlagPath).getMtime();
    }

    public static void refreshRangeLastUpdateTime(String taskId, String tableName, String rangeName) {
        String timeoutFlagPath = makePath(getRangePath(taskId, tableName, rangeName), NAME_TIMEOUT_FLAG);
        ZookeeperUtils.setData(timeoutFlagPath, String.valueOf(new Date().getTime()));
    }

    public static void setNameRangeStartIndex(String taskId, String tableName, String rangeName, long startIndex) {
        setData(makePath(getRangePath(taskId, tableName, rangeName), NAME_RANGE_START_INDEX), String.valueOf(startIndex));
    }

    private static String getRangePath(String taskId, String tableName, String rangeName) {
        return makePath(TaskStorage.TASKS, taskId, NAME_TABLES, tableName, NAME_RANGES, rangeName);
    }

    private static String getRangeStatusPath(String taskId, String tableName, String rangeName) {
        return makePath(getRangePath(taskId, tableName, rangeName), NAME_STATUS);
    }

    public static void setRangeRecordNum(String taskId, String tableName, String rangeName, int recordNum) {
        final String rangePath = getRangePath(taskId, tableName, rangeName);
        createNodeAndSetData(rangePath, NAME_RANGE_RECORD_NUM, String.valueOf(recordNum));
    }

    public static void updatePageExecutionStatistics(String taskId, String tableName, String rangeName, ExecutionStatistics stat) {
        String path = getStatisticsPath(taskId, tableName, rangeName);

        addIntValue(makePath(path, NAME_STAT_RECORD_NUM), stat.getHandledRecordNum());

        addIntValue(makePath(path, NAME_STAT_RECORD_NUM_SUCCESS), stat.getSuccessRecordNum());
        if (stat.getFailRecordNum() != 0) {
            addIntValue(makePath(path, NAME_STAT_RECORD_NUM_FAIL), stat.getFailRecordNum());
            appendValue(makePath(path, NAME_STAT_FAIL_PAGE), stat.getFailPageName() + ";");
            appendValue(makePath(path, NAME_STAT_EXCEPTION_STACK_TRACE), stat.getExceptionMsg() + "\r\n");
        }

        addLongValue(makePath(path, NAME_STAT_QUERY_USING_TIME), stat.getQueryUsingTime());

        addLongValue(makePath(path, NAME_STAT_HANDLE_USING_TIME), stat.getHandleUsingTime());

        addLongValue(makePath(path, NAME_STAT_TOTAL_TIME), stat.getTotalTime());
    }

    public static ExecutionStatistics getExecutionStatistics(String taskId, String tableName, String rangeName) {
        String path = getStatisticsPath(taskId, tableName, rangeName);
        if (!checkExists(path)) {
            return null;
        }

        ExecutionStatistics stat = new ExecutionStatistics();

        stat.setHandledRecordNum(getDataInteger(makePath(path, NAME_STAT_RECORD_NUM)));

        stat.setSuccessRecordNum(getDataInteger(makePath(path, NAME_STAT_RECORD_NUM_SUCCESS)));

        if (checkExists(makePath(path, NAME_STAT_RECORD_NUM_FAIL))) {
            stat.setFailRecordNum(getDataInteger(makePath(path, NAME_STAT_RECORD_NUM_FAIL)));
            stat.setFailPageName(getDataString(makePath(path, NAME_STAT_FAIL_PAGE)));
            stat.setExceptionMsg(getDataString(makePath(path, NAME_STAT_EXCEPTION_STACK_TRACE)));
        }

        stat.setQueryUsingTime(getDataLong(makePath(path, NAME_STAT_QUERY_USING_TIME)));

        stat.setHandleUsingTime(getDataLong(makePath(path, NAME_STAT_HANDLE_USING_TIME)));

        stat.setTotalTime(getDataLong(makePath(path, NAME_STAT_TOTAL_TIME)));

        return stat;
    }

    private static String getStatisticsPath(String taskId, String tableName, String rangeName) {
        return makePath(getRangePath(taskId, tableName, rangeName), NAME_STAT);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy