funky-eyes commented on code in PR #6499: URL: https://github.com/apache/incubator-seata/pull/6499#discussion_r1580545818
########## server/src/main/java/org/apache/seata/server/coordinator/DefaultCoordinator.java: ########## @@ -488,6 +498,96 @@ private boolean isRetryTimeout(long now, long timeout, long beginTime) { return timeout >= ALWAYS_RETRY_BOUNDARY && now - beginTime > timeout; } + /** + * Handle rollbacking by scheduled. + */ + protected void handleRollbackingByScheduled() { + SessionCondition sessionCondition = new SessionCondition(rollbackingStatuses); + sessionCondition.setLazyLoadBranch(true); + List<GlobalSession> rollbackingSessions = + SessionHolder.getRootSessionManager().findGlobalSessions(sessionCondition); + if (CollectionUtils.isEmpty(rollbackingSessions)) { + rollbackingSchedule(DEFAULT_SYNC_PROCESSING_DELAY); + return; + } + rollbackingSessions.sort(Comparator.comparingLong(GlobalSession::getBeginTime)); + //The first one is the oldest one. + GlobalSession globalSession = rollbackingSessions.get(0); + if (!globalSession.isDeadSession()) { + rollbackingSchedule(System.currentTimeMillis() - globalSession.getBeginTime()); + return; + } + long now = System.currentTimeMillis(); + SessionHelper.forEach(rollbackingSessions, rollbackingSession -> { + try { + if (isRetryTimeout(now, MAX_ROLLBACK_RETRY_TIMEOUT, rollbackingSession.getBeginTime())) { + if (ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE) { + rollbackingSession.clean(); + } + + SessionHelper.endRollbackFailed(rollbackingSession, true, true); + + //The function of this 'return' is 'continue'. + return; + } + core.doGlobalRollback(rollbackingSession, true); + } catch (TransactionException ex) { + LOGGER.error("Failed to handle rollbacking [{}] {} {}", rollbackingSession.getXid(), ex.getCode(), ex.getMessage()); + } + }); + rollbackingSchedule(DEFAULT_SYNC_PROCESSING_DELAY); + } + + private void rollbackingSchedule(long delay) { + syncProcessing.schedule( + () -> SessionHolder.distributedLockAndExecute(ROLLBACKING, this::handleRollbackingByScheduled), + delay, TimeUnit.MILLISECONDS); + } + + /** + * Handle committing by scheduled. + */ + protected void handleCommittingByScheduled() { + SessionCondition sessionCondition = new SessionCondition(committingStatuses); + sessionCondition.setLazyLoadBranch(true); + List<GlobalSession> committingSessions = + SessionHolder.getRootSessionManager().findGlobalSessions(sessionCondition); + if (CollectionUtils.isEmpty(committingSessions)) { + committingSchedule(DEFAULT_SYNC_PROCESSING_DELAY); Review Comment: > > 如果是空的就应该等待间隔时间,而不是1s If it is empty, you should wait for the margin time, not 1s. > > 那么启动时的延迟1s执行是否有必要? So is the 1s delay in execution at startup necessary? 当然有必要,启动的时候不通过1s去执行任务,如何知道到底有没有需要处理的session? Of course it is necessary. If you don't perform tasks through 1s when starting, how do you know if there is a session that needs to be processed? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org For additional commands, e-mail: notifications-h...@seata.apache.org