Search in sources :

Example 1 with BackendConnection

use of io.mycat.backend.BackendConnection in project Mycat-Server by MyCATApache.

the class PhysicalDatasource method getConnection.

public void getConnection(String schema, boolean autocommit, final ResponseHandler handler, final Object attachment) throws IOException {
    // 从当前连接map中拿取已建立好的后端连接
    BackendConnection con = this.conMap.tryTakeCon(schema, autocommit);
    if (con != null) {
        //如果不为空,则绑定对应前端请求的handler
        takeCon(con, handler, attachment, schema);
        return;
    } else {
        // 当前最大活动连接
        int activeCons = this.getActiveCount();
        if (activeCons + 1 > size) {
            // 下一个连接大于最大连接数
            LOGGER.error("the max activeConnnections size can not be max than maxconnections");
            throw new IOException("the max activeConnnections size can not be max than maxconnections");
        } else {
            // create connection
            LOGGER.info("no ilde connection in pool,create new connection for " + this.name + " of schema " + schema);
            createNewConnection(handler, attachment, schema);
        }
    }
}
Also used : BackendConnection(io.mycat.backend.BackendConnection) IOException(java.io.IOException)

Example 2 with BackendConnection

use of io.mycat.backend.BackendConnection in project Mycat-Server by MyCATApache.

the class PhysicalDatasource method checkIfNeedHeartBeat.

private void checkIfNeedHeartBeat(LinkedList<BackendConnection> heartBeatCons, ConQueue queue, ConcurrentLinkedQueue<BackendConnection> checkLis, long hearBeatTime, long hearBeatTime2) {
    int maxConsInOneCheck = 10;
    Iterator<BackendConnection> checkListItor = checkLis.iterator();
    while (checkListItor.hasNext()) {
        BackendConnection con = checkListItor.next();
        if (con.isClosedOrQuit()) {
            checkListItor.remove();
            continue;
        }
        if (validSchema(con.getSchema())) {
            if (con.getLastTime() < hearBeatTime && heartBeatCons.size() < maxConsInOneCheck) {
                checkListItor.remove();
                // Heart beat check
                con.setBorrowed(true);
                heartBeatCons.add(con);
            }
        } else if (con.getLastTime() < hearBeatTime2) {
            // not valid schema conntion should close for idle
            // exceed 2*conHeartBeatPeriod
            checkListItor.remove();
            con.close(" heart beate idle ");
        }
    }
}
Also used : BackendConnection(io.mycat.backend.BackendConnection)

Example 3 with BackendConnection

use of io.mycat.backend.BackendConnection in project Mycat-Server by MyCATApache.

the class PhysicalDatasource method closeByIdleMany.

private void closeByIdleMany(int ildeCloseCount) {
    LOGGER.info("too many ilde cons ,close some for datasouce  " + name);
    List<BackendConnection> readyCloseCons = new ArrayList<BackendConnection>(ildeCloseCount);
    for (ConQueue queue : conMap.getAllConQueue()) {
        readyCloseCons.addAll(queue.getIdleConsToClose(ildeCloseCount));
        if (readyCloseCons.size() >= ildeCloseCount) {
            break;
        }
    }
    for (BackendConnection idleCon : readyCloseCons) {
        if (idleCon.isBorrowed()) {
            LOGGER.warn("find idle con is using " + idleCon);
        }
        idleCon.close("too many idle con");
    }
}
Also used : BackendConnection(io.mycat.backend.BackendConnection) ArrayList(java.util.ArrayList) ConQueue(io.mycat.backend.ConQueue)

Example 4 with BackendConnection

use of io.mycat.backend.BackendConnection in project Mycat-Server by MyCATApache.

the class MultiNodeCoordinator method executeBatchNodeCmd.

