blob: 20ed1944fff73406be0ba95ac93fca5440e5e04a [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.visor.tx;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.TimeZone;
import java.util.UUID;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.visor.VisorDataTransferObject;
import org.apache.ignite.lang.IgniteClosure;
import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.transactions.TransactionConcurrency;
import org.apache.ignite.transactions.TransactionIsolation;
import org.apache.ignite.transactions.TransactionState;
import org.jetbrains.annotations.Nullable;
/**
*/
public class VisorTxInfo extends VisorDataTransferObject {
/** */
private static final long serialVersionUID = 0L;
/** */
private static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
/** */
private IgniteUuid xid;
/**
* Transaction start time.
*/
private long startTime;
/** */
private long duration;
/** */
private TransactionIsolation isolation;
/** */
private TransactionConcurrency concurrency;
/** */
private long timeout;
/** */
private String lb;
/** */
private Collection<UUID> primaryNodes;
/** */
private TransactionState state;
/** */
private int size;
/** */
private IgniteUuid nearXid;
/** */
private Collection<UUID> masterNodeIds;
/** */
private AffinityTopologyVersion topVer;
/** Tx verbose info. */
private TxVerboseInfo txVerboseInfo;
/**
* Default constructor.
*/
public VisorTxInfo() {
// No-op.
}
/**
* @param xid Xid.
* @param startTime Start time of transaction.
* @param duration Duration.
* @param isolation Isolation.
* @param concurrency Concurrency.
* @param timeout Timeout.
* @param lb Label.
* @param primaryNodes Primary nodes.
* @param state State.
* @param size Size.
* @param info Verbose TX info.
*/
public VisorTxInfo(IgniteUuid xid, long startTime, long duration, TransactionIsolation isolation,
TransactionConcurrency concurrency, long timeout, String lb, Collection<UUID> primaryNodes,
TransactionState state, int size, IgniteUuid nearXid, Collection<UUID> masterNodeIds,
AffinityTopologyVersion topVer, TxVerboseInfo info) {
this.xid = xid;
this.startTime = startTime;
this.duration = duration;
this.isolation = isolation;
this.concurrency = concurrency;
this.timeout = timeout;
this.lb = lb;
this.primaryNodes = primaryNodes;
this.state = state;
this.size = size;
this.nearXid = nearXid;
this.masterNodeIds = masterNodeIds;
this.topVer = topVer;
txVerboseInfo = info;
}
/**
* Constructor for historical mode.
* Used to encapsulate information about tx commit/rollback from completed versions history map.
*
* @param xid Xid.
* @param state State.
*/
public VisorTxInfo(IgniteUuid xid, TransactionState state) {
this(xid, 0L, 0L, null, null, 0L, null, null, state, 0, null, null, null, null);
}
/** {@inheritDoc} */
@Override public byte getProtocolVersion() {
return V5;
}
/** */
public IgniteUuid getXid() {
return xid;
}
/** */
public long getStartTime() {
return startTime;
}
/** */
public String getFormattedStartTime() {
return dateTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), TimeZone.getDefault().toZoneId()));
}
/** */
public long getDuration() {
return duration;
}
/** */
public TransactionIsolation getIsolation() {
return isolation;
}
/** */
public TransactionConcurrency getConcurrency() {
return concurrency;
}
/** */
public AffinityTopologyVersion getTopologyVersion() {
return topVer;
}
/** */
public long getTimeout() {
return timeout;
}
/** */
public String getLabel() {
return lb;
}
/** */
public Collection<UUID> getPrimaryNodes() {
return primaryNodes;
}
/** */
public TransactionState getState() {
return state;
}
/** */
public int getSize() {
return size;
}
/** */
public @Nullable IgniteUuid getNearXid() {
return nearXid;
}
/** */
public @Nullable Collection<UUID> getMasterNodeIds() {
return masterNodeIds;
}
/**
* @return Tx verbose info.
*/
public TxVerboseInfo getTxVerboseInfo() {
return txVerboseInfo;
}
/** {@inheritDoc} */
@Override protected void writeExternalData(ObjectOutput out) throws IOException {
U.writeIgniteUuid(out, xid);
out.writeLong(duration);
U.writeEnum(out, isolation);
U.writeEnum(out, concurrency);
out.writeLong(timeout);
U.writeString(out, lb);
U.writeCollection(out, primaryNodes);
U.writeEnum(out, state);
out.writeInt(size);
U.writeIgniteUuid(out, nearXid);
U.writeCollection(out, masterNodeIds);
out.writeLong(startTime);
out.writeLong(topVer == null ? -1 : topVer.topologyVersion());
out.writeInt(topVer == null ? -1 : topVer.minorTopologyVersion());
out.writeObject(txVerboseInfo);
}
/** {@inheritDoc} */
@Override protected void readExternalData(
byte protoVer,
ObjectInput in
) throws IOException, ClassNotFoundException {
xid = U.readIgniteUuid(in);
duration = in.readLong();
isolation = TransactionIsolation.fromOrdinal(in.readByte());
concurrency = TransactionConcurrency.fromOrdinal(in.readByte());
timeout = in.readLong();
lb = U.readString(in);
primaryNodes = U.readCollection(in);
state = TransactionState.fromOrdinal(in.readByte());
size = in.readInt();
if (protoVer >= V2) {
nearXid = U.readIgniteUuid(in);
masterNodeIds = U.readCollection(in);
startTime = in.readLong();
}
if (protoVer >= V3) {
long topVer = in.readLong();
int minorTopVer = in.readInt();
if (topVer != -1)
this.topVer = new AffinityTopologyVersion(topVer, minorTopVer);
}
if (protoVer >= V4)
txVerboseInfo = (TxVerboseInfo)in.readObject();
}
/**
* Get tx info as user string.
*
* @return User string.
*/
public String toUserString() {
return " Tx: [xid=" + getXid() +
", label=" + getLabel() +
", state=" + getState() +
", startTime=" + getFormattedStartTime() +
", duration=" + getDuration() / 1000 +
", isolation=" + getIsolation() +
", concurrency=" + getConcurrency() +
", topVer=" + (getTopologyVersion() == null ? "N/A" : getTopologyVersion()) +
", timeout=" + getTimeout() +
", size=" + getSize() +
", dhtNodes=" + (getPrimaryNodes() == null ? "N/A" :
F.transform(getPrimaryNodes(), new IgniteClosure<UUID, String>() {
@Override public String apply(UUID id) {
return U.id8(id);
}
})) +
", nearXid=" + getNearXid() +
", parentNodeIds=" + (getMasterNodeIds() == null ? "N/A" :
F.transform(getMasterNodeIds(), new IgniteClosure<UUID, String>() {
@Override public String apply(UUID id) {
return U.id8(id);
}
})) +
']';
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(VisorTxInfo.class, this);
}
}