/* This file is part of VoltDB. * Copyright (C) 2008-2017 VoltDB Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with VoltDB. If not, see <http://www.gnu.org/licenses/>. */ package org.voltdb; import java.io.Serializable; import com.google_voltpatches.common.base.Preconditions; public class DRSequenceId implements Serializable, Comparable<DRSequenceId> { private static final long serialVersionUID = 1192186486936556377L; public static final short MAX_CLUSTER_ID = (1 << 8) - 1; public static final long MAX_SEQUENCE_NUMBER = (1L << 55) - 1L; public static final long UNINITIALIZED_SEQUENCE_NUMBER = -1L; public final long rawDrId; public DRSequenceId(long drId) { this.rawDrId = drId; } public DRSequenceId(DRSequenceId drSeqId) { this.rawDrId = drSeqId.rawDrId; } @Override public String toString() { return Long.toString(getSentinelOrSeqNumFromDRId(this)); } public boolean equals(DRSequenceId drId){ return rawDrId == drId.rawDrId; } public static DRSequenceId makeDRIdFromComponents(int clusterId, long sequenceNumber) { Preconditions.checkArgument(clusterId <= MAX_CLUSTER_ID); Preconditions.checkArgument(sequenceNumber >= 0); Preconditions.checkArgument(sequenceNumber <= MAX_SEQUENCE_NUMBER); return new DRSequenceId(((long)clusterId << 55) | sequenceNumber); } public static DRSequenceId makeEmptyDRId(int clusterId) { Preconditions.checkArgument(clusterId <= MAX_CLUSTER_ID); return new DRSequenceId(((long)1 << 63) | ((long)clusterId << 55) | MAX_SEQUENCE_NUMBER); } public static DRSequenceId makeInitialAckDRId(int clusterId) { return new DRSequenceId(makeDRIdFromComponents(clusterId, 0L).rawDrId - 1L); } public static boolean isEmptyDRId (DRSequenceId drId) { return (drId.rawDrId >>> 63) == 1L; } public static boolean seqIsBeforeZero(DRSequenceId drId) { return ((-1L & MAX_SEQUENCE_NUMBER) == getSequenceNumberFromDRId(drId)); } public static int getClusterIdFromDRId(DRSequenceId drId) { return (int)((drId.rawDrId >> 55) & MAX_CLUSTER_ID); } public static long getSequenceNumberFromDRId(DRSequenceId drId) { return drId.rawDrId & MAX_SEQUENCE_NUMBER; } public static long getSentinelOrSeqNumFromDRId(DRSequenceId drId) { return (drId.rawDrId < 0 ? drId.rawDrId : (drId.rawDrId & MAX_SEQUENCE_NUMBER)); } @Override public int compareTo(DRSequenceId drId) { return Long.compare(rawDrId, drId.rawDrId); } }