/** Multi-nodes 1pc Commit Handle **/
public void executeBatchNodeCmd(SQLCtrlCommand cmdHandler) {
    this.cmdHandler = cmdHandler;
    final int initCount = session.getTargetCount();
    runningCount.set(initCount);
    nodeCount = initCount;
    failed.set(false);
    faileCount.set(0);
    //recovery nodes log
    ParticipantLogEntry[] participantLogEntry = new ParticipantLogEntry[initCount];
    // 执行
    int started = 0;
    for (RouteResultsetNode rrn : session.getTargetKeys()) {
        if (rrn == null) {
            LOGGER.error("null is contained in RoutResultsetNodes, source = " + session.getSource());
            continue;
        }
        final BackendConnection conn = session.getTarget(rrn);
        if (conn != null) {
            conn.setResponseHandler(this);
            //process the XA_END XA_PREPARE Command
            MySQLConnection mysqlCon = (MySQLConnection) conn;
            String xaTxId = session.getXaTXID();
            if (mysqlCon.getXaStatus() == TxState.TX_STARTED_STATE) {
                //recovery Log
                participantLogEntry[started] = new ParticipantLogEntry(xaTxId, conn.getHost(), 0, conn.getSchema(), ((MySQLConnection) conn).getXaStatus());
                String[] cmds = new String[] { "XA END " + xaTxId, "XA PREPARE " + xaTxId };
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("Start execute the batch cmd : " + cmds[0] + ";" + cmds[1] + "," + "current connection:" + conn.getHost() + ":" + conn.getPort());
                }
                mysqlCon.execBatchCmd(cmds);
            } else {
                //recovery Log
                participantLogEntry[started] = new ParticipantLogEntry(xaTxId, conn.getHost(), 0, conn.getSchema(), ((MySQLConnection) conn).getXaStatus());
                cmdHandler.sendCommand(session, conn);
            }
            ++started;
        }
    }
    //xa recovery log
    if (session.getXaTXID() != null) {
        CoordinatorLogEntry coordinatorLogEntry = new CoordinatorLogEntry(session.getXaTXID(), false, participantLogEntry);
        inMemoryRepository.put(session.getXaTXID(), coordinatorLogEntry);
        fileRepository.writeCheckpoint(inMemoryRepository.getAllCoordinatorLogEntries());
    }
    if (started < nodeCount) {
        runningCount.set(started);
        LOGGER.warn("some connection failed to execute " + (nodeCount - started));
        /**
			 * assumption: only caused by front-end connection close. <br/>
			 * Otherwise, packet must be returned to front-end
			 */
        failed.set(true);
    }
}
Also used : BackendConnection(io.mycat.backend.BackendConnection) ParticipantLogEntry(io.mycat.backend.mysql.xa.ParticipantLogEntry) RouteResultsetNode(io.mycat.route.RouteResultsetNode) MySQLConnection(io.mycat.backend.mysql.nio.MySQLConnection) CoordinatorLogEntry(io.mycat.backend.mysql.xa.CoordinatorLogEntry)

Example 5 with BackendConnection

use of io.mycat.backend.BackendConnection in project Mycat-Server by MyCATApache.

the class MultiNodeQueryHandler method execute.

public void execute() throws Exception {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        this.reset(rrs.getNodes().length);
        this.fieldsReturned = false;
        this.affectedRows = 0L;
        this.insertId = 0L;
    } finally {
        lock.unlock();
    }
    MycatConfig conf = MycatServer.getInstance().getConfig();
    startTime = System.currentTimeMillis();
    LOGGER.debug("rrs.getRunOnSlave()-" + rrs.getRunOnSlave());
    for (final RouteResultsetNode node : rrs.getNodes()) {
        BackendConnection conn = session.getTarget(node);
        if (session.tryExistsCon(conn, node)) {
            LOGGER.debug("node.getRunOnSlave()-" + node.getRunOnSlave());
            // 实现 master/slave注解
            node.setRunOnSlave(rrs.getRunOnSlave());
            LOGGER.debug("node.getRunOnSlave()-" + node.getRunOnSlave());
            _execute(conn, node);
        } else {
            // create new connection
            LOGGER.debug("node.getRunOnSlave()1-" + node.getRunOnSlave());
            // 实现 master/slave注解
            node.setRunOnSlave(rrs.getRunOnSlave());
            LOGGER.debug("node.getRunOnSlave()2-" + node.getRunOnSlave());
            PhysicalDBNode dn = conf.getDataNodes().get(node.getName());
            dn.getConnection(dn.getDatabase(), autocommit, node, this, node);
        // 注意该方法不仅仅是获取连接,获取新连接成功之后,会通过层层回调,最后回调到本类 的connectionAcquired
        // 这是通过 上面方法的 this 参数的层层传递完成的。
        // connectionAcquired 进行执行操作:
        // session.bindConnection(node, conn);
        // _execute(conn, node);
        }
    }
}
Also used : ReentrantLock(java.util.concurrent.locks.ReentrantLock) PhysicalDBNode(io.mycat.backend.datasource.PhysicalDBNode) BackendConnection(io.mycat.backend.BackendConnection) RouteResultsetNode(io.mycat.route.RouteResultsetNode) MycatConfig(io.mycat.config.MycatConfig)

Aggregations

BackendConnection (io.mycat.backend.BackendConnection)25 RouteResultsetNode (io.mycat.route.RouteResultsetNode)7 PhysicalDBNode (io.mycat.backend.datasource.PhysicalDBNode)6 MycatConfig (io.mycat.config.MycatConfig)6 MySQLConnection (io.mycat.backend.mysql.nio.MySQLConnection)3 NIOProcessor (io.mycat.net.NIOProcessor)3 RowDataPacket (io.mycat.net.mysql.RowDataPacket)3 ByteBuffer (java.nio.ByteBuffer)3 Entry (java.util.Map.Entry)3 ConQueue (io.mycat.backend.ConQueue)2 EOFPacket (io.mycat.net.mysql.EOFPacket)2 FieldPacket (io.mycat.net.mysql.FieldPacket)2 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 LinkedList (java.util.LinkedList)2 PhysicalDBPool (io.mycat.backend.datasource.PhysicalDBPool)1 PhysicalDatasource (io.mycat.backend.datasource.PhysicalDatasource)1 JDBCConnection (io.mycat.backend.jdbc.JDBCConnection)1 GetConnectionHandler (io.mycat.backend.mysql.nio.handler.GetConnectionHandler)1 CoordinatorLogEntry (io.mycat.backend.mysql.xa.CoordinatorLogEntry)1