blob: d4bbaeafeebac6eb89220bb1e3a7ec75524c7131 [file] [log] [blame]
/*
* 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.cache;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
/**
* Base runnable for {@link IgniteInternalCache#clearLocally(boolean, boolean, boolean)} routine.
*/
public class GridCacheClearAllRunnable<K, V> implements Runnable {
/** Cache to be cleared. */
protected final GridCacheAdapter<K, V> cache;
/** Obsolete version. */
protected final GridCacheVersion obsoleteVer;
/** Mod for the given runnable. */
protected final int id;
/** Mods count across all spawned clearLocally runnables. */
protected final int totalCnt;
/** Whether to clear readers. */
protected final boolean readers;
/** Cache context. */
protected final GridCacheContext<K, V> ctx;
/** Logger. */
protected final IgniteLogger log;
/**
* Constructor.
*
* @param cache Cache to be cleared.
* @param obsoleteVer Obsolete version.
* @param id Mod for the given runnable.
* @param totalCnt Mods count across all spawned clearLocally runnables.
*/
public GridCacheClearAllRunnable(GridCacheAdapter<K, V> cache, GridCacheVersion obsoleteVer,
int id, int totalCnt, boolean readers) {
assert cache != null;
assert obsoleteVer != null;
assert id >= 0;
assert totalCnt > 0;
assert id < totalCnt;
this.cache = cache;
this.obsoleteVer = obsoleteVer;
this.id = id;
this.totalCnt = totalCnt;
this.readers = readers;
ctx = cache.context();
log = ctx.logger(getClass());
}
/** {@inheritDoc} */
@Override public void run() {
for (GridCacheEntryEx gridCacheEntryEx : cache.entries())
clearEntry(gridCacheEntryEx);
if (!ctx.isNear()) {
if (id == 0)
ctx.offheap().clearCache(ctx, readers);
}
}
/**
* Clear entry from cache.
*
* @param e Entry.
*/
protected void clearEntry(GridCacheEntryEx e) {
ctx.shared().database().checkpointReadLock();
try {
e.clear(obsoleteVer, readers);
}
catch (IgniteCheckedException ex) {
U.error(log, "Failed to clearLocally entry from cache (will continue to clearLocally other entries): " + e, ex);
}
finally {
ctx.shared().database().checkpointReadUnlock();
}
}
/**
* Check whether this worker owns particular key.
*
* @param key Key.
* @return {@code True} in case this worker should process this key.
*/
protected boolean owns(KeyCacheObject key) {
assert key != null;
// Avoid hash code and remainder calculation in case there is no actual split.
return totalCnt == 1 || key.hashCode() % totalCnt == id;
}
/**
* @return ID for the given runnable.
*/
public int id() {
return id;
}
/**
* @return Total count across all spawned clearLocally runnables.
*/
public int totalCount() {
return totalCnt;
}
/**
* @return Whether to clean readers.
*/
public boolean readers() {
return readers;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridCacheClearAllRunnable.class, this);
}
}