IGNITE-10381 Fixed U.doInParallel not to terminate early - Fixes #5483. Signed-off-by: Alexey Goncharuk <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/97d24226 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/97d24226 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/97d24226 Branch: refs/heads/ignite-9720 Commit: 97d242263a2b2f8f2c6677df1007a6bd3188522b Parents: ae5bfad Author: Alexey Goncharuk <[email protected]> Authored: Fri Nov 23 19:11:31 2018 +0300 Committer: Alexey Goncharuk <[email protected]> Committed: Fri Nov 23 19:11:31 2018 +0300 ---------------------------------------------------------------------- .../GridCachePartitionExchangeManager.java | 4 +- .../GridDhtPartitionsExchangeFuture.java | 3 +- .../ignite/internal/util/IgniteUtils.java | 189 +++---------------- ...ynamicCacheStartFailWithPersistenceTest.java | 1 + .../internal/util/IgniteUtilsSelfTest.java | 43 ----- 5 files changed, 34 insertions(+), 206 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/97d24226/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java index fed5686..6dad367 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java @@ -2906,8 +2906,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana "topVer=" + exchFut.initialVersion() + ", node=" + cctx.localNodeId() + "]. " + (curTimeout <= 0 && !txRolledBack ? "Consider changing " + - "TransactionConfiguration.txTimeoutOnPartitionMapSynchronization" + - " to non default value to avoid this message. " : "") + + "TransactionConfiguration.txTimeoutOnPartitionMapSynchronization" + + " to non default value to avoid this message. " : "") + "Dumping pending objects that might be the cause: "); try { http://git-wip-us.apache.org/repos/asf/ignite/blob/97d24226/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java index 9d81405..3384bb9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java @@ -1189,7 +1189,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte // This exception will be handled by init() method. throw e; - U.error(log, "Failed to initialize cache(s) (will try to rollback). " + exchId, e); + U.error(log, "Failed to initialize cache(s) (will try to rollback) [exchId=" + exchId + + ", caches=" + exchActions.cacheGroupsToStart() + ']', e); exchangeLocE = new IgniteCheckedException( "Failed to initialize exchange locally [locNodeId=" + cctx.localNodeId() + "]", e); http://git-wip-us.apache.org/repos/asf/ignite/blob/97d24226/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index f1f4253..2d6b584 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -202,7 +202,6 @@ import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -221,7 +220,6 @@ import java.util.Random; import java.util.ServiceLoader; import java.util.Set; import java.util.StringTokenizer; -import java.util.TimeZone; import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.BrokenBarrierException; @@ -7193,137 +7191,6 @@ public abstract class IgniteUtils { } /** - * - * @param str ISO date. - * @return Calendar instance. - * @throws IgniteCheckedException Thrown in case of any errors. - */ - public static Calendar parseIsoDate(String str) throws IgniteCheckedException { - StringTokenizer t = new StringTokenizer(str, "+-:.TZ", true); - - Calendar cal = Calendar.getInstance(); - cal.clear(); - - try { - if (t.hasMoreTokens()) - cal.set(Calendar.YEAR, Integer.parseInt(t.nextToken())); - else - return cal; - - if (checkNextToken(t, "-", str) && t.hasMoreTokens()) - cal.set(Calendar.MONTH, Integer.parseInt(t.nextToken()) - 1); - else - return cal; - - if (checkNextToken(t, "-", str) && t.hasMoreTokens()) - cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(t.nextToken())); - else - return cal; - - if (checkNextToken(t, "T", str) && t.hasMoreTokens()) - cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(t.nextToken())); - else { - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - return cal; - } - - if (checkNextToken(t, ":", str) && t.hasMoreTokens()) - cal.set(Calendar.MINUTE, Integer.parseInt(t.nextToken())); - else { - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - return cal; - } - - if (!t.hasMoreTokens()) - return cal; - - String tok = t.nextToken(); - - if (":".equals(tok)) { // Seconds. - if (t.hasMoreTokens()) { - cal.set(Calendar.SECOND, Integer.parseInt(t.nextToken())); - - if (!t.hasMoreTokens()) - return cal; - - tok = t.nextToken(); - - if (".".equals(tok)) { - String nt = t.nextToken(); - - while (nt.length() < 3) - nt += "0"; - - nt = nt.substring(0, 3); // Cut trailing chars. - - cal.set(Calendar.MILLISECOND, Integer.parseInt(nt)); - - if (!t.hasMoreTokens()) - return cal; - - tok = t.nextToken(); - } - else - cal.set(Calendar.MILLISECOND, 0); - } - else - throw new IgniteCheckedException("Invalid date format: " + str); - } - else { - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - } - - if (!"Z".equals(tok)) { - if (!"+".equals(tok) && !"-".equals(tok)) - throw new IgniteCheckedException("Invalid date format: " + str); - - boolean plus = "+".equals(tok); - - if (!t.hasMoreTokens()) - throw new IgniteCheckedException("Invalid date format: " + str); - - tok = t.nextToken(); - - int tzHour; - int tzMin; - - if (tok.length() == 4) { - tzHour = Integer.parseInt(tok.substring(0, 2)); - tzMin = Integer.parseInt(tok.substring(2, 4)); - } - else { - tzHour = Integer.parseInt(tok); - - if (checkNextToken(t, ":", str) && t.hasMoreTokens()) - tzMin = Integer.parseInt(t.nextToken()); - else - throw new IgniteCheckedException("Invalid date format: " + str); - } - - if (plus) - cal.set(Calendar.ZONE_OFFSET, (tzHour * 60 + tzMin) * 60 * 1000); - else - cal.set(Calendar.ZONE_OFFSET, -(tzHour * 60 + tzMin) * 60 * 1000); - } - else - cal.setTimeZone(TimeZone.getTimeZone("GMT")); - } - catch (NumberFormatException ex) { - throw new IgniteCheckedException("Invalid date format: " + str, ex); - } - - return cal; - } - - /** * Adds values to collection and returns the same collection to allow chaining. * * @param c Collection to add values to. @@ -7429,20 +7296,6 @@ public abstract class IgniteUtils { } /** - * Parses passed string with specified date. - * - * @param src String to parse. - * @param ptrn Pattern. - * @return Parsed date. - * @throws java.text.ParseException If exception occurs while parsing. - */ - public static Date parse(String src, String ptrn) throws java.text.ParseException { - java.text.DateFormat format = new java.text.SimpleDateFormat(ptrn); - - return format.parse(src); - } - - /** * Checks if class loader is an internal P2P class loader. * * @param o Object to check. @@ -10841,7 +10694,7 @@ public abstract class IgniteUtils { batch.result(res); } - catch (IgniteCheckedException e) { + catch (Throwable e) { batch.result(e); } } @@ -10854,10 +10707,7 @@ public abstract class IgniteUtils { Throwable err = batch.error; if (err != null) { - if (error == null) - error = err; - else - error.addSuppressed(err); + error = addSuppressed(error, err); continue; } @@ -10875,16 +10725,10 @@ public abstract class IgniteUtils { throw new IgniteInterruptedCheckedException(e); } catch (ExecutionException e) { - if(error == null) - error = e.getCause(); - else - error.addSuppressed(e.getCause()); + error = addSuppressed(error, e.getCause()); } catch (CancellationException e) { - if(error == null) - error = e; - else - error.addSuppressed(e); + error = addSuppressed(error, e); } } @@ -10905,6 +10749,31 @@ public abstract class IgniteUtils { } /** + * Utility method to add the given throwable error to the given throwable root error. If the given + * suppressed throwable is an {@code Error}, but the root error is not, will change the root to the {@code Error}. + * + * @param root Root error to add suppressed error to. + * @param err Error to add. + * @return New root error. + */ + private static Throwable addSuppressed(Throwable root, Throwable err) { + assert err != null; + + if (root == null) + return err; + + if (err instanceof Error && !(root instanceof Error)) { + err.addSuppressed(root); + + root = err; + } + else + root.addSuppressed(err); + + return root; + } + + /** * The batch of tasks with a batch index in global array. */ private static class Batch<T,R> { http://git-wip-us.apache.org/repos/asf/ignite/blob/97d24226/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteDynamicCacheStartFailWithPersistenceTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteDynamicCacheStartFailWithPersistenceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteDynamicCacheStartFailWithPersistenceTest.java index 24c9342..8643b66 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteDynamicCacheStartFailWithPersistenceTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteDynamicCacheStartFailWithPersistenceTest.java @@ -34,6 +34,7 @@ public class IgniteDynamicCacheStartFailWithPersistenceTest extends IgniteAbstra return 5 * 60 * 1000; } + /** {@inheritDoc} */ @Override protected boolean persistenceEnabled() { return true; } http://git-wip-us.apache.org/repos/asf/ignite/blob/97d24226/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsSelfTest.java index 39bb21ea..310705b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsSelfTest.java @@ -38,7 +38,6 @@ import java.net.URL; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -401,48 +400,6 @@ public class IgniteUtilsSelfTest extends GridCommonAbstractTest { } /** - * - * @throws Exception If failed. - */ - public void testParseIsoDate() throws Exception { - Calendar cal = U.parseIsoDate("2009-12-08T13:30:44.000Z"); - - assert cal.get(Calendar.YEAR) == 2009; - assert cal.get(Calendar.MONTH) == 11; - assert cal.get(Calendar.DAY_OF_MONTH) == 8; - assert cal.get(Calendar.HOUR_OF_DAY) == 13; - assert cal.get(Calendar.MINUTE) == 30; - assert cal.get(Calendar.SECOND) == 44; - assert cal.get(Calendar.MILLISECOND) == 0; - assert cal.get(Calendar.ZONE_OFFSET) == 0 : - "Unexpected value: " + cal.get(Calendar.ZONE_OFFSET); - - cal = U.parseIsoDate("2009-12-08T13:30:44.000+03:00"); - - assert cal.get(Calendar.YEAR) == 2009; - assert cal.get(Calendar.MONTH) == 11; - assert cal.get(Calendar.DAY_OF_MONTH) == 8; - assert cal.get(Calendar.HOUR_OF_DAY) == 13; - assert cal.get(Calendar.MINUTE) == 30; - assert cal.get(Calendar.SECOND) == 44; - assert cal.get(Calendar.MILLISECOND) == 0; - assert cal.get(Calendar.ZONE_OFFSET) == 3 * 60 * 60 * 1000 : - "Unexpected value: " + cal.get(Calendar.ZONE_OFFSET); - - cal = U.parseIsoDate("2009-12-08T13:30:44.000+0300"); - - assert cal.get(Calendar.YEAR) == 2009; - assert cal.get(Calendar.MONTH) == 11; - assert cal.get(Calendar.DAY_OF_MONTH) == 8; - assert cal.get(Calendar.HOUR_OF_DAY) == 13; - assert cal.get(Calendar.MINUTE) == 30; - assert cal.get(Calendar.SECOND) == 44; - assert cal.get(Calendar.MILLISECOND) == 0; - assert cal.get(Calendar.ZONE_OFFSET) == 3 * 60 * 60 * 1000 : - "Unexpected value: " + cal.get(Calendar.ZONE_OFFSET); - } - - /** * @throws Exception If test failed. */ public void testPeerDeployAware0() throws Exception {
