You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2017/03/24 14:12:29 UTC

[39/50] [abbrv] ignite git commit: Merge branch master ignite-2.0 to ignite-3477

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 59f5c21,b0d3850..e663768
--- 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
@@@ -59,6 -59,8 +59,7 @@@ import org.apache.ignite.IgniteCheckedE
  import org.apache.ignite.IgniteDataStreamer;
  import org.apache.ignite.IgniteException;
  import org.apache.ignite.IgniteLogger;
 -import org.apache.ignite.cache.CacheMemoryMode;
+ import org.apache.ignite.cache.QueryIndexType;
  import org.apache.ignite.cache.query.QueryCancelledException;
  import org.apache.ignite.cache.query.QueryCursor;
  import org.apache.ignite.cache.query.SqlFieldsQuery;
@@@ -88,9 -85,9 +89,10 @@@ import org.apache.ignite.internal.proce
  import org.apache.ignite.internal.processors.cache.query.GridCacheQueryMarshallable;
  import org.apache.ignite.internal.processors.cache.query.GridCacheTwoStepQuery;
  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.GridQueryCacheObjectsIterator;
  import org.apache.ignite.internal.processors.query.GridRunningQueryInfo;
+ import org.apache.ignite.internal.processors.query.GridRunningQueryInfo;
  import org.apache.ignite.internal.processors.query.GridQueryCancel;
  import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
  import org.apache.ignite.internal.processors.query.GridQueryFieldsResult;
@@@ -1895,97 -1898,7 +1894,84 @@@ public class IgniteH2Indexing implement
          return schema.spaceName;
      }
  
-     /** {@inheritDoc} */
-     @Override public void rebuildIndexes(@Nullable String spaceName, GridQueryTypeDescriptor type) {
-         TableDescriptor tbl = tableDescriptor(spaceName, type);
- 
-         if (tbl == null)
-             return;
- 
-         if (tbl.schema.offheap != null)
-             throw new UnsupportedOperationException("Index rebuilding is not supported when off-heap memory is used");
- 
-         tbl.tbl.rebuildIndexes();
-     }
- 
      /**
 +     * Rebuild indexes from hash index.
 +     *
 +     * @param spaceName Space name.
 +     * @param type Type descriptor.
 +     * @throws IgniteCheckedException If failed.
 +     */
 +    @Override public void rebuildIndexesFromHash(@Nullable String spaceName,
 +        GridQueryTypeDescriptor type) throws IgniteCheckedException {
 +        TableDescriptor tbl = tableDescriptor(spaceName, type);
 +
 +        if (tbl == null)
 +            return;
 +
 +        assert tbl.tbl != null;
 +
 +        assert tbl.tbl.rebuildFromHashInProgress();
 +
 +        H2PkHashIndex hashIdx = tbl.pkHashIdx;
 +
 +        Cursor cursor = hashIdx.find((Session)null, null, null);
 +
 +        int cacheId = CU.cacheId(tbl.schema.ccfg.getName());
 +
 +        GridCacheContext cctx = ctx.cache().context().cacheContext(cacheId);
 +
 +        while (cursor.next()) {
 +            CacheDataRow dataRow = (CacheDataRow)cursor.get();
 +
 +            boolean done = false;
 +
 +            while (!done) {
 +                GridCacheEntryEx entry = cctx.cache().entryEx(dataRow.key());
 +
 +                try {
 +                    synchronized (entry) {
 +                        // TODO : How to correctly get current value and link here?
 +
 +                        GridH2Row row = tbl.tbl.rowDescriptor().createRow(entry.key(), entry.partition(),
 +                            dataRow.value(), entry.version(), entry.expireTime());
 +
 +                        row.link(dataRow.link());
 +
 +                        List<Index> indexes = tbl.tbl.getAllIndexes();
 +
 +                        for (int i = 2; i < indexes.size(); i++) {
 +                            Index idx = indexes.get(i);
 +
 +                            if (idx instanceof H2TreeIndex)
 +                                ((H2TreeIndex)idx).put(row);
 +                        }
 +
 +                        done = true;
 +                    }
 +                }
 +                catch (GridCacheEntryRemovedException e) {
 +                    // No-op
 +                }
 +            }
 +
 +        }
 +
 +        tbl.tbl.markRebuildFromHashInProgress(false);
 +    }
 +
 +    /** {@inheritDoc} */
 +    @Override public void markForRebuildFromHash(@Nullable String spaceName, GridQueryTypeDescriptor type) {
 +        TableDescriptor tbl = tableDescriptor(spaceName, type);
 +
 +        if (tbl == null)
 +            return;
 +
 +        assert tbl.tbl != null;
 +
 +        tbl.tbl.markRebuildFromHashInProgress(true);
 +    }
 +
 +    /**
       * Gets size (for tests only).
       *
       * @param spaceName Space name.
@@@ -2292,7 -2203,7 +2278,7 @@@
      }
  
      /** {@inheritDoc} */
-     @Override public void registerCache(GridCacheContext<?, ?> cctx, CacheConfiguration<?, ?> ccfg)
 -    @Override public void registerCache(String spaceName, GridCacheContext<?, ?> cctx, CacheConfiguration<?,?> ccfg)
++    @Override public void registerCache(String spaceName, GridCacheContext<?, ?> cctx, CacheConfiguration<?, ?> ccfg)
          throws IgniteCheckedException {
          String schema = schemaNameFromCacheConf(ccfg);
  
@@@ -2321,18 -2232,14 +2307,18 @@@
                  dropSchema(schema);
              }
              catch (IgniteCheckedException e) {
-                 U.error(log, "Failed to drop schema on cache stop (will ignore): " + U.maskName(ccfg.getName()), e);
+                 U.error(log, "Failed to drop schema on cache stop (will ignore): " + U.maskName(spaceName), e);
              }
  
 +            for (TableDescriptor tblDesc : rmv.tbls.values())
 +                for (Index idx : tblDesc.tbl.getIndexes())
 +                    idx.close(null);
 +
              for (Iterator<Map.Entry<TwoStepCachedQueryKey, TwoStepCachedQuery>> it = twoStepCache.entrySet().iterator();
 -                it.hasNext();) {
 +                it.hasNext(); ) {
                  Map.Entry<TwoStepCachedQueryKey, TwoStepCachedQuery> e = it.next();
  
-                 if (F.eq(e.getKey().space, ccfg.getName()))
+                 if (F.eq(e.getKey().space, spaceName))
                      it.remove();
              }
          }
