Pull-Merge of latest changes from main repo

This commit is contained in:
Abraham Kiggundu
2015-01-08 11:54:47 +03:00
118 changed files with 2538 additions and 1820 deletions

View File

@@ -152,7 +152,7 @@ interface Database<T> {
* <p>
* Locking: write.
*/
boolean addTransport(T txn, TransportId t, long maxLatency)
boolean addTransport(T txn, TransportId t, int maxLatency)
throws DbException;
/**
@@ -460,7 +460,7 @@ interface Database<T> {
* <p>
* Locking: write.
*/
RetentionUpdate getRetentionUpdate(T txn, ContactId c, long maxLatency)
RetentionUpdate getRetentionUpdate(T txn, ContactId c, int maxLatency)
throws DbException;
/**
@@ -499,7 +499,7 @@ interface Database<T> {
* Locking: write.
*/
SubscriptionUpdate getSubscriptionUpdate(T txn, ContactId c,
long maxLatency) throws DbException;
int maxLatency) throws DbException;
/**
* Returns a collection of transport acks for the given contact, or null if
@@ -511,11 +511,11 @@ interface Database<T> {
throws DbException;
/**
* Returns the maximum latencies of all local transports.
* Returns the maximum latencies of all supported transports.
* <p>
* Locking: read.
*/
Map<TransportId, Long> getTransportLatencies(T txn) throws DbException;
Map<TransportId, Integer> getTransportLatencies(T txn) throws DbException;
/**
* Returns a collection of transport updates for the given contact and
@@ -525,7 +525,7 @@ interface Database<T> {
* Locking: write.
*/
Collection<TransportUpdate> getTransportUpdates(T txn, ContactId c,
long maxLatency) throws DbException;
int maxLatency) throws DbException;
/**
* Returns the number of unread messages in each subscribed group.
@@ -798,6 +798,6 @@ interface Database<T> {
* <p>
* Locking: write.
*/
void updateExpiryTime(T txn, ContactId c, MessageId m, long maxLatency)
void updateExpiryTime(T txn, ContactId c, MessageId m, int maxLatency)
throws DbException;
}

View File

