From e98698cd894da9a2624bc8a5c460e54bb5cacf47 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sat, 10 Nov 2018 23:21:17 -0200 Subject: [PATCH] IDEMPIERE-2771 implement semaphore in internal 2packs to avoid multiple servers applying same 2pack / Fixes for semaphore implementation --- .../plugin/utils/AbstractActivator.java | 21 +++++++++++++------ .../plugin/utils/AdempiereActivator.java | 11 +++++----- .../utils/Incremental2PackActivator.java | 15 ++++++------- .../utils/PackInApplicationActivator.java | 20 +++++++++--------- .../plugin/utils/Version2PackActivator.java | 11 +++++----- 5 files changed, 45 insertions(+), 33 deletions(-) diff --git a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AbstractActivator.java b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AbstractActivator.java index 53f03f4b7a..9d049f8482 100644 --- a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AbstractActivator.java +++ b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AbstractActivator.java @@ -43,7 +43,7 @@ public abstract class AbstractActivator implements BundleActivator, ServiceTrack protected BundleContext context; protected ServiceTracker serviceTracker; protected IDictionaryService service; - private String trxName = ""; + private String trxName = null; private ProcessInfo m_processInfo = null; private IProcessUI m_processUI = null; @@ -54,7 +54,7 @@ public abstract class AbstractActivator implements BundleActivator, ServiceTrack service.merge(context, zipfile); success = true; } else { - logger.log(Level.SEVERE, "The file was previously installed: " + zipfile.getName()); + logger.log(Level.WARNING, "The file was previously installed: " + zipfile.getName()); } return success; @@ -77,7 +77,7 @@ public abstract class AbstractActivator implements BundleActivator, ServiceTrack addLog(Level.SEVERE, "Could not find an IDictionaryService to process the zip files"); } } else { - addLog(Level.SEVERE, "The file was previously installed: " + zipfile.getName()); + addLog(Level.WARNING, "The file was previously installed: " + zipfile.getName()); success = true; } @@ -107,15 +107,24 @@ public abstract class AbstractActivator implements BundleActivator, ServiceTrack while(maxAttempts > 0 && !lockAcquired) { maxAttempts --; - if (getDBLock(timeout)) - lockAcquired = true; + if (logger.isLoggable(Level.INFO)) logger.log(Level.INFO, "Acquiring lock with timeout " + timeout + " for " + getName() + " / remaining attempts " + maxAttempts); + try { + if (getDBLock(timeout)) + lockAcquired = true; + } catch (Exception e) { + // Timeout throws DBException, ignore and try again + releaseLock(); + } } return lockAcquired; } public void releaseLock() { - Trx.get(trxName, false).close(); + if (trxName != null) { + Trx.get(trxName, false).close(); + trxName = null; + } } private boolean getDBLock(int timeout) throws AdempiereSystemError { diff --git a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AdempiereActivator.java b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AdempiereActivator.java index 0c366700ed..97fa3b0f8a 100644 --- a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AdempiereActivator.java +++ b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/AdempiereActivator.java @@ -60,16 +60,17 @@ public class AdempiereActivator extends AbstractActivator { if (pkg == null) { try { if (getDBLock()) { - System.out.println("Installing " + getName() + " " + version + " ..."); + logger.log(Level.WARNING, "Installing " + getName() + " " + version + " ..."); packIn(); install(); - releaseLock(); - System.out.println(getName() + " " + version + " installed."); + logger.log(Level.WARNING, getName() + " " + version + " installed."); } else { - logger.log(Level.SEVERE, "Could not acquire the DB lock to install:" + getName()); + logger.log(Level.WARNING, "Could not acquire the DB lock to install:" + getName()); } } catch (AdempiereSystemError e) { e.printStackTrace(); + } finally { + releaseLock(); } } else { if (logger.isLoggable(Level.INFO)) logger.info(getName() + " " + version + " was installed: " @@ -121,7 +122,7 @@ public class AdempiereActivator extends AbstractActivator { // call 2pack merge(zipfile, getPKVersion()); } catch (Throwable e) { - logger.log(Level.SEVERE, "Pack in failed.", e); + logger.log(Level.WARNING, "Pack in failed.", e); } finally{ if (zipstream != null) { diff --git a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Incremental2PackActivator.java b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Incremental2PackActivator.java index ea6197482f..a6fc44cc55 100644 --- a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Incremental2PackActivator.java +++ b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Incremental2PackActivator.java @@ -157,7 +157,7 @@ public class Incremental2PackActivator extends AbstractActivator { } } if (patch) { - System.out.println("Patch Meta Data for " + getName() + " " + entry.version + " ..."); + logger.log(Level.WARNING, "Patch Meta Data for " + getName() + " " + entry.version + " ..."); X_AD_Package_Imp pi = new X_AD_Package_Imp(Env.getCtx(), 0, trx.getTrxName()); pi.setName(getName()); @@ -175,7 +175,7 @@ public class Incremental2PackActivator extends AbstractActivator { trx.commit(true); } catch (Exception e) { trx.rollback(); - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); + logger.log(Level.WARNING, e.getLocalizedMessage(), e); } finally { trx.close(); } @@ -197,12 +197,13 @@ public class Incremental2PackActivator extends AbstractActivator { } } } - releaseLock(); } else { - logger.log(Level.SEVERE, "Could not acquire the DB lock to install:" + getName()); + logger.log(Level.WARNING, "Could not acquire the DB lock to install:" + getName()); } } catch (AdempiereSystemError e) { e.printStackTrace(); + } finally { + releaseLock(); } } @@ -220,7 +221,7 @@ public class Incremental2PackActivator extends AbstractActivator { MSession.get(Env.getCtx(), true); String path = packout.getPath(); String suffix = "_"+path.substring(path.lastIndexOf("2Pack_")); - System.out.println("Installing " + getName() + " " + path + " ..."); + logger.log(Level.WARNING, "Installing " + getName() + " " + path + " ..."); FileOutputStream zipstream = null; try { // copy the resource to a temporary file to process it with 2pack @@ -236,7 +237,7 @@ public class Incremental2PackActivator extends AbstractActivator { if (!merge(zipfile, extractVersionString(packout))) return false; } catch (Throwable e) { - logger.log(Level.SEVERE, "Pack in failed.", e); + logger.log(Level.WARNING, "Pack in failed.", e); return false; } finally{ if (zipstream != null) { @@ -245,7 +246,7 @@ public class Incremental2PackActivator extends AbstractActivator { } catch (Exception e2) {} } } - System.out.println(getName() + " " + packout.getPath() + " installed"); + logger.log(Level.WARNING, getName() + " " + packout.getPath() + " installed"); } return true; } diff --git a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java index 1619cf7b6d..fc7615fa5e 100644 --- a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java +++ b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java @@ -167,19 +167,19 @@ public class PackInApplicationActivator extends AbstractActivator { currentFile = zipFile; if (!packIn(zipFile)) { // stop processing further packages if one fail - addLog(Level.SEVERE, "Failed application of " + zipFile); + addLog(Level.WARNING, "Failed application of " + zipFile); break; } addLog(Level.INFO, "Successful application of " + zipFile); filesToProcess.remove(zipFile); } } else { - addLog(Level.SEVERE, "Could not acquire the DB lock to automatically install the packins"); + addLog(Level.WARNING, "Could not acquire the DB lock to automatically install the packins"); return; } } catch (AdempiereSystemError e) { e.printStackTrace(); - addLog(Level.SEVERE, e.getLocalizedMessage()); + addLog(Level.WARNING, e.getLocalizedMessage()); } finally { releaseLock(); } @@ -212,7 +212,7 @@ public class PackInApplicationActivator extends AbstractActivator { seedClientValue = clientValue.split("-")[2]; seedClientIDs = getClientIDs(seedClientValue); if (seedClientIDs.length == 0) { - logger.log(Level.SEVERE, "Seed client does not exist: " + seedClientValue); + logger.log(Level.WARNING, "Seed client does not exist: " + seedClientValue); return false; } } @@ -234,7 +234,7 @@ public class PackInApplicationActivator extends AbstractActivator { } else { clientIDs = getClientIDs(clientValue); if (clientIDs.length == 0) { - logger.log(Level.SEVERE, "Client does not exist: " + clientValue); + logger.log(Level.WARNING, "Client does not exist: " + clientValue); return false; } } @@ -258,7 +258,7 @@ public class PackInApplicationActivator extends AbstractActivator { } } } catch (Throwable e) { - logger.log(Level.SEVERE, "Pack in failed.", e); + logger.log(Level.WARNING, "Pack in failed.", e); return false; } finally { Env.setContext(Env.getCtx(), "#AD_Client_ID", 0); @@ -299,7 +299,7 @@ public class PackInApplicationActivator extends AbstractActivator { for (String filePath : filePaths) { File toProcess = new File(filePath.trim()); if (!toProcess.exists()) { - addLog(Level.SEVERE, filePath + " does not exist"); + addLog(Level.WARNING, filePath + " does not exist"); continue; } @@ -326,7 +326,7 @@ public class PackInApplicationActivator extends AbstractActivator { if (toProcess.getName().toLowerCase().endsWith(".zip")) filesToProcess.add(toProcess); else { - logger.log(Level.SEVERE, toProcess.getName() + " is not a valid .zip file"); + logger.log(Level.WARNING, toProcess.getName() + " is not a valid .zip file"); return; } } else if (toProcess.isDirectory() && toProcess.canRead()) { @@ -350,7 +350,7 @@ public class PackInApplicationActivator extends AbstractActivator { if (fileToProcess.canRead()) { filesToProcess.add(fileToProcess); } else { - addLog(Level.SEVERE, fileToProcess.getName() + " not readable"); + addLog(Level.WARNING, fileToProcess.getName() + " not readable"); } } } @@ -359,7 +359,7 @@ public class PackInApplicationActivator extends AbstractActivator { return; } } else { - addLog(Level.SEVERE, toProcess.getName() + " not a file or folder or not readable"); + addLog(Level.WARNING, toProcess.getName() + " not a file or folder or not readable"); } } diff --git a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Version2PackActivator.java b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Version2PackActivator.java index b4d0162d64..c8756cb95e 100644 --- a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Version2PackActivator.java +++ b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/Version2PackActivator.java @@ -169,12 +169,13 @@ public class Version2PackActivator extends AbstractActivator { break; } } - releaseLock(); } else { - logger.log(Level.SEVERE, "Could not acquire the DB lock to install:" + getName()); + logger.log(Level.WARNING, "Could not acquire the DB lock to install:" + getName()); } } catch (AdempiereSystemError e) { e.printStackTrace(); + } finally { + releaseLock(); } } @@ -190,7 +191,7 @@ public class Version2PackActivator extends AbstractActivator { if (packout != null && service != null) { String path = packout.getPath(); String suffix = "_"+path.substring(path.lastIndexOf("2Pack_")); - System.out.println("Installing " + getName() + " " + path + " ..."); + logger.log(Level.WARNING, "Installing " + getName() + " " + path + " ..."); FileOutputStream zipstream = null; try { // copy the resource to a temporary file to process it with 2pack @@ -206,7 +207,7 @@ public class Version2PackActivator extends AbstractActivator { if (!merge(zipfile, extractVersionString(packout))) return false; } catch (Throwable e) { - logger.log(Level.SEVERE, "Pack in failed.", e); + logger.log(Level.WARNING, "Pack in failed.", e); return false; } finally{ if (zipstream != null) { @@ -215,7 +216,7 @@ public class Version2PackActivator extends AbstractActivator { } catch (Exception e2) {} } } - System.out.println(getName() + " " + packout.getPath() + " installed"); + logger.log(Level.WARNING, getName() + " " + packout.getPath() + " installed"); } return true; }