svn commit: r1144546 - in /ofbiz/branches/release10.04: ./ framework/common/config/ framework/entity/src/org/ofbiz/entity/ framework/entity/src/org/ofbiz/entity/util/

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1144546 - in /ofbiz/branches/release10.04: ./ framework/common/config/ framework/entity/src/org/ofbiz/entity/ framework/entity/src/org/ofbiz/entity/util/

jleroux@apache.org
Author: jleroux
Date: Fri Jul  8 23:18:30 2011
New Revision: 1144546

URL: http://svn.apache.org/viewvc?rev=1144546&view=rev
Log:
"Applied fix from trunk for revision: 1144537"  (a conflict handled by hand)
------------------------------------------------------------------------
r1144537 | jleroux | 2011-07-09 00:58:35 +0200 (sam., 09 juil. 2011) | 8 lines

Closes "SequenceUtil may generate duplicate IDs in Load Balancing mode" https://issues.apache.org/jira/browse/OFBIZ-2353

Pb: If OFBiz is deployed on 2 servers in Load Balancing Mode, SequenceUtil will generate duplicate IDs because synchronization is done at JVM level instead of doing it in DB.

The OFBIZ-2353 SELECT FOR UPDATE solution.patch provides a simple mean to quickly resolve this issue. I did not remove the bank loop (useless since there is a DB contention).
I created a cluster general property. But since, most of the time, when you use a cluster you use also a sole database with a delegator having distributed-cache-clear-enabled set to true, I retrieve this information to automatically use SELECT FOR UPDATE in this case

This has been tested on a cluster with JMeter. BTW I found that UserLoginHistory can throw errors because it does not use a SeqId in PK but only login+fromDate. I guess there are other cases like that but in reality it's unlikely that someone log on 2 diff machines with the  same login at the same time (ms), just a JMeter side effect...
------------------------------------------------------------------------

Modified:
    ofbiz/branches/release10.04/   (props changed)
    ofbiz/branches/release10.04/framework/common/config/general.properties
    ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/Delegator.java
    ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java
    ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/util/SequenceUtil.java

Propchange: ofbiz/branches/release10.04/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 23:18:30 2011
@@ -1,3 +1,3 @@
 /ofbiz/branches/addbirt:831210-885099,885686-886087
 /ofbiz/branches/multitenant20100310:921280-927264
-/ofbiz/trunk:939988,939990,939999,940025,940053,940234,940248,940309,940401,940410,940425,940779,940815,940849,940851,941007,941047,941109,941177,941199,941261,941440,941600,941999,942084,942406,942414,942671,942883-942884,943168,943271-943272,943843,944614,944621,944623,944647,944669,944797,944895,945010,945018,945026,945118,945573,945578,945580,945582,945610,945619,945848,945852,945857,946061,946066,946073,946075,946080,946309,946313,946320,946322,946596,947004-947005,947392,947424,947679,947988,948017,948694,949174,949710,949844,950866,950870,950893,951005,951062,951098,951251,951367,951381,951672,952232,952249,952270,953294,953671,954135,954583,954733,954956,955568,956022,956206,956340,957160,958343,958514,958521,958752,958758,958769,958953,959456,960143,960491,960997,963610,964558,965470,965916,966525,966785,967098,978806,978893,978939,979104,980641-980642,980935,981051,981104,981123,981288,983920,983930,985163,985298,985473,985718,985856,985902,987841,989166,990127,990
 339,990539,991485,993344,993387,995384,995686,996069,996078-996079,996563,997418-997420,997423-997425,997431,997440,997526,997990,998061,998412,998557,1000621,1000725,1000998,1001099,1001131,1001185,1001574,1001849,1001962,1002963,1003434,1003450,1003829,1004139,1027756,1027960,1028053,1028625,1028627,1029600,1030016,1030385,1030390,1033928,1033953,1034138,1034179,1035080,1035084,1036426,1036669,1037507,1037559-1037560,1037567,1037883,1038228,1038990,1039256,1040044,1040091,1042009,1042034,1042038,1042132,1042188,1042222,1042317,1042348,1042396,1042411,1042950,1043861,1043996-1043998,1044047,1044084,1044912,1049031,1050602,1051111,1051450,1051812,1052195,1053285,1053289,1053722,1054565,1055057,1056072,1056305,1056803,1057519,1058028,1058056,1058488,1059180,1060236,1060261,1060368,1060933,1061167,1061307,1061346,1061886,1061939,1062138,1062144,1062152,1063273,1064090,1064953,1064993,1065550,1066048,1067097,1067942,1069597,1069965,1070193,1070229,1072017,1072378,1074624,107520
 5,1075952,1076027,1076115,1080218,1080959,1083144,1084572,1084671,1084689,1084855,1085697,1085774,1090952,1090961,1090964,1092479,1094126,1096441,1098063,1104423,1131144,1132589,1132749,1134649,1134990,1135199,1135686,1137201,1137435,1139346,1139385,1139504,1140358,1140362,1140375,1140469
