Updated storage to throw IOException when there is a problem
deserializing the data from disk
This commit is contained in:
parent
3b3a2e6d74
commit
e9585ce5b7
|
@ -35,6 +35,7 @@ import dorkbox.util.bytes.ByteArrayWrapper;
|
|||
* <p/>
|
||||
* Be wary of opening the database file in different JVM instances. Even with file-locks, you can corrupt the data.
|
||||
*/
|
||||
@SuppressWarnings({"Convert2Diamond", "Convert2Lambda"})
|
||||
class DiskStorage implements Storage {
|
||||
private final DelayTimer timer;
|
||||
private final ByteArrayWrapper defaultKey;
|
||||
|
@ -122,37 +123,45 @@ class DiskStorage implements Storage {
|
|||
|
||||
/**
|
||||
* Reads a object using the default (blank) key, and casts it to the expected class
|
||||
*
|
||||
* @throws IOException if there is a problem deserializing data from disk
|
||||
*/
|
||||
@Override
|
||||
public final
|
||||
<T> T get() {
|
||||
<T> T get() throws IOException {
|
||||
return get0(this.defaultKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a object using the specific key, and casts it to the expected class
|
||||
*
|
||||
* @throws IOException if there is a problem deserializing data from disk
|
||||
*/
|
||||
@Override
|
||||
public final
|
||||
<T> T get(String key) {
|
||||
<T> T get(String key) throws IOException {
|
||||
return get0(ByteArrayWrapper.wrap(key));
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a object using the specific key, and casts it to the expected class
|
||||
*
|
||||
* @throws IOException if there is a problem deserializing data from disk
|
||||
*/
|
||||
@Override
|
||||
public final
|
||||
<T> T get(byte[] key) {
|
||||
<T> T get(byte[] key) throws IOException {
|
||||
return get0(ByteArrayWrapper.wrap(key));
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a object using the specific key, and casts it to the expected class
|
||||
*
|
||||
* @throws IOException if there is a problem deserializing data from disk
|
||||
*/
|
||||
@Override
|
||||
public final
|
||||
<T> T get(ByteArrayWrapper key) {
|
||||
<T> T get(ByteArrayWrapper key) throws IOException {
|
||||
return get0(key);
|
||||
}
|
||||
|
||||
|
@ -223,9 +232,11 @@ class DiskStorage implements Storage {
|
|||
|
||||
/**
|
||||
* Reads a object from pending or from storage
|
||||
*
|
||||
* @throws IOException if there is a problem deserializing data from disk
|
||||
*/
|
||||
private
|
||||
<T> T get0(ByteArrayWrapper key) {
|
||||
<T> T get0(ByteArrayWrapper key) throws IOException {
|
||||
if (!this.isOpen.get()) {
|
||||
throw new RuntimeException("Unable to act on closed storage");
|
||||
}
|
||||
|
|
|
@ -38,22 +38,22 @@ interface Storage {
|
|||
/**
|
||||
* Reads a object using the DEFAULT key ("") key, and casts it to the expected class
|
||||
*/
|
||||
<T> T get();
|
||||
<T> T get() throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a object using the specific key, and casts it to the expected class
|
||||
*/
|
||||
<T> T get(String key);
|
||||
<T> T get(String key) throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a object using the specific key, and casts it to the expected class
|
||||
*/
|
||||
<T> T get(byte[] key);
|
||||
<T> T get(byte[] key) throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a object using the specific key, and casts it to the expected class
|
||||
*/
|
||||
<T> T get(ByteArrayWrapper key);
|
||||
<T> T get(ByteArrayWrapper key) throws IOException;
|
||||
|
||||
/**
|
||||
* Uses the DEFAULT key ("") to return saved data.
|
||||
|
|
|
@ -33,9 +33,11 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import com.esotericsoftware.kryo.KryoException;
|
||||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
|
||||
import dorkbox.util.OS;
|
||||
import dorkbox.util.SerializationManager;
|
||||
import dorkbox.util.bytes.ByteArrayWrapper;
|
||||
|
||||
|
@ -251,7 +253,7 @@ class StorageBase {
|
|||
* @return an object for a specified key form referenceCache FIRST, then from DISK
|
||||
*/
|
||||
final
|
||||
<T> T get(ByteArrayWrapper key) {
|
||||
<T> T get(ByteArrayWrapper key) throws IOException {
|
||||
// NOT protected by lock
|
||||
|
||||
Metadata meta = this.memoryIndex.get(key);
|
||||
|
@ -298,13 +300,11 @@ class StorageBase {
|
|||
|
||||
return readRecordData;
|
||||
} catch (Exception e) {
|
||||
if (this.logger != null) {
|
||||
this.logger.error("Error while getting data from disk", e);
|
||||
if (e instanceof KryoException && e.getMessage().contains("(missing no-arg constructor)")) {
|
||||
throw new IOException("Cannot get data from disk: " + e.getMessage().substring(0, e.getMessage().indexOf(OS.LINE_SEPARATOR)));
|
||||
} else {
|
||||
throw new IOException("Cannot get data from disk", e);
|
||||
}
|
||||
else {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user