Class DfsGarbageCollector
- java.lang.Object
-
- org.eclipse.jgit.internal.storage.dfs.DfsGarbageCollector
-
public class DfsGarbageCollector extends java.lang.Object
Repack and garbage collect a repository.
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.Set<ObjectId>
allHeadsAndTags
private java.util.Set<ObjectId>
allTags
private long
coalesceGarbageLimit
private boolean
convertToReftable
private DfsReader
ctx
private java.util.List<DfsPackFile>
expiredGarbagePacks
private long
garbageTtlMillis
private boolean
includeDeletes
private java.util.List<DfsPackDescription>
newPackDesc
private java.util.List<ObjectIdSet>
newPackObj
private java.util.List<PackStatistics>
newPackStats
private java.util.Set<ObjectId>
nonHeads
private DfsObjDatabase
objdb
private PackConfig
packConfig
private java.util.List<DfsPackFile>
packsBefore
private RefDatabase
refdb
private java.util.Collection<Ref>
refsBefore
private ReftableConfig
reftableConfig
private long
reftableInitialMaxUpdateIndex
private long
reftableInitialMinUpdateIndex
private java.util.List<DfsReftable>
reftablesBefore
private DfsRepository
repo
private long
startTimeMillis
private java.util.Set<ObjectId>
tagTargets
-
Constructor Summary
Constructors Constructor Description DfsGarbageCollector(DfsRepository repository)
Initialize a garbage collector.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private boolean
anyPackHas(AnyObjectId id)
private static long
dayStartInMillis(long timeInMillis)
private long
estimateGcPackSize(DfsObjDatabase.PackSource first, DfsObjDatabase.PackSource... rest)
private java.util.Collection<Ref>
getAllRefs()
long
getCoalesceGarbageLimit()
Get coalesce garbage limitlong
getGarbageTtlMillis()
Get time to live for garbage packs.java.util.List<DfsPackDescription>
getNewPacks()
Get new packs created by this compaction.java.util.List<PackStatistics>
getNewPackStatistics()
Get statistics corresponding to thegetNewPacks()
.PackConfig
getPackConfig()
Get configuration used to generate the new pack file.java.util.Set<DfsPackDescription>
getSourcePacks()
Get all of the source packs that fed into this compaction.private boolean
hasGcReftable()
private static boolean
isHead(Ref ref)
private static boolean
isTag(Ref ref)
private PackWriter
newPackWriter()
private int
objectsBefore()
boolean
pack(ProgressMonitor pm)
Create a single new pack file containing all of the live objects.private void
packGarbage(ProgressMonitor pm)
private void
packHeads(ProgressMonitor pm)
private boolean
packIsCoalesceableGarbage(DfsPackDescription d, long now)
private boolean
packIsExpiredGarbage(DfsPackDescription d, long now)
private void
packRest(ProgressMonitor pm)
private void
readPacksBefore()
private void
readReftablesBefore()
DfsGarbageCollector
setCoalesceGarbageLimit(long limit)
Set the byte size limit for garbage packs to be repacked.DfsGarbageCollector
setConvertToReftable(boolean convert)
Whether the garbage collector should convert references to reftable.DfsGarbageCollector
setGarbageTtl(long ttl, java.util.concurrent.TimeUnit unit)
Set the time to live for garbage objects.DfsGarbageCollector
setIncludeDeletes(boolean include)
Whether the garbage collector will include tombstones for deleted references in the reftable.DfsGarbageCollector
setPackConfig(PackConfig newConfig)
Set the new configuration to use when creating the pack file.DfsGarbageCollector
setReftableConfig(ReftableConfig cfg)
Set configuration to write a reftable.DfsGarbageCollector
setReftableInitialMaxUpdateIndex(long u)
Set maxUpdateIndex for the initial reftable created during conversion.DfsGarbageCollector
setReftableInitialMinUpdateIndex(long u)
Set minUpdateIndex for the initial reftable created during conversion.private java.util.Set<DfsPackDescription>
toPrune()
private DfsPackDescription
writePack(DfsObjDatabase.PackSource source, PackWriter pw, ProgressMonitor pm, long estimatedPackSize)
private void
writeReftable()
private void
writeReftable(DfsPackDescription pack)
private void
writeReftable(DfsPackDescription pack, java.util.Collection<Ref> refs)
-
-
-
Field Detail
-
repo
private final DfsRepository repo
-
refdb
private final RefDatabase refdb
-
objdb
private final DfsObjDatabase objdb
-
newPackDesc
private final java.util.List<DfsPackDescription> newPackDesc
-
newPackStats
private final java.util.List<PackStatistics> newPackStats
-
newPackObj
private final java.util.List<ObjectIdSet> newPackObj
-
ctx
private DfsReader ctx
-
packConfig
private PackConfig packConfig
-
reftableConfig
private ReftableConfig reftableConfig
-
convertToReftable
private boolean convertToReftable
-
includeDeletes
private boolean includeDeletes
-
reftableInitialMinUpdateIndex
private long reftableInitialMinUpdateIndex
-
reftableInitialMaxUpdateIndex
private long reftableInitialMaxUpdateIndex
-
coalesceGarbageLimit
private long coalesceGarbageLimit
-
garbageTtlMillis
private long garbageTtlMillis
-
startTimeMillis
private long startTimeMillis
-
packsBefore
private java.util.List<DfsPackFile> packsBefore
-
reftablesBefore
private java.util.List<DfsReftable> reftablesBefore
-
expiredGarbagePacks
private java.util.List<DfsPackFile> expiredGarbagePacks
-
refsBefore
private java.util.Collection<Ref> refsBefore
-
allHeadsAndTags
private java.util.Set<ObjectId> allHeadsAndTags
-
allTags
private java.util.Set<ObjectId> allTags
-
nonHeads
private java.util.Set<ObjectId> nonHeads
-
tagTargets
private java.util.Set<ObjectId> tagTargets
-
-
Constructor Detail
-
DfsGarbageCollector
public DfsGarbageCollector(DfsRepository repository)
Initialize a garbage collector.- Parameters:
repository
- repository objects to be packed will be read from.
-
-
Method Detail
-
getPackConfig
public PackConfig getPackConfig()
Get configuration used to generate the new pack file.- Returns:
- configuration used to generate the new pack file.
-
setPackConfig
public DfsGarbageCollector setPackConfig(PackConfig newConfig)
Set the new configuration to use when creating the pack file.- Parameters:
newConfig
- the new configuration to use when creating the pack file.- Returns:
this
-
setReftableConfig
public DfsGarbageCollector setReftableConfig(ReftableConfig cfg)
Set configuration to write a reftable.- Parameters:
cfg
- configuration to write a reftable. Reftable writing is disabled (default) whencfg
isnull
.- Returns:
this
-
setConvertToReftable
public DfsGarbageCollector setConvertToReftable(boolean convert)
Whether the garbage collector should convert references to reftable.- Parameters:
convert
- iftrue
,setReftableConfig(ReftableConfig)
has been set non-null, and a GC reftable doesn't yet exist, the garbage collector will make one by scanning the existing references, and writing a new reftable. Default istrue
.- Returns:
this
-
setIncludeDeletes
public DfsGarbageCollector setIncludeDeletes(boolean include)
Whether the garbage collector will include tombstones for deleted references in the reftable.- Parameters:
include
- iftrue
, the garbage collector will include tombstones for deleted references in the reftable. Default isfalse
.- Returns:
this
-
setReftableInitialMinUpdateIndex
public DfsGarbageCollector setReftableInitialMinUpdateIndex(long u)
Set minUpdateIndex for the initial reftable created during conversion.- Parameters:
u
- minUpdateIndex for the initial reftable created by scanningDfsRefDatabase.getRefs(String)
. Ignored unless caller has also setsetReftableConfig(ReftableConfig)
. Defaults to1
. Must beu >= 0
.- Returns:
this
-
setReftableInitialMaxUpdateIndex
public DfsGarbageCollector setReftableInitialMaxUpdateIndex(long u)
Set maxUpdateIndex for the initial reftable created during conversion.- Parameters:
u
- maxUpdateIndex for the initial reftable created by scanningDfsRefDatabase.getRefs(String)
. Ignored unless caller has also setsetReftableConfig(ReftableConfig)
. Defaults to1
. Must beu >= 0
.- Returns:
this
-
getCoalesceGarbageLimit
public long getCoalesceGarbageLimit()
Get coalesce garbage limit- Returns:
- coalesce garbage limit, packs smaller than this size will be repacked.
-
setCoalesceGarbageLimit
public DfsGarbageCollector setCoalesceGarbageLimit(long limit)
Set the byte size limit for garbage packs to be repacked.Any UNREACHABLE_GARBAGE pack smaller than this limit will be repacked at the end of the run. This allows the garbage collector to coalesce unreachable objects into a single file.
If an UNREACHABLE_GARBAGE pack is already larger than this limit it will be left alone by the garbage collector. This avoids unnecessary disk IO reading and copying the objects.
If limit is set to 0 the UNREACHABLE_GARBAGE coalesce is disabled.
If limit is set toLong.MAX_VALUE
, everything is coalesced.Keeping unreachable garbage prevents race conditions with repository changes that may suddenly need an object whose only copy was stored in the UNREACHABLE_GARBAGE pack.
- Parameters:
limit
- size in bytes.- Returns:
this
-
getGarbageTtlMillis
public long getGarbageTtlMillis()
Get time to live for garbage packs.- Returns:
- garbage packs older than this limit (in milliseconds) will be pruned as part of the garbage collection process if the value is > 0, otherwise garbage packs are retained.
-
setGarbageTtl
public DfsGarbageCollector setGarbageTtl(long ttl, java.util.concurrent.TimeUnit unit)
Set the time to live for garbage objects.Any UNREACHABLE_GARBAGE older than this limit will be pruned at the end of the run.
If timeToLiveMillis is set to 0, UNREACHABLE_GARBAGE purging is disabled.
- Parameters:
ttl
- Time to live whatever unit is specified.unit
- The specified time unit.- Returns:
this
-
pack
public boolean pack(ProgressMonitor pm) throws java.io.IOException
Create a single new pack file containing all of the live objects.This method safely decides which packs can be expired after the new pack is created by validating the references have not been modified in an incompatible way.
- Parameters:
pm
- progress monitor to receive updates on as packing may take a while, depending on the size of the repository.- Returns:
- true if the repack was successful without race conditions. False if a race condition was detected and the repack should be run again later.
- Throws:
java.io.IOException
- a new pack cannot be created.
-
getAllRefs
private java.util.Collection<Ref> getAllRefs() throws java.io.IOException
- Throws:
java.io.IOException
-
readPacksBefore
private void readPacksBefore() throws java.io.IOException
- Throws:
java.io.IOException
-
readReftablesBefore
private void readReftablesBefore() throws java.io.IOException
- Throws:
java.io.IOException
-
packIsExpiredGarbage
private boolean packIsExpiredGarbage(DfsPackDescription d, long now)
-
packIsCoalesceableGarbage
private boolean packIsCoalesceableGarbage(DfsPackDescription d, long now)
-
dayStartInMillis
private static long dayStartInMillis(long timeInMillis)
-
getSourcePacks
public java.util.Set<DfsPackDescription> getSourcePacks()
Get all of the source packs that fed into this compaction.- Returns:
- all of the source packs that fed into this compaction.
-
getNewPacks
public java.util.List<DfsPackDescription> getNewPacks()
Get new packs created by this compaction.- Returns:
- new packs created by this compaction.
-
getNewPackStatistics
public java.util.List<PackStatistics> getNewPackStatistics()
Get statistics corresponding to thegetNewPacks()
.The elements can be null if the stat is not available for the pack file.
- Returns:
- statistics corresponding to the
getNewPacks()
.
-
toPrune
private java.util.Set<DfsPackDescription> toPrune()
-
packHeads
private void packHeads(ProgressMonitor pm) throws java.io.IOException
- Throws:
java.io.IOException
-
packRest
private void packRest(ProgressMonitor pm) throws java.io.IOException
- Throws:
java.io.IOException
-
packGarbage
private void packGarbage(ProgressMonitor pm) throws java.io.IOException
- Throws:
java.io.IOException
-
anyPackHas
private boolean anyPackHas(AnyObjectId id)
-
isHead
private static boolean isHead(Ref ref)
-
isTag
private static boolean isTag(Ref ref)
-
objectsBefore
private int objectsBefore()
-
newPackWriter
private PackWriter newPackWriter()
-
estimateGcPackSize
private long estimateGcPackSize(DfsObjDatabase.PackSource first, DfsObjDatabase.PackSource... rest)
-
writePack
private DfsPackDescription writePack(DfsObjDatabase.PackSource source, PackWriter pw, ProgressMonitor pm, long estimatedPackSize) throws java.io.IOException
- Throws:
java.io.IOException
-
writeReftable
private void writeReftable() throws java.io.IOException
- Throws:
java.io.IOException
-
writeReftable
private void writeReftable(DfsPackDescription pack) throws java.io.IOException
- Throws:
java.io.IOException
-
hasGcReftable
private boolean hasGcReftable()
-
writeReftable
private void writeReftable(DfsPackDescription pack, java.util.Collection<Ref> refs) throws java.io.IOException
- Throws:
java.io.IOException
-
-