@@ -314,7 +314,7 @@ DatabaseCleaner.Callback {
}
}
public boolean addTransport(TransportId t, long maxLatency)
public boolean addTransport(TransportId t, int maxLatency)
throws DbException {
boolean added;
lock.writeLock().lock();
@@ -357,7 +357,7 @@ DatabaseCleaner.Callback {
}
public Collection<byte[]> generateBatch(ContactId c, int maxLength,
long maxLatency) throws DbException {
int maxLatency) throws DbException {
Collection<MessageId> ids;
List<byte[]> messages = new ArrayList<byte[]>();
lock.writeLock().lock();
@@ -384,7 +384,7 @@ DatabaseCleaner.Callback {
return Collections.unmodifiableList(messages);
}
public Offer generateOffer(ContactId c, int maxMessages, long maxLatency)
public Offer generateOffer(ContactId c, int maxMessages, int maxLatency)
throws DbException {
Collection<MessageId> ids;
lock.writeLock().lock();
@@ -432,7 +432,7 @@ DatabaseCleaner.Callback {
}
public Collection<byte[]> generateRequestedBatch(ContactId c, int maxLength,
long maxLatency) throws DbException {
int maxLatency) throws DbException {
Collection<MessageId> ids;
List<byte[]> messages = new ArrayList<byte[]>();
lock.writeLock().lock();
@@ -478,7 +478,7 @@ DatabaseCleaner.Callback {
}
}
public RetentionUpdate generateRetentionUpdate(ContactId c, long maxLatency)
public RetentionUpdate generateRetentionUpdate(ContactId c, int maxLatency)
throws DbException {
lock.writeLock().lock();
try {
@@ -519,7 +519,7 @@ DatabaseCleaner.Callback {
}
public SubscriptionUpdate generateSubscriptionUpdate(ContactId c,
long maxLatency) throws DbException {
int maxLatency) throws DbException {
lock.writeLock().lock();
try {
T txn = db.startTransaction();
@@ -560,7 +560,7 @@ DatabaseCleaner.Callback {
}
public Collection<TransportUpdate> generateTransportUpdates(ContactId c,
long maxLatency) throws DbException {
int maxLatency) throws DbException {
lock.writeLock().lock();
try {
T txn = db.startTransaction();
@@ -932,12 +932,13 @@ DatabaseCleaner.Callback {
}
}
public Map<TransportId, Long> getTransportLatencies() throws DbException {
public Map<TransportId, Integer> getTransportLatencies()
throws DbException {
lock.readLock().lock();
try {
T txn = db.startTransaction();
try {
Map<TransportId, Long> latencies =
Map<TransportId, Integer> latencies =
db.getTransportLatencies(txn);
db.commitTransaction(txn);
return latencies;

View File

@@ -11,13 +11,12 @@ class ExponentialBackoff {
* transmissions increases exponentially. If the expiry time would
* be greater than Long.MAX_VALUE, Long.MAX_VALUE is returned.
*/
static long calculateExpiry(long now, long maxLatency, int txCount) {
static long calculateExpiry(long now, int maxLatency, int txCount) {
if(now < 0) throw new IllegalArgumentException();
if(maxLatency <= 0) throw new IllegalArgumentException();
if(txCount < 0) throw new IllegalArgumentException();
// The maximum round-trip time is twice the maximum latency
long roundTrip = maxLatency * 2;
if(roundTrip < 0) return Long.MAX_VALUE;
long roundTrip = maxLatency * 2L;
// The interval between transmissions is roundTrip * 2 ^ txCount
for(int i = 0; i < txCount; i++) {
roundTrip <<= 1;

View File

@@ -81,34 +81,18 @@ class H2Database extends JdbcDatabase {
}
}
@Override
protected Connection createConnection() throws SQLException {
byte[] key = config.getEncryptionKey();
if(key == null) throw new IllegalStateException();
char[] password = encodePassword(key);
Properties props = new Properties();
props.setProperty("user", "user");
props.put("password", password);
try {
return DriverManager.getConnection(url, props);
} finally {
for(int i = 0; i < password.length; i++) password[i] = 0;
}
}
private char[] encodePassword(byte[] key) {
// The database password is the hex-encoded key
char[] hex = StringUtils.toHexChars(key);
// Separate the database password from the user password with a space
char[] user = "password".toCharArray();
char[] combined = new char[hex.length + 1 + user.length];
System.arraycopy(hex, 0, combined, 0, hex.length);
combined[hex.length] = ' ';
System.arraycopy(user, 0, combined, hex.length + 1, user.length);
// Erase the hex-encoded key
for(int i = 0; i < hex.length; i++) hex[i] = 0;
return combined;
// Separate the file password from the user password with a space
props.put("password", StringUtils.toHexString(key) + " password");
return DriverManager.getConnection(url, props);
}
@Override
protected void flushBuffersToDisk(Statement s) throws SQLException {
// FIXME: Remove this after implementing BTPv2?
s.execute("CHECKPOINT SYNC");

View File

@@ -65,8 +65,8 @@ import org.briarproject.api.transport.TemporarySecret;
*/
abstract class JdbcDatabase implements Database<Connection> {
private static final int SCHEMA_VERSION = 6;
private static final int MIN_SCHEMA_VERSION = 5;
private static final int SCHEMA_VERSION = 7;
private static final int MIN_SCHEMA_VERSION = 7;
private static final String CREATE_SETTINGS =
"CREATE TABLE settings"
@@ -216,7 +216,7 @@ abstract class JdbcDatabase implements Database<Connection> {
private static final String CREATE_TRANSPORTS =
"CREATE TABLE transports"
+ " (transportId VARCHAR NOT NULL,"
+ " maxLatency BIGINT NOT NULL,"
+ " maxLatency INT NOT NULL,"
+ " PRIMARY KEY (transportId))";
private static final String CREATE_TRANSPORT_CONFIGS =
@@ -897,7 +897,7 @@ abstract class JdbcDatabase implements Database<Connection> {
}
}
public boolean addTransport(Connection txn, TransportId t, long maxLatency)
public boolean addTransport(Connection txn, TransportId t, int maxLatency)
throws DbException {
PreparedStatement ps = null;
ResultSet rs = null;
@@ -2055,7 +2055,7 @@ abstract class JdbcDatabase implements Database<Connection> {
}
public RetentionUpdate getRetentionUpdate(Connection txn, ContactId c,
long maxLatency) throws DbException {
int maxLatency) throws DbException {
long now = clock.currentTimeMillis();
PreparedStatement ps = null;
ResultSet rs = null;
@@ -2233,7 +2233,7 @@ abstract class JdbcDatabase implements Database<Connection> {
}
public SubscriptionUpdate getSubscriptionUpdate(Connection txn, ContactId c,
long maxLatency) throws DbException {
int maxLatency) throws DbException {
long now = clock.currentTimeMillis();
PreparedStatement ps = null;
ResultSet rs = null;
@@ -2327,7 +2327,7 @@ abstract class JdbcDatabase implements Database<Connection> {
}
}
public Map<TransportId, Long> getTransportLatencies(Connection txn)
public Map<TransportId, Integer> getTransportLatencies(Connection txn)
throws DbException {
PreparedStatement ps = null;
ResultSet rs = null;
@@ -2335,10 +2335,11 @@ abstract class JdbcDatabase implements Database<Connection> {
String sql = "SELECT transportId, maxLatency FROM transports";
ps = txn.prepareStatement(sql);
rs = ps.executeQuery();
Map<TransportId, Long> latencies = new HashMap<TransportId, Long>();
Map<TransportId, Integer> latencies =
new HashMap<TransportId, Integer>();
while(rs.next()){
TransportId id = new TransportId(rs.getString(1));
latencies.put(id, rs.getLong(2));
latencies.put(id, rs.getInt(2));
}
rs.close();
ps.close();
@@ -2351,7 +2352,7 @@ abstract class JdbcDatabase implements Database<Connection> {
}
public Collection<TransportUpdate> getTransportUpdates(Connection txn,
ContactId c, long maxLatency) throws DbException {
ContactId c, int maxLatency) throws DbException {
long now = clock.currentTimeMillis();
PreparedStatement ps = null;
ResultSet rs = null;
@@ -3332,7 +3333,7 @@ abstract class JdbcDatabase implements Database<Connection> {
}
public void updateExpiryTime(Connection txn, ContactId c, MessageId m,
long maxLatency) throws DbException {
int maxLatency) throws DbException {
PreparedStatement ps = null;
ResultSet rs = null;
try {