Allow DfsReader to be subclassed

Necessary if a DFS implementation wants to override close()
to record DfsReaderIoStats.

Change-Id: I144575f9bf1abf2c1fd72030550c4f0795fcf44d
This commit is contained in:
Shawn Pearce 2017-05-19 13:47:10 -07:00
parent 562de51239
commit 1513a5632d
5 changed files with 14 additions and 8 deletions

View File

@ -674,7 +674,7 @@ private static boolean isReachable(Repository repo, AnyObjectId id)
private boolean isObjectInPack(AnyObjectId id, DfsPackFile pack) private boolean isObjectInPack(AnyObjectId id, DfsPackFile pack)
throws IOException { throws IOException {
try (DfsReader reader = new DfsReader(odb)) { try (DfsReader reader = odb.newReader()) {
return pack.hasObject(reader, id); return pack.hasObject(reader, id);
} }
} }

View File

@ -530,7 +530,7 @@ public void close() throws IOException {
} }
private class Reader extends ObjectReader { private class Reader extends ObjectReader {
private final DfsReader ctx = new DfsReader(db); private final DfsReader ctx = db.newReader();
@Override @Override
public ObjectReader newReader() { public ObjectReader newReader() {
@ -647,7 +647,7 @@ private class StreamLoader extends ObjectLoader {
@Override @Override
public ObjectStream openStream() throws IOException { public ObjectStream openStream() throws IOException {
final DfsReader ctx = new DfsReader(db); final DfsReader ctx = db.newReader();
if (srcPack != packKey) { if (srcPack != packKey) {
try { try {
// Post DfsInserter.flush() use the normal code path. // Post DfsInserter.flush() use the normal code path.

View File

@ -170,7 +170,7 @@ public DfsReaderOptions getReaderOptions() {
} }
@Override @Override
public ObjectReader newReader() { public DfsReader newReader() {
return new DfsReader(this); return new DfsReader(this);
} }

View File

@ -95,7 +95,7 @@
* See the base {@link ObjectReader} documentation for details. Notably, a * See the base {@link ObjectReader} documentation for details. Notably, a
* reader is not thread safe. * reader is not thread safe.
*/ */
public final class DfsReader extends ObjectReader implements ObjectReuseAsIs { public class DfsReader extends ObjectReader implements ObjectReuseAsIs {
private static final int MAX_RESOLVE_MATCHES = 256; private static final int MAX_RESOLVE_MATCHES = 256;
/** Temporary buffer large enough for at least one raw object id. */ /** Temporary buffer large enough for at least one raw object id. */
@ -112,7 +112,13 @@ public final class DfsReader extends ObjectReader implements ObjectReuseAsIs {
private DfsPackFile last; private DfsPackFile last;
private boolean avoidUnreachable; private boolean avoidUnreachable;
DfsReader(DfsObjDatabase db) { /**
* Initialize a new DfsReader
*
* @param db
* parent DfsObjDatabase.
*/
protected DfsReader(DfsObjDatabase db) {
this.db = db; this.db = db;
this.streamFileThreshold = db.getReaderOptions().getStreamFileThreshold(); this.streamFileThreshold = db.getReaderOptions().getStreamFileThreshold();
} }
@ -129,7 +135,7 @@ DeltaBaseCache getDeltaBaseCache() {
@Override @Override
public ObjectReader newReader() { public ObjectReader newReader() {
return new DfsReader(db); return db.newReader();
} }
@Override @Override

View File

@ -99,7 +99,7 @@ public byte[] getCachedBytes() throws LargeObjectException {
@Override @Override
public ObjectStream openStream() throws MissingObjectException, IOException { public ObjectStream openStream() throws MissingObjectException, IOException {
DfsReader ctx = new DfsReader(db); DfsReader ctx = db.newReader();
InputStream in; InputStream in;
try { try {
in = new PackInputStream(pack, objectOffset + headerLength, ctx); in = new PackInputStream(pack, objectOffset + headerLength, ctx);