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

com.alibaba.hologres.client.impl.handler.MetaActionHandler Maven / Gradle / Ivy

There is a newer version: 2.5.5
Show newest version
/*
 * Copyright (c) 2022. Alibaba Group Holding Limited
 */

package com.alibaba.hologres.client.impl.handler;

import com.alibaba.hologres.client.HoloConfig;
import com.alibaba.hologres.client.exception.HoloClientException;
import com.alibaba.hologres.client.impl.ConnectionHolder;
import com.alibaba.hologres.client.impl.action.MetaAction;
import com.alibaba.hologres.client.impl.util.ConnectionUtil;
import com.alibaba.hologres.client.model.TableSchema;

import java.sql.SQLException;

/**
 * MetaAction处理类.
 */
public class MetaActionHandler extends ActionHandler {

	private static final String NAME = "meta";
	private final HoloConfig config;
	private final ConnectionHolder connectionHolder;

	public MetaActionHandler(ConnectionHolder connectionHolder, HoloConfig config) {
		super(config);
		this.config = config;
		this.connectionHolder = connectionHolder;
	}

	@Override
	public void handle(MetaAction action) {
		try {
			action.getFuture().complete((TableSchema) connectionHolder.retryExecuteWithVersion((connWithVersion) -> {
				if (config.isRefreshMetaBeforeGetTableSchema() && config.getRefreshMetaTimeout() > 0) {
					String fullTableName = action.getTableName().getFullName();
					ConnectionUtil.CheckMetaResult result = ConnectionUtil.checkMeta(connWithVersion.getConn(), connWithVersion.getVersion(), fullTableName, config.getRefreshMetaTimeout());
					if (!result.isUpdated()) {
						if (result.getMsg().contains("table is lock by other query which request a AccessExclusiveLock")) {
							throw new SQLException("mismatches the version of the table [" + fullTableName + "]:" + result.getMsg()); //HoloClientException会识别这种特殊的异常message
						} else {
							throw new SQLException("truncate table [" + fullTableName + "], but replay not finished yet:" + result.getMsg()); //HoloClientException会识别这种特殊的异常message
						}
					}
				}
				return ConnectionUtil.getTableSchema(connWithVersion.getConn(), action.getTableName());
			}));
		} catch (HoloClientException e) {
			action.getFuture().completeExceptionally(e);
		}
	}

	@Override
	public String getCostMsMetricName() {
		return NAME + METRIC_COST_MS;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy