/** * Adds write future at the front of the queue without acquiring back pressure semaphore. * * @param writeFut Write request. * @return Updated size of the queue. */ int offerSystemFuture(SessionWriteRequest writeFut) { writeFut.messageThread(true); boolean res = queue.offerFirst(writeFut); assert res : "Future was not added to queue"; return queue.sizex(); }
/** * Adds write future to the pending list and returns the size of the queue. * <p> * Note that separate counter for the queue size is needed because in case of concurrent * calls this method should return different values (when queue size is 0 and 2 concurrent calls * occur exactly one call will return 1) * * @param writeFut Write request to add. * @return Updated size of the queue. */ int offerFuture(SessionWriteRequest writeFut) { boolean msgThread = GridNioBackPressureControl.threadProcessingMessage(); if (sem != null && !msgThread) sem.acquireUninterruptibly(); writeFut.messageThread(msgThread); boolean res = queue.offer(writeFut); assert res : "Future was not added to queue"; return queue.sizex(); }
/** * @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); } }
/** * @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; }
/** * Adds write future at the front of the queue without acquiring back pressure semaphore. * * @param writeFut Write request. * @return Updated size of the queue. */ int offerSystemFuture(SessionWriteRequest writeFut) { writeFut.messageThread(true); boolean res = queue.offerFirst(writeFut); assert res : "Future was not added to queue"; return queue.sizex(); }
/** * Adds write future to the pending list and returns the size of the queue. * <p> * Note that separate counter for the queue size is needed because in case of concurrent * calls this method should return different values (when queue size is 0 and 2 concurrent calls * occur exactly one call will return 1) * * @param writeFut Write request to add. * @return Updated size of the queue. */ int offerFuture(SessionWriteRequest writeFut) { boolean msgThread = GridNioBackPressureControl.threadProcessingMessage(); if (sem != null && !msgThread) sem.acquireUninterruptibly(); writeFut.messageThread(msgThread); boolean res = queue.offer(writeFut); assert res : "Future was not added to queue"; return queue.sizex(); }
/** * @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); } }
/** * @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; }