From 9a7ffa7c0f4ad08e0db8701d6eda46d29ce4837b Mon Sep 17 00:00:00 2001 From: Priya Sharma Date: Sun, 1 Mar 2026 02:45:41 +0530 Subject: [PATCH] fix(user): prevent permanent import lockout on unchecked exceptions The IMPORT_DEPARTMENT_STATUS flag in UserDatabaseHandler.importFileToDB() is only reset inside try and catch(IOException). Any unchecked exception leaves the flag stuck at true, permanently disabling department import until server restart. - Move flag reset to finally block for guaranteed reset - Replace static boolean with AtomicBoolean.compareAndSet() for thread-safe guarding between Timer scheduler and Thrift request threads closes eclipse/sw360#3778 Signed-off-by: Priya Sharma --- .../sw360/users/db/UserDatabaseHandler.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/backend/users/src/main/java/org/eclipse/sw360/users/db/UserDatabaseHandler.java b/backend/users/src/main/java/org/eclipse/sw360/users/db/UserDatabaseHandler.java index 70ff41c80b..f99e9279b6 100644 --- a/backend/users/src/main/java/org/eclipse/sw360/users/db/UserDatabaseHandler.java +++ b/backend/users/src/main/java/org/eclipse/sw360/users/db/UserDatabaseHandler.java @@ -35,6 +35,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import static org.eclipse.sw360.datahandler.permissions.PermissionUtils.makePermission; @@ -59,7 +60,7 @@ public class UserDatabaseHandler { private static final String SUCCESS = "SUCCESS"; private static final String FAIL = "FAIL"; private static final String TITLE = "IMPORT"; - private static boolean IMPORT_DEPARTMENT_STATUS = false; + private static final AtomicBoolean IMPORT_DEPARTMENT_STATUS = new AtomicBoolean(false); private List departmentDuplicate; private List emailDoNotExist; DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); @@ -169,10 +170,9 @@ public RequestSummary importFileToDB(String pathFolder) { DepartmentConfigDTO configDTO = readFileDepartmentConfig.readFileJson(); String pathFolderLog = configDTO.getPathFolderLog(); Map> mapArrayList = new HashMap<>(); - if (IMPORT_DEPARTMENT_STATUS) { + if (!IMPORT_DEPARTMENT_STATUS.compareAndSet(false, true)) { return requestSummary.setRequestStatus(RequestStatus.PROCESSING); } - IMPORT_DEPARTMENT_STATUS = true; Calendar calendar = Calendar.getInstance(Locale.getDefault()); String lastRunningTime = dateFormat.format(calendar.getTime()); readFileDepartmentConfig.writeLastRunningTimeConfig(lastRunningTime); @@ -207,19 +207,24 @@ public RequestSummary importFileToDB(String pathFolder) { listFileFail.add(fileName); } } - IMPORT_DEPARTMENT_STATUS = false; requestSummary.setTotalAffectedElements(listFileSuccess.size()); requestSummary.setTotalElements(listFileSuccess.size() + listFileFail.size()); requestSummary.setRequestStatus(RequestStatus.SUCCESS); } catch (IOException e) { - IMPORT_DEPARTMENT_STATUS = false; String msg = "Failed to import department"; requestSummary.setMessage(msg); requestSummary.setRequestStatus(RequestStatus.FAILURE); FileUtil.writeLogToFile(TITLE, "FILE ERROR: " + e.getMessage(), "", pathFolderLog); + } catch (Exception e) { + String msg = "Unexpected error during department import"; + requestSummary.setMessage(msg); + requestSummary.setRequestStatus(RequestStatus.FAILURE); + FileUtil.writeLogToFile(TITLE, "UNEXPECTED ERROR: " + e.getMessage(), "", pathFolderLog); + } finally { + FileUtil.writeLogToFile(TITLE, "[ FILE SUCCESS: " + listFileSuccess.size() + " - " + "FILE FAIL: " + listFileFail.size() + " - " + "TOTAL FILE: " + (listFileSuccess.size() + listFileFail.size()) + " ]", "Complete The File Import", pathFolderLog); + FileUtil.writeLogToFile(TITLE, "END IMPORT DEPARTMENT", "", pathFolderLog); + IMPORT_DEPARTMENT_STATUS.set(false); } - FileUtil.writeLogToFile(TITLE, "[ FILE SUCCESS: " + listFileSuccess.size() + " - " + "FILE FAIL: " + listFileFail.size() + " - " + "TOTAL FILE: " + (listFileSuccess.size() + listFileFail.size()) + " ]", "Complete The File Import", pathFolderLog); - FileUtil.writeLogToFile(TITLE, "END IMPORT DEPARTMENT", "", pathFolderLog); return requestSummary; }