blob: c21f78806b21a9d985b8a6ca715df7b1bb0b47fc [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 javax.cache.processor.EntryProcessor;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersionConflictContext;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.lang.IgniteBiTuple;
import org.jetbrains.annotations.Nullable;
/**
* Cache entry atomic update result.
*/
public class GridCacheUpdateAtomicResult {
/** Update operation outcome. */
private final UpdateOutcome outcome;
/** Old value. */
@GridToStringInclude
private final CacheObject oldVal;
/** New value. */
@GridToStringInclude
private final CacheObject newVal;
/** New TTL. */
private final long newTtl;
/** Explicit DR expire time (if any). */
private final long conflictExpireTime;
/** Version for deferred delete. */
@GridToStringInclude
private final GridCacheVersion rmvVer;
/** DR resolution result. */
@GridToStringInclude
private final GridCacheVersionConflictContext<?, ?> conflictRes;
/** */
private final long updateCntr;
/** Flag indicating whether value is transformed. */
private boolean transformed;
/** Value computed by entry processor. */
private IgniteBiTuple<Object, Exception> res;
/**
* Constructor.
*
* @param outcome Update outcome.
* @param oldVal Old value.
* @param newVal New value.
* @param res Value computed by the {@link EntryProcessor}.
* @param newTtl New TTL.
* @param conflictExpireTime Explicit DR expire time (if any).
* @param rmvVer Version for deferred delete.
* @param conflictRes DR resolution result.
* @param updateCntr Partition update counter.
* @param transformed {@code True} if result was transformed.
*/
GridCacheUpdateAtomicResult(UpdateOutcome outcome,
@Nullable CacheObject oldVal,
@Nullable CacheObject newVal,
@Nullable IgniteBiTuple<Object, Exception> res,
long newTtl,
long conflictExpireTime,
@Nullable GridCacheVersion rmvVer,
@Nullable GridCacheVersionConflictContext<?, ?> conflictRes,
long updateCntr,
boolean transformed) {
assert outcome != null;
this.outcome = outcome;
this.oldVal = oldVal;
this.newVal = newVal;
this.res = res;
this.newTtl = newTtl;
this.conflictExpireTime = conflictExpireTime;
this.rmvVer = rmvVer;
this.conflictRes = conflictRes;
this.updateCntr = updateCntr;
this.transformed = transformed;
}
/**
* @return Update operation outcome.
*/
UpdateOutcome outcome() {
return outcome;
}
/**
* @return Value computed by the {@link EntryProcessor}.
*/
@Nullable public IgniteBiTuple<Object, Exception> computedResult() {
return res;
}
/**
* @return Success flag.
*/
public boolean success() {
return outcome.success();
}
/**
* @return Old value.
*/
@Nullable public CacheObject oldValue() {
return oldVal;
}
/**
* @return New value.
*/
@Nullable public CacheObject newValue() {
return newVal;
}
/**
* @return {@link GridCacheUtils#TTL_NOT_CHANGED} if TTL did not change, otherwise new TTL.
*/
public long newTtl() {
return newTtl;
}
/**
* @return Partition update index.
*/
public long updateCounter() {
return updateCntr;
}
/**
* @return Explicit conflict expire time (if any). Set only if it is necessary to propagate concrete expire time
* value to DHT node. Otherwise set to {@link GridCacheUtils#EXPIRE_TIME_CALCULATE}.
*/
public long conflictExpireTime() {
return conflictExpireTime;
}
/**
* @return Version for deferred delete.
*/
@Nullable public GridCacheVersion removeVersion() {
return rmvVer;
}
/**
* @return DR conflict resolution context.
*/
@Nullable public GridCacheVersionConflictContext<?, ?> conflictResolveResult() {
return conflictRes;
}
/**
* @return Whether update should be propagated to DHT node.
*/
public boolean sendToDht() {
return outcome.sendToDht();
}
/**
*
*/
public enum UpdateOutcome {
/** */
CONFLICT_USE_OLD(false, false, false),
/** */
VERSION_CHECK_FAILED(false, false, false),
/** */
FILTER_FAILED(false, false, true),
/** */
INVOKE_NO_OP(false, false, true),
/** */
INTERCEPTOR_CANCEL(false, false, true),
/** */
REMOVE_NO_VAL(false, true, true),
/** */
SUCCESS(true, true, true);
/** */
private final boolean success;
/** */
private final boolean sndToDht;
/** */
private final boolean updateReadMetrics;
/**
* @param success Success flag.
* @param sndToDht Whether update should be propagated to DHT node.
* @param updateReadMetrics Metrics update flag.
*/
UpdateOutcome(boolean success, boolean sndToDht, boolean updateReadMetrics) {
this.success = success;
this.sndToDht = sndToDht;
this.updateReadMetrics = updateReadMetrics;
}
/**
* @return Success flag.
*/
public boolean success() {
return success;
}
/**
* @return Whether update should be propagated to DHT node.
*/
public boolean sendToDht() {
return sndToDht;
}
/**
* @return Metrics update flag.
*/
public boolean updateReadMetrics() {
return updateReadMetrics;
}
}
/**
* @return {@code True} if transformed.
*/
public boolean transformed() {
return transformed;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridCacheUpdateAtomicResult.class, this);
}
}