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

Reply via email to