@@@ -2936,9 -2812,9 +2922,9 @@@
  
                          cols = treeIndexColumns(cols, keyCol, affCol);
  
 -                        idxs.add(createTreeIndex(name, tbl, false, cols));
 +                        idxs.add(createSortedIndex(cacheId, name, tbl, false, cols, idx.inlineSize()));
                      }
-                     else if (idx.type() == GEO_SPATIAL)
+                     else if (idx.type() == QueryIndexType.GEOSPATIAL)
                          idxs.add(createH2SpatialIndex(tbl, name, cols.toArray(new IndexColumn[cols.size()])));
                      else
                          throw new IllegalStateException("Index type: " + idx.type());

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
index 00db055,1ebfd60..67e294a
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
@@@ -190,17 -200,7 +190,7 @@@ public abstract class GridH2IndexBase e
      }
  
      /**
-      * If the index supports rebuilding it has to creates its own copy.
-      *
-      * @return Rebuilt copy.
-      * @throws InterruptedException If interrupted.
-      */
-     public GridH2IndexBase rebuild() throws InterruptedException {
-         return this;
-     }
- 
-     /**
 -     * Put row if absent.
 +     * Puts row.
       *
       * @param row Row.
       * @return Existing row or {@code null}.

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index 0dd4182,287e1e0..60eecd8
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@@ -684,53 -631,6 +684,20 @@@ public class GridH2Table extends TableB
          return res;
      }
  
 +    /**
-      * Rebuilds all indexes of this table.
-      */
-     public void rebuildIndexes() {
-         if (!snapshotEnabled)
-             return;
- 
-         Lock l = lock(true, Long.MAX_VALUE);
- 
-         ArrayList<Index> idxs0 = new ArrayList<>(idxs);
- 
-         try {
-             snapshotIndexes(null); // Allow read access while we are rebuilding indexes.
- 
-             for (int i = 2, len = idxs.size(); i < len; i++) {
-                 GridH2IndexBase newIdx = index(i).rebuild();
- 
-                 idxs.set(i, newIdx);
- 
-                 if (i == 2) // ScanIndex at 0 and actualSnapshot can contain references to old indexes, reset them.
-                     idxs.set(0, new ScanIndex(newIdx, index(1)));
-             }
-         }
-         catch (InterruptedException e) {
-             throw new IgniteInterruptedException(e);
-         }
-         finally {
-             releaseSnapshots0(idxs0);
- 
-             unlock(l);
-         }
-     }
- 
-     /**
 +     *
 +     */
 +    public void markRebuildFromHashInProgress(boolean value) {
 +        rebuildFromHashInProgress = value;
 +    }
 +
 +    /**
 +     *
 +     */
 +    public boolean rebuildFromHashInProgress() {
 +        return rebuildFromHashInProgress;
 +    }
 +
      /** {@inheritDoc} */
      @Override public Index addIndex(Session ses, String s, int i, IndexColumn[] idxCols, IndexType idxType,
          boolean b, String s1) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
index aaf8310,99392f7..9180b89
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
@@@ -498,109 -503,4 +497,76 @@@ public class GridH2TreeIndex extends Gr
              throw new IllegalStateException();
          }
      }
 +
