提交 f11667db authored 作者: Thomas Mueller's avatar Thomas Mueller

Formatting.

上级 bf43f380
......@@ -48,7 +48,7 @@ import org.h2.value.ValueLobDb;
* lock the Database object. However, in the case of the LOB data, we are using
* the system session to store the data. If we locked the normal way, we see
* deadlocks caused by the following pattern:
*
*
* <pre>
* Thread 1:
* locks normal session
......@@ -58,7 +58,7 @@ import org.h2.value.ValueLobDb;
* locks system session
* waiting to lock database.
* </pre>
*
*
* So, in this class alone, we do two things: we have our very own dedicated
* session, the LOB session, and we take the locks in this order: first the
* Database object, and then the LOB session. Since we own the LOB session,
......@@ -326,7 +326,7 @@ public class LobStorageBackend implements LobStorageInterface {
// see locking discussion at the top
synchronized (database) {
synchronized (conn.getSession()) {
long lobId = lob.getLobId();
long lobId = lob.getLobId();
return new LobInputStream(lobId, byteCount);
}
}
......
......@@ -65,7 +65,7 @@ public class LobStorageFrontend implements LobStorageInterface {
public void setTable(ValueLobDb lob, int tableIdSessionVariable) {
throw new UnsupportedOperationException();
}
@Override
public void removeAllForTable(int tableId) {
throw new UnsupportedOperationException();
......
......@@ -70,17 +70,17 @@ public interface LobStorageInterface {
* @param lob the lob
*/
void removeLob(ValueLobDb lob);
/**
* Remove all LOBs for this table.
*
* @param tableId the table id
*/
void removeAllForTable(int tableId);
/**
* Initialize the lob storage.
*/
void init();
}
......@@ -34,35 +34,36 @@ import org.h2.value.ValueLobDb;
* i.e. the server side of the LOB storage.
*/
public class LobStorageMap implements LobStorageInterface {
private static final boolean TRACE = false;
private final Database database;
private boolean init;
/**
* The lob metadata map. It contains the mapping from the lob id
* (which is a long) to the stream store id (which is a byte array).
*
* Key: lobId (long)
* Value: { streamStoreId (byte[]), tableId (int), byteCount (long), hashCode (long) }.
*
* Key: lobId (long)
* Value: { streamStoreId (byte[]), tableId (int),
* byteCount (long), hashCode (long) }.
*/
private MVMap<Long, Object[]> lobMap;
/**
* The reference map. It is used to remove data from the stream store: if no
* more entries for the given streamStoreId exist, the data is removed from
* the stream store.
*
*
* Key: { streamStoreId (byte[]), lobId (long) }.
* Value: true (boolean).
*/
private MVMap<Object[], Boolean> refMap;
/**
* The stream store data map.
*
*
* Key: stream store block id (long).
* Value: data (byte[]).
*/
......@@ -73,7 +74,7 @@ public class LobStorageMap implements LobStorageInterface {
public LobStorageMap(Database database) {
this.database = database;
}
@Override
public void init() {
if (init) {
......@@ -88,14 +89,15 @@ public class LobStorageMap implements LobStorageInterface {
} else {
mvStore = s.getStore();
}
lobMap = mvStore.openMap("lobMap",
lobMap = mvStore.openMap("lobMap",
new MVMapConcurrent.Builder<Long, Object[]>());
refMap = mvStore.openMap("lobRef",
refMap = mvStore.openMap("lobRef",
new MVMapConcurrent.Builder<Object[], Boolean>());
dataMap = mvStore.openMap("lobData",
new MVMapConcurrent.Builder<Long, byte[]>());
streamStore = new StreamStore(dataMap);
// TODO currently needed to avoid out of memory
// TODO currently needed to avoid out of memory,
// because memory usage is only measure in number of pages currently
streamStore.setMaxBlockSize(32 * 1024);
}
......@@ -165,13 +167,13 @@ public class LobStorageMap implements LobStorageInterface {
throw DbException.convertIOException(e, null);
}
}
private ValueLobDb createLob(InputStream in, int type) throws IOException {
byte[] streamStoreId;
try {
streamStoreId = streamStore.put(in);
} catch (Exception e) {
throw DbException.convertToIOException(e);
throw DbException.convertToIOException(e);
}
long lobId = generateLobId();
long length = streamStore.length(streamStoreId);
......@@ -186,7 +188,7 @@ public class LobStorageMap implements LobStorageInterface {
}
return lob;
}
private long generateLobId() {
Long id = lobMap.lastKey();
return id == null ? 1 : id + 1;
......@@ -211,7 +213,7 @@ public class LobStorageMap implements LobStorageInterface {
refMap.put(key, Boolean.TRUE);
ValueLobDb lob = ValueLobDb.create(type, database, tableId, lobId, null, length);
if (TRACE) {
trace("copy " + old.getTableId() + "/" + old.getLobId() + " > " + tableId + "/" + lobId);
trace("copy " + old.getTableId() + "/" + old.getLobId() + " > " + tableId + "/" + lobId);
}
return lob;
}
......@@ -220,7 +222,7 @@ public class LobStorageMap implements LobStorageInterface {
public InputStream getInputStream(ValueLobDb lob, byte[] hmac, long byteCount)
throws IOException {
init();
Object[] value = lobMap.get(lob.getLobId());
Object[] value = lobMap.get(lob.getLobId());
byte[] streamStoreId = (byte[]) value[0];
return streamStore.get(streamStoreId);
}
......@@ -231,16 +233,17 @@ public class LobStorageMap implements LobStorageInterface {
long lobId = lob.getLobId();
Object[] value = lobMap.remove(lobId);
if (TRACE) {
trace("move " + lob.getTableId() + "/" + lob.getLobId() + " > " + tableId + "/" + lobId);
trace("move " + lob.getTableId() + "/" + lob.getLobId() + " > " + tableId + "/" + lobId);
}
value[1] = tableId;
lobMap.put(lobId, value);
}
@Override
public void removeAllForTable(int tableId) {
init();
// this might not be very efficient - to speed it up, we would need yet another map
// this might not be very efficient -
// to speed it up, we would need yet another map
ArrayList<Long> list = New.arrayList();
for (Entry<Long, Object[]> e : lobMap.entrySet()) {
Object[] value = e.getValue();
......@@ -261,10 +264,10 @@ public class LobStorageMap implements LobStorageInterface {
long lobId = lob.getLobId();
removeLob(tableId, lobId);
}
private void removeLob(int tableId, long lobId) {
if (TRACE) {
trace("remove " + tableId + "/" + lobId);
trace("remove " + tableId + "/" + lobId);
}
Object[] value = lobMap.remove(lobId);
byte[] streamStoreId = (byte[]) value[0];
......@@ -284,7 +287,7 @@ public class LobStorageMap implements LobStorageInterface {
streamStore.remove(streamStoreId);
}
}
private static void trace(String op) {
System.out.println("LOB " + op);
}
......
......@@ -26,7 +26,7 @@ class LobStorageRemoteInputStream extends InputStream {
* The lob id.
*/
private final long lob;
private final byte[] hmac;
/**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论