ignite-341 - fix attempt 2
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/e2445bbd Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/e2445bbd Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/e2445bbd Branch: refs/heads/ignite-611 Commit: e2445bbd6f67c5e186869c466cc0cdef61bde12b Parents: 2c87164 Author: S.Vladykin <svlady...@gridgain.com> Authored: Mon Mar 23 13:31:56 2015 +0300 Committer: S.Vladykin <svlady...@gridgain.com> Committed: Mon Mar 23 13:31:56 2015 +0300 ---------------------------------------------------------------------- .../swapspace/GridSwapSpaceManager.java | 6 +++-- .../processors/cache/GridCacheMapEntry.java | 16 +++++++++---- .../processors/cache/GridCacheProcessor.java | 17 +++++++++++-- .../distributed/dht/GridDhtLocalPartition.java | 24 +++++-------------- .../cache/query/GridCacheQueryManager.java | 4 ++-- .../processors/query/GridQueryIndexing.java | 3 ++- .../processors/query/GridQueryProcessor.java | 4 ++-- .../spi/swapspace/SwapSpaceSpiListener.java | 3 ++- .../spi/swapspace/file/FileSwapSpaceSpi.java | 2 +- .../GridSwapSpaceSpiAbstractSelfTest.java | 9 ++++--- .../inmemory/GridTestSwapSpaceSpi.java | 2 +- .../processors/query/h2/IgniteH2Indexing.java | 12 +++++----- .../query/h2/opt/GridH2AbstractKeyValueRow.java | 13 ++++++++++ .../processors/query/h2/opt/GridH2Table.java | 25 +++++++++++++------- .../h2/GridIndexingSpiAbstractSelfTest.java | 8 +++---- 15 files changed, 92 insertions(+), 56 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/main/java/org/apache/ignite/internal/managers/swapspace/GridSwapSpaceManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/swapspace/GridSwapSpaceManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/swapspace/GridSwapSpaceManager.java index 82e7bb5..e62e43f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/swapspace/GridSwapSpaceManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/swapspace/GridSwapSpaceManager.java @@ -52,7 +52,8 @@ public class GridSwapSpaceManager extends GridManagerAdapter<SwapSpaceSpi> { /** {@inheritDoc} */ @Override public void start() throws IgniteCheckedException { getSpi().setListener(new SwapSpaceSpiListener() { - @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes) { + @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes, + @Nullable byte[] valBytes) { if (ctx.event().isRecordable(evtType)) { String msg = null; @@ -98,9 +99,10 @@ public class GridSwapSpaceManager extends GridManagerAdapter<SwapSpaceSpi> { // Always notify grid cache processor. if (evtType == EVT_SWAP_SPACE_DATA_EVICTED && spaceName != null) { assert keyBytes != null; + assert valBytes != null; // Cache cannot use default swap space. - ctx.cache().onEvictFromSwap(spaceName, keyBytes); + ctx.cache().onEvictFromSwap(spaceName, keyBytes, valBytes); } } }); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java index a610354..a22b35a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java @@ -42,7 +42,6 @@ import javax.cache.processor.*; import java.io.*; import java.nio.*; import java.util.*; -import java.util.concurrent.*; import java.util.concurrent.atomic.*; import static org.apache.ignite.events.EventType.*; @@ -3154,7 +3153,13 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx { return val0; } - return null; + GridCacheSwapEntry swapEntry = cctx.swap().read(key, true, true); + + if (swapEntry == null) + return null; + + // TODO do we need all this val.finishUnmarshal stuff?? + return swapEntry.value(); } /** {@inheritDoc} */ @@ -3697,14 +3702,15 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx { * @param prevVal Previous value (if needed for index update). * @throws IgniteCheckedException If failed. */ - protected void clearIndex(@Nullable CacheObject prevVal) throws IgniteCheckedException { + protected void clearIndex(CacheObject prevVal) throws IgniteCheckedException { assert Thread.holdsLock(this); try { GridCacheQueryManager<?, ?> qryMgr = cctx.queries(); if (qryMgr != null) - qryMgr.remove(key().value(cctx.cacheObjectContext(), false)); + qryMgr.remove(key().value(cctx.cacheObjectContext(), false), + prevVal.value(cctx.cacheObjectContext(), false)); } catch (IgniteCheckedException e) { throw new GridCacheIndexUpdateException(e); @@ -3721,7 +3727,7 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx { protected CacheObject saveValueForIndexUnlocked() throws IgniteCheckedException { assert Thread.holdsLock(this); - if (!cctx.cache().isMongoDataCache() && !cctx.cache().isMongoMetaCache()) + if (cctx.queries() == null) return null; return rawGetOrUnmarshalUnlocked(false); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index e13177b..6b09cc9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -1439,11 +1439,13 @@ public class GridCacheProcessor extends GridProcessorAdapter { /** * @param spaceName Space name. * @param keyBytes Key bytes. + * @param valBytes Value bytes. */ @SuppressWarnings( {"unchecked"}) - public void onEvictFromSwap(String spaceName, byte[] keyBytes) { + public void onEvictFromSwap(String spaceName, byte[] keyBytes, byte[] valBytes) { assert spaceName != null; assert keyBytes != null; + assert valBytes != null; /* * NOTE: this method should not have any synchronization because @@ -1464,7 +1466,18 @@ public class GridCacheProcessor extends GridProcessorAdapter { try { KeyCacheObject key = cctx.toCacheKeyObject(keyBytes); - qryMgr.remove(key.value(cctx.cacheObjectContext(), false)); + GridCacheSwapEntry swapEntry = GridCacheSwapEntryImpl.unmarshal(valBytes); + + CacheObject val = swapEntry.value(); + + if (val == null) + val = cctx.cacheObjects().toCacheObject(cctx.cacheObjectContext(), swapEntry.type(), + swapEntry.valueBytes()); + + assert val != null; + + qryMgr.remove(key.value(cctx.cacheObjectContext(), false), + val.value(cctx.cacheObjectContext(), false)); } catch (IgniteCheckedException e) { U.error(log, "Failed to unmarshal key evicted from swap [swapSpaceName=" + spaceName + ']', e); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java index 66f555c..efbbe21 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java @@ -566,7 +566,7 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition> try { if (cached.clearInternal(clearVer, swap)) { - it.remove(); + map.remove(cached.key(), cached); if (!cached.isInternal()) { mapPubSize.decrement(); @@ -599,7 +599,7 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition> return new Iterator<GridDhtCacheEntry>() { /** */ - KeyCacheObject lastKey; + GridDhtCacheEntry lastEntry; @Override public boolean hasNext() { return it.hasNext(); @@ -611,13 +611,11 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition> byte[] keyBytes = entry.getKey(); try { - lastKey = cctx.toCacheKeyObject(keyBytes); - - GridDhtCacheEntry res = (GridDhtCacheEntry)cctx.cache().entryEx(lastKey, false); + KeyCacheObject key = cctx.toCacheKeyObject(keyBytes); - res.unswap(true, true); + lastEntry = (GridDhtCacheEntry)cctx.cache().entryEx(key, false); - return res; + return lastEntry; } catch (IgniteCheckedException e) { throw new CacheException(e); @@ -625,17 +623,7 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition> } @Override public void remove() { - if (lastKey == null) - throw new IllegalStateException(); - - map.remove(lastKey); - - try { - cctx.swap().remove(lastKey); - } - catch (IgniteCheckedException e) { - U.error(log, "Failed to remove swap entry for key: " + lastKey); - } + map.remove(lastEntry.key(), lastEntry); } }; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java index ba1d921..66d4583 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java @@ -350,7 +350,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte * @throws IgniteCheckedException Thrown in case of any errors. */ @SuppressWarnings("SimplifiableIfStatement") - public void remove(Object key) throws IgniteCheckedException { + public void remove(Object key, Object val) throws IgniteCheckedException { assert key != null; if (!GridQueryProcessor.isEnabled(cctx.config()) && !(key instanceof GridCacheInternal)) @@ -360,7 +360,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte return; // Ignore index update when node is stopping. try { - qryProc.remove(space, key); + qryProc.remove(space, key, val); } finally { invalidateResultCache(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/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 2caae45..62788df 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 @@ -177,9 +177,10 @@ public interface GridQueryIndexing { * * @param spaceName Space name. * @param key Key. + * @param val Value. * @throws IgniteCheckedException If failed. */ - public void remove(@Nullable String spaceName, Object key) throws IgniteCheckedException; + public void remove(@Nullable String spaceName, Object key, Object val) throws IgniteCheckedException; /** * Will be called when entry with given key is swapped. http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/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 6bd47a4..d3bfdf6 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 @@ -601,7 +601,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { * @throws IgniteCheckedException Thrown in case of any errors. */ @SuppressWarnings("unchecked") - public void remove(String space, Object key) throws IgniteCheckedException { + public void remove(String space, Object key, Object val) throws IgniteCheckedException { assert key != null; ctx.indexing().remove(space, key); @@ -613,7 +613,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { throw new IllegalStateException("Failed to remove from index (grid is stopping)."); try { - idx.remove(space, key); + idx.remove(space, key, val); } finally { busyLock.leaveBusy(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/main/java/org/apache/ignite/spi/swapspace/SwapSpaceSpiListener.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/swapspace/SwapSpaceSpiListener.java b/modules/core/src/main/java/org/apache/ignite/spi/swapspace/SwapSpaceSpiListener.java index 3b0f7e5..cb61a94 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/swapspace/SwapSpaceSpiListener.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/swapspace/SwapSpaceSpiListener.java @@ -29,6 +29,7 @@ public interface SwapSpaceSpiListener { * @param evtType Event type. See {@link org.apache.ignite.events.SwapSpaceEvent} * @param spaceName Space name for this event or {@code null} for default space. * @param keyBytes Key bytes of affected entry. Not {@code null} only for evict notifications. + * @param valBytes Value bytes of affected entry. Not {@code null} only for evict notifications. */ - public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes); + public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes, @Nullable byte[] valBytes); } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/main/java/org/apache/ignite/spi/swapspace/file/FileSwapSpaceSpi.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/swapspace/file/FileSwapSpaceSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/swapspace/file/FileSwapSpaceSpi.java index 858db79..39a5455 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/swapspace/file/FileSwapSpaceSpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/swapspace/file/FileSwapSpaceSpi.java @@ -581,7 +581,7 @@ public class FileSwapSpaceSpi extends IgniteSpiAdapter implements SwapSpaceSpi, SwapSpaceSpiListener lsnr = evictLsnr; if (lsnr != null) - lsnr.onSwapEvent(evtType, spaceName, null); + lsnr.onSwapEvent(evtType, spaceName, null, null); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/test/java/org/apache/ignite/spi/swapspace/GridSwapSpaceSpiAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/spi/swapspace/GridSwapSpaceSpiAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/swapspace/GridSwapSpaceSpiAbstractSelfTest.java index 038198a..da673d9 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/swapspace/GridSwapSpaceSpiAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/swapspace/GridSwapSpaceSpiAbstractSelfTest.java @@ -290,7 +290,8 @@ public abstract class GridSwapSpaceSpiAbstractSelfTest extends GridCommonAbstrac final CountDownLatch rmvLatch = new CountDownLatch(cnt); spi.setListener(new SwapSpaceSpiListener() { - @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes) { + @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes, + @Nullable byte[] valBytes) { info("Received event: " + evtType); if (evtType == EVT_SWAP_SPACE_DATA_STORED) @@ -350,7 +351,8 @@ public abstract class GridSwapSpaceSpiAbstractSelfTest extends GridCommonAbstrac final CountDownLatch rmvLatch = new CountDownLatch(cnt); spi.setListener(new SwapSpaceSpiListener() { - @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes) { + @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes, + @Nullable byte[] valBytes) { info("Received event: " + evtType); if (evtType == EVT_SWAP_SPACE_DATA_STORED) @@ -409,7 +411,8 @@ public abstract class GridSwapSpaceSpiAbstractSelfTest extends GridCommonAbstrac final CountDownLatch rmvLatch = new CountDownLatch(cnt); spi.setListener(new SwapSpaceSpiListener() { - @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes) { + @Override public void onSwapEvent(int evtType, @Nullable String spaceName, @Nullable byte[] keyBytes, + @Nullable byte[] valBytes) { info("Received event: " + evtType); if (evtType == EVT_SWAP_SPACE_DATA_STORED) http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/core/src/test/java/org/apache/ignite/spi/swapspace/inmemory/GridTestSwapSpaceSpi.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/spi/swapspace/inmemory/GridTestSwapSpaceSpi.java b/modules/core/src/test/java/org/apache/ignite/spi/swapspace/inmemory/GridTestSwapSpaceSpi.java index 870f21b..1ba2c9f 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/swapspace/inmemory/GridTestSwapSpaceSpi.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/swapspace/inmemory/GridTestSwapSpaceSpi.java @@ -187,7 +187,7 @@ public class GridTestSwapSpaceSpi extends IgniteSpiAdapter implements SwapSpaceS SwapSpaceSpiListener lsnr0 = lsnr; if (lsnr0 != null) - lsnr0.onSwapEvent(evtType, spaceName, key); + lsnr0.onSwapEvent(evtType, spaceName, key, null); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/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 ee6aedf..8b9550d 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 @@ -277,7 +277,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { * @param tblToUpdate Table to update. * @throws IgniteCheckedException In case of error. */ - private void removeKey(@Nullable String spaceName, Object key, TableDescriptor tblToUpdate) + private void removeKey(@Nullable String spaceName, Object key, Object val, TableDescriptor tblToUpdate) throws IgniteCheckedException { try { Collection<TableDescriptor> tbls = tables(schema(spaceName)); @@ -285,7 +285,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { if (tbls.size() > 1) { for (TableDescriptor tbl : tbls) { if (tbl != tblToUpdate && tbl.type().keyClass().equals(key.getClass())) { - if (tbl.tbl.update(key, null, 0)) { + if (tbl.tbl.update(key, val, 0, true)) { if (tbl.luceneIdx != null) tbl.luceneIdx.remove(key); @@ -345,25 +345,25 @@ public class IgniteH2Indexing implements GridQueryIndexing { if (tbl == null) return; // Type was rejected. - removeKey(spaceName, k, tbl); + removeKey(spaceName, k, v, tbl); if (expirationTime == 0) expirationTime = Long.MAX_VALUE; - tbl.tbl.update(k, v, expirationTime); + tbl.tbl.update(k, v, expirationTime, false); if (tbl.luceneIdx != null) tbl.luceneIdx.store(k, v, ver, expirationTime); } /** {@inheritDoc} */ - @Override public void remove(@Nullable String spaceName, Object key) throws IgniteCheckedException { + @Override public void remove(@Nullable String spaceName, Object key, Object val) throws IgniteCheckedException { if (log.isDebugEnabled()) log.debug("Removing key from cache query index [locId=" + nodeId + ", key=" + key + ']'); for (TableDescriptor tbl : tables(schema(spaceName))) { if (tbl.type().keyClass().equals(key.getClass())) { - if (tbl.tbl.update(key, null, 0)) { + if (tbl.tbl.update(key, val, 0, true)) { if (tbl.luceneIdx != null) tbl.luceneIdx.remove(key); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java index ef4c3a8..5f52a77 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java @@ -169,6 +169,19 @@ public abstract class GridH2AbstractKeyValueRow extends GridH2Row { } /** + * @param val Value. + * @throws IgniteCheckedException + */ + public synchronized void unswapBeforeRemove(Object val) throws IgniteCheckedException { + assert val != null; + + Value oldVal = super.getValue(VAL_COL); + + if (oldVal == null || oldVal instanceof WeakValue) + onUnswap(val); + } + + /** * Should be called when entry getting unswapped. * * @param val Value. http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java ---------------------------------------------------------------------- diff --git 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 index 71f5ff4..27e756f 100644 --- 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 @@ -27,6 +27,7 @@ import org.h2.message.*; import org.h2.result.*; import org.h2.schema.*; import org.h2.table.*; +import org.h2.value.*; import org.jdk8.backport.*; import org.jetbrains.annotations.*; @@ -295,15 +296,17 @@ public class GridH2Table extends TableBase { * @param key Key. * @param val Value. * @param expirationTime Expiration time. - * @return {@code True} if operation succeeded. + * @param rmv If {@code true} then remove, else update row. + * @return {@code true} If operation succeeded. * @throws IgniteCheckedException If failed. */ - public boolean update(Object key, @Nullable Object val, long expirationTime) throws IgniteCheckedException { + public boolean update(Object key, Object val, long expirationTime, boolean rmv) throws IgniteCheckedException { assert desc != null; + assert val != null; GridH2Row row = desc.createRow(key, val, expirationTime); - return doUpdate(row, val == null); + return doUpdate(row, rmv); } /** @@ -334,7 +337,7 @@ public class GridH2Table extends TableBase { * @throws IgniteCheckedException If failed. */ @SuppressWarnings("LockAcquiredButNotSafelyReleased") - boolean doUpdate(GridH2Row row, boolean del) throws IgniteCheckedException { + boolean doUpdate(final GridH2Row row, boolean del) throws IgniteCheckedException { // Here we assume that each key can't be updated concurrently and case when different indexes // getting updated from different threads with different rows with the same key is impossible. GridUnsafeMemory mem = desc == null ? null : desc.memory(); @@ -374,15 +377,21 @@ public class GridH2Table extends TableBase { } else { // index(1) is PK, get full row from there (search row here contains only key but no other columns). - row = pk.remove(row); + GridH2Row old = pk.remove(row); + + if (old instanceof GridH2AbstractKeyValueRow) { // Unswap value. + Value v = row.getValue(GridH2AbstractKeyValueRow.VAL_COL); + + ((GridH2AbstractKeyValueRow)old).unswapBeforeRemove(v); + } - if (row != null) { + if (old != null) { // Remove row from all indexes. // Start from 2 because 0 - Scan (don't need to update), 1 - PK (already updated). for (int i = 2, len = idxs.size(); i < len; i++) { - Row res = index(i).remove(row); + Row res = index(i).remove(old); - assert eq(pk, res, row): "\n" + row + "\n" + res; + assert eq(pk, res, old): "\n" + old + "\n" + res; } } else http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2445bbd/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 4bb801b..e9a9ad4 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 @@ -202,8 +202,8 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract assertFalse(spi.query(typeBA.space(), "select * from B.A", Collections.emptySet(), typeBA, null).hasNext()); // Nothing to remove. - spi.remove("A", 1); - spi.remove("B", 1); + spi.remove("A", 1, aa(1, "", 10)); + spi.remove("B", 1, ba(1, "", 10, true)); spi.store(typeAA.space(), typeAA, 1, aa(1, "Vasya", 10), "v1".getBytes(), 0); @@ -307,13 +307,13 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract assertFalse(fieldsRes.iterator().hasNext()); // Remove - spi.remove(typeAA.space(), 2); + spi.remove(typeAA.space(), 2, aa(2, "Valera", 19)); assertEquals(1, spi.size(typeAA.space(), typeAA, null)); assertEquals(2, spi.size(typeAB.space(), typeAB, null)); assertEquals(1, spi.size(typeBA.space(), typeBA, null)); - spi.remove(typeBA.space(), 1); + spi.remove(typeBA.space(), 1, ba(2, "Kolya", 25, true)); assertEquals(1, spi.size(typeAA.space(), typeAA, null)); assertEquals(2, spi.size(typeAB.space(), typeAB, null));