diff options
author | Christian Halstrick <christian.halstrick@sap.com> | 2015-06-13 01:38:29 +0200 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2015-06-22 11:18:31 +0200 |
commit | 6b65adca2d50108fcb106904738b444fefe49fd1 (patch) | |
tree | 5a45bd2d2bcfc891c9b8c82c1483457d75f06b1b /org.eclipse.jgit | |
parent | 2dd4dc149ce9e6231c42eaa995c52ea3e90181dd (diff) | |
download | jgit-6b65adca2d50108fcb106904738b444fefe49fd1.tar.gz jgit-6b65adca2d50108fcb106904738b444fefe49fd1.zip |
Add a grace period for packfiles during GC
For loose objects an expiration date can be set which will save too
young objects from being deleted. Add the same for packfiles. Packfiles
which are too young are not deleted.
Bug: 468024
Change-Id: I3956411d19b47aaadc215dab360d57fa6c24635e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java index 338106f8e7..c5723c0594 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java @@ -175,13 +175,17 @@ public class GC { /** * Delete old pack files. What is 'old' is defined by specifying a set of * old pack files and a set of new pack files. Each pack file contained in - * old pack files but not contained in new pack files will be deleted. + * old pack files but not contained in new pack files will be deleted. If an + * expirationDate is set then pack files which are younger than the + * expirationDate will not be deleted. * * @param oldPacks * @param newPacks + * @throws ParseException */ private void deleteOldPacks(Collection<PackFile> oldPacks, - Collection<PackFile> newPacks) { + Collection<PackFile> newPacks) throws ParseException { + long expireDate = getExpireDate(); oldPackLoop: for (PackFile oldPack : oldPacks) { String oldName = oldPack.getPackName(); // check whether an old pack file is also among the list of new @@ -190,7 +194,8 @@ public class GC { if (oldName.equals(newPack.getPackName())) continue oldPackLoop; - if (!oldPack.shouldBeKept()) { + if (!oldPack.shouldBeKept() + && oldPack.getPackFile().lastModified() < expireDate) { oldPack.close(); prunePack(oldName); } @@ -303,22 +308,7 @@ public class GC { */ public void prune(Set<ObjectId> objectsToKeep) throws IOException, ParseException { - long expireDate = Long.MAX_VALUE; - - if (expire == null && expireAgeMillis == -1) { - String pruneExpireStr = repo.getConfig().getString( - ConfigConstants.CONFIG_GC_SECTION, null, - ConfigConstants.CONFIG_KEY_PRUNEEXPIRE); - if (pruneExpireStr == null) - pruneExpireStr = PRUNE_EXPIRE_DEFAULT; - expire = GitDateParser.parse(pruneExpireStr, null, SystemReader - .getInstance().getLocale()); - expireAgeMillis = -1; - } - if (expire != null) - expireDate = expire.getTime(); - if (expireAgeMillis != -1) - expireDate = System.currentTimeMillis() - expireAgeMillis; + long expireDate = getExpireDate(); // Collect all loose objects which are old enough, not referenced from // the index and not in objectsToKeep @@ -435,6 +425,26 @@ public class GC { repo.getObjectDatabase().close(); } + private long getExpireDate() throws ParseException { + long expireDate = Long.MAX_VALUE; + + if (expire == null && expireAgeMillis == -1) { + String pruneExpireStr = repo.getConfig().getString( + ConfigConstants.CONFIG_GC_SECTION, null, + ConfigConstants.CONFIG_KEY_PRUNEEXPIRE); + if (pruneExpireStr == null) + pruneExpireStr = PRUNE_EXPIRE_DEFAULT; + expire = GitDateParser.parse(pruneExpireStr, null, SystemReader + .getInstance().getLocale()); + expireAgeMillis = -1; + } + if (expire != null) + expireDate = expire.getTime(); + if (expireAgeMillis != -1) + expireDate = System.currentTimeMillis() - expireAgeMillis; + return expireDate; + } + /** * Remove all entries from a map which key is the id of an object referenced * by the given ObjectWalk @@ -559,7 +569,14 @@ public class GC { if (rest != null) ret.add(rest); } - deleteOldPacks(toBeDeleted, ret); + try { + deleteOldPacks(toBeDeleted, ret); + } catch (ParseException e) { + // TODO: the exception has to be wrapped into an IOException because + // throwing the ParseException directly would break the API, instead + // we should throw a ConfigInvalidException + throw new IOException(e); + } prunePacked(); lastPackedRefs = refsBefore; |