You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2018/10/29 13:33:26 UTC
ignite git commit: IGNITE-10004: MVCC: Do not rollback transaction in
case of parsing error. This closes #5088.
Repository: ignite
Updated Branches:
refs/heads/master 2ad04930d -> ac093b9e3
IGNITE-10004: MVCC: Do not rollback transaction in case of parsing error. This closes #5088.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ac093b9e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ac093b9e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ac093b9e
Branch: refs/heads/master
Commit: ac093b9e343f1f599054406c5421c0cd921392dd
Parents: 2ad0493
Author: AMRepo <an...@gmail.com>
Authored: Mon Oct 29 16:33:18 2018 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Mon Oct 29 16:33:18 2018 +0300
----------------------------------------------------------------------
.../jdbc/thin/JdbcThinTransactionsSelfTest.java | 28 ++++++++++++
.../processors/query/h2/IgniteH2Indexing.java | 7 ++-
.../mvcc/CacheMvccSqlTxQueriesAbstractTest.java | 48 ++++++++++++++++++++
3 files changed, 82 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/ac093b9e/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java
index 1d68712..783a8cd 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java
@@ -444,4 +444,32 @@ public class JdbcThinTransactionsSelfTest extends JdbcThinAbstractSelfTest {
}
}
}
+
+ /**
+ * Test that exception in one of the statements does not kill connection worker altogether.
+ * @throws SQLException if failed.
+ */
+ @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+ public void testParsingErrorHasNoSideEffect() throws SQLException {
+ try (Connection c = c(false, NestedTxMode.ERROR)) {
+ try (Statement s = c.createStatement()) {
+ s.execute("INSERT INTO INTS(k, v) values(1, 1)");
+
+ GridTestUtils.assertThrows(null, new Callable<Void>() {
+ @Override public Void call() throws Exception {
+ s.execute("INSERT INTO INTS(k, v) values(1)");
+
+ return null;
+ }
+ }, SQLException.class, "Failed to parse query");
+
+ s.execute("INSERT INTO INTS(k, v) values(2, 2)");
+
+ c.commit();
+ }
+
+ assertEquals(1, grid(0).cache("ints").get(1));
+ assertEquals(2, grid(0).cache("ints").get(2));
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/ac093b9e/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 3194eed..866ae99 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -85,6 +85,7 @@ import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
import org.apache.ignite.internal.processors.cache.query.QueryTable;
import org.apache.ignite.internal.processors.cache.query.SqlFieldsQueryEx;
import org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter;
+import org.apache.ignite.internal.processors.odbc.SqlStateCode;
import org.apache.ignite.internal.processors.query.CacheQueryObjectValueContext;
import org.apache.ignite.internal.processors.query.GridQueryCacheObjectsIterator;
import org.apache.ignite.internal.processors.query.GridQueryCancel;
@@ -2202,8 +2203,12 @@ public class IgniteH2Indexing implements GridQueryIndexing {
catch (RuntimeException | Error e) {
GridNearTxLocal tx;
- if (mvccEnabled && (tx = tx(ctx)) != null)
+ if (mvccEnabled && (tx = tx(ctx)) != null &&
+ (!(e instanceof IgniteSQLException) || /* Parsing errors should not rollback Tx. */
+ ((IgniteSQLException)e).sqlState() != SqlStateCode.PARSING_EXCEPTION) ) {
+
tx.setRollbackOnly();
+ }
throw e;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/ac093b9e/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlTxQueriesAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlTxQueriesAbstractTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlTxQueriesAbstractTest.java
index 053d370..b71dd26 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlTxQueriesAbstractTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlTxQueriesAbstractTest.java
@@ -50,6 +50,7 @@ import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter;
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
import org.apache.ignite.internal.processors.cache.query.SqlFieldsQueryEx;
import org.apache.ignite.internal.processors.query.IgniteSQLException;
import org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException;
@@ -237,6 +238,53 @@ public abstract class CacheMvccSqlTxQueriesAbstractTest extends CacheMvccAbstrac
/**
* @throws Exception If failed.
*/
+ public void testParsingErrorHasNoSideEffect() throws Exception {
+ ccfg = cacheConfiguration(cacheMode(), FULL_SYNC, 0, 4)
+ .setIndexedTypes(Integer.class, Integer.class);
+
+ IgniteEx node = startGrid(0);
+
+ IgniteCache<Object, Object> cache = node.cache(DEFAULT_CACHE_NAME);
+
+ try (Transaction tx = node.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ tx.timeout(TX_TIMEOUT);
+
+ SqlFieldsQuery qry = new SqlFieldsQuery("INSERT INTO Integer (_key, _val) values (1),(2,2),(3,3)");
+
+ try {
+ try (FieldsQueryCursor<List<?>> cur = cache.query(qry)) {
+ fail("We should not get there.");
+ }
+ }
+ catch (CacheException ex){
+ IgniteSQLException cause = X.cause(ex, IgniteSQLException.class);
+
+ assertNotNull(cause);
+ assertEquals(IgniteQueryErrorCode.PARSING, cause.statusCode());
+
+ assertFalse(tx.isRollbackOnly());
+ }
+
+ qry = new SqlFieldsQuery("INSERT INTO Integer (_key, _val) values (4,4),(5,5),(6,6)");
+
+ try (FieldsQueryCursor<List<?>> cur = cache.query(qry)) {
+ assertEquals(3L, cur.iterator().next().get(0));
+ }
+
+ tx.commit();
+ }
+
+ assertNull(cache.get(1));
+ assertNull(cache.get(2));
+ assertNull(cache.get(3));
+ assertEquals(4, cache.get(4));
+ assertEquals(5, cache.get(5));
+ assertEquals(6, cache.get(6));
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
public void testQueryInsertStaticCache() throws Exception {
ccfg = cacheConfiguration(cacheMode(), FULL_SYNC, 2, DFLT_PARTITION_COUNT)
.setIndexedTypes(Integer.class, Integer.class);