amoro icon indicating copy to clipboard operation
amoro copied to clipboard

[AMORO-3286] Fix ConcurrentModificationException in TableRuntime.getQuotaTime()

Open guilherme-dsantos opened this issue 1 year ago • 0 comments

Fix/Resolve #3286

Changes made:

  • Added synchronization block in TableRuntime.getQuotaTime() to prevent ConcurrentModificationException
  • The fix synchronizes both removeIf and stream operations to ensure thread safety

Technical details:

  • Location: org.apache.amoro.server.table.TableRuntime
  • Method modified: getQuotaTime()
  • Added synchronized block around list operations to prevent concurrent modification

Testing:

  • While the original error couldn't be reproduced, the fix ensures thread safety for concurrent access to taskQuotas list

Code changes:

public long getQuotaTime() {
    long calculatingEndTime = System.currentTimeMillis();
    long calculatingStartTime = calculatingEndTime - AmoroServiceConstants.QUOTA_LOOK_BACK_TIME;
    long finishedTaskQuotaTime;
    synchronized (taskQuotas) {
        taskQuotas.removeIf(task -> task.checkExpired(calculatingStartTime));
        finishedTaskQuotaTime = taskQuotas.stream()
                .mapToLong(taskQuota -> taskQuota.getQuotaTime(calculatingStartTime))
                .sum();
    }
    return optimizingProcess == null
            ? finishedTaskQuotaTime
            : finishedTaskQuotaTime
            + optimizingProcess.getRunningQuotaTime(calculatingStartTime, calculatingEndTime);
}

guilherme-dsantos avatar Oct 22 '24 14:10 guilherme-dsantos