Class AbstractLazyLoadRunMap<R>
- Direct Known Subclasses:
RunMap
SortedMap that keeps build records by their build numbers, in the descending order
(newer ones first.)
The main thing about this class is that it encapsulates the lazy loading logic.
That is, while this class looks and feels like a normal SortedMap from outside,
it actually doesn't have every item in the map instantiated yet. As items in the map get
requested, this class retrieves them on demand, one by one.
The lookup is done by using the build number as the key (hence the key type is Integer).
This class makes the following assumption about the on-disk layout of the data:
- Every build is stored in a directory, named after its number.
Some of the SortedMap operations are weakly implemented. For example,
AbstractMap.size() may be inaccurate because we only count the number of directories that look like
build records, without checking if they are loadable. But these weaknesses aren't distinguishable
from concurrent modifications, where another thread deletes a build while one thread iterates them.
Object lock of this is used to make sure mutation occurs sequentially.
That is, ensure that only one thread is actually calling retrieve(File) and
updating core.
- Since:
- 1.485
- Author:
- Kohsuke Kawaguchi
-
Nested Class Summary
Nested ClassesNested classes/interfaces inherited from class java.util.AbstractMap
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K, V> -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected Rprotected booleanallowLoad(int buildNumber) final booleanComparator<? super Integer> booleancontainsKey(Object value) booleancontainsValue(Object value) protected IntPredicateprotected BuildReference<R> createReference(R r) Allow subtype to capture a reference.entrySet()booleanfirstKey()get(int n) getByNumber(int n) protected StringSubtype to provideRun.getId()so that this class doesn't have to depend on it.Returns a read-only view of records that has already been loaded.protected abstract intgetNumberOf(R r) Subtype to provideRun.getNumber()so that this class doesn't have to depend on it.inthashCode()protected voidinitBaseDir(File dir) booleanisEmpty()keySet()lastKey()intprotected final voidproposeNewNumber(int number) voidLet go of all the loaded references.voidfinal voidrecognizeNumber(int buildNumber) Permits a previous blocked build number to be eligible for loading.booleanremoveValue(R run) voidReplaces all the current loaded Rs with the given ones.protected abstract RParsesRinstance from data in the specified directory.booleanrunExists(int number) Checks if the specified build exists.search(int n, AbstractLazyLoadRunMap.Direction d) Finds the build #M where M is nearby the given 'n'.final voidupdateBaseDir(File dir) Updates base directory location after directory changes.values()Methods inherited from class java.util.AbstractMap
clear, clone, size, toStringMethods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, waitMethods inherited from interface java.util.Map
clear, compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, replace, replaceAll, size
-
Field Details
-
dir
Base directory for data. In effect this is treated as a final field, but can't mark it final because the compatibility requires that we make it settable in the first call after the constructor.
-
-
Constructor Details
-
AbstractLazyLoadRunMap
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) protected AbstractLazyLoadRunMap()
-
-
Method Details
-
keySet
-
values
-
entrySet
-
initBaseDir
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) protected void initBaseDir(File dir) -
baseDirInitialized
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public final boolean baseDirInitialized()- Returns:
- true if
AbstractLazyLoadRunMap()was called with a non-null param, orRunMap.load(Job, RunMap.Constructor)was called
-
updateBaseDir
Updates base directory location after directory changes. This method should be used on jobs renaming, etc.- Parameters:
dir- Directory location- Since:
- 1.546
-
purgeCache
public void purgeCache()Let go of all the loaded references. This is a bit more sophisticated version of forcing GC. Primarily for debugging and testing lazy loading behaviour.- Since:
- 1.507
-
allowLoad
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) protected boolean allowLoad(int buildNumber) -
createLoadAllower
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) protected IntPredicate createLoadAllower() -
recognizeNumber
@Restricted(org.kohsuke.accmod.restrictions.Beta.class) public final void recognizeNumber(int buildNumber) Permits a previous blocked build number to be eligible for loading.- Parameters:
buildNumber- a build number- See Also:
-
comparator
- Specified by:
comparatorin interfaceSortedMap<Integer,R>
-
isEmpty
public boolean isEmpty() -
containsKey
- Specified by:
containsKeyin interfaceMap<Integer,R> - Overrides:
containsKeyin classAbstractMap<Integer,R>
-
containsValue
- Specified by:
containsValuein interfaceMap<Integer,R> - Overrides:
containsValuein classAbstractMap<Integer,R>
-
getLoadedBuilds
Returns a read-only view of records that has already been loaded. -
subMap
-
headMap
-
tailMap
-
firstKey
-
lastKey
-
newestBuild
-
oldestBuild
-
get
-
get
-
runExists
public boolean runExists(int number) Checks if the specified build exists.- Parameters:
number- the build number to probe.- Returns:
trueif there is an run for the corresponding number, note that this does not mean that the corresponding record will load.- Since:
- 2.14
-
search
Finds the build #M where M is nearby the given 'n'.- Parameters:
n- the index to start the search fromd- defines what we mean by "nearby" above. If EXACT, find #N or return null. If ASC, finds the closest #M that satisfies M ≥ N. If DESC, finds the closest #M that satisfies M ≤ N.
-
getById
-
getByNumber
-
maxNumberOnDisk
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public int maxNumberOnDisk()- Returns:
- the highest recorded build number, or 0 if there are none
-
proposeNewNumber
- Throws:
IllegalStateException
-
put
-
_put
-
put
-
putAll
-
remove
-
getNumberOf
Subtype to provideRun.getNumber()so that this class doesn't have to depend on it. -
getIdOf
Subtype to provideRun.getId()so that this class doesn't have to depend on it. -
createReference
Allow subtype to capture a reference. -
retrieve
ParsesRinstance from data in the specified directory.- Returns:
- null if the parsing failed.
- Throws:
IOException- if the parsing failed. This is just like returning null except the caller will catch the exception and report it.
-
getBuildClass
-
removeValue
-
reset
Replaces all the current loaded Rs with the given ones. -
hashCode
public int hashCode() -
equals
-