/** * @return Message that is in the head of the queue, {@code null} if queue is empty. */ @Nullable SessionWriteRequest pollFuture() { SessionWriteRequest last = queue.poll(); if (last != null) { if (sem != null && !last.messageThread()) sem.release(); if (outRecovery != null) { if (!outRecovery.add(last)) { LT.warn(log, "Unacknowledged messages queue size overflow, will attempt to reconnect " + "[remoteAddr=" + remoteAddress() + ", queueLimit=" + outRecovery.queueLimit() + ']'); if (log.isDebugEnabled()) log.debug("Unacknowledged messages queue size overflow, will attempt to reconnect " + "[remoteAddr=" + remoteAddress() + ", queueSize=" + outRecovery.messagesRequests().size() + ", queueLimit=" + outRecovery.queueLimit() + ']'); close(); } } } return last; }
/** * @param ses Session. * @param req Request. * @param sys System message flag. * @throws IgniteCheckedException If session was closed. */ private void send0(GridSelectorNioSessionImpl ses, SessionWriteRequest req, boolean sys) throws IgniteCheckedException { assert ses != null; assert req != null; int msgCnt = sys ? ses.offerSystemFuture(req) : ses.offerFuture(req); if (ses.closed()) { if (ses.removeFuture(req)) { IOException err = new IOException("Failed to send message (connection was closed): " + ses); req.onError(err); if (!(req instanceof GridNioFuture)) throw new IgniteCheckedException(err); } } else if (!ses.procWrite.get() && ses.procWrite.compareAndSet(false, true)) { AbstractNioClientWorker worker = (AbstractNioClientWorker)ses.worker(); if (worker != null) worker.offer((SessionChangeRequest)req); } if (msgQueueLsnr != null) msgQueueLsnr.apply(ses, msgCnt); }
/** * @param ses Session. * @param from Move from index. * @param to Move to index. */ private void moveSession(GridNioSession ses, int from, int to) { assert from >= 0 && from < clientWorkers.size() : from; assert to >= 0 && to < clientWorkers.size() : to; assert from != to; GridSelectorNioSessionImpl ses0 = (GridSelectorNioSessionImpl)ses; SessionMoveFuture fut = new SessionMoveFuture(ses0, to); if (!ses0.offerMove(clientWorkers.get(from), fut)) fut.onDone(false); }
/** * @param ses Session to close. * @return Future for operation. */ public GridNioFuture<Boolean> close(GridNioSession ses) { assert ses instanceof GridSelectorNioSessionImpl : ses; GridSelectorNioSessionImpl impl = (GridSelectorNioSessionImpl)ses; if (impl.closed()) return new GridNioFinishedFuture<>(false); NioOperationFuture<Boolean> fut = new NioOperationFuture<>(impl, NioOperation.CLOSE); impl.offerStateChange(fut); return fut; }
/** * @param ses Session. */ public void resend(GridNioSession ses) { assert ses instanceof GridSelectorNioSessionImpl; GridNioRecoveryDescriptor recoveryDesc = ses.outRecoveryDescriptor(); if (recoveryDesc != null && !recoveryDesc.messagesRequests().isEmpty()) { Deque<SessionWriteRequest> futs = recoveryDesc.messagesRequests(); if (log.isDebugEnabled()) log.debug("Resend messages [rmtNode=" + recoveryDesc.node().id() + ", msgCnt=" + futs.size() + ']'); GridSelectorNioSessionImpl ses0 = (GridSelectorNioSessionImpl)ses; SessionWriteRequest fut0 = futs.iterator().next(); for (SessionWriteRequest fut : futs) { fut.messageThread(true); fut.resetSession(ses0); } ses0.resend(futs); // Wake up worker. ses0.offerStateChange((GridNioServer.SessionChangeRequest)fut0); } }
/** * @param fut Future. * @return {@code True} if future was removed from queue. */ boolean removeFuture(SessionWriteRequest fut) { assert closed(); return queue.removeLastOccurrence(fut); }
/** * */ void onServerStopped() { onClosed(); }
/** * Stops all threads and releases all resources. */ public void stop() { if (!closed) { closed = true; // Make sure to entirely stop acceptor if any. U.cancel(acceptWorker); U.join(acceptWorker, log); U.cancel(clientWorkers); U.join(clientWorkers, log); filterChain.stop(); for (GridSelectorNioSessionImpl ses : sessions) ses.onServerStopped(); } }
/** * @param ses Session. * @param op Operation. * @return Future for operation. */ private GridNioFuture<?> pauseResumeReads(GridNioSession ses, NioOperation op) { assert ses instanceof GridSelectorNioSessionImpl; assert op == NioOperation.PAUSE_READ || op == NioOperation.RESUME_READ; GridSelectorNioSessionImpl impl = (GridSelectorNioSessionImpl)ses; if (impl.closed()) return new GridNioFinishedFuture(new IOException("Failed to pause/resume reads " + "(connection was closed): " + ses)); NioOperationFuture<?> fut = new NioOperationFuture<Void>(impl, op); impl.offerStateChange(fut); return fut; }
/** * @param ses Session. */ public void resend(GridNioSession ses) { assert ses instanceof GridSelectorNioSessionImpl; GridNioRecoveryDescriptor recoveryDesc = ses.outRecoveryDescriptor(); if (recoveryDesc != null && !recoveryDesc.messagesRequests().isEmpty()) { Deque<SessionWriteRequest> futs = recoveryDesc.messagesRequests(); if (log.isDebugEnabled()) log.debug("Resend messages [rmtNode=" + recoveryDesc.node().id() + ", msgCnt=" + futs.size() + ']'); GridSelectorNioSessionImpl ses0 = (GridSelectorNioSessionImpl)ses; SessionWriteRequest fut0 = futs.iterator().next(); for (SessionWriteRequest fut : futs) { fut.messageThread(true); fut.resetSession(ses0); } ses0.resend(futs); // Wake up worker. ses0.offerStateChange((GridNioServer.SessionChangeRequest)fut0); } }
/** * @param fut Future. * @return {@code True} if future was removed from queue. */ boolean removeFuture(SessionWriteRequest fut) { assert closed(); return queue.removeLastOccurrence(fut); }
/** * */ void onServerStopped() { onClosed(); }
/** * Stops all threads and releases all resources. */ public void stop() { if (!closed) { closed = true; // Make sure to entirely stop acceptor if any. U.cancel(acceptWorker); U.join(acceptWorker, log); U.cancel(clientWorkers); U.join(clientWorkers, log); filterChain.stop(); for (GridSelectorNioSessionImpl ses : sessions) ses.onServerStopped(); } }
/** * @param ses Session. * @param req Request. * @param sys System message flag. * @throws IgniteCheckedException If session was closed. */ private void send0(GridSelectorNioSessionImpl ses, SessionWriteRequest req, boolean sys) throws IgniteCheckedException { assert ses != null; assert req != null; int msgCnt = sys ? ses.offerSystemFuture(req) : ses.offerFuture(req); if (ses.closed()) { if (ses.removeFuture(req)) { IOException err = new IOException("Failed to send message (connection was closed): " + ses); req.onError(err); if (!(req instanceof GridNioFuture)) throw new IgniteCheckedException(err); } } else if (!ses.procWrite.get() && ses.procWrite.compareAndSet(false, true)) { AbstractNioClientWorker worker = (AbstractNioClientWorker)ses.worker(); if (worker != null) worker.offer((SessionChangeRequest)req); } if (msgQueueLsnr != null) msgQueueLsnr.apply(ses, msgCnt); }
/** * @param ses Session to close. * @return Future for operation. */ public GridNioFuture<Boolean> close(GridNioSession ses) { assert ses instanceof GridSelectorNioSessionImpl : ses; GridSelectorNioSessionImpl impl = (GridSelectorNioSessionImpl)ses; if (impl.closed()) return new GridNioFinishedFuture<>(false); NioOperationFuture<Boolean> fut = new NioOperationFuture<>(impl, NioOperation.CLOSE); impl.offerStateChange(fut); return fut; }
/** * @return Message that is in the head of the queue, {@code null} if queue is empty. */ @Nullable SessionWriteRequest pollFuture() { SessionWriteRequest last = queue.poll(); if (last != null) { if (sem != null && !last.messageThread()) sem.release(); if (outRecovery != null) { if (!outRecovery.add(last)) { LT.warn(log, "Unacknowledged messages queue size overflow, will attempt to reconnect " + "[remoteAddr=" + remoteAddress() + ", queueLimit=" + outRecovery.queueLimit() + ']'); if (log.isDebugEnabled()) log.debug("Unacknowledged messages queue size overflow, will attempt to reconnect " + "[remoteAddr=" + remoteAddress() + ", queueSize=" + outRecovery.messagesRequests().size() + ", queueLimit=" + outRecovery.queueLimit() + ']'); close(); } } } return last; }
/** * @param ses Session. * @param from Move from index. * @param to Move to index. */ private void moveSession(GridNioSession ses, int from, int to) { assert from >= 0 && from < clientWorkers.size() : from; assert to >= 0 && to < clientWorkers.size() : to; assert from != to; GridSelectorNioSessionImpl ses0 = (GridSelectorNioSessionImpl)ses; SessionMoveFuture fut = new SessionMoveFuture(ses0, to); if (!ses0.offerMove(clientWorkers.get(from), fut)) fut.onDone(false); }
/** * @param ses Session. * @param op Operation. * @return Future for operation. */ private GridNioFuture<?> pauseResumeReads(GridNioSession ses, NioOperation op) { assert ses instanceof GridSelectorNioSessionImpl; assert op == NioOperation.PAUSE_READ || op == NioOperation.RESUME_READ; GridSelectorNioSessionImpl impl = (GridSelectorNioSessionImpl)ses; if (impl.closed()) return new GridNioFinishedFuture(new IOException("Failed to pause/resume reads " + "(connection was closed): " + ses)); NioOperationFuture<?> fut = new NioOperationFuture<Void>(impl, op); impl.offerStateChange(fut); return fut; }