This is an automated email from the ASF dual-hosted git repository.

bstoyanov pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.20 by this push:
     new 95de88a8ffe Usage server should takeover immediately if the other 
Usage server has been stopped gracefully (#12507)
95de88a8ffe is described below

commit 95de88a8ffee115a98fd34818394d420b01f8cdf
Author: Abhisar Sinha <[email protected]>
AuthorDate: Wed Jan 28 19:38:25 2026 +0530

    Usage server should takeover immediately if the other Usage server has been 
stopped gracefully (#12507)
---
 engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDao.java     | 2 ++
 engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDaoImpl.java | 3 ++-
 usage/src/main/java/com/cloud/usage/UsageManagerImpl.java            | 5 +++++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDao.java 
b/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDao.java
index d4038d4ceeb..b22ce69d94e 100644
--- a/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDao.java
+++ b/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDao.java
@@ -28,6 +28,8 @@ public interface UsageJobDao extends GenericDao<UsageJobVO, 
Long> {
 
     UsageJobVO getLastJob();
 
+    UsageJobVO getNextRecurringJob();
+
     UsageJobVO getNextImmediateJob();
 
     long getLastJobSuccessDateMillis();
diff --git 
a/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDaoImpl.java 
b/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDaoImpl.java
index 44a7d1a8b72..6f340501cf1 100644
--- a/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/usage/dao/UsageJobDaoImpl.java
@@ -156,7 +156,8 @@ public class UsageJobDaoImpl extends 
GenericDaoBase<UsageJobVO, Long> implements
         return jobs.get(0);
     }
 
-    private UsageJobVO getNextRecurringJob() {
+    @Override
+    public UsageJobVO getNextRecurringJob() {
         Filter filter = new Filter(UsageJobVO.class, "id", false, 
Long.valueOf(0), Long.valueOf(1));
         SearchCriteria<UsageJobVO> sc = createSearchCriteria();
         sc.addAnd("endMillis", SearchCriteria.Op.EQ, Long.valueOf(0));
diff --git a/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java 
b/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
index 99de98f56e4..30cdfcf21f0 100644
--- a/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
@@ -2257,6 +2257,11 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
                         }
                     }
 
+                    if (_usageJobDao.getNextRecurringJob() == null) {
+                        // Own the usage processing immediately if no other 
node is owning it
+                        _usageJobDao.createNewJob(_hostname, _pid, 
UsageJobVO.JOB_TYPE_RECURRING);
+                    }
+
                     Long jobId = _usageJobDao.checkHeartbeat(_hostname, _pid, 
_aggregationDuration);
                     if (jobId != null) {
                         // if I'm taking over the job...see how long it's been 
since the last job, and if it's more than the

Reply via email to