dfs: Add a position argument
This makes DfsBlockCache methods more unified. Also this reduces a magic number embedded in DfsBlockCache. Change-Id: I61e6c93ca283c0395738103bd2d94091edbccd4e Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
This commit is contained in:
parent
566384fa45
commit
e837bdd0fa
|
@ -521,17 +521,20 @@ void put(DfsBlock v) {
|
|||
*
|
||||
* @param key
|
||||
* the stream key of the pack.
|
||||
* @param position
|
||||
* the position in the key. The default should be 0.
|
||||
* @param loader
|
||||
* the function to load the reference.
|
||||
* @return the object reference.
|
||||
* @throws IOException
|
||||
* the reference was not in the cache and could not be loaded.
|
||||
*/
|
||||
<T> Ref<T> getOrLoadRef(DfsStreamKey key, RefLoader<T> loader)
|
||||
<T> Ref<T> getOrLoadRef(
|
||||
DfsStreamKey key, long position, RefLoader<T> loader)
|
||||
throws IOException {
|
||||
int slot = slot(key, 0);
|
||||
int slot = slot(key, position);
|
||||
HashEntry e1 = table.get(slot);
|
||||
Ref<T> ref = scanRef(e1, key, 0);
|
||||
Ref<T> ref = scanRef(e1, key, position);
|
||||
if (ref != null) {
|
||||
getStat(statHit, key).incrementAndGet();
|
||||
return ref;
|
||||
|
@ -543,7 +546,7 @@ <T> Ref<T> getOrLoadRef(DfsStreamKey key, RefLoader<T> loader)
|
|||
try {
|
||||
HashEntry e2 = table.get(slot);
|
||||
if (e2 != e1) {
|
||||
ref = scanRef(e2, key, 0);
|
||||
ref = scanRef(e2, key, position);
|
||||
if (ref != null) {
|
||||
getStat(statHit, key).incrementAndGet();
|
||||
return ref;
|
||||
|
|
|
@ -89,6 +89,7 @@
|
|||
*/
|
||||
public final class DfsPackFile extends BlockBasedFile {
|
||||
private static final int REC_SIZE = Constants.OBJECT_ID_LENGTH + 8;
|
||||
private static final long REF_POSITION = 0;
|
||||
|
||||
/**
|
||||
* Lock for initialization of {@link #index} and {@link #corruptObjects}.
|
||||
|
@ -194,7 +195,9 @@ private PackIndex idx(DfsReader ctx) throws IOException {
|
|||
|
||||
try {
|
||||
DfsStreamKey idxKey = desc.getStreamKey(INDEX);
|
||||
DfsBlockCache.Ref<PackIndex> idxref = cache.getOrLoadRef(idxKey,
|
||||
DfsBlockCache.Ref<PackIndex> idxref = cache.getOrLoadRef(
|
||||
idxKey,
|
||||
REF_POSITION,
|
||||
() -> loadPackIndex(ctx, idxKey));
|
||||
PackIndex idx = idxref.get();
|
||||
if (index == null && idx != null) {
|
||||
|
@ -232,6 +235,7 @@ PackBitmapIndex getBitmapIndex(DfsReader ctx) throws IOException {
|
|||
DfsStreamKey bitmapKey = desc.getStreamKey(BITMAP_INDEX);
|
||||
DfsBlockCache.Ref<PackBitmapIndex> idxref = cache.getOrLoadRef(
|
||||
bitmapKey,
|
||||
REF_POSITION,
|
||||
() -> loadBitmapIndex(ctx, bitmapKey, idx, revidx));
|
||||
PackBitmapIndex bmidx = idxref.get();
|
||||
if (bitmapIndex == null && bmidx != null) {
|
||||
|
@ -255,7 +259,9 @@ PackReverseIndex getReverseIdx(DfsReader ctx) throws IOException {
|
|||
DfsStreamKey revKey = new DfsStreamKey.ForReverseIndex(
|
||||
desc.getStreamKey(INDEX));
|
||||
DfsBlockCache.Ref<PackReverseIndex> revref = cache.getOrLoadRef(
|
||||
revKey, () -> loadReverseIdx(ctx, revKey, idx));
|
||||
revKey,
|
||||
REF_POSITION,
|
||||
() -> loadReverseIdx(ctx, revKey, idx));
|
||||
PackReverseIndex revidx = revref.get();
|
||||
if (reverseIndex == null && revidx != null) {
|
||||
reverseIndex = revidx;
|
||||
|
@ -1034,7 +1040,7 @@ private DfsBlockCache.Ref<PackIndex> loadPackIndex(
|
|||
Integer.MAX_VALUE);
|
||||
ctx.stats.readIdxBytes += rc.position();
|
||||
index = idx;
|
||||
return new DfsBlockCache.Ref<>(idxKey, 0, sz, idx);
|
||||
return new DfsBlockCache.Ref<>(idxKey, REF_POSITION, sz, idx);
|
||||
} finally {
|
||||
ctx.stats.readIdxMicros += elapsedMicros(start);
|
||||
}
|
||||
|
@ -1054,7 +1060,7 @@ private DfsBlockCache.Ref<PackReverseIndex> loadReverseIdx(
|
|||
PackReverseIndex revidx = new PackReverseIndex(idx);
|
||||
int sz = (int) Math.min(idx.getObjectCount() * 8, Integer.MAX_VALUE);
|
||||
reverseIndex = revidx;
|
||||
return new DfsBlockCache.Ref<>(revKey, 0, sz, revidx);
|
||||
return new DfsBlockCache.Ref<>(revKey, REF_POSITION, sz, revidx);
|
||||
}
|
||||
|
||||
private DfsBlockCache.Ref<PackBitmapIndex> loadBitmapIndex(
|
||||
|
@ -1085,7 +1091,7 @@ private DfsBlockCache.Ref<PackBitmapIndex> loadBitmapIndex(
|
|||
}
|
||||
int sz = (int) Math.min(size, Integer.MAX_VALUE);
|
||||
bitmapIndex = bmidx;
|
||||
return new DfsBlockCache.Ref<>(bitmapKey, 0, sz, bmidx);
|
||||
return new DfsBlockCache.Ref<>(bitmapKey, REF_POSITION, sz, bmidx);
|
||||
} catch (EOFException e) {
|
||||
throw new IOException(MessageFormat.format(
|
||||
DfsText.get().shortReadOfIndex,
|
||||
|
|
Loading…
Reference in New Issue