-     /** {@inheritDoc} */
-     @Override public GridH2TreeIndex rebuild() throws InterruptedException {
-         IndexColumn[] cols = getIndexColumns();
- 
-         GridH2TreeIndex idx = new GridH2TreeIndex(getName(), getTable(),
-             getIndexType().isUnique(), F.asList(cols), segments.length);
- 
-         Thread thread = Thread.currentThread();
- 
-         long j = 0;
- 
-         for (int i = 0; i < segments.length; i++) {
-             try {
-                 GridCursor<GridH2Row> cursor = segments[i].find(null, null);
- 
-                 while(cursor.next()) {
-                     GridH2Row row = cursor.get();
- 
-                     // Check for interruptions every 1024 iterations.
-                     if ((++j & 1024) == 0 && thread.isInterrupted())
-                         throw new InterruptedException();
- 
-                     idx.put(row);
-                 }
-             }
-             catch (IgniteCheckedException e) {
-                 throw DbException.convert(e);
-             }
-         }
- 
-         return idx;
-     }
- 
 +    /**
 +     * Adapter from {@link NavigableMap} to {@link IgniteTree}.
 +     */
 +    private static final class IgniteNavigableMapTree implements IgniteTree<GridSearchRowPointer, GridH2Row>, Cloneable {
 +        /** Tree. */
 +        private final NavigableMap<GridSearchRowPointer, GridH2Row> tree;
 +
 +        /**
 +         * @param tree Tree.
 +         */
 +        private IgniteNavigableMapTree(NavigableMap<GridSearchRowPointer, GridH2Row> tree) {
 +            this.tree = tree;
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public void invoke(GridSearchRowPointer key, Object x, InvokeClosure<GridH2Row> c) {
 +            throw new UnsupportedOperationException();
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public GridH2Row put(GridH2Row val) {
 +            return tree.put(val, val);
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public GridH2Row findOne(GridSearchRowPointer key) {
 +            return tree.get(key);
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public GridCursor<GridH2Row> find(GridSearchRowPointer lower, GridSearchRowPointer upper)
 +            throws IgniteCheckedException {
 +
 +            Collection<GridH2Row> rows;
 +
 +            if (lower == null && upper == null)
 +                rows = tree.values();
 +            else if (lower != null && upper == null)
 +                rows = tree.tailMap(lower).values();
 +            else if (lower == null)
 +                rows = tree.headMap(upper).values();
 +            else
 +                rows = tree.subMap(lower, false, upper, false).values();
 +
 +            return new GridCursorIteratorWrapper<>(rows.iterator());
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public GridH2Row remove(GridSearchRowPointer key) {
 +            return tree.remove(key);
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public long size() {
 +            return tree.size();
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public IgniteNavigableMapTree clone() {
 +            IgniteNavigableMapTree cp;
 +
 +            try {
 +                cp = (IgniteNavigableMapTree)super.clone();
 +            }
 +            catch (final CloneNotSupportedException e) {
 +                throw DbException.convert(e);
 +            }
 +
 +            return new IgniteNavigableMapTree(cp.tree);
 +        }
 +    }
  }

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
index 5fd088f,c35eebb..b73bb96
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
@@@ -24,9 -25,7 +25,8 @@@ import org.apache.ignite.cache.QueryInd
  import org.apache.ignite.internal.GridKernalContext;
  import org.apache.ignite.internal.processors.cache.CacheObject;
  import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
  import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor;
- import org.apache.ignite.internal.processors.query.GridQueryIndexType;
  import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
  import org.apache.ignite.internal.util.GridAtomicLong;
  import org.apache.ignite.internal.util.GridCloseableIteratorAdapter;

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
index daa5246,347043f..0f62b4b
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
@@@ -113,10 -112,10 +113,7 @@@ import static org.apache.ignite.interna
   * Reduce query executor.
   */
  public class GridReduceQueryExecutor {
-     /** Thread pool to process query messages. */
-     public static final byte QUERY_POOL = GridIoPolicy.SYSTEM_POOL;
- 
      /** */
 -    private static final IgniteProductVersion DISTRIBUTED_JOIN_SINCE = IgniteProductVersion.fromString("1.7.0");
 -
 -    /** */
      private static final String MERGE_INDEX_UNSORTED = "merge_scan";
  
      /** */

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheIndexStreamerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheCrossCacheQuerySelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
index 99fc741,d896c08..6f9d6b5
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
@@@ -90,9 -92,17 +90,9 @@@ public class GridCacheOffHeapAndSwapSel
      /** */
      private final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
  
 -    /**
 -     * Creates a SwapSpaceSpi.
 -     * @return the Spi
 -     */
 -    protected SwapSpaceSpi spi() {
 -        return new FileSwapSpaceSpi();
 -    }
 -
      /** {@inheritDoc} */
-     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
-         IgniteConfiguration cfg = super.getConfiguration(gridName);
+     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
  
          TcpDiscoverySpi disco = new TcpDiscoverySpi();
  

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
index 016b3db,846f700..2c083fb
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
@@@ -71,9 -73,17 +71,9 @@@ public class GridCacheOffHeapSelfTest e
      /** PeerClassLoadingLocalClassPathExclude enable. */
      private boolean excluded;
  
 -    /**
 -     * Creates a SwapSpaceSpi.
 -     * @return the Spi
 -     */
 -    protected SwapSpaceSpi spi() {
 -        return new FileSwapSpaceSpi();
 -    }
 -
      /** {@inheritDoc} */
-     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
-         IgniteConfiguration cfg = super.getConfiguration(gridName);
+     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
  
          TcpDiscoverySpi disco = new TcpDiscoverySpi();
  

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffheapIndexEntryEvictTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffheapIndexGetSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryIndexDisabledSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQuerySimpleBenchmark.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridIndexingWithNoopSwapSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteBinaryObjectFieldsQuerySelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
index e927e50,80541ff..1740fe9
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
@@@ -265,74 -293,85 +265,95 @@@ public abstract class IgniteCacheAbstra
  
                      assert String.class.getName().equals(fields.get("NAME"));
  
 -                    fields = meta.fields("Organization");
 -
 -                    assert fields != null;
 -                    assertEquals("Fields: " + fields, 5, fields.size());
 -
 -                    if (binaryMarshaller) {
 -                        assert Object.class.getName().equals(fields.get("_VAL"));
 -                        assert Integer.class.getName().equals(fields.get("ID"));
 -                    }
 -                    else {
 -                        assert Organization.class.getName().equals(fields.get("_VAL"));
 -                        assert int.class.getName().equals(fields.get("ID"));
 -                    }
 -
 -                    assert String.class.getName().equals(fields.get("_KEY"));
 -                    assert String.class.getName().equals(fields.get("NAME"));
 -
 -                    fields = meta.fields("String");
 -
 -                    assert fields != null;
 -                    assert fields.size() == 2;
 -                    assert String.class.getName().equals(fields.get("_KEY"));
 -                    assert String.class.getName().equals(fields.get("_VAL"));
 -
 -                    fields = meta.fields("Integer");
 -
 -                    assert fields != null;
 -                    assert fields.size() == 2;
 -                    assert Integer.class.getName().equals(fields.get("_KEY"));
 -                    assert Integer.class.getName().equals(fields.get("_VAL"));
 -
                      Collection<GridCacheSqlIndexMetadata> indexes = meta.indexes("Person");
  
+                     assertNotNull("Indexes should be defined", indexes);
                      assertEquals(2, indexes.size());
+ 
+                     Iterator<GridCacheSqlIndexMetadata> it = indexes.iterator();
+ 
+                     Collection<String> indFlds = it.next().fields();
+ 
+                     assertNotNull("Fields for first index should be defined", indFlds);
+                     assertEquals("First index should have one field", indFlds.size(), 1);
+ 
+                     Iterator<String> indFldIt = indFlds.iterator();
+ 
+                     assertEquals(indFldIt.next(), "AGE");
+ 
+                     indFlds = it.next().fields();
+ 
+                     assertNotNull("Fields for second index should be defined", indFlds);
+                     assertEquals("Second index should have one field", indFlds.size(), 1);
+ 
+                     indFldIt = indFlds.iterator();
+ 
+                     assertEquals(indFldIt.next(), "ORGID");
 +                }
 +                else if (orgCache.getName().equals(meta.cacheName())) {
 +                    assertEquals("Invalid types size", 1, types.size());
 +                    assert types.contains("Organization");
 +
 +                    if (binaryMarshaller)
 +                        assert Object.class.getName().equals(meta.valueClass("Organization"));
 +                    else
 +                        assert Organization.class.getName().equals(meta.valueClass("Organization"));
 +
 +                    assert String.class.getName().equals(meta.keyClass("Organization"));
 +
 +                    Map<String, String> fields = meta.fields("Organization");
 +
 +                    assert fields != null;
 +                    assertEquals("Fields: " + fields, 5, fields.size());
  
 -                    wasNull = true;
 +                    if (binaryMarshaller) {
 +                        assert Object.class.getName().equals(fields.get("_VAL"));
 +                        assert Integer.class.getName().equals(fields.get("ID"));
 +                    }
 +                    else {
 +                        assert Organization.class.getName().equals(fields.get("_VAL"));
 +                        assert int.class.getName().equals(fields.get("ID"));
 +                    }
 +
 +                    assert String.class.getName().equals(fields.get("_KEY"));
 +                    assert String.class.getName().equals(fields.get("NAME"));
                  }
 -                else if (CACHE.equals(meta.cacheName()))
 -                    wasNamed = true;
 -                else if (EMPTY_CACHE.equals(meta.cacheName())) {
 -                    assert meta.types().isEmpty();
 +                else if (intCache.getName().equals(meta.cacheName())) {
 +                    assertEquals("Invalid types size", 1, types.size());
 +                    assert types.contains("Integer");
 +
 +                    assert Integer.class.getName().equals(meta.valueClass("Integer"));
 +                    assert Integer.class.getName().equals(meta.keyClass("Integer"));
  
 -                    wasEmpty = true;
 +                    Map<String, String> fields = meta.fields("Integer");
 +
 +                    assert fields != null;
 +                    assert fields.size() == 2;
 +                    assert Integer.class.getName().equals(fields.get("_KEY"));
 +                    assert Integer.class.getName().equals(fields.get("_VAL"));
                  }
 -                else if (CACHE_NO_PRIMITIVES.equals(meta.cacheName()))
 -                    wasNoPrimitives = true;
 -                else if (CACHE_COMPLEX_KEYS.equals(meta.cacheName()))
 -                    wasComplexKeys = true;
 -            }
 +                else if (strCache.getName().equals(meta.cacheName())) {
 +                    assertEquals("Invalid types size", 1, types.size());
 +                    assert types.contains("String");
 +
 +                    assert String.class.getName().equals(meta.valueClass("String"));
 +                    assert String.class.getName().equals(meta.keyClass("String"));
 +
 +                    Map<String, String> fields = meta.fields("String");
  
 -            assert wasNull;
 -            assert wasNamed;
 -            assert wasEmpty;
 -            assert wasNoPrimitives;
 -            assert wasComplexKeys;
 +                    assert fields != null;
 +                    assert fields.size() == 2;
 +                    assert String.class.getName().equals(fields.get("_KEY"));
 +                    assert String.class.getName().equals(fields.get("_VAL"));
 +                }
 +                else if (meta.cacheName() == null)
 +                    assertTrue("Invalid types size", types.isEmpty());
 +                else
 +                    fail("Unknown cache: " + meta.cacheName());
 +            }
          }
          finally {
 -            ((IgniteKernal)grid(0)).getCache(null).remove(new GridCacheInternalKeyImpl("LONG"));
 +            ((IgniteKernal)grid(0)).getCache(intCache.getName()).remove(new GridCacheInternalKeyImpl("LONG"));
          }
      }
  

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
index 426a3ef,209ab02..82e83ca
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
@@@ -145,86 -146,102 +145,101 @@@ public abstract class IgniteCacheAbstra
  
          c.setDiscoverySpi(new TcpDiscoverySpi().setForceServerMode(true).setIpFinder(ipFinder));
  
-         if (gridName.startsWith("client"))
 -        // Otherwise noop swap space will be chosen on Windows.
 -        c.setSwapSpaceSpi(new FileSwapSpaceSpi());
 -
 -        if (!igniteInstanceName.startsWith("client")) {
 -            CacheConfiguration[] ccs = new CacheConfiguration[2];
++        if (igniteInstanceName.startsWith("client"))
 +            c.setClientMode(true);
  
 -            for (int i = 0; i < ccs.length; i++) {
 -                CacheConfiguration cc = defaultCacheConfiguration();
 +        return c;
 +    }
  
 -                if (i > 0)
 -                    cc.setName("c" + i);
 +    /**
 +     * @return cache configuration
 +     */
 +    protected CacheConfiguration cacheConfiguration() {
 +        CacheConfiguration cc = defaultCacheConfiguration();
  
 -                cc.setCacheMode(cacheMode());
 -                cc.setAtomicityMode(atomicityMode());
 -                cc.setNearConfiguration(nearCacheConfiguration());
 -                cc.setWriteSynchronizationMode(FULL_SYNC);
 -                cc.setCacheStoreFactory(new StoreFactory());
 -                cc.setReadThrough(true);
 -                cc.setWriteThrough(true);
 -                cc.setLoadPreviousValue(true);
 -                cc.setRebalanceMode(SYNC);
 -                cc.setSwapEnabled(true);
 -                cc.setSqlFunctionClasses(SqlFunctions.class);
 -                cc.setIndexedTypes(
 -                    BadHashKeyObject.class, Byte.class,
 -                    ObjectValue.class, Long.class,
 -                    Integer.class, Integer.class,
 -                    Integer.class, String.class,
 -                    Integer.class, ObjectValue.class,
 -                    String.class, ObjectValueOther.class,
 -                    Integer.class, ArrayObject.class,
 -                    Key.class, GridCacheQueryTestValue.class,
 -                    UUID.class, Person.class,
 -                    IgniteCacheReplicatedQuerySelfTest.CacheKey.class, IgniteCacheReplicatedQuerySelfTest.CacheValue.class,
 -                    Long.class, EnumObject.class
 -                );
 +        cc.setCacheMode(cacheMode());
 +        cc.setAtomicityMode(atomicityMode());
 +        cc.setNearConfiguration(nearCacheConfiguration());
 +        cc.setWriteSynchronizationMode(FULL_SYNC);
 +        cc.setCacheStoreFactory(new StoreFactory());
 +        cc.setReadThrough(true);
 +        cc.setWriteThrough(true);
 +        cc.setLoadPreviousValue(true);
 +        cc.setRebalanceMode(SYNC);
 +        cc.setSqlFunctionClasses(SqlFunctions.class);
  
 -                List<QueryEntity> entityList = new ArrayList<>();
 +        List<QueryEntity> entityList = new ArrayList<>();
  
 -                QueryEntity qryEntity = new QueryEntity();
 +        QueryEntity qryEntity = new QueryEntity();
  
 -                qryEntity.setKeyType(Integer.class.getName());
 -                qryEntity.setValueType(Type1.class.getName());
 -                qryEntity.addQueryField("id", Integer.class.getName(), null);
 -                qryEntity.addQueryField("name", String.class.getName(), null);
 -                qryEntity.setTableName("Type2");
 -                qryEntity.setIndexes(Arrays.asList(new QueryIndex("id")));
 +        qryEntity.setKeyType(Integer.class.getName());
 +        qryEntity.setValueType(Type1.class.getName());
 +        qryEntity.addQueryField("id", Integer.class.getName(), null);
 +        qryEntity.addQueryField("name", String.class.getName(), null);
 +        qryEntity.setTableName("Type2");
 +        qryEntity.setIndexes(Arrays.asList(new QueryIndex("id")));
  
 -                entityList.add(qryEntity);
 +        entityList.add(qryEntity);
  
 -                qryEntity = new QueryEntity();
 +        qryEntity = new QueryEntity();
  
 -                qryEntity.setKeyType(Integer.class.getName());
 -                qryEntity.setValueType(Type2.class.getName());
 -                qryEntity.addQueryField("id", Integer.class.getName(), null);
 -                qryEntity.addQueryField("name", String.class.getName(), null);
 -                qryEntity.setTableName("Type1");
 -                qryEntity.setIndexes(Arrays.asList(new QueryIndex("id")));
 +        qryEntity.setKeyType(Integer.class.getName());
 +        qryEntity.setValueType(Type2.class.getName());
 +        qryEntity.addQueryField("id", Integer.class.getName(), null);
 +        qryEntity.addQueryField("name", String.class.getName(), null);
 +        qryEntity.setTableName("Type1");
 +        qryEntity.setIndexes(Arrays.asList(new QueryIndex("id")));
  
 -                entityList.add(qryEntity);
 +        entityList.add(qryEntity);
  
-         cc.setQueryEntities(entityList);if (cacheMode() != CacheMode.LOCAL)
 -                qryEntity = new QueryEntity();
++        qryEntity = new QueryEntity();
+ 
 -                qryEntity.setKeyType(Integer.class.getName());
 -                qryEntity.setValueType(ObjectValue2.class.getName());
++        qryEntity.setKeyType(Integer.class.getName());
++        qryEntity.setValueType(ObjectValue2.class.getName());
+ 
 -                qryEntity.addQueryField("strVal", String.class.getName(), null);
++        qryEntity.addQueryField("strVal", String.class.getName(), null);
+ 
 -                final QueryIndex strIdx = new QueryIndex(); // Default index type
++        final QueryIndex strIdx = new QueryIndex(); // Default index type
+ 
 -                strIdx.setFieldNames(Collections.singletonList("strVal"), true);
++        strIdx.setFieldNames(Collections.singletonList("strVal"), true);
+ 
 -                qryEntity.setIndexes(Arrays.asList(strIdx));
++        qryEntity.setIndexes(Arrays.asList(strIdx));
+ 
 -                entityList.add(qryEntity);
++        entityList.add(qryEntity);cc.setQueryEntities(entityList);
+ 
 -                cc.setQueryEntities(entityList);
++        if (cacheMode() != CacheMode.LOCAL)
 +            cc.setAffinity(new RendezvousAffinityFunction());
  
 -                if (cacheMode() != CacheMode.LOCAL)
 -                    cc.setAffinity(new RendezvousAffinityFunction());
 +        // Explicitly set number of backups equal to number of grids.
 +        if (cacheMode() == CacheMode.PARTITIONED)
 +            cc.setBackups(gridCount());
  
 -                // Explicitly set number of backups equal to number of grids.
 -                if (cacheMode() == CacheMode.PARTITIONED)
 -                    cc.setBackups(gridCount());
 +        //cc.setSnapshotableIndex(snapshotableIndex());
  
 -                cc.setSnapshotableIndex(snapshotableIndex());
 +        return cc;
 +    }
  
 -                ccs[i] = cc;
 -            }
 +    /**
 +     * @param clsK Key class.
 +     * @param clsV Value class.
 +     *
 +     * @return cache instance
 +     */
 +    protected <K, V> IgniteCache<K, V> jcache(Class<K> clsK, Class<V> clsV) {
 +        return jcache(ignite(), clsK, clsV);
 +    }
  
 -            c.setCacheConfiguration(ccs);
 -        }
 -        else
 -            c.setClientMode(true);
 +    /**
 +     * @param ig Ignite.
 +     * @param clsK Key class.
 +     * @param clsV Value class.
 +     *
 +     * @return cache instance
 +     */
 +    protected <K, V> IgniteCache<K, V> jcache(Ignite ig, Class<K> clsK, Class<V> clsV) {
 +        IgniteCache<K, V> cache = jcache(ig, cacheConfiguration(), clsK, clsV);
  
 -        return c;
 +        return cache;
      }
  
      /**
@@@ -752,8 -768,42 +767,42 @@@
       *
       * @throws Exception In case of error.
       */
+     public void testObjectWithString() throws Exception {
+         IgniteCache<Integer, ObjectValue2> cache = ignite().cache(null);
+ 
+         cache.put(1, new ObjectValue2("value 1"));
+         cache.put(2, new ObjectValue2("value 2"));
+         cache.put(3, new ObjectValue2("value 3"));
+ 
+         QueryCursor<Cache.Entry<Integer, ObjectValue2>> qry
+             = cache.query(new SqlQuery<Integer, ObjectValue2>(ObjectValue2.class, "strVal like ?").setArgs("value%"));
+ 
+         int expCnt = 3;
+ 
+         List<Cache.Entry<Integer, ObjectValue2>> results = qry.getAll();
+ 
+         assertEquals(expCnt, results.size());
+ 
+         qry = cache.query(new SqlQuery<Integer, ObjectValue2>(ObjectValue2.class, "strVal > ?").setArgs("value 1"));
+ 
+         results = qry.getAll();
+ 
+         assertEquals(expCnt - 1, results.size());
+ 
+         qry = cache.query(new TextQuery<Integer, ObjectValue2>(ObjectValue2.class, "value"));
+ 
+         results = qry.getAll();
+ 
+         assertEquals(0, results.size()); //Should fail for FULL_TEXT index, but SORTED
+     }
+ 
+     /**
+      * JUnit.
+      *
+      * @throws Exception In case of error.
+      */
      public void testEnumObjectQuery() throws Exception {
 -        final IgniteCache<Long, EnumObject> cache = ignite().cache(null);
 +        final IgniteCache<Long, EnumObject> cache = jcache(Long.class, EnumObject.class);
  
          for (long i = 0; i < 50; i++)
              cache.put(i, new EnumObject(i, i % 2 == 0 ? EnumType.TYPE_A : EnumType.TYPE_B));

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheCollocatedQuerySelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheConfigurationPrimitiveTypesSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheCrossCacheJoinRandomTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheJoinPartitionedAndReplicatedCollocationTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheLargeResultSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapEvictQueryTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapTieredMultithreadedSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheQueryMultiThreadedSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCrossCachesJoinsQueryTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteCacheQueryNodeRestartSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/ttl/CacheTtlAbstractSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
----------------------------------------------------------------------
diff --cc modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
index 3af4701,2d99010..70c46e8
--- 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
@@@ -30,11 -31,8 +31,10 @@@ import org.apache.ignite.cache.QueryInd
  import org.apache.ignite.configuration.CacheConfiguration;
  import org.apache.ignite.internal.processors.cache.CacheObject;
  import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 +import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
  import org.apache.ignite.internal.processors.query.GridQueryFieldsResult;
  import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor;
- import org.apache.ignite.internal.processors.query.GridQueryIndexType;
  import org.apache.ignite.internal.processors.query.GridQueryProperty;
  import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
  import org.apache.ignite.internal.util.typedef.F;
@@@ -504,14 -488,9 +490,14 @@@ public abstract class GridIndexingSpiAb
          }
  
          /** {@inheritDoc} */
-         @Override public GridQueryIndexType type() {
-             return GridQueryIndexType.FULLTEXT;
+         @Override public QueryIndexType type() {
+             return QueryIndexType.FULLTEXT;
          }
 +
 +        /** {@inheritDoc} */
 +        @Override public int inlineSize() {
 +            return 0;
 +        }
      }
  
      /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/AbstractH2CompareQueryTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheConfigurationTest.cs
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
----------------------------------------------------------------------
diff --cc modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
index ba86b86,4335d11..55acb12
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
@@@ -49,7 -49,10 +49,9 @@@ namespace Apache.Ignite.Core.Test
      using Apache.Ignite.Core.Impl.Common;
      using Apache.Ignite.Core.Lifecycle;
      using Apache.Ignite.Core.Log;
 -    using Apache.Ignite.Core.SwapSpace.File;
      using Apache.Ignite.Core.Tests.Binary;
+     using Apache.Ignite.Core.Tests.Plugin;
+     using Apache.Ignite.Core.Tests.Plugin.Cache;
      using Apache.Ignite.Core.Transactions;
      using Apache.Ignite.NLog;
      using NUnit.Framework;
@@@ -126,6 -133,10 +132,9 @@@
                              <atomicConfiguration backups='2' cacheMode='Local' atomicSequenceReserveSize='250' />
                              <transactionConfiguration defaultTransactionConcurrency='Optimistic' defaultTransactionIsolation='RepeatableRead' defaultTimeout='0:1:2' pessimisticTransactionLogSize='15' pessimisticTransactionLogLinger='0:0:33' />
                              <logger type='Apache.Ignite.Core.Tests.IgniteConfigurationSerializerTest+TestLogger, Apache.Ignite.Core.Tests' />
 -                            <swapSpaceSpi type='FileSwapSpaceSpi' baseDirectory='abcd' maximumSparsity='0.7' maximumWriteQueueSize='25' readStripesNumber='36' writeBufferSize='47' />
+                             <pluginConfigurations>
+                                 <iPluginConfiguration type='Apache.Ignite.Core.Tests.Plugin.TestIgnitePluginConfiguration, Apache.Ignite.Core.Tests' />
+                             </pluginConfigurations>
                          </igniteConfig>";
  
              var cfg = IgniteConfiguration.FromXml(xml);
@@@ -742,6 -786,15 +774,7 @@@
                  SpringConfigUrl = "test",
                  Logger = new IgniteNLogLogger(),
                  FailureDetectionTimeout = TimeSpan.FromMinutes(2),
 -                SwapSpaceSpi = new FileSwapSpaceSpi
 -                {
 -                    MaximumSparsity = 0.1f,
 -                    MaximumWriteQueueSize = 55,
 -                    WriteBufferSize = 66,
 -                    ReadStripesNumber = 77,
 -                    BaseDirectory = "test"
 -                },
+                 PluginConfigurations = new[] {new TestIgnitePluginConfiguration() }
              };
          }
  

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
----------------------------------------------------------------------
diff --cc modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
index b9a05c2,5063c21..ee36e5d
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
@@@ -35,6 -35,8 +35,7 @@@ namespace Apache.Ignite.Core.Test
      using Apache.Ignite.Core.Events;
      using Apache.Ignite.Core.Impl;
      using Apache.Ignite.Core.Impl.Binary;
 -    using Apache.Ignite.Core.SwapSpace.File;
