All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.mdi.IndexPartitionCause Maven / Gradle / Ivy

package com.bigdata.mdi;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

import com.bigdata.resources.ResourceManager;

/**
 * Encapsulate the reason why an index partition was created and the
 * synchronous overflow counter of the data service on which the index
 * partition was created as of that action. This information may be used to
 * support heuristics which refuse to move an index partition which was
 * recently moved or to join an index partition which was recently split,
 * etc.
 * 
 * @author Bryan Thompson
 * @version $Id$
 */
public class IndexPartitionCause implements Externalizable {

    /**
     * 
     */
    private static final long serialVersionUID = 4643434468430418713L;

    /**
     * Typesafe enumeration of reasons why an index partition was created.
     * 
     * @author Bryan
     *         Thompson
     * @version $Id$
     */
    static public enum CauseEnum {

        /**
         * The initial registration of a scale-out index.
         */
        Register((byte) 0),

        /** An index partition was split. */
        Split((byte) 1),

        /** Two or more index partitions were joined. */
        Join((byte) 2),

        /** An index partition was moved to another data service. */
        Move((byte) 3);

        private CauseEnum(final byte code) {
            this.code = code;
        }

        private final byte code;

        static IndexPartitionCause.CauseEnum valueOf(final byte code) {
            switch (code) {
            case 0:
                return Register;
            case 1:
                return Split;
            case 2:
                return Join;
            case 3:
                return Move;
            default:
                throw new IllegalArgumentException("code=" + code);
            }
        }

    }

    private IndexPartitionCause.CauseEnum cause;

    private long synchronousOverflowCounter;

    private long lastCommitTime;

    /**
     * The underlying cause.
     */
    public IndexPartitionCause.CauseEnum getCause() {
        return cause;
    }

    /**
     * The value of the synchronous overflow counter at the time that the
     * index partition was created.
     */
    public long getSynchronousOverflowCounter() {
        return synchronousOverflowCounter;
    }

    /**
     * The lastCommitTime for the live journal. Note that this will be 0L if no
     * commits have been performed on the journal. This makes the "time" less
     * robust than the overflow counter.
     */
    public long getLastCommitTime() {
        return lastCommitTime;
    }

    /**
     * Factory for {@link CauseEnum#Register}.
     */
    static public IndexPartitionCause register(ResourceManager resourceManager) {

        return new IndexPartitionCause(
                IndexPartitionCause.CauseEnum.Register,
                resourceManager.getSynchronousOverflowCount(),
                resourceManager.getLiveJournal()
                        .getLastCommitTime());

    }
    
    /**
     * Factory for {@link CauseEnum#Split}.
     */
    static public IndexPartitionCause split(ResourceManager resourceManager) {

        return new IndexPartitionCause(
                IndexPartitionCause.CauseEnum.Split,
                resourceManager.getSynchronousOverflowCount(),
                resourceManager.getLiveJournal()
                        .getLastCommitTime());

    }

    /**
     * Factory for {@link CauseEnum#Join}.
     */
    static public IndexPartitionCause join(ResourceManager resourceManager) {

        return new IndexPartitionCause(
                IndexPartitionCause.CauseEnum.Join,
                resourceManager.getSynchronousOverflowCount(),
                resourceManager.getLiveJournal()
                        .getLastCommitTime());

    }

    /**
     * Factory for {@link CauseEnum#Move}.
     */
    static public IndexPartitionCause move(ResourceManager resourceManager) {

        return new IndexPartitionCause(
                IndexPartitionCause.CauseEnum.Move,
                resourceManager.getSynchronousOverflowCount(),
                resourceManager.getLiveJournal()
                        .getLastCommitTime());

    }
    
    /**
     * De-serialization ctor.
     */
    public IndexPartitionCause() {
        
    }
    
    /**
     * 
     * @param cause
     *            The reason why the index partition was created.
     * @param synchronousOverflowCounter
     *            The value of the counter at the time that the index partition
     *            was created.
     * @param lastCommitTime
     *            The lastCommitTime for the live journal. Note that this will
     *            be 0L if no commits have been performed on the journal. This
     *            makes the "time" less robust than the overflow counter.
     */
    public IndexPartitionCause(final IndexPartitionCause.CauseEnum cause,
            final long synchronousOverflowCounter, final long lastCommitTime) {

        if (cause == null)
            throw new IllegalArgumentException();

        if (synchronousOverflowCounter < 0)
            throw new IllegalArgumentException();

        this.cause = cause;

        this.synchronousOverflowCounter = synchronousOverflowCounter;

        this.lastCommitTime = lastCommitTime;

    }

    /**
     * The initial version.
     */
    private static final transient byte VERSION0 = 0;

    /**
     * The current version.
     */
    private static final transient byte VERSION = VERSION0;

    public void readExternal(ObjectInput in) throws IOException,
            ClassNotFoundException {

        final byte version = in.readByte();
        
        if (version != VERSION0)
            throw new UnsupportedOperationException("version=" + version);

        cause = CauseEnum.valueOf(in.readByte());

        synchronousOverflowCounter = in.readLong();

        lastCommitTime = in.readLong();

    }

    public void writeExternal(ObjectOutput out) throws IOException {

        out.writeByte(VERSION);
        out.writeByte(cause.code);
        out.writeLong(synchronousOverflowCounter);
        out.writeLong(lastCommitTime);

    }

    public String toString() {
        
        return getClass().getName() + "{" + cause + ",overflowCounter="
                + synchronousOverflowCounter + ",timestamp=" + lastCommitTime
                + "}";

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy