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 13:33:49 UTC
ignite git commit: Better index state.
Repository: ignite
Updated Branches:
refs/heads/ignite-4565-ddl 8e9ba9751 -> cec52fd44
Better index state.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/cec52fd4
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/cec52fd4
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/cec52fd4
Branch: refs/heads/ignite-4565-ddl
Commit: cec52fd44db52c4cb1510ec37b98ac1ae32ae715
Parents: 8e9ba97
Author: devozerov <vo...@gridgain.com>
Authored: Tue Mar 14 16:33:40 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Mar 14 16:33:40 2017 +0300
----------------------------------------------------------------------
.../cache/DynamicCacheChangeRequest.java | 32 ++---
.../query/QueryIndexActiveOperation.java | 71 ++++++++++
.../processors/query/QueryIndexState.java | 10 +-
.../processors/query/QueryIndexStates.java | 131 +++++++++++++++++++
.../query/ddl/AbstractIndexOperation.java | 5 +
.../query/ddl/CreateIndexOperation.java | 5 +
.../query/ddl/DropIndexOperation.java | 6 +-
7 files changed, 228 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/cec52fd4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
index aaab4e2..5d274b4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
@@ -17,21 +17,21 @@
package org.apache.ignite.internal.processors.cache;
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.NearCacheConfiguration;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.query.QueryIndexState;
+import org.apache.ignite.internal.processors.query.QueryIndexStates;
import org.apache.ignite.internal.processors.query.ddl.AbstractIndexOperation;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.lang.IgniteUuid;
import org.jetbrains.annotations.Nullable;
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Map;
+import java.util.UUID;
+
/**
* Cache start/stop request.
*/
@@ -80,7 +80,7 @@ public class DynamicCacheChangeRequest implements Serializable {
private AbstractIndexOperation idxInitOp;
/** Dynamic index states. */
- private Map<String, QueryIndexState> idxStates;
+ private Map<String, QueryIndexStates> idxStates;
/** */
private transient boolean exchangeNeeded;
@@ -312,22 +312,8 @@ public class DynamicCacheChangeRequest implements Serializable {
/**
* @return Dynamic index states.
*/
- public Map<String, QueryIndexState> indexStates() {
- return idxStates == null ? Collections.<String, QueryIndexState>emptyMap() : idxStates;
- }
-
- /**
- * Add dynamic index state.
- *
- * @param idxState Index state.
- */
- public void addIndexState(QueryIndexState idxState) {
- if (idxStates == null)
- idxStates = new HashMap<>();
-
- String name = idxState.indexName();
-
- idxStates.put(name, idxState);
+ public Map<String, QueryIndexStates> indexStates() {
+ return idxStates == null ? Collections.<String, QueryIndexStates>emptyMap() : idxStates;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/cec52fd4/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexActiveOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexActiveOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexActiveOperation.java
new file mode 100644
index 0000000..77262b6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexActiveOperation.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+import org.apache.ignite.internal.processors.query.ddl.AbstractIndexOperation;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/**
+ * Active index operation.
+ */
+public class QueryIndexActiveOperation {
+ /** Operation. */
+ @GridToStringInclude
+ private final AbstractIndexOperation op;
+
+ /** Whether operation is accepted. */
+ private boolean accepted;
+
+ /**
+ * Constructor.
+ *
+ * @param op Operation.
+ */
+ public QueryIndexActiveOperation(AbstractIndexOperation op) {
+ this.op = op;
+ }
+
+ /**
+ * @return Operation.
+ */
+ public AbstractIndexOperation operation() {
+ return op;
+ }
+
+ /**
+ * @return Whether operation is accepted.
+ */
+ public boolean accepted() {
+ return accepted;
+ }
+
+ /**
+ * Accept operation.
+ */
+ public void accept() {
+ assert !accepted;
+
+ accepted = true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(QueryIndexActiveOperation.class, this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/cec52fd4/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexState.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexState.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexState.java
index 1af7ff6..63ad8d4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexState.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexState.java
@@ -25,7 +25,7 @@ import org.jetbrains.annotations.Nullable;
import java.io.Serializable;
/**
- * Dynamic index state
+ * Query index state.
*/
public class QueryIndexState implements Serializable {
/** */
@@ -39,12 +39,12 @@ public class QueryIndexState implements Serializable {
private final QueryIndex idx;
/**
- * Constructor.
+ * Query index state.
*
* @param idxName Index name.
- * @param idx Index descriptor.
+ * @param idx Index.
*/
- public QueryIndexState(String idxName, @Nullable QueryIndex idx) {
+ public QueryIndexState(String idxName, QueryIndex idx) {
this.idxName = idxName;
this.idx = idx;
}
@@ -57,7 +57,7 @@ public class QueryIndexState implements Serializable {
}
/**
- * @return Index.
+ * @return Index
*/
@Nullable public QueryIndex index() {
return idx;
http://git-wip-us.apache.org/repos/asf/ignite/blob/cec52fd4/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexStates.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexStates.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexStates.java
new file mode 100644
index 0000000..13b1525
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexStates.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+import org.apache.ignite.internal.processors.query.ddl.AbstractIndexOperation;
+import org.apache.ignite.internal.processors.query.ddl.CreateIndexOperation;
+import org.apache.ignite.internal.processors.query.ddl.DropIndexOperation;
+import org.apache.ignite.internal.processors.query.ddl.IndexAcceptDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.ddl.IndexFinishDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.ddl.IndexProposeDiscoveryMessage;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Dynamic index states.
+ */
+public class QueryIndexStates implements Serializable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Currently running operations in either proposed or accepted states. */
+ private final Map<String, QueryIndexActiveOperation> activeOps = new HashMap<>();
+
+ /** Finished operations. */
+ private final Map<String, QueryIndexState> readyOps = new HashMap<>();
+
+ /**
+ * Try propose new index operation.
+ *
+ * @param locNodeId Local node ID.
+ * @param msg Propose message.
+ * @return {@code True} if propose succeeded.
+ */
+ public boolean propose(UUID locNodeId, IndexProposeDiscoveryMessage msg) {
+ AbstractIndexOperation op = msg.operation();
+
+ String idxName = op.indexName();
+
+ if (activeOps.containsKey(idxName)) {
+ msg.onError(locNodeId, "Failed to initiate index create/drop because another operation on the same " +
+ "index is in progress: " + idxName);
+
+ return false;
+ }
+
+ activeOps.put(idxName, new QueryIndexActiveOperation(op));
+
+ return true;
+ }
+
+ /**
+ * Process accept message propagating index from proposed to accepted state.
+ *
+ * @param msg Message.
+ */
+ public void accept(IndexAcceptDiscoveryMessage msg) {
+ AbstractIndexOperation op = msg.operation();
+
+ String idxName = op.indexName();
+
+ QueryIndexActiveOperation curOp = activeOps.get(idxName);
+
+ assert curOp != null && !curOp.accepted(); // Operation is found and is in proposed ("false") state.
+ assert F.eq(curOp.operation().operationId(), op.operationId()); // Operation ID matches.
+
+ curOp.accept();
+ }
+
+ /**
+ * Process finish message.
+ *
+ * @param msg Message.
+ */
+ @SuppressWarnings("ConstantConditions")
+ public void finish(IndexFinishDiscoveryMessage msg) {
+ AbstractIndexOperation op = msg.operation();
+
+ String idxName = op.indexName();
+
+ QueryIndexActiveOperation curOp = activeOps.remove(idxName);
+
+ assert curOp != null; // Operation is found.
+ assert F.eq(curOp.operation().operationId(), op.operationId()); // Operation ID matches.
+
+ if (!msg.hasError()) {
+ QueryIndexState state;
+
+ if (op instanceof CreateIndexOperation)
+ state = new QueryIndexState(idxName, ((CreateIndexOperation)op).index());
+ else {
+ assert op instanceof DropIndexOperation;
+
+ state = new QueryIndexState(idxName, null);
+ }
+
+ readyOps.put(idxName, state);
+ }
+ }
+
+ /**
+ * @return Ready operations.
+ */
+ public Map<String, QueryIndexState> readyOperation() {
+ return new HashMap<>(readyOps);
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(QueryIndexStates.class, this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/cec52fd4/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/AbstractIndexOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/AbstractIndexOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/AbstractIndexOperation.java
index 24600e5..11e7966 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/AbstractIndexOperation.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/AbstractIndexOperation.java
@@ -69,4 +69,9 @@ public abstract class AbstractIndexOperation implements Serializable {
public String space() {
return space;
}
+
+ /**
+ * @return Index name.
+ */
+ public abstract String indexName();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/cec52fd4/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/CreateIndexOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/CreateIndexOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/CreateIndexOperation.java
index 7030586..4127c2a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/CreateIndexOperation.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/CreateIndexOperation.java
@@ -59,6 +59,11 @@ public class CreateIndexOperation extends AbstractIndexOperation {
this.ifNotExists = ifNotExists;
}
+ /** {@inheritDoc} */
+ @Override public String indexName() {
+ return idx.getName();
+ }
+
/**
* @return Index params.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/cec52fd4/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/DropIndexOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/DropIndexOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/DropIndexOperation.java
index be2941c..88d6aab 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/DropIndexOperation.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/ddl/DropIndexOperation.java
@@ -50,10 +50,8 @@ public class DropIndexOperation extends AbstractIndexOperation {
this.ifExists = ifExists;
}
- /**
- * @return Index name.
- */
- public String indexName() {
+ /** {@inheritDoc} */
+ @Override public String indexName() {
return idxName;
}