+     using Apache.Ignite.Core.Tests.Plugin;
      using Apache.Ignite.Core.Transactions;
      using NUnit.Framework;
  
@@@ -458,8 -472,8 +462,8 @@@
                      ThreadPriority = 6,
                      TopologyHistorySize = 1234567
                  },
-                 GridName = "gridName1",
+                 IgniteInstanceName = "gridName1",
 -                IncludedEventTypes = EventType.SwapspaceAll,
 +                IncludedEventTypes = EventType.DiscoveryAll,
                  MetricsExpireTime = TimeSpan.FromMinutes(7),
                  MetricsHistorySize = 125,
                  MetricsLogFrequency = TimeSpan.FromMinutes(8),

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/CacheConfiguration.cs
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
----------------------------------------------------------------------
diff --cc modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
index 93c8976,d3bd50c..fbd3ba1
--- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
@@@ -39,10 -39,12 +39,10 @@@ namespace Apache.Ignite.Cor
      using Apache.Ignite.Core.Impl;
      using Apache.Ignite.Core.Impl.Binary;
      using Apache.Ignite.Core.Impl.Common;
 -    using Apache.Ignite.Core.Impl.SwapSpace;
      using Apache.Ignite.Core.Lifecycle;
      using Apache.Ignite.Core.Log;
