Index - All Packages - All Categories - All Classes
Class SnarfPacker
Should myFlocks contain full flockInfos for forwarded flocks? Both the flags and the size mean nothing.
A SnarfPacker maintains the relationship between Shepherds and the set of snarfs representing the disk. A SnarfPacker assigns flocks to snarfs based loosely on the flocks's Shepherd's preferences. When a flock changes, it informs the SnarfPacker. When the SnarfPacker decides to write to the disk, it ensures that the changed objects still fit in their snarf (migrating them if necessary), writes them to the snarf, then writes out the snarf.
mySnarfInfo
- How much space remains in each snarf.
mySnarfMap
- Map from snarfIDs to a SnarfRecord that handles that snarf.
myChangedSnarfs
- The IDs for all snarfs in which an imaged flock has changed.
myFlocks
- Indexed by Abraham hash, contains all FlockInfos that refer to flocks in memory.
Multiple infos may refer to the same flock if it is referenced through forwarding.
The only info considered to have the correct state wrt its flocks suitability for
purging is the info pointed to by its Abraham.
myInsideCommit
- True while writing new and changed flocks to disk to prevent purging,
and during purgeClean to prevent recursive call through Purgeror recycling.
Package: Udanax-Gold
All Superclasses: Object Heaper DiskManager
Protocols: Object
Categories: Xanadu-Snarf
Class MethodsbombResetCommit: CHARGE
initializeUrdiOnDisk: fname
linkTimeNonInherited
Overrides: DiskManager class
make: fname
Overrides: DiskManager class
Instance MethodsaddInfo: info with: shep
Add another flockInfo object to myFlocks with info about another location for shep.
assignSnarf: shep
Find a snarf in which to fit shep. Then assign it to
that location, and mark that snarf as changed.
beginConsistent: dirtyFlocks
Overrides: DiskManager
checkInfos
Perform the sanity check of the moment. Beware the compile cost of changing this comment.
commitState: flag
Used by ResetCommit bomb
commitView
Commit by destroying the current view and creating a new one.
computeSize: flock
Send the snarf over a transmitter into a stream that just counts the bytes put
into it.
consistent: dirty with: aBlock
Overrides: DiskManager
consistentCount
create: urdi
currentView
Return the current urdiView.
destroyAbandoned
Destroy all forgotten flocks that are no longer in memory.
destroyFlock: info
Queue destroy of the given flock. The destroy will happen later.
Overrides: DiskManager
destruct
Destroy all objects imaged from this snarf.
Overrides: DiskManager
diskUpdate: info
Overrides: DiskManager
dismantleFlock: info
Turn the flock designated by info into a Pumpkin. It should have completed all dismantle actions.
Overrides: DiskManager
dropFlock: token
The flock is being removed from memory. For now, this is an error
if the flock has been updated. If the flock has been forgotten,
then it will be dismantled when next it comes in from disk.
Because of forwarding, there may be many FlockInfos refering
to the flock if it is not new.
Overrides: DiskManager
endConsistent: dirty
Overrides: DiskManager
fetchCanonical: hash with: snarfID with: index
If something is already imaged at that location, then return it. If there is already
an existing stub with the same hash at a different location, follow them till we
know that they are actually different objects.
Overrides: DiskManager
fetchInMemory: snarfID with: index
Return true if the object is on disk but not in memory.
flushFlocks
Actually write all the changed and newly assigned flocks to the disk.
forgetFlock: info
Remember that there are no more persistent pointers to the shepherd
represented by info. If it gets manually deleted, dismantle it immediately.
If it gets garbage collected, remember to dismantle it when it comes back
in from the disk.
Overrides: DiskManager
forgottenFlocks: snarfID
Return the set of indices to flocks in snarf snarfID that are forgotten.
forwardFlock: shep
Shep has grown too large for its current place. Treat it as just a new flock and give it another place.
getFlock: snarfID with: index
Return a flock at a particular location. This needs to register
the flock if it doesn't exist already.
getInitialFlock
Return the starting object for the entire backend. This will be the 0th
flock in the first snarf following the snarfInfo tables.
Overrides: DiskManager
getReadHandler: snarfID
Get the read handler on the snarf.
getSnarfRecord: snarfID
Return the snarfRecord for snarfID. The SnarfRecord must exist if there are
changed flocks imaged out of that snarf, but might not otherwise. Create it if necessary.
insideCommit
Overrides: DiskManager
isFake
Overrides: DiskManager
makePersistent
The virtual image in memory is now in a consistent state. Write the image of
all changed or new Shepherds out to the disk in a single atomic action. The
atomicity only happens on top of a real Urdi, however.
makeRcvr: readStream
makeReal: info
Retrieve from the disk the flock at index within the specified snarf. Since
stubs are canonical, and this only gets called by stubs, the existing stub will
*become* the shepherd for the flock.
Overrides: DiskManager
makeXmtr: writeStream
nextHashForEqual
Shepherds use a sequence number for their hash. Return the next one
and increment. This should actually spread the hashes.
Overrides: DiskManager
purge
Flush everything out to disk and remove all purgeable imaged
objects from memory.
Overrides: DiskManager
purgeClean
purgeClean: noneLocked
purge all shepherds that are currently clean, not locked, not dirty,
and purgeable. Purging just turns them into stubs, freeing all their
flocks. Garbage collection can clean up the flocks and any stubs no
longer pointed to by something in memory. Because infos for new
flocks don't appear in myFlocks, this will not throw out any newFlocks
(which will be marked dirty anyway). For each FlockInfo, we check
that its flock refers to that exact instance to get correct information
about its dirty state.
Overrides: DiskManager
recordUpdate: info
The flock represented by info has changed. Record it in the
bookkeeping data-structures. This must be called by all things
that affect whether the flock gets rewritten to disk.
refitFlocks
Make sure all flocks that have changed still fit in their snarfs.
Add any that don't to myNewFlocks and return the table
from their current locations to the newShepherds.
registerStub: shep with: snarfID with: index
Overrides: DiskManager
releaseReadHandler: handler
Release the supplied snarfHandler and destroy it.
rememberFlock: info
There are now persistent pointers to the shepherd help by info.
Overrides: DiskManager
resolveLocation: info
Make sure that the shepherd or stub at that location actually points
at the real location for a shepherd. This will resolve forwarding pointers,
but not instantiate any flocks.
setHashCounter: aCounter
Overrides: DiskManager
storeAlmostNewShepherd: shep
Do nothing
Overrides: DiskManager
storeInitialFlock: turtle with: protocol with: cookbook
A turtle just got created! Write out a pseudo-forwarder that has all the protocol information encoded in the snarfID and index.
Overrides: DiskManager
storeNewFlock: shep
Shep just got created! On some later commit, assign it to a snarf
and write it to the disk.
Overrides: DiskManager
testNewFlocks
Index - All Packages - All Categories - All Classes