|
|
|
@ -104,32 +104,26 @@ final class LargePackedWholeObject extends ObjectLoader {
|
|
|
|
|
/** {@inheritDoc} */ |
|
|
|
|
@Override |
|
|
|
|
public ObjectStream openStream() throws MissingObjectException, IOException { |
|
|
|
|
DfsReader ctx = db.newReader(); |
|
|
|
|
InputStream in; |
|
|
|
|
try { |
|
|
|
|
in = new PackInputStream(pack, objectOffset + headerLength, ctx); |
|
|
|
|
} catch (IOException packGone) { |
|
|
|
|
// If the pack file cannot be pinned into the cursor, it
|
|
|
|
|
// probably was repacked recently. Go find the object
|
|
|
|
|
// again and open the stream from that location instead.
|
|
|
|
|
//
|
|
|
|
|
try (DfsReader ctx = db.newReader()) { |
|
|
|
|
try { |
|
|
|
|
in = new PackInputStream(pack, objectOffset + headerLength, ctx); |
|
|
|
|
} catch (IOException packGone) { |
|
|
|
|
// If the pack file cannot be pinned into the cursor, it
|
|
|
|
|
// probably was repacked recently. Go find the object
|
|
|
|
|
// again and open the stream from that location instead.
|
|
|
|
|
//
|
|
|
|
|
ObjectId obj = pack.getReverseIdx(ctx).findObject(objectOffset); |
|
|
|
|
return ctx.open(obj, type).openStream(); |
|
|
|
|
} finally { |
|
|
|
|
ctx.close(); |
|
|
|
|
} |
|
|
|
|
} finally { |
|
|
|
|
ctx.close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Align buffer to inflater size, at a larger than default block.
|
|
|
|
|
// This reduces the number of context switches from the
|
|
|
|
|
// caller down into the pack stream inflation.
|
|
|
|
|
int bufsz = 8192; |
|
|
|
|
in = new BufferedInputStream( |
|
|
|
|
new InflaterInputStream(in, ctx.inflater(), bufsz), |
|
|
|
|
bufsz); |
|
|
|
|
return new ObjectStream.Filter(type, size, in); |
|
|
|
|
// Align buffer to inflater size, at a larger than default block.
|
|
|
|
|
// This reduces the number of context switches from the
|
|
|
|
|
// caller down into the pack stream inflation.
|
|
|
|
|
int bufsz = 8192; |
|
|
|
|
in = new BufferedInputStream( |
|
|
|
|
new InflaterInputStream(in, ctx.inflater(), bufsz), bufsz); |
|
|
|
|
return new ObjectStream.Filter(type, size, in); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|