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/03/14 15:31:40 UTC
[1/2] ignite git commit: Improving H2 indexing abstractions.
Repository: ignite
Updated Branches:
refs/heads/ignite-4565-ddl 8ee4716b8 -> 86817195b
Improving H2 indexing abstractions.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/65ff0bf3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/65ff0bf3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/65ff0bf3
Branch: refs/heads/ignite-4565-ddl
Commit: 65ff0bf3d744045c8715a5f8881a61c09e07df34
Parents: 8ee4716
Author: devozerov <vo...@gridgain.com>
Authored: Tue Mar 14 18:24:45 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Mar 14 18:24:45 2017 +0300
----------------------------------------------------------------------
.../processors/query/GridQueryIndexing.java | 12 +-
.../processors/query/GridQueryProcessor.java | 7 +-
.../processors/query/h2/IgniteH2Indexing.java | 29 ++---
.../h2/GridIndexingSpiAbstractSelfTest.java | 116 +++++++++----------
4 files changed, 77 insertions(+), 87 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/65ff0bf3/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
index 299df34..b5a6c6f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
@@ -124,13 +124,13 @@ public interface GridQueryIndexing {
*
* @param spaceName Space name.
* @param qry Text query.
- * @param type Query return type.
+ * @param typeName Type name.
* @param filter Space name and key filter.
* @return Queried rows.
* @throws IgniteCheckedException If failed.
*/
public <K, V> GridCloseableIterator<IgniteBiTuple<K, V>> queryLocalText(@Nullable String spaceName, String qry,
- GridQueryTypeDescriptor type, IndexingQueryFilter filter) throws IgniteCheckedException;
+ String typeName, IndexingQueryFilter filter) throws IgniteCheckedException;
/**
* Registers cache.
@@ -165,24 +165,24 @@ public interface GridQueryIndexing {
* Unregisters type and removes all corresponding data.
*
* @param spaceName Space name.
- * @param type Type descriptor.
+ * @param typeName Type name.
* @throws IgniteCheckedException If failed.
*/
- public void unregisterType(@Nullable String spaceName, GridQueryTypeDescriptor type) throws IgniteCheckedException;
+ public void unregisterType(@Nullable String spaceName, String typeName) throws IgniteCheckedException;
/**
* Updates index. Note that key is unique for space, so if space contains multiple indexes
* the key should be removed from indexes other than one being updated.
*
* @param spaceName Space name.
- * @param type Value type.
+ * @param typeName Type name.
* @param key Key.
* @param val Value.
* @param ver Version.
* @param expirationTime Expiration time or 0 if never expires.
* @throws IgniteCheckedException If failed.
*/
- public void store(@Nullable String spaceName, GridQueryTypeDescriptor type, CacheObject key, CacheObject val,
+ public void store(@Nullable String spaceName, String typeName, CacheObject key, CacheObject val,
byte[] ver, long expirationTime) throws IgniteCheckedException;
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/65ff0bf3/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 d0d9374..5a13d95 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
@@ -291,6 +291,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
* @param space Space.
* @param msg Message.
*/
+ // TODO: This should be done during accept phase.
public void onIndexProposeMessage(String space, IndexProposeDiscoveryMessage msg) {
// Validate.
idxLock.writeLock().lock();
@@ -590,7 +591,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
desc.keyClass().getName() + ", actualCls=" + keyCls.getName() + "]");
}
- idx.store(space, desc, key, val, ver, expirationTime);
+ idx.store(space, desc.name(), key, val, ver, expirationTime);
}
finally {
busyLock.leaveBusy();
@@ -974,7 +975,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
@Override public GridCloseableIterator<IgniteBiTuple<K, V>> applyx() throws IgniteCheckedException {
QueryTypeDescriptorImpl type = type(space, resType);
- return idx.queryLocalText(space, clause, type, filters);
+ return idx.queryLocalText(space, clause, type.name(), filters);
}
}, true);
}
@@ -1077,7 +1078,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
completeIndexClientFuturesOnSpaceUnregister(space, false);
try {
- idx.unregisterType(entry.getKey().space(), desc);
+ idx.unregisterType(entry.getKey().space(), desc.name());
}
catch (Exception e) {
U.error(log, "Failed to clear indexing on type unregister (will ignore): " + space, e);
http://git-wip-us.apache.org/repos/asf/ignite/blob/65ff0bf3/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 0219c49..1e4ff97 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
@@ -644,9 +644,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
}
/** {@inheritDoc} */
- @Override public void store(@Nullable String spaceName, GridQueryTypeDescriptor type, CacheObject k, CacheObject v,
+ @Override public void store(@Nullable String spaceName, String typeName, CacheObject k, CacheObject v,
byte[] ver, long expirationTime) throws IgniteCheckedException {
- TableDescriptor tbl = tableDescriptor(spaceName, type);
+ TableDescriptor tbl = tableDescriptor(typeName, spaceName);
removeKey(spaceName, k, tbl);
@@ -823,9 +823,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public <K, V> GridCloseableIterator<IgniteBiTuple<K, V>> queryLocalText(
- @Nullable String spaceName, String qry, GridQueryTypeDescriptor type,
+ @Nullable String spaceName, String qry, String typeName,
IndexingQueryFilter filters) throws IgniteCheckedException {
- TableDescriptor tbl = tableDescriptor(spaceName, type);
+ TableDescriptor tbl = tableDescriptor(typeName, spaceName);
if (tbl != null && tbl.luceneIdx != null) {
GridRunningQueryInfo run = new GridRunningQueryInfo(qryIdGen.incrementAndGet(), qry, TEXT, spaceName,
@@ -845,9 +845,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
}
/** {@inheritDoc} */
- @Override public void unregisterType(@Nullable String spaceName, GridQueryTypeDescriptor type)
+ @Override public void unregisterType(@Nullable String spaceName, String typeName)
throws IgniteCheckedException {
- TableDescriptor tbl = tableDescriptor(spaceName, type);
+ TableDescriptor tbl = tableDescriptor(typeName, spaceName);
if (tbl != null)
removeTable(tbl);
@@ -1840,17 +1840,6 @@ public class IgniteH2Indexing implements GridQueryIndexing {
}
/**
- * Gets table descriptor by value type.
- *
- * @param spaceName Space name.
- * @param type Value type descriptor.
- * @return Table descriptor or {@code null} if not found.
- */
- @Nullable private TableDescriptor tableDescriptor(@Nullable String spaceName, GridQueryTypeDescriptor type) {
- return tableDescriptor(type.name(), spaceName);
- }
-
- /**
* Gets table descriptor by type and space names.
*
* @param type Type name.
@@ -1928,12 +1917,12 @@ public class IgniteH2Indexing implements GridQueryIndexing {
* Gets size (for tests only).
*
* @param spaceName Space name.
- * @param type Type descriptor.
+ * @param typeName Type name.
* @return Size.
* @throws IgniteCheckedException If failed or {@code -1} if the type is unknown.
*/
- long size(@Nullable String spaceName, GridQueryTypeDescriptor type) throws IgniteCheckedException {
- TableDescriptor tbl = tableDescriptor(spaceName, type);
+ long size(@Nullable String spaceName, String typeName) throws IgniteCheckedException {
+ TableDescriptor tbl = tableDescriptor(typeName, spaceName);
if (tbl == null)
return -1;
http://git-wip-us.apache.org/repos/asf/ignite/blob/65ff0bf3/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
index 3a12ead..1985c0f 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
@@ -210,28 +210,28 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
public void testSpi() throws Exception {
IgniteH2Indexing spi = getIndexing();
- assertEquals(-1, spi.size(typeAA.space(), typeAA));
- assertEquals(-1, spi.size(typeAB.space(), typeAB));
- assertEquals(-1, spi.size(typeBA.space(), typeBA));
+ assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(-1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(-1, spi.size(typeBA.space(), typeBA.name()));
spi.registerType(typeAA.space(), typeAA);
- assertEquals(0, spi.size(typeAA.space(), typeAA));
- assertEquals(-1, spi.size(typeAB.space(), typeAB));
- assertEquals(-1, spi.size(typeBA.space(), typeBA));
+ assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(-1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(-1, spi.size(typeBA.space(), typeBA.name()));
spi.registerType(typeAB.space(), typeAB);
- assertEquals(0, spi.size(typeAA.space(), typeAA));
- assertEquals(0, spi.size(typeAB.space(), typeAB));
- assertEquals(-1, spi.size(typeBA.space(), typeBA));
+ assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(0, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(-1, spi.size(typeBA.space(), typeBA.name()));
spi.registerType(typeBA.space(), typeBA);
// Initially all is empty.
- assertEquals(0, spi.size(typeAA.space(), typeAA));
- assertEquals(0, spi.size(typeAB.space(), typeAB));
- assertEquals(0, spi.size(typeBA.space(), typeBA));
+ assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(0, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
assertFalse(spi.queryLocalSql(typeAA.space(), "select * from A.A", null, Collections.emptySet(), typeAA.name(), null, null).hasNext());
assertFalse(spi.queryLocalSql(typeAB.space(), "select * from A.B", null, Collections.emptySet(), typeAB.name(), null, null).hasNext());
@@ -260,51 +260,51 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
spi.remove("A", key(1), aa(1, "", 10));
spi.remove("B", key(1), ba(1, "", 10, true));
- spi.store(typeAA.space(), typeAA, key(1), aa(1, "Vasya", 10), "v1".getBytes(), 0);
+ spi.store(typeAA.space(), typeAA.name(), key(1), aa(1, "Vasya", 10), "v1".getBytes(), 0);
- assertEquals(1, spi.size(typeAA.space(), typeAA));
- assertEquals(0, spi.size(typeAB.space(), typeAB));
- assertEquals(0, spi.size(typeBA.space(), typeBA));
+ assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(0, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
- spi.store(typeAB.space(), typeAB, key(1), ab(1, "Vasya", 20, "Some text about Vasya goes here."),
+ spi.store(typeAB.space(), typeAB.name(), key(1), ab(1, "Vasya", 20, "Some text about Vasya goes here."),
"v2".getBytes(), 0);
// In one space all keys must be unique.
- assertEquals(0, spi.size(typeAA.space(), typeAA));
- assertEquals(1, spi.size(typeAB.space(), typeAB));
- assertEquals(0, spi.size(typeBA.space(), typeBA));
+ assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
- spi.store(typeBA.space(), typeBA, key(1), ba(2, "Petya", 25, true), "v3".getBytes(), 0);
+ spi.store(typeBA.space(), typeBA.name(), key(1), ba(2, "Petya", 25, true), "v3".getBytes(), 0);
// No replacement because of different space.
- assertEquals(0, spi.size(typeAA.space(), typeAA));
- assertEquals(1, spi.size(typeAB.space(), typeAB));
- assertEquals(1, spi.size(typeBA.space(), typeBA));
+ assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
- spi.store(typeBA.space(), typeBA, key(1), ba(2, "Kolya", 25, true), "v4".getBytes(), 0);
+ spi.store(typeBA.space(), typeBA.name(), key(1), ba(2, "Kolya", 25, true), "v4".getBytes(), 0);
// Replacement in the same table.
- assertEquals(0, spi.size(typeAA.space(), typeAA));
- assertEquals(1, spi.size(typeAB.space(), typeAB));
- assertEquals(1, spi.size(typeBA.space(), typeBA));
+ assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
- spi.store(typeAA.space(), typeAA, key(2), aa(2, "Valera", 19), "v5".getBytes(), 0);
+ spi.store(typeAA.space(), typeAA.name(), key(2), aa(2, "Valera", 19), "v5".getBytes(), 0);
- assertEquals(1, spi.size(typeAA.space(), typeAA));
- assertEquals(1, spi.size(typeAB.space(), typeAB));
- assertEquals(1, spi.size(typeBA.space(), typeBA));
+ assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
- spi.store(typeAA.space(), typeAA, key(3), aa(3, "Borya", 18), "v6".getBytes(), 0);
+ spi.store(typeAA.space(), typeAA.name(), key(3), aa(3, "Borya", 18), "v6".getBytes(), 0);
- assertEquals(2, spi.size(typeAA.space(), typeAA));
- assertEquals(1, spi.size(typeAB.space(), typeAB));
- assertEquals(1, spi.size(typeBA.space(), typeBA));
+ assertEquals(2, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
- spi.store(typeAB.space(), typeAB, key(4), ab(4, "Vitalya", 20, "Very Good guy"), "v7".getBytes(), 0);
+ spi.store(typeAB.space(), typeAB.name(), key(4), ab(4, "Vitalya", 20, "Very Good guy"), "v7".getBytes(), 0);
- assertEquals(2, spi.size(typeAA.space(), typeAA));
- assertEquals(2, spi.size(typeAB.space(), typeAB));
- assertEquals(1, spi.size(typeBA.space(), typeBA));
+ assertEquals(2, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
// Query data.
Iterator<IgniteBiTuple<Integer, Map<String, Object>>> res =
@@ -351,7 +351,7 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
// Text queries
Iterator<IgniteBiTuple<Integer, Map<String, Object>>> txtRes = spi.queryLocalText(typeAB.space(), "good",
- typeAB, null);
+ typeAB.name(), null);
assertTrue(txtRes.hasNext());
assertEquals(ab(4, "Vitalya", 20, "Very Good guy").value(null, false), value(txtRes.next()));
@@ -385,35 +385,35 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
// Remove
spi.remove(typeAA.space(), key(2), aa(2, "Valera", 19));
- assertEquals(1, spi.size(typeAA.space(), typeAA));
- assertEquals(2, spi.size(typeAB.space(), typeAB));
- assertEquals(1, spi.size(typeBA.space(), typeBA));
+ assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
spi.remove(typeBA.space(), key(1), ba(2, "Kolya", 25, true));
- assertEquals(1, spi.size(typeAA.space(), typeAA));
- assertEquals(2, spi.size(typeAB.space(), typeAB));
- assertEquals(0, spi.size(typeBA.space(), typeBA));
+ assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
// Unregister.
- spi.unregisterType(typeAA.space(), typeAA);
+ spi.unregisterType(typeAA.space(), typeAA.name());
- assertEquals(-1, spi.size(typeAA.space(), typeAA));
- assertEquals(2, spi.size(typeAB.space(), typeAB));
- assertEquals(0, spi.size(typeBA.space(), typeBA));
+ assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
- spi.unregisterType(typeAB.space(), typeAB);
+ spi.unregisterType(typeAB.space(), typeAB.name());
- assertEquals(-1, spi.size(typeAA.space(), typeAA));
- assertEquals(-1, spi.size(typeAB.space(), typeAB));
- assertEquals(0, spi.size(typeBA.space(), typeBA));
+ assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
+ assertEquals(-1, spi.size(typeAB.space(), typeAB.name()));
+ assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
- spi.unregisterType(typeBA.space(), typeBA);
+ spi.unregisterType(typeBA.space(), typeBA.name());
// Should not store but should not fail as well.
- spi.store(typeAA.space(), typeAA, key(10), aa(1, "Fail", 100500), "v220".getBytes(), 0);
+ spi.store(typeAA.space(), typeAA.name(), key(10), aa(1, "Fail", 100500), "v220".getBytes(), 0);
- assertEquals(-1, spi.size(typeAA.space(), typeAA));
+ assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
}
/**
[2/2] ignite git commit: Designing concurrency for
QueryTypeDescriptorImpl.
Posted by vo...@apache.org.
Designing concurrency for QueryTypeDescriptorImpl.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/86817195
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/86817195
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/86817195
Branch: refs/heads/ignite-4565-ddl
Commit: 86817195b556feb49a9ab8155d9725f29cc9482d
Parents: 65ff0bf
Author: devozerov <vo...@gridgain.com>
Authored: Tue Mar 14 18:31:32 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Mar 14 18:31:32 2017 +0300
----------------------------------------------------------------------
.../processors/query/GridQueryProcessor.java | 2 +-
.../query/QueryTypeDescriptorImpl.java | 32 ++++++++++++++------
2 files changed, 23 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/86817195/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 5a13d95..3bdfbdb 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
@@ -1122,7 +1122,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
* @return Type descriptor.
* @throws IgniteCheckedException If failed.
*/
- public QueryTypeDescriptorImpl type(@Nullable String space, String typeName) throws IgniteCheckedException {
+ private QueryTypeDescriptorImpl type(@Nullable String space, String typeName) throws IgniteCheckedException {
QueryTypeDescriptorImpl type = typesByName.get(new QueryTypeNameKey(space, typeName));
if (type == null || !type.registered())
http://git-wip-us.apache.org/repos/asf/ignite/blob/86817195/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
index 0949b1b..206c37c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
@@ -24,6 +24,7 @@ import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.A;
import org.apache.ignite.internal.util.typedef.internal.S;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -54,9 +55,12 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
/** Map with upper cased property names to help find properties based on SQL INSERT and MERGE queries. */
private final Map<String, GridQueryProperty> uppercaseProps = new HashMap<>();
+ /** Mutex for operations on indexes. */
+ private final Object idxMux = new Object();
+
/** */
@GridToStringInclude
- private final Map<String, QueryIndexDescriptorImpl> indexes = new HashMap<>();
+ private final Map<String, QueryIndexDescriptorImpl> idxs = new HashMap<>();
/** */
private QueryIndexDescriptorImpl fullTextIdx;
@@ -194,14 +198,18 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
/** {@inheritDoc} */
@Override public Map<String, GridQueryIndexDescriptor> indexes() {
- return Collections.<String, GridQueryIndexDescriptor>unmodifiableMap(indexes);
+ synchronized (idxMux) {
+ return Collections.<String, GridQueryIndexDescriptor>unmodifiableMap(idxs);
+ }
}
/**
* @return Raw index descriptors.
*/
public Collection<QueryIndexDescriptorImpl> indexes0() {
- return indexes.values();
+ synchronized (idxMux) {
+ return new ArrayList<>(idxs.values());
+ }
}
/** {@inheritDoc} */
@@ -218,12 +226,14 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
* @throws IgniteCheckedException In case of error.
*/
public QueryIndexDescriptorImpl addIndex(String idxName, QueryIndexType type) throws IgniteCheckedException {
- QueryIndexDescriptorImpl idx = new QueryIndexDescriptorImpl(this, idxName, type);
+ synchronized (idxMux) {
+ QueryIndexDescriptorImpl idx = new QueryIndexDescriptorImpl(this, idxName, type);
- if (indexes.put(idxName, idx) != null)
- throw new IgniteCheckedException("Index with name '" + idxName + "' already exists.");
+ if (idxs.put(idxName, idx) != null)
+ throw new IgniteCheckedException("Index with name '" + idxName + "' already exists.");
- return idx;
+ return idx;
+ }
}
/**
@@ -237,11 +247,13 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
*/
public void addFieldToIndex(String idxName, String field, int orderNum, boolean descending)
throws IgniteCheckedException {
- QueryIndexDescriptorImpl desc = indexes.get(idxName);
+ synchronized (idxMux) {
+ QueryIndexDescriptorImpl desc = idxs.get(idxName);
- assert desc != null;
+ assert desc != null;
- desc.addField(field, orderNum, descending);
+ desc.addField(field, orderNum, descending);
+ }
}
/**