+/ofbiz/trunk:939988,939990,939999,940025,940053,940234,940248,940309,940401,940410,940425,940779,940815,940849,940851,941007,941047,941109,941177,941199,941261,941440,941600,941999,942084,942406,942414,942671,942883-942884,943168,943271-943272,943843,944614,944621,944623,944647,944669,944797,944895,945010,945018,945026,945118,945573,945578,945580,945582,945610,945619,945848,945852,945857,946061,946066,946073,946075,946080,946309,946313,946320,946322,946596,947004-947005,947392,947424,947679,947988,948017,948694,949174,949710,949844,950866,950870,950893,951005,951062,951098,951251,951367,951381,951672,952232,952249,952270,953294,953671,954135,954583,954733,954956,955568,956022,956206,956340,957160,958343,958514,958521,958752,958758,958769,958953,959456,960143,960491,960997,963610,964558,965470,965916,966525,966785,967098,978806,978893,978939,979104,980641-980642,980935,981051,981104,981123,981288,983920,983930,985163,985298,985473,985718,985856,985902,987841,989166,990127,990
 339,990539,991485,993344,993387,995384,995686,996069,996078-996079,996563,997418-997420,997423-997425,997431,997440,997526,997990,998061,998412,998557,1000621,1000725,1000998,1001099,1001131,1001185,1001574,1001849,1001962,1002963,1003434,1003450,1003829,1004139,1027756,1027960,1028053,1028625,1028627,1029600,1030016,1030385,1030390,1033928,1033953,1034138,1034179,1035080,1035084,1036426,1036669,1037507,1037559-1037560,1037567,1037883,1038228,1038990,1039256,1040044,1040091,1042009,1042034,1042038,1042132,1042188,1042222,1042317,1042348,1042396,1042411,1042950,1043861,1043996-1043998,1044047,1044084,1044912,1049031,1050602,1051111,1051450,1051812,1052195,1053285,1053289,1053722,1054565,1055057,1056072,1056305,1056803,1057519,1058028,1058056,1058488,1059180,1060236,1060261,1060368,1060933,1061167,1061307,1061346,1061886,1061939,1062138,1062144,1062152,1063273,1064090,1064953,1064993,1065550,1066048,1067097,1067942,1069597,1069965,1070193,1070229,1072017,1072378,1074624,107520
 5,1075952,1076027,1076115,1080218,1080959,1083144,1084572,1084671,1084689,1084855,1085697,1085774,1090952,1090961,1090964,1092479,1094126,1096441,1098063,1104423,1131144,1132589,1132749,1134649,1134990,1135199,1135686,1137201,1137435,1139346,1139385,1139504,1140358,1140362,1140375,1140469,1144537

Modified: ofbiz/branches/release10.04/framework/common/config/general.properties
URL: http://svn.apache.org/viewvc/ofbiz/branches/release10.04/framework/common/config/general.properties?rev=1144546&r1=1144545&r2=1144546&view=diff
==============================================================================
--- ofbiz/branches/release10.04/framework/common/config/general.properties (original)
+++ ofbiz/branches/release10.04/framework/common/config/general.properties Fri Jul  8 23:18:30 2011
@@ -129,4 +129,7 @@ https.localhost=ABQIAAAAtt0d8djaYFkk8N5L
 http.localhost=ABQIAAAAtt0d8djaYFkk8N5LJVcDSBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxR3euHYk9bpwvdF2Qg1EYO1LQitHA
 
 # -- Y if you want to display the multi-tenant textbox in the login page
-multitenant=N
\ No newline at end of file
+multitenant=N
+
+# -- Y if you use a cluster
+cluster=N

Modified: ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/Delegator.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/Delegator.java?rev=1144546&r1=1144545&r2=1144546&view=diff
==============================================================================
--- ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/Delegator.java (original)
+++ ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/Delegator.java Fri Jul  8 23:18:30 2011
@@ -1222,4 +1222,10 @@ public interface Delegator {
      */
     public boolean getEnabledJMS();
     
+    /**
+     * Get use of Distributed Cache Clear mechanism status
+     * @return boolean true if this delegator uses a Distributed Cache Clear mechanism
+     */
+    public boolean useDistributedCacheClear();
+    
 }

Modified: ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java?rev=1144546&r1=1144545&r2=1144546&view=diff
==============================================================================
--- ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java (original)
+++ ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java Fri Jul  8 23:18:30 2011
@@ -2415,7 +2415,7 @@ public class GenericDelegator implements
                 synchronized (this) {
                     if (sequencer == null) {
                         ModelEntity seqEntity = this.getModelEntity("SequenceValueItem");
-                        sequencer = new SequenceUtil(this.getEntityHelperInfo("SequenceValueItem"), seqEntity, "seqName", "seqId");
+                        sequencer = new SequenceUtil(this, this.getEntityHelperInfo("SequenceValueItem"), seqEntity, "seqName", "seqId");
                     }
                 }
             }
