Search in sources :

Example 1 with ArrayMinHeap

use of com.actiontech.dble.backend.mysql.nio.handler.util.ArrayMinHeap in project dble by actiontech.

the class MultiNodeSelectHandler method ownThreadJob.

private void ownThreadJob() {
    try {
        ArrayMinHeap<HeapItem> heap = new ArrayMinHeap<>(new Comparator<HeapItem>() {

            @Override
            public int compare(HeapItem o1, HeapItem o2) {
                RowDataPacket row1 = o1.getRowPacket();
                RowDataPacket row2 = o2.getRowPacket();
                if (row1 == null || row2 == null) {
                    if (row1 == row2)
                        return 0;
                    if (row1 == null)
                        return -1;
                    return 1;
                }
                return rowComparator.compare(row1, row2);
            }
        });
        // init heap
        for (Map.Entry<BackendConnection, BlockingQueue<HeapItem>> entry : queues.entrySet()) {
            HeapItem firstItem = entry.getValue().take();
            heap.add(firstItem);
        }
        while (!heap.isEmpty()) {
            if (isFail())
                return;
            HeapItem top = heap.peak();
            if (top.isNullItem()) {
                heap.poll();
            } else {
                BlockingQueue<HeapItem> topItemQueue = queues.get(top.getIndex());
                HeapItem item = topItemQueue.take();
                heap.replaceTop(item);
                // limit
                this.selectRows++;
                if (rrs.getLimitSize() >= 0) {
                    if (selectRows <= rrs.getLimitStart()) {
                        continue;
                    } else if (selectRows > (rrs.getLimitStart() < 0 ? 0 : rrs.getLimitStart()) + rrs.getLimitSize()) {
                        noNeedRows = true;
                        while (!heap.isEmpty()) {
                            HeapItem itemToDiscard = heap.poll();
                            if (!itemToDiscard.isNullItem()) {
                                BlockingQueue<HeapItem> discardQueue = queues.get(itemToDiscard.getIndex());
                                while (true) {
                                    if (discardQueue.take().isNullItem() || isFail()) {
                                        break;
                                    }
                                }
                            }
                        }
                        continue;
                    }
                }
                outputHandler.rowResponse(top.getRowData(), top.getRowPacket(), false, top.getIndex());
            }
        }
        Iterator<Map.Entry<BackendConnection, BlockingQueue<HeapItem>>> iterator = this.queues.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<BackendConnection, BlockingQueue<HeapItem>> entry = iterator.next();
            entry.getValue().clear();
            session.releaseConnectionIfSafe(entry.getKey(), false);
            iterator.remove();
        }
        outputHandler.rowEofResponse(null, false, null);
        doSqlStat(session.getSource());
    } catch (Exception e) {
        String msg = "Merge thread error, " + e.getLocalizedMessage();
        LOGGER.info(msg, e);
        session.onQueryError(msg.getBytes());
    }
}
Also used : BlockingQueue(java.util.concurrent.BlockingQueue) LinkedBlockingQueue(java.util.concurrent.LinkedBlockingQueue) HeapItem(com.actiontech.dble.backend.mysql.nio.handler.util.HeapItem) BackendConnection(com.actiontech.dble.backend.BackendConnection) ArrayMinHeap(com.actiontech.dble.backend.mysql.nio.handler.util.ArrayMinHeap) RowDataPacket(com.actiontech.dble.net.mysql.RowDataPacket) IOException(java.io.IOException) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Example 2 with ArrayMinHeap

use of com.actiontech.dble.backend.mysql.nio.handler.util.ArrayMinHeap in project dble by actiontech.

the class MultiNodeMergeHandler method ownThreadJob.

@Override
protected void ownThreadJob(Object... objects) {
    try {
        ArrayMinHeap<HeapItem> heap = new ArrayMinHeap<>(new Comparator<HeapItem>() {

            @Override
            public int compare(HeapItem o1, HeapItem o2) {
                RowDataPacket row1 = o1.getRowPacket();
                RowDataPacket row2 = o2.getRowPacket();
                if (row1 == null || row2 == null) {
                    if (row1 == row2)
                        return 0;
                    if (row1 == null)
                        return -1;
                    return 1;
                }
                return rowComparator.compare(row1, row2);
            }
        });
        // init heap
        for (Map.Entry<MySQLConnection, BlockingQueue<HeapItem>> entry : queues.entrySet()) {
            HeapItem firstItem = entry.getValue().take();
            heap.add(firstItem);
        }
        while (!heap.isEmpty()) {
            if (terminate.get())
                return;
            HeapItem top = heap.peak();
            if (top.isNullItem()) {
                heap.poll();
            } else {
                BlockingQueue<HeapItem> topItemQueue = queues.get(top.getIndex());
                HeapItem item = topItemQueue.take();
                heap.replaceTop(item);
                if (nextHandler.rowResponse(top.getRowData(), top.getRowPacket(), this.isLeft, top.getIndex())) {
                    noNeedRows = true;
                    while (!heap.isEmpty()) {
                        HeapItem itemToDiscard = heap.poll();
                        if (!itemToDiscard.isNullItem()) {
                            BlockingQueue<HeapItem> discardQueue = queues.get(itemToDiscard.getIndex());
                            while (true) {
                                if (discardQueue.take().isNullItem() || terminate.get()) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        if (LOGGER.isInfoEnabled()) {
            String executeQueries = getRoutesSql(route);
            LOGGER.info(executeQueries + " heap send eof: ");
        }
        nextHandler.rowEofResponse(null, this.isLeft, queues.keySet().iterator().next());
    } catch (Exception e) {
        String msg = "Merge thread error, " + e.getLocalizedMessage();
        LOGGER.info(msg, e);
        session.onQueryError(msg.getBytes());
    }
}
Also used : BlockingQueue(java.util.concurrent.BlockingQueue) LinkedBlockingQueue(java.util.concurrent.LinkedBlockingQueue) HeapItem(com.actiontech.dble.backend.mysql.nio.handler.util.HeapItem) ArrayMinHeap(com.actiontech.dble.backend.mysql.nio.handler.util.ArrayMinHeap) RowDataPacket(com.actiontech.dble.net.mysql.RowDataPacket) MySQLOutPutException(com.actiontech.dble.plan.common.exception.MySQLOutPutException) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) MySQLConnection(com.actiontech.dble.backend.mysql.nio.MySQLConnection)

Aggregations

ArrayMinHeap (com.actiontech.dble.backend.mysql.nio.handler.util.ArrayMinHeap)2 HeapItem (com.actiontech.dble.backend.mysql.nio.handler.util.HeapItem)2 RowDataPacket (com.actiontech.dble.net.mysql.RowDataPacket)2 BlockingQueue (java.util.concurrent.BlockingQueue)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2 LinkedBlockingQueue (java.util.concurrent.LinkedBlockingQueue)2 BackendConnection (com.actiontech.dble.backend.BackendConnection)1 MySQLConnection (com.actiontech.dble.backend.mysql.nio.MySQLConnection)1 MySQLOutPutException (com.actiontech.dble.plan.common.exception.MySQLOutPutException)1 IOException (java.io.IOException)1