/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.node;
import freenet.support.LightweightException;
import freenet.support.LogThresholdCallback;
import freenet.support.Logger;
import freenet.support.Logger.LogLevel;
public class LowLevelGetException extends LightweightException {
private static volatile boolean logDEBUG;
static {
Logger.registerLogThresholdCallback(new LogThresholdCallback() {
@Override
public void shouldUpdate() {
logDEBUG = Logger.shouldLog(LogLevel.DEBUG, this);
}
});
}
private static final long serialVersionUID = 1L;
/** Decode of data failed, probably was bogus at source */
public static final int DECODE_FAILED = 1;
/** Data was not in store and request was local-only */
public static final int DATA_NOT_FOUND_IN_STORE = 2;
/** An internal error occurred */
public static final int INTERNAL_ERROR = 3;
/** The request went to many hops, but could not find the data. Maybe
* it doesn't exist. */
public static final int DATA_NOT_FOUND = 4;
/** The request could not find enough nodes to visit while looking for
* the datum. */
public static final int ROUTE_NOT_FOUND = 5;
/** A downstream node is overloaded, and rejected the request. We should
* reduce our rate of sending requests.
*/
public static final int REJECTED_OVERLOAD = 6;
/** Transfer of data started, but then failed. */
public static final int TRANSFER_FAILED = 7;
/** Data successfully transferred, but was not valid (at the node key level
* i.e. before decode) */
public static final int VERIFY_FAILED = 8;
/** Request cancelled by user */
public static final int CANCELLED = 9;
/** Ran into a failure table */
public static final int RECENTLY_FAILED = 10;
public static String getMessage(int reason) {
switch(reason) {
case DECODE_FAILED:
return "Decode of data failed, probably was bogus at source";
case DATA_NOT_FOUND_IN_STORE:
return "Data was not in store and request was local-only";
case INTERNAL_ERROR:
return "Internal error - probably a bug";
case DATA_NOT_FOUND:
return "Could not find the data";
case ROUTE_NOT_FOUND:
return "Could not find enough nodes to be sure that the data is not out there somewhere";
case REJECTED_OVERLOAD:
return "A node downstream either timed out or was overloaded (retry)";
case TRANSFER_FAILED:
return "Started to transfer data, then failed (should be rare)";
case VERIFY_FAILED:
return "Node sent us invalid data";
case CANCELLED:
return "Request cancelled";
case RECENTLY_FAILED:
return "Request killed by failure table due to recently DNFing on a downstream node";
default:
return "Unknown error code: "+reason;
}
}
/** Failure code */
public final int code;
public LowLevelGetException(int code, String message, Throwable t) {
super(message, t);
this.code = code;
}
public LowLevelGetException(int code, String message) {
super(message);
this.code = code;
}
public LowLevelGetException(int reason) {
super(getMessage(reason));
this.code = reason;
}
@Override
public String toString() {
return super.toString()+':'+getMessage(code);
}
@Override
protected boolean shouldFillInStackTrace() {
return logDEBUG || code == INTERNAL_ERROR || code == DECODE_FAILED || code == VERIFY_FAILED;
}
}