+     using Apache.Ignite.Core.Plugin;
 -    using Apache.Ignite.Core.SwapSpace;
      using Apache.Ignite.Core.Transactions;
-     using BinaryReader = Apache.Ignite.Core.Impl.Binary.BinaryReader;
      using BinaryWriter = Apache.Ignite.Core.Impl.Binary.BinaryWriter;
  
      /// <summary>
@@@ -326,6 -333,37 +331,34 @@@
              }
              else
                  writer.WriteBoolean(false);
+ 
 -            // Swap space
 -            SwapSpaceSerializer.Write(writer, SwapSpaceSpi);
 -
+             // Plugins
+             if (PluginConfigurations != null)
+             {
+                 var pos = writer.Stream.Position;
+ 
+                 writer.WriteInt(0); // reserve count
+ 
+                 var cnt = 0;
+ 
+                 foreach (var cfg in PluginConfigurations)
+                 {
+                     if (cfg.PluginConfigurationClosureFactoryId != null)
+                     {
+                         writer.WriteInt(cfg.PluginConfigurationClosureFactoryId.Value);
+ 
+                         cfg.WriteBinary(writer);
+ 
+                         cnt++;
+                     }
+                 }
+ 
+                 writer.Stream.WriteInt(pos, cnt);
+             }
+             else
+             {
+                 writer.WriteInt(0);
+             }
          }
  
          /// <summary>