@@ -2856,4 +2856,12 @@ public class GenericDelegator implements
     public boolean getEnabledJMS() {
         return this.enableJMS;
     }
+    
+    /* (non-Javadoc)
+     * @see org.ofbiz.entity.Delegator#getEnableJMS()
+     */
+    public boolean useDistributedCacheClear() {
+        return this.getDelegatorInfo().useDistributedCacheClear;
+    }
+    
 }

Modified: ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/util/SequenceUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/util/SequenceUtil.java?rev=1144546&r1=1144545&r2=1144546&view=diff
==============================================================================
--- ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/util/SequenceUtil.java (original)
+++ ofbiz/branches/release10.04/framework/entity/src/org/ofbiz/entity/util/SequenceUtil.java Fri Jul  8 23:18:30 2011
@@ -28,6 +28,8 @@ import java.util.Map;
 import javax.transaction.Transaction;
 
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.entity.GenericDelegator;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.datasource.GenericHelperInfo;
 import org.ofbiz.entity.jdbc.ConnectionFactory;
@@ -50,8 +52,9 @@ public class SequenceUtil {
     private final String tableName;
     private final String nameColName;
     private final String idColName;
+    private final boolean clustered;
 
-    public SequenceUtil(GenericHelperInfo helperInfo, ModelEntity seqEntity, String nameFieldName, String idFieldName) {
+    public SequenceUtil(GenericDelegator delegator, GenericHelperInfo helperInfo, ModelEntity seqEntity, String nameFieldName, String idFieldName) {
         this.helperInfo = helperInfo;
         if (seqEntity == null) {
             throw new IllegalArgumentException("The sequence model entity was null but is required.");
@@ -76,6 +79,7 @@ public class SequenceUtil {
             bankSize = seqEntity.getSequenceBankSize().longValue();
         }
         this.bankSize = bankSize;
+        clustered = delegator.useDistributedCacheClear() || "Y".equals(UtilProperties.getPropertyValue("general.properties", "clustered"));                
     }
 
     public Long getNextSeqId(String seqName, long staggerMax, ModelEntity seqModelEntity) {
@@ -182,8 +186,8 @@ public class SequenceUtil {
                         this.seqName + "; start of loop val1=" + val1 + ", val2=" + val2 + ", bankSize=" + bankSize, module);
 
                 // not sure if this synchronized block is totally necessary, the method is synchronized but it does do a wait/sleep
-                //outside of this block, and this is the really sensitive block, so making sure it is isolated; there is some overhead
-                //to this, but very bad things can happen if we try to do too many of these at once for a single sequencer
+                // outside of this block, and this is the really sensitive block, so making sure it is isolated; there is some overhead
+                // to this, but very bad things can happen if we try to do too many of these at once for a single sequencer
                 synchronized (this) {
                     Transaction suspendedTransaction = null;
                     try {
@@ -218,8 +222,11 @@ public class SequenceUtil {
                                 // we shouldn't need this, and some TX managers complain about it, so not including it: connection.setAutoCommit(false);
 
                                 stmt = connection.createStatement();
-
-                                sql = "SELECT " + SequenceUtil.this.idColName + " FROM " + SequenceUtil.this.tableName + " WHERE " + SequenceUtil.this.nameColName + "='" + this.seqName + "'";
+                                if (clustered) {
+                                    sql = "SELECT " + SequenceUtil.this.idColName + " FROM " + SequenceUtil.this.tableName + " WHERE " + SequenceUtil.this.nameColName + "='" + this.seqName + "'" + " FOR UPDATE";                                    
+                                } else {
+                                    sql = "SELECT " + SequenceUtil.this.idColName + " FROM " + SequenceUtil.this.tableName + " WHERE " + SequenceUtil.this.nameColName + "='" + this.seqName + "'";
+                                }
                                 rs = stmt.executeQuery(sql);
                                 boolean gotVal1 = false;
                                 if (rs.next()) {
@@ -241,8 +248,12 @@ public class SequenceUtil {
                                 if (stmt.executeUpdate(sql) <= 0) {
                                     throw new GenericEntityException("[SequenceUtil.SequenceBank.fillBank] update failed, no rows changes for seqName: " + seqName);
                                 }
+                                if (clustered) {
+                                    sql = "SELECT " + SequenceUtil.this.idColName + " FROM " + SequenceUtil.this.tableName + " WHERE " + SequenceUtil.this.nameColName + "='" + this.seqName + "'" + " FOR UPDATE";                                    
 
-                                sql = "SELECT " + SequenceUtil.this.idColName + " FROM " + SequenceUtil.this.tableName + " WHERE " + SequenceUtil.this.nameColName + "='" + this.seqName + "'";
+                                } else {
+                                    sql = "SELECT " + SequenceUtil.this.idColName + " FROM " + SequenceUtil.this.tableName + " WHERE " + SequenceUtil.this.nameColName + "='" + this.seqName + "'";
+                                }
                                 rs = stmt.executeQuery(sql);
                                 boolean gotVal2 = false;
                                 if (rs.next()) {