/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved.
*
* $Id$
*/
package com.sleepycat.db;
import com.sleepycat.db.internal.DbConstants;
import com.sleepycat.db.internal.DbEnv;
/** The return status from processing a replication message. */
public final class ReplicationStatus {
static final ReplicationStatus SUCCESS =
new ReplicationStatus("SUCCESS", 0);
private int errCode;
private DatabaseEntry cdata;
private int envid;
private LogSequenceNumber lsn;
/* For toString */
private String statusName;
private ReplicationStatus(final String statusName,
final int errCode,
final DatabaseEntry cdata,
final int envid,
final LogSequenceNumber lsn) {
this.statusName = statusName;
this.errCode = errCode;
this.cdata = cdata;
this.envid = envid;
this.lsn = lsn;
}
private ReplicationStatus(final String statusName, final int errCode) {
this(statusName, errCode, null, 0, null);
}
/**
The operation succeeded.
*/
public boolean isSuccess() {
return errCode == 0;
}
/**
This message cannot be processed.
This is an indication that this message is irrelevant to the current
replication state (for example, an old message from a previous
generation arrives and is processed late).
**/
public boolean isIgnore() {
return errCode == DbConstants.DB_REP_IGNORE;
}
/**
Processing this message resulted in the processing of records that
are permanent. The maximum LSN of the permanent records stored is
available from the getLSN method.
*/
public boolean isPermanent() {
return errCode == DbConstants.DB_REP_ISPERM;
}
/**
The system received contact information from a new environment. A
copy of the opaque data specified in the cdata parameter to the
{@link com.sleepycat.db.Environment#startReplication Environment.startReplication} is available from the
getCDAta method. The application should take whatever action is
needed to establish a communication channel with this new
environment.
*/
public boolean isNewSite() {
return errCode == DbConstants.DB_REP_NEWSITE;
}
/**
A message carrying a DB_REP_PERMANENT flag was processed successfully,
but was not written to disk. The LSN of this record is available from
the getLSN method. The application should take whatever action is
deemed necessary to retain its recoverability characteristics.
*/
public boolean isNotPermanent() {
return errCode == DbConstants.DB_REP_NOTPERM;
}
/**
Whenever the system receives contact information from a new
environment, a copy of the opaque data specified in the cdata
parameter to the {@link com.sleepycat.db.Environment#startReplication Environment.startReplication} is available
from the getCDAta method. The application should take whatever
action is needed to establish a communication channel with this new
environment.
*/
public DatabaseEntry getCData() {
return cdata;
}
/**
Return the environment ID associated with the operation. In most cases,
this is the same as the environment ID passed to {@link com.sleepycat.db.Environment#processReplicationMessage Environment.processReplicationMessage}. However, if a new master is elected, this
method returns the environment ID of the new master. It is the
application's responsibility to ensure that the matching node begins acting
as the master environment.
*/
public int getEnvID() {
return envid;
}
/**
Whenever processing a messages results in the processing of messages
that are permanent, or a message carrying a DB_REP_PERMANENT flag
was processed successfully, but was not written to disk, the LSN of
the record is available from the getLSN method. The application
should take whatever action is deemed necessary to retain its
recoverability characteristics.
*/
public LogSequenceNumber getLSN() {
return lsn;
}
/** {@inheritDoc} */
public String toString() {
return "ReplicationStatus." + statusName;
}
/* package */
static ReplicationStatus getStatus(final int errCode,
final DatabaseEntry cdata,
final int envid,
final LogSequenceNumber lsn) {
switch(errCode) {
case 0:
return SUCCESS;
case DbConstants.DB_REP_IGNORE:
return IGNORE;
case DbConstants.DB_REP_ISPERM:
return new ReplicationStatus("ISPERM", errCode, cdata, envid, lsn);
case DbConstants.DB_REP_NEWSITE:
return new ReplicationStatus("NEWSITE", errCode, cdata, envid, lsn);
case DbConstants.DB_REP_NOTPERM:
return new ReplicationStatus("NOTPERM", errCode, cdata, envid, lsn);
default:
throw new IllegalArgumentException(
"Unknown error code: " + DbEnv.strerror(errCode));
}
}
private static final ReplicationStatus IGNORE =
new ReplicationStatus("IGNORE", DbConstants.DB_REP_IGNORE);
}