@@@ -843,5 -901,16 +893,11 @@@
              get { return _failureDetectionTimeout ?? DefaultFailureDetectionTimeout; }
              set { _failureDetectionTimeout = value; }
          }
+ 
+         /// <summary>
 -        /// Gets or sets the swap space SPI.
 -        /// </summary>
 -        public ISwapSpaceSpi SwapSpaceSpi { get; set; }
 -
 -        /// <summary>
+         /// Gets or sets the configurations for plugins to be started.
+         /// </summary>
+         [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
+         public ICollection<IPluginConfiguration> PluginConfigurations { get; set; }
      }
  }

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
----------------------------------------------------------------------
diff --cc modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
index 98522fa,629a41b..a6b9671
--- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
@@@ -1125,8 -1164,71 +1146,34 @@@
                          </xs:attribute>
                      </xs:complexType>
                  </xs:element>
 -                <xs:element name="swapSpaceSpi" minOccurs="0">
 -                    <xs:annotation>
 -                        <xs:documentation>Swap space SPI.</xs:documentation>
 -                    </xs:annotation>
 -                    <xs:complexType>
 -                        <xs:attribute name="type" type="xs:string" use="required">
 -                            <xs:annotation>
 -                                <xs:documentation>Assembly-qualified type name.</xs:documentation>
 -                            </xs:annotation>
 -                        </xs:attribute>
 -                        <xs:attribute name="baseDirectory" type="xs:string">
 -                            <xs:annotation>
 -                                <xs:documentation>Base directory.</xs:documentation>
 -                            </xs:annotation>
 -                        </xs:attribute>
 -                        <xs:attribute name="maximumSparsity" type="xs:decimal">
 -                            <xs:annotation>
 -                                <xs:documentation>Maximum sparsity. This property defines maximum acceptable wasted file space to whole file size ratio. When this ratio becomes higher than specified number compacting thread starts working.</xs:documentation>
 -                            </xs:annotation>
 -                        </xs:attribute>
 -                        <xs:attribute name="maximumWriteQueueSize" type="xs:int">
 -                            <xs:annotation>
 -                                <xs:documentation>Maximum size of the write queue in bytes. If there are more values are waiting to be written to disk then specified size, SPI will block on write operation.</xs:documentation>
 -                            </xs:annotation>
 -                        </xs:attribute>
 -                        <xs:attribute name="readStripesNumber" type="xs:int">
 -                            <xs:annotation>
 -                                <xs:documentation>Read stripes number. Defines number of file channels to be used concurrently. Defaults to Environment.ProcessorCount.</xs:documentation>
 -                            </xs:annotation>
 -                        </xs:attribute>
 -                        <xs:attribute name="writeBufferSize" type="xs:int">
 -                            <xs:annotation>
 -                                <xs:documentation>Size of the write buffer, in bytes. Write to disk occurs only when this buffer is full.</xs:documentation>
 -                            </xs:annotation>
 -                        </xs:attribute>
 -                    </xs:complexType>
 -                </xs:element>
+                 <xs:element name="pluginConfigurations" minOccurs="0">
+                     <xs:annotation>
+                         <xs:documentation>Plugin configurations.</xs:documentation>
+                     </xs:annotation>
+                     <xs:complexType>
+                         <xs:sequence>
+                             <xs:element name="iPluginConfiguration" maxOccurs="unbounded">
+                                 <xs:annotation>
+                                     <xs:documentation>Plugin configuration.</xs:documentation>
+                                 </xs:annotation>
+                                 <xs:complexType>
+                                     <xs:attribute name="type" type="xs:string" use="required">
+                                         <xs:annotation>
+                                             <xs:documentation>Assembly-qualified type name.</xs:documentation>
+                                         </xs:annotation>
+                                     </xs:attribute>
+                                     <xs:attribute name="pluginConfigurationClosureFactoryId" type="xs:int">
+                                         <xs:annotation>
+                                             <xs:documentation>Id to locate PlatformPluginConfigurationClosureFactory on Java side.</xs:documentation>
+                                         </xs:annotation>
+                                     </xs:attribute>
+                                 </xs:complexType>
+                             </xs:element>
+                         </xs:sequence>
+                     </xs:complexType>
+                 </xs:element>
              </xs:all>
-             <xs:attribute name="gridName" type="xs:string">
+             <xs:attribute name="igniteInstanceName" type="xs:string">
                  <xs:annotation>
                      <xs:documentation>Local Ignite instance name to be used with Ignition.GetIgnite.</xs:documentation>
                  </xs:annotation>

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/schedule/src/main/java/org/apache/ignite/internal/processors/schedule/IgniteScheduleProcessor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/spark/src/test/java/org/apache/ignite/spark/JavaStandaloneIgniteRDDSelfTest.java
----------------------------------------------------------------------
diff --cc modules/spark/src/test/java/org/apache/ignite/spark/JavaStandaloneIgniteRDDSelfTest.java
index 82eea27,2f6326d..7f5c252
--- a/modules/spark/src/test/java/org/apache/ignite/spark/JavaStandaloneIgniteRDDSelfTest.java
+++ b/modules/spark/src/test/java/org/apache/ignite/spark/JavaStandaloneIgniteRDDSelfTest.java
@@@ -303,11 -299,10 +303,11 @@@ public class JavaStandaloneIgniteRDDSel
      }
  
      /**
-      * @param gridName Grid name.
+      * @param igniteInstanceName Ignite instance name.
       * @param client Client.
 +     * @return Cache configuration.
       */
