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 2017/10/09 19:17:32 UTC
ignite git commit: IGNITE-6569: Fixed hang when trying to execute
"DROP TABLE" on the cache this table belongs to. This closes #2823.
Repository: ignite
Updated Branches:
refs/heads/master 2e5568293 -> 5f67cf25d
IGNITE-6569: Fixed hang when trying to execute "DROP TABLE" on the cache this table belongs to. This closes #2823.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/5f67cf25
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/5f67cf25
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/5f67cf25
Branch: refs/heads/master
Commit: 5f67cf25d6ead0e62ba973be7a6f3cd8cab49678
Parents: 2e55682
Author: Alexander Paschenko <al...@gmail.com>
Authored: Mon Oct 9 22:17:28 2017 +0300
Committer: devozerov <pp...@gmail.com>
Committed: Mon Oct 9 22:17:28 2017 +0300
----------------------------------------------------------------------
.../processors/query/GridQueryProcessor.java | 17 +++++++++++++++
.../cache/index/H2DynamicTableSelfTest.java | 23 ++++++++++++++++++++
2 files changed, 40 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/5f67cf25/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index f044c1d..0d8ee47 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -70,6 +70,7 @@ import org.apache.ignite.internal.processors.cache.StoredCacheData;
import org.apache.ignite.internal.processors.cache.query.CacheQueryFuture;
import org.apache.ignite.internal.processors.cache.query.CacheQueryType;
import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType;
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.processors.query.property.QueryBinaryProperty;
import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitor;
@@ -186,6 +187,9 @@ public class GridQueryProcessor extends GridProcessorAdapter {
/** Pending status messages. */
private final LinkedList<SchemaOperationStatusMessage> pendingMsgs = new LinkedList<>();
+ /** Current cache that has a query running on it. */
+ private final ThreadLocal<GridCacheContext> curCache = new ThreadLocal<>();
+
/** Disconnected flag. */
private boolean disconnected;
@@ -1440,6 +1444,13 @@ public class GridQueryProcessor extends GridProcessorAdapter {
*/
@SuppressWarnings("unchecked")
public void dynamicTableDrop(String cacheName, String tblName, boolean ifExists) throws SchemaOperationException {
+ GridCacheContext currCache = this.curCache.get();
+
+ if (currCache != null && F.eq(currCache.name(), cacheName))
+ throw new IgniteSQLException("DROP TABLE cannot be called from the same cache that holds " +
+ "the table being dropped [cacheName-" + cacheName + ", tblName=" + tblName + ']',
+ IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
+
boolean res = ctx.grid().destroyCache0(cacheName, true);
if (!res && !ifExists)
@@ -1853,6 +1864,10 @@ public class GridQueryProcessor extends GridProcessorAdapter {
if (!busyLock.enterBusy())
throw new IllegalStateException("Failed to execute query (grid is stopping).");
+ GridCacheContext oldCctx = curCache.get();
+
+ curCache.set(cctx);
+
try {
final String schemaName = qry.getSchema() != null ? qry.getSchema() : idx.schema(cctx.name());
final int mainCacheId = CU.cacheId(cctx.name());
@@ -1898,6 +1913,8 @@ public class GridQueryProcessor extends GridProcessorAdapter {
throw new CacheException(e);
}
finally {
+ curCache.set(oldCctx);
+
busyLock.leaveBusy();
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5f67cf25/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
index e0ab6c5..b108bb3 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
@@ -652,6 +652,29 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest {
}
/**
+ * Test that attempting to execute {@code DROP TABLE} via API of cache being dropped yields an error.
+ * @throws Exception if failed.
+ */
+ @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+ public void testCacheSelfDrop() throws Exception {
+ execute("CREATE TABLE IF NOT EXISTS \"Person\" (\"id\" int, \"city\" varchar," +
+ " \"name\" varchar, \"surname\" varchar, \"age\" int, PRIMARY KEY (\"id\", \"city\")) WITH " +
+ "\"template=cache\"");
+
+ GridTestUtils.assertThrows(null, new Callable<Object>() {
+ @Override public Object call() throws Exception {
+ client().cache(QueryUtils.createTableCacheName(QueryUtils.DFLT_SCHEMA, "Person"))
+ .query(new SqlFieldsQuery("DROP TABLE \"Person\"")).getAll();
+
+ return null;
+ }
+ }, IgniteSQLException.class, "DROP TABLE cannot be called from the same cache that holds the table " +
+ "being dropped");
+
+ execute("DROP TABLE \"Person\"");
+ }
+
+ /**
* Test that attempting to {@code DROP TABLE} that does not exist does not yield an error if the statement contains
* {@code IF EXISTS} clause.
*