-     private static IgniteConfiguration getConfiguration(String gridName, boolean client) throws Exception {
+     private static IgniteConfiguration getConfiguration(String igniteInstanceName, boolean client) throws Exception {
          IgniteConfiguration cfg = new IgniteConfiguration();
  
          TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/spark/src/test/scala/org/apache/ignite/spark/IgniteRDDSpec.scala
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/spring/src/main/java/org/apache/ignite/IgniteSpringBean.java
----------------------------------------------------------------------
diff --cc modules/spring/src/main/java/org/apache/ignite/IgniteSpringBean.java
index fc45a25,1f790f8..9010f23
--- a/modules/spring/src/main/java/org/apache/ignite/IgniteSpringBean.java
+++ b/modules/spring/src/main/java/org/apache/ignite/IgniteSpringBean.java
@@@ -54,10 -54,10 +54,10 @@@ import org.springframework.context.Appl
   * <h1 class="header">Spring Configuration Example</h1>
   * Here is a typical example of describing it in Spring file:
   * <pre name="code" class="xml">
 - * &lt;bean id="mySpringBean" class="org.apache.ignite.GridSpringBean"&gt;
 + * &lt;bean id="mySpringBean" class="org.apache.ignite.IgniteSpringBean"&gt;
   *     &lt;property name="configuration"&gt;
   *         &lt;bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"&gt;
-  *             &lt;property name="gridName" value="mySpringGrid"/&gt;
+  *             &lt;property name="igniteInstanceName" value="mySpringGrid"/&gt;
   *         &lt;/bean&gt;
   *     &lt;/property&gt;
   * &lt;/bean&gt;

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/config/VisorConfigurationCommand.scala
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkUtils.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81ae2d83/scripts/git-remoteless-branches.sh
----------------------------------------------------------------------
diff --cc scripts/git-remoteless-branches.sh
index 0000000,0000000..8676e87
new file mode 100755
--- /dev/null
+++ b/scripts/git-remoteless-branches.sh
@@@ -1,0 -1,0 +1,19 @@@
++#!/bin/bash
++
++# Prints list of all local branches, which doesn't have remote.
++#
++# If '-d' argument passed it tries to delete found branches.
++# Note that foreceful delete is used - so ANY UNMERGED CHANGES WILL BE LOST!
++#
++# Note this script doesn't inspect current branch.
++
++for branch in `git branch | grep -v "*"`; do
++    git branch -r | grep "$branch" > /dev/null
++    if [ "$?" ==  "1" ]; then
++        if [ "$1" == "-d" ]; then
++            git branch -D $branch
++        else
++            echo "$branch"
++        fi;
++    fi;
++done;