This build is primarily so that people running the purge-db4o snapshots can continue to connect to opennet, because 1466 goes mandatory 2014-11-16.
It is more or less purge-db4o-snapshot-28 with a few changes since then,
and is not yet feature-complete.
It's available on update.sh|cmd testing.
Keys:
CHK@WoCa9aTwHGgENAY3cwbZC68ati5OmVMjfMgJ4A0lycs,hVqnPVEZRBgxbnQvRKpa~pVclGTN34f1fXmaFGCAqoo,AAMC--8/freenet-testing-build-1467-pre1-snapshot.jar
CHK@~mGD61ZObEKNrYvwez~jkvNPFcC13zjtQ86SF9t1yFc,Hin-fiH31PXP65NaCGhIMcBuGqdAjqRFsDz5DQiwyFE,AAMC--8/freenet-testing-build-1467-pre1-snapshot.jar.sig
---
Bert Massop (1):
SentTimeCache: fix new Coverity defects
Charles Teese (1):
Fixed CryptByteBufferTest for iv length.
Matthew Toseland (1637):
New FEC framework, with unit tests.
Add LockableRandomAccessThing
Javadocs.
RAFWrapper implements LockableRAFThing
Use a proper object to represent the locked status.
Implement LockableRandomAccessThing here too.
lock() can throw
Length of a RandomAccessThing is constant.
Add FIXME
Add PooledRandomAccessFileWrapper (uses a limited number of open
fd's to implement LockableRandomAccessThing).
Inner class.
Add free() to RandomAccessThing. May or may not be supported.
Support setting file size on creation
Add copyTo(Bucket, RAF)
Fix for changes to RandomAccessThingy
Handle IOException's thrown by RAFWrapper constructor after we
made it throw.
Fix ByteArrayRandomAccessThing: RandomAccessThing's must be threadsafe
Clearer name: LockableRAF.lockOpen() not lock()
Check for already closed in ByteArrayRandomAccessThing.
This is not really an IOException...
Javadocs.
Add generic tests for RandomAccessThing, use them to test
ByteArrayRandomAccessThing. More soon.
Add constructor to create RAF with fixed length.
Test: Factory method can throw.
IllegalArgumentException if negative offset.
Tests for RandomAccessFileWrapper.
IllegalArgumentException here too.
Fix test-breaking bugs in pooled...
Allow changing the size of the pool and querying how many fd's are
open.
Javadocs.
Fix memory leak: Remove from closables list when closing! Oops.
Basic tests for PooledRAF (no pooling yet, just check basic
functionality).
Test that pooling works - can write to two files with a fd limit of 1.
Package-local status counts for tests/stats.
Test locking.
Lock on closables queue, not class. Thanks bertm for suggestion.
MyKey -> CodecKey. Thanks Bombe.
Style.
Don't need to close others if already open - even if not actually
locked.
Add bert's test. Works fine. :)
Explain.
Clarify condition, thanks bertm
Rewrite wait loop, clarify, may work better if several threads
trying to lock the same RAF.
Another neat catch from bert.
Use a LinkedHashSet, as bert suggested, using his code. (Debatable
point as it slows down the common case linearly but we're doing disk I/O
here anyway...)
Deprecate old FEC
Add MemoryLimitedJobRunner. Will be used for in-RAM FEC decoding,
which is significantly different (much faster/less disk I/O, more
reliable) than what we are doing at the moment.
API fixes
Fix test for new ClientContext parameter for MemoryLimitedJobRunner
Remove job from queue in the right place.
Move MemoryLimitedJob to a separate file for easier importing.
Add some tests.
Add some async tests and FIXMEs.
Make initial allocation visible.
Check return value from release.
Check size
Test that runner goes back to 0.
Check that it sticks to the limits.
Clarify, indent.
Trivial: Newline
Refactor slightly and clarify javadocs.
Delete (possibly obsolete) comment.
ChecksumOutputStream. Simple enough that I'm not providing any tests.
Add storedKeysLength()
Add getCryptoAlgorithm()
ClientMetadata serialization to/from Data*Stream. Not tested yet.
Add copyTo(), used to persist bloom filters
Move DataInputStream to a factory method.
Storage layer for new post-db4o splitfile code, incomplete but
should build, no support for e.g. cross-segment. Abstracted out a
callback SplitFileFetcherCallback so can unit test separately.
Separate out interface for saltKey().
Get rid of lots of client layer dependencies in the storage code.
Static method to make a FetchContext
Don't clear the keys, need them to write the Metadata.
Explain.
Bugfix: Pass the keys in here.
Fix more small bugs.
Write the correct number of bytes for the last block.
Initial tests for splitfile fetcher segment storage.
More unit tests (here if we only give the check blocks)
Fix bug found with random order of finding blocks.
Test finding blocks in a random order.
Fix sizes
Fix test.
Rename BaseRandomAccessThingTest -> RandomAccessThingTestBase
(fixes unit tests in Eclipse)
Add a factory interface for RandomAccessThing's
Add a simple factory for in-memory
Use the new RAF factory in SplitFileFetcherStorage, so don't need
the dirty hack with FilenameGenerator.
Fix incorrect block padding in test.
Test multi-segment splitfiles.
Add a RAF factory to ClientContext (*dangerous* at present as
in-RAM-only)
Start work on SplitFileFetcherNew, partly from old branch, builds
but not complete yet.
Lots of work on SplitFileFetcherNew etc, i.e. integrating the new
splitfile code so it can actually work. Not finished yet.
Factor out translateException into SendableGet
Key selection token is always a SendableRequestItem
Initial implementation of SplitFileFetcherGet (no cooldown support
at the moment).
Try it out. Wait for the bang.
Fix infinite recursion
Better error message.
Minimum memory allocation needs to be slightly bigger.
Terminate the getter.
Logging
Fix error on cancelling a fetch.
Fix deadlock/major concurrency issue: Never run the heavy
callbacks in the memory limited job thread! Can start new stuff before
the old job is finished -> boom.
Fix not reporting progress.
Fix streamGenerator (we *need* to close the stream, or it will
stick forever).
Support maxRetries != -1, i.e. splitfiles with finite number of
retries, e.g. important for fproxy, and give feedback on failed blocks.
Support creating binary blobs in new splitfiles. Now the updater
successfully creates the blob.
Don't call unless need to.
Make verifying that the decoded blocks match the expected keys
optional (compile time, on in the source), as in the old code, and if it
is enabled, do the FEC *encode* and check the blocks before completing
the request (fixes updater blob being too short because closed too early).
Copy before encryption clobbers the buffer!
Factor out padding a byte[]
Enable older splitfiles.
Track retries if maxRetries != -1
Logging
Avoid reporting error if already closed.
Don't try to add last block to blob in old splitfile
Fix NPE, use the right length
Fix retry count handling: MaxRetries=0 (default for FCP) => try
each block once (and then terminate! wasn't working!)
If a block is not full, it's an error, unless it's the last block
of an old-format splitfile, in which case we ignore it (=> we don't use
it at all), because it would break FEC decoding.
Logging
Doh! Really fix retry count handling!
Dirty hack fix for infinite loop when ignore last block.
Explain.
Don't choose to fetch the last data block for really old
splitfiles. We may still pick it up by accident however.
Use KeysFetchingLocally to not schedule a fetch for a key that is
currently being fetched.
Ignore failure on blocks already found (race condition?)
Fix stalling counting bug in
647ad6c60c76209fd77f5cad120aec9415607573 - requests for old keys would
stall forever.
Logging
Fix non-static logMINOR. Oops.
Do loop checking inside onGotKey; this is clearer and allows us to
return a slightly more accurate boolean.
Rename, explain a little.
Remove changedSomething flag, unnecessary, all these odd exits
we've clearly changed something.
Add a callback for when a segment is restarted due to data corruption.
Re-register on corruption, re-check the datastore.
Add makeRAF() with initial contents to copy to factory.
Factory for PooledRandomAccessFileWrapper's using a FilenameGenerator.
Abstract proxy RAF with ability to switch between implementations.
Make TempBucketFactory able to create LockableRandomAccessThing's
(no encryption yet but otherwise works, if there is plenty of RAM we
start off as byte array and then moved to disk later).
Use TempBucketFactory for RAFs as well.
Doh! When migrated, not using the memory any more.
Doh!
Check for negative index.
Add tests for TempBucketFactory creating RAF's.
Just use the usual delete(), like TempBucket's do.
Don't use new splitfile code if temp buckets are encrypted.
Tests for chooseKey().
Test onNonFatalFailure calling failure here.
Always track retries, but if parent.maxRetries=-1 then don't write
them to disk.
Beginnings of cooldown support.
Implement and test cooldown.
Remove unused method getCooldownWakeupByKey
Fix length after removing "tried"
Concurrency issues with callbacks.
Check for already finished.
Comments.
Add a flag to FetchContext to use the new splitfile code (if
possible). (Currently hardcoded default on)
Turn off for updater for now.
Fix progress bar updating on found blocks during store fetch stage
but not after that, when it should be vice versa.
Config for whether to use new splitfiles will be separate for
transient and persistent (eventually).
Explain slightly.
Make using the new splitfile code configurable for transient requests.
Hopefully fix "Unsetting bit but already unset"
Always use the old splitfile code on <256MB of memory (because the
new FEC and old FEC both use memory, so using both means losing 8MB).
Delete cruft
Checksums.
Missing methods in KeyListenerNew
Fix memory leak: Remove KeyListener on completion or failure.
Use whichever checksum implementation storage is using.
Explain.
Checksums.
Document synchronization
Fix writeTo() (backing array may not be the same size as capacity!)
Make ChecksumOutputStream (optionally) actually write the checksum.
Check here too.
Add checksum tool, will be used for using HMAC's rather than CRC's
when encrypted, also tidies a bit. PLEASE REVIEW: Are there standard
tools for this? What about unixninja's work?
Use ChecksumChecker.
Check checksum when reading keys.
Pass in keys here, make sure we don't read keys before writing them!
Lock in readAllBlocks()
Add writeChecksummedTo() and make raf private.
Move all the checksum/storage stuff to the end of the file.
Permissions.
Add equals()
Test readSegmentKeys().
Add generateChecksum()
Initial support for persistence in Storage.
More tests.
Restoring between fetches is now working, at least for a single
segment.
Can write immediately.
Fix not persisting metadata.
Count failedBlocks on startup too, and fail on startup if it was
failed but hadn't been processed yet.
>= not ==. failed is false here so we haven't handled it already.
Can happen on startup maybe; safer this way anyway.
More tests
Don't call the callback here, would be confusing and probably lead
to NPEs.
writeMetadata does not return anything.
Persistence flag on storage. Don't write anything except for
blocks and keys if transient.
Persist more details, not just thisURI
Fix wrong length of key list
Write sufficient detail to restart from scratch if the persistent
request is from an FCPClient, i.e. from FCP or on the global queue.
Add flags and checksum type.
Add FIXME
Imports.
Missing file.
Add new FetchException: Not enough disk space.
Add configuration for minimum available disk space, both long term
and short term.
Fill the new RAFs explicitly.
Write random bytes if crypto is enabled.
Move disk limits before tempBucketFactory.
Add a RAF factory proxy that checks disk space.
Check disk space when creating temp RAFs
Deduct the max RAM used from the on disk limit. We don't want it
to fail during migration, and we don't want to have to deduct the in
memory total as it changes from moment to moment, so this is the best
solution.
Better out of disk space handling in temp factory.
trivial indent
Serialize creation of RAFs so that the disk space checks work, and
to avoid fragmentation. Add FIXME, this should be per-filesystem.
Persistent RAF factory.
Fix NPE.
Remove getFreeSpace JNI hack, we require 1.6 now.
getUsableSpace not getFreeSpace
Add an alert for out of disk space.
Move InsufficientSpaceException to a top level class and rename to
InsufficientDiskSpaceException
Convert to a FetchException on out of disk space.
Fix typo in f527f5d05d1f1cae939cdbadbef6a33242ee321a
Another common "don't know".
Check size if known.
Check for disk space when writing too.
More accurate estimate of length of final file.
Translate InsufficientDiskSpaceException -> FetchException.
Less aggressive default space limits for now. These will need to
be discussed.
Move freenet/node/fcp to freenet/clients/fcp. Intentionally breaks
db4o-based persistence! I will implement non-db4o persistence and then
implement migration by putting back a few files in freenet/node/fcp/
just for migration.
Add PersistentJobRunner and PersistentJob. We still need to have
some control over when jobs affecting the persistent state can run, in
particular we need to be able to stop them while serializing.
Implement PersistentJobRunner (but not serialization yet).
Change ClientContext.jobRunner to a PersistentJobRunner.
We need to keep DatabaseDisabledException (now
PersistenceDisabledException).
Can't be persistent here.
Don't need to go through persistence for this now.
Use the PersistentJobRunner, not the DBJobRunner.
More PersistentJob fixes.
More PersistenceDisabledException fixes
Missing file (trivial)
Remove blob-file temp buckets.
PersistenceDisabledException
Fix build.
Unpacking containers does not need to happen off-thread (as we can
use multiple threads in PersistentJob's at once) and so does not need to
have special treatment on restarting.
Delete old splitfile fetcher code.
Remove useNewSplitfile flag, reverts
f404ee82403d3ab1772fc6abe6b52c2ad2c628b5
Remove restart jobs for site inserts, run it directly.
Remove *BucketChainBucket*, doesn't make sense without blob-file
temp buckets.
Remove restart jobs.
Another BucketChainBucket use.
Add a new object to track InsertCompressor's. Will be serialized
with the database.
Most of persistence implementation, but not fully integrated yet.
Build fix
Move PersistentTempBucketFactory init to ClientLayerPersister
Fix not writing when we have a burst that lasts just less than the
timeout and then a long pause.
Increase timeout to 10 minutes.
Implement shutdown for ClientLayerPersister (some minor internal
changes/refactoring).
Bandwidth stats putter
Fix shutdown, doh
FCP
Fix killedDatabase()
Minor fixes.
Callback called on restarting.
onRestart/onRestartedFreenet: Trivial cases.
Restart USKs on startup via onRestarted, get rid of older initUSK etc.
Register KeyListener's on restarting a single block fetcher.
Implement resuming of SplitFileFetcherNew's!
Get rid of initKeys
Fix USKFetcherTag.
Make parent RGA transient ... we will have RGAs transient ...
On startup, reregister. The RGAs will be non-persistent.
Clarify: onRestart -> onRestartedFreenet
Clarify: onRestart -> onRestartedFreenet.
Document some assumptions.
onRestartedFreenet -> onResume. Thanks operhiem1.
Use the job runner, not the executor.
Remove RegisterMe. Not needed any more.
Fix more DBJob -> PersistentJob.
Single RGA tree for all requests, persistent or transient.
KeyListener's and callbacks are still per-mode (transient|persistent).
It is safe to chooseKey() on any thread, as explained previously.
Remove makeBlocks() now that we don't need it
Fix counting queued requests for test.
Don't need to commit here; fix remaining compile error in CRS. The
block is probably for a splitfile, so it will write it anyway to its own
storage; we don't need to checkpoint the main storage in that case. If
it's a single block fetch it should set the write flag anyway on
completion - TODO will check that later.
Persist flag for whether the splitfile fetch has checked the
datastore, don't check it again on reregistering if we have.
Single DatastoreChecker registration queue (but still call
callbacks on the jobRunner if persistent).
Fix compile issues in lateInitDatabase ... crypto, and passworded
init, does NOT work at present.
Move preCommit/postCommit hooks to ClientLayerPersister.
Remove the database job executor.
Doh
Remove DBJob, DBJobRunner, Db4oBugs, DatabaseDisabledException.
Remove old splitfile inserter code for now. Will be rewritten soon.
Remove old FEC.
Remove unused method.
Remove persistent support in block encoder queue. Will need
changes later when I reinstate splitfile insert support.
Cleanup.
Old cooldown queue hasn't been used for some time, obsoleted by
CooldownTracker. Remove it.
Remove requeueAfterCooldown()
Enable persistent splitfile fetches.
watchGlobal* is transient.
NullObject not needed.
Don't store the infrastructure classes (persistent temp bucket
factory, FCPPersistentRoot etc). They will be populated in onResume()
(we will read the ClientRequester's individually).
Always construct the persistent RAF factory
Pass in clientContext to clientLayerPersister.
Serialize requests separately.
Pass onResume back to client.
Fill in the FCPPersistentRoot in ClientRequest.onResume().
Missing argument
Move RequestClient generation to the Client*Callback, do not pass
it in directly. This allows us to reconstruct the RequestClient on
deserialization, e.g. from the FCPClient, even though the FCPClient
isn't persistent, and it also simplifies the API.
Add realTime flag in ClientRequest
Resume the RequestClient
Remove unused constructors. (We won't need db4o for much longer)
Set the ClientContext
Fix serialization
Remove now bogus assertion
Remove persistent stuff from CooldownTracker.
FCPClient is NOT serialized.
Explain.
Remove ObjectContainer from FCPClient
Fix stats serialization.
Fix regression in 1a5dfc333d049129f655de9afa827569df1525c7: Don't
write past end of file.
Remove logging
Don't close() twice.
Fix fork bomb in PersistentJobRunnerImpl. Ooops!
Fix forgetting to close() explicitly and thus not writing anything :(
Fix infinite loop.
Logging
Remove RequestClient.removeFrom()
Remove more ObjectContainer stuff from FCP layer
More ObjectContainer purging in fcp/
Get rid of ObjectContainer from onMajorProgress
Remove ObjectContainer from ClientGetCallback.
Remove ObjectContainer from ClientPutCallback (and small related
stuff)
Remove ObjectContainer from clientdetail etc
Remove ObjectContainer from events framework.
Remove more ObjectContainer's.
Remove ObjectContainer from ClientGetCallback and StreamGenerator
Remove SimpleManifestPutter. We will use saces' new
multi-container site insert code for everything now.
Fix HLSC site insert.
Fix FCP site inserts.
Remove lots of ObjectContainer stuff and also checkForBrokenClient
etc, which doesn't make sense without the database.
Fix another overlapped API (getPriorityClass() defined in two
APIs, need to change both at once).
Remove ObjectContainer from USK callbacks.
More USK ObjectContainer removal.
ClientGetState and more USK stuff
The easy (non-overlapping) cases from HasKeyListener.
isCancelled(ObjectContainer)
Remove removeFrom() and isStorageBroken()
RandomGrabArrayItem interface
SendableRequest
SendableGet and minor trivial related stuff: ObjectContainer removal.
SendableInsert and private helper methods.
DatastoreChecker
KeyListener
WantsCooldownCallback
BinaryBlobWriter and ClientGetter.
ArchiveExtractCallback: Trivial remove ObjectContainer.
ObjectContainer in loop detection
Archive (container) code: Remove ObjectContainer, and remove some
unused cruft.
BaseSingleFileFetcher, SimpleSingleFileFetcher.
Remove ObjectContainer from schedulers. (Mostly trivial). All the
RGAs are in-RAM and transient but we still do e.g. tripPendingKey on the
appropriate executor/jobRunner.
SingleFileFetcher: Remove ObjectContainer.
SplitFileFetcherNew: Remove ObjectContainer
Remove PersistentSendableRequestsSet, always use transient, remove
ObjectContainer cruft from it.
RequestScheduler (trivial)
Create CRSCore and CRSNP at the same time, make keyListeners and
sched final, get rid of init method.
Remove ObjectContainer from ClientRequestScheduler.
Catch Throwable's in save()
Don't forget onStarted() in successful path.
Logging
close() explicitly.
Persist the global salt.
Remove ObjectContainer from RandomGrabArrayItemExclusionList
Remove ObjectContainer from RGA, SRGA.
Remove RGAItem.persistent(): One queue for everything, persistent
or not.
Remove ObjectContainer
Remove unused method getBetterNonPersistentRequest.
Remove obsolete and now incorrect assertion
Fix NPEs in serializing client details
Write URLs as text, not as binary keys (can't write USKs as binary
keys).
Remove ObjectContainer from USKManager
Remove ObjectContainer from RequestCompletionCallback (to fix NPE
in QueueToadlet)
Add Serializable to some classes.
Make some Bucket's Serializable.
Remove BucketChainBucket.
Make NullBucket streams static.
Remove ObjectContainer from Bucket and SplitfileBlock.
Lots more Serializable.
Javadocs.
Make a second constructor for the common case. Makes it easier to
see the cases where we actually keep the EventProducer.
Explain a bit more.
Serialize the SimpleEventProducer.
Imports.
Add serial version.
Remove ObjectContainer from FCP messages, in particular
removeFrom(). Also add serial version for one message.
Remove from events too (precedes last commit)
Remove unnecessary ObjectContainer references in listing requests.
Remove more ObjectContainer's from PersistentPutDir
Remove ObjectContainer from DirPutFile
Remove remaining ObjectContainer references in FCP layer
More Serializable. Will need to consider whether to implement
binary formats and versioning for some of these...
Don't forget the salt!
Not serializable. Shouldn't be used long term. Explain.
Add default constructors for most of the classes that get
serialized. (Remainder have more complicated problems)
Fix DelayedFreeBucket preCommit/postCommit hooks.
Add onResume() API for Bucket.
Add onResume() for easy cases (no-op and proxies).
Fix DelayedFreeBucket.
Missed a Bucket for onResume()
Fix TempFileBucket: Pick up the generator on resume.
Fix PersistentTempFileBucket. Keep the PersistentFileTracker,
that's what we'll need for garbage collection.
Serializable.
Fix infinite recursion: DO NOT call back into getter.onResume()!
Also, javadocs for onResume().
Resume the returnBucket
Add onResume() to RAFs
Easy cases for onResume()
Pooled on-disk RAFs have a flag for persistent, if true, we
register on the persistentFileTracker on resuming, if false, persistence
is not supported.
Call resume on the RAF on new splitfile fetcher code.
Add missing serialVersionUID's.
Fix NPE
Fix NPE.
Logging
Fix another NPE on failing to resume.
Allow onResume() to throw.
Don't forget to register
Add toString()
load after initializing ClientRequestScheduler's.
Use the right factory.
Logging.
Recreate the SendableRequestSet on startup.
Move more of the queue code to the selector. Javadocs to explain
what goes where.
Must add to clientRequestsByIdentifier (and check for reused
identifiers).
Add to the right scheduler.
Fix maxRetries = -1!
Use the right CRSBase / salter.
Fix not reading Bloom filters! Ooops!
Fix not serializing parent fields (in spite of docs saying it
should work): Make the parent classes Serializable.
Add serialVersionUID's.
Fix infinite loop.
Call notifyClients() in onResume(). Make the fields it sets in
ClientGet transient as they will now be refreshed on startup; so we
don't need to save them, less to serialize.
Run directly if in onResume()
Logging
Not persistent any more.
Add missing serialVersionUID's.
Remove some more ObjectContainer's.
Remove some more ObjectContainer's.
More ObjectContainer's.
Remove ObjectContainer from Snoop callbacks.
Remove ObjectContainer from Encodeable interface
More ObjectContainer stuff
Remove unused method.
Remove obsolete comment.
Delete obsolete javadocs
Delete obsolete comment.
Delete trivial ObjectContainer's - imports and objectOn* callbacks.
Remove ObjectContainer from crypto.
Remove ObjectContainer from keys
Remove ObjectContainer from lots more of the code.
Remove SupportsBulkCallFailure, no longer necessary.
Remove more ObjectContainer's. What remains will be needed for
auto-migration.
Fix serialization regression in PersistentTempFileBucket.
Resume buckets before deleting them.
Missing proxy.onResume()'s (fix NPE)
Don't start resuming until after we've read everything in.
Checksum all objects in client.dat
Clear the flag once done.
Fix not updating checkpoint time. -> Hopefully will be fewer
gratuitous writes.
Create DummyJobRunner, pass it in to splitfile code when doing a
transient request. -> Don't need if(persistent) jobRunner... else
executor... -> Fix immediate problem of writing client.dat when a
transient request finishes.
Checksum the salt value.
Regenerate Bloom filters when necessary.
Rename *New -> *, New* -> *.
Zero out when the checksum fails.
Don't forget to start() the storage. (Important for e.g. checking
what segments already need decoding etc)
Factor out getSalter()
Regenerate Bloom filters off-thread.
Allow jobs to run while loading (in onResume()), but don't allow
to write a snapshot.
Fix tests.
Doh, wrong variable - fix NPE
Fix tests, missing file.
Don't write a checkpoint if we haven't started successfully, even
if we are shutting down.
If mustCheckpoint is true we must write on onStarted(), otherwise
jobs will stall.
Slightly more robust.
Deal gracefully with onResume() throwing anything.
Lots of logging
Always checkpoint after restarting due to data corruption /
corrupt bloom filters.
Consistent naming.
Fix NPE creating an insert.
Make Serializable.
Vector -> ArrayList.
Indent.
Use ArrayList rather than Vector and fix synchronization issue.
Save all the requests we can save, even if one fails.
Serializable.
Make progressMessage transient here too, it will be restored
later. See 1e4b5b4829c79d2ee117354c39cf6e029f6d800e
Imports
Fix infinite recursion, see 15378c51b70f491fda7ede080437a8dac5b4dd68
Don't forget to call parent onResume()
Fix regression in 351282d0248fd56303e14b07f458fd0adabad8b6
Add onResume() for inserts.
Ensure that second and later calls to onResume are ignored (fix
infinite recursion).
Missed one.
Only call innerOnResume once for ClientRequester's too.
Fix FCP bug (possibly old): Non-global persistence=forever
requests didn't report progress, and didn't list on connect.
Fix NPE due to bandwidth stats not being loaded
Fix persistent stats.
Remove db4o-era error handling cruft. This can't happen.
Correct returnBucket.
Send an error if asks for data only and we don't have any data to
send.
Clarify.
Delete useless dontFree. We were freeing the Bucket but free() was
a no-op as we set deleteOnFree=false.
Do not store the AllData message.
Make PutFailed Serializable.
Store the ClientRequest's, not the ClientRequester's. I.e. start
at the FCP persistent requests layer. There are places where this is
important, e.g. for big completed site inserts we may want to store the
ClientPutDir but not the (huge!) DefaultManifestPutter.
Write the request identifier separately and use it to skip
anything we've already loaded. Not useful yet but will be when we
process backups automatically. Plus will help with emergency-restart
mechanism for when serialization fails.
Remove unused variable charset
Use getRequestIdentifier for the basic client details.
Explain exactly what getClientDetail() is for and what it should
contain.
Eliminate postFetchProtocolErrorMessage
FCP CHANGE: Remove TempFile. We will use temp files, in the same
directory, but ClientGetter and FileBucket handle this automatically.
Add tempFileAlreadyExists(). True only for tempfiles where we have
created the file already.
If it's a tempfile, it must exist before we open it.
Check permissions as well.
Fix symlink race: Create the file.
Enforce and document mutual incompatibility
Simplify logic.
Use createNewFile() in this case too.
Document and add FIXME.
Remove unused methods.
Short-cut.
Automatically move tempfiles in onResume(), and keep a File
pointing to the current location of the tempfile in TempFileBucket.
Maybe the file is somewhere else ...
Remove init()
Remove some leftover TempFilename stuff.
Remove more TempFilename stuff.
Doh, we already created it in getOutputStream()!
Fix progress bar, adding to wrong blocks.
Rename to clarify.
Document.
Do not allocate a temp bucket up front for return type = direct.
Let ClientGetter allocate it later on, when we know how big it needs to
be etc.
Only keep the returnBucket if we are doing returnType=direct
Make size and MIME type and sentToNetwork transient, and send
events for them on resume too.
Get rid of getFinalBucket(), getBucket() is now what is needed;
fixes getting downloaded data.
Explain.
Don't ask the getter.
compatMessage needs to be persisted.
Factor out CompatibilityAnalyser to a separate class. Some changes
to how ClientGet handles events.
Explain.
min/max compat mode are *int* not long.
Much more client detail. We will use this for restarting requests
if all else fails.
Write enough to restart the request, and if possible (in trivial
cases, to be implemented soon) to continue it.
Write recovery data for each request.
Add Bucket.storeTo(DataOutputStream)
Store the Bucket if download-to-temp-space.
Make some fields transient, and recover randomSeed on onResume().
Note that this class won't be used much in future, we'll use the new
crypto stuff.
Make fields transient
Fix synchronization.
Make length transient. We should really get rid of it though.
Move StorageFormatException to top level type.
Restore FetchContext from DataInputStream.
Add isErrorCode()
Make sure that isErrorCode is kept up to date.
Restore CompatibilityAnalyser from DIS.
Restore GetFailedMessage from DIS.
Restore requests from getClientDetails if serialization fails.
Store the URI! Ooops!
Skip the recovery data too.
Fix bad default max splitfile blocks per segment.
Create the FCPClient early if recovering, because we need it in
the constructor.
If logging is MINOR, test emergency recovery.
Logging
Bugfixes for restoring fetch
Need to start the requests.
Don't fail everything if one resume fails.
Make *Bucket.MAGIC public and an integer. We will use these to
restore Bucket's that support storeTo()
Implement restoring a Bucket from a DataInputStream.
Restore downloads to temp space (after finished).
Simplify (or at least de-duplicate) reading/writing of checksummed
stuff with lengths.
Pass in ChecksumChecker to writing recovery data. We can use it to
isolate and check individual components where we can recover from failure.
Logging (may lose logs if shutting down)
Better API
Try to isolate the returnType bucket: Separate length and
checksum, and if it fails, restart.
Always need a CompatibilityAnalyser.
Accept events even if finished - needed after restart.
Pull the progress data from the ClientGetter directly to avoid
race condition issues. Partially reverts
3f402837348cbf3f66914c399dfc8773efd516c6.
Synchronization.
More synchronization fixes.
Hopefully this works in all cases now (including aborting).
Slightly better for big files.
Doh, remove debugging code.
Argh. :|
Close stream.
Separately write (within checksum/length) fetch failure details,
and restart if we can't reconstruct.
MIME type *can* be null at least in some failure cases.
If it's failed, it's started; fix display when recovered.
Fix logging
Move default fetch/insert contexts to ClientContext.
Avoid leaks
Write the FetchContext separately too, and use the defaults if we
can't read it.
Move StorageFormatException to freenet/support/io
Use extensionCheck if necessary.
Persist extensionCheck.
Don't need to pass in.
Keep initialMetadata in ClientGet
Fix disk space leak: Free initialMetadata when done.
onResume for initialMetadata
Store initialMetadata.
RandomAccessFileWrapper: Support readOnly flag, don't ask for a
mode string.
Enforce length limit preemptively in pread() too.
Flag to do a plain delete().
By default do a plain delete, option is secureDelete.
Option for secure deletion for pooled RAFs
Read only flag for PooledRandomAccessFileWrapper too.
Doh, readOnly in pwrite not pread
Add RAF.storeTo()
Restore RAFs from a serialized-to-DIS form.
Resume of an RAF can fail.
Check in onResume() if possible, use ResumeFailedException.
Store the tempfile ID, so we can deal with prefix changes.
Move RAF files too.
Missing files for checksumming changes earlier.
Restore from mid-way through a splitfile.
Set a flag to avoid recreating the SingleFileFetcher.
Fix condition.
Fix inverted condition in secureDelete
Missing write.
Failed block but don't notify clients is now possible.
Don't clobber data we will need on restarting from resuming.
Reconstruct progress, MIME type etc from splitfile.
Fix writing incorrectly -> failure (writing the fields separately
not the same as writeTransientProgressFields any more).
Checksum the splitfile restart, fail back to restarting the whole
file.
Synchronization
Don't create shadow bucket unless finished. Fixes size = Unknown.
Check that the size is correct.
finalLength is not the same as decompressedLength! (Changes format
again)
Logging
Delete obsolete test, we don't zero out in all the factories.
Create client.dat.bak.
Add fullyResumed() to tell ClientLayerPersister whether we resumed
fully or just restarted.
Refactor load() prior to implementing backup-reading support
Handle the salt through loaded too.
Don't write salt twice, once checksummed and once not. Ooops!
Move filename check outside.
Load from the backup if necessary and if it exists.
More robust, and add logging.
Doh!
Clarify, encapsulate.
Logging
Slightly more robust, and register nulls when we can't load.
Logging
Rename.
Simplify.
Fix NPE
Update documentation, explain design decisions a bit.
Add the same checks to FetchContext constructor that we already
have in serialization.
Check for some bogus fields in FCP.
Add equals() and hashCode() to InsertContext and FetchContext.
Add persistence test for FetchContext. This one is particularly
likely to change and have persistence problems.
Refactor slightly
Add function to DatabaseKey to create an AEADCryptBucket for the
ClientLayerPersister (client.dat). CRYPTO PLEASE REVIEW! (This adds
another KDF)
Beginnings of crypto support for client.dat
Use the same lock to serialize loads with checkpoints. Not really
necessary yet but it will be...
Beginnings of support for setting the files and Bucket's later on,
will be needed for password encryption.
Don't need to pass ObjectContainer into NodeClientCore any more.
Get the flag for whether to load buckets etc from whether we made
any progress so far, don't pass it in.
Encryption of client.dat should work now ...
Make sure we cleanup the old files ... after writing successfully.
Logging
Logging
Logging
Move inside the condition and fix the condition; fixes error on
new start.
Only call completedInit() ONCE
Logging
BaseFileBucket.onResume() must be called, or we get "Size of
downloaded data has changed"; it's okay not to return early in this
error case.
Logging
Check whether serialized-in request is obviously broken
Add Serializable to SSKs and keys used in them - should fix SSK
fetches.
onResume() can throw ResumeFailedException.
onResume() can throw ResumeFailedException.
Catch RuntimeException's in case of severe serialization issues.
Don't register with the FCPPersistentRoot until the rest of
onResume() has completed successfully; break innerResume() out so we run
even the per-class stuff first.
If serialization fails, go back over the file(s) with it turned
off, just restoring from scratch. Hence most delayed errors from
serialization will now be automatically recovered from.
Explain.
Serialization.
Make fields protected.
Fix serialization. We need the parent fields, and can't restore
them in no-args constructors, even though some of these classes aren't
persistent.
Indent.
Turn off and on encryption on client.dat on the fly.
Logging
Remove unused code/imports.
MAXIMUM seclevel support (delete client.dat*)
Null out after using.
Don't store these, they are redundant (breaks serialization of
failed requests but will still resume).
Use the long message.
Bucket.onResume can throw ResumeFailedException, and use this in
TempFileBucket.onResume.
MultiReaderBucket doesn't persist.
Fix NPE
Fix serialization, fixes single file fetches involving archive
unpacking.
Pass in boolean for whether the checkpoint is the final one.
Check for killed.
Add shutdown callback to make sure metadata has been written.
Throw an error here
Remove canResume(), bad idea (reverts
6ac750a2c7fc4bbac6b6aca34a94d03c80f89544 more or less)
Check for null here. Important for e.g. site inserts.
Add FIXME
Update the fields on the ClientGetter.
Remove SplitfileBlock
Remove unused persistent recentSuccesses code
Move recentSuccesses to ClientRequestSelector.
Remove more ObjectContainer's.
Remove unused plugin store migration and old format dump code
Remove NullObject
Document.
Add queueInternal(), allows us to chain a series of jobs while
ensuring checkpoint doesn't happen in the middle.
queueNormalOrDrop not queueLowOrDrop. Most of the client layer
runs at NORMAL, except for e.g. FEC jobs.
Use NORM_PRIORITY not LOW_PRIORITY
Remove duplicate class SimplePersistentJobRunner
Imports.
Add getJobRunner(persistent)
Run off-thread but atomically. Most of the complicated cases are
in SingleFileFetcher.
Keep the Key not the URI
Report the encoded key if possible in onResume
Explain.
FEC jobs must not occur at the same time as checkpointing. They
may be queued by either the MemoryLimitedJobRunner or the
PersistentJobRunnerImpl/ClientLayerPersister, so hopefully this doesn't
mean that we'll have to wait for the entire splitfile decode to finish
(if it happens all at once, as can happen with cross-segment) before
checkpointing.
Explain a bit.
Make field private
Make sure we checkpoint
Explain, add FIXMEs
Remove persistent from *RandomGrabArray*
Logging
Don't call onEncode twice
If the file is already the correct length, use it.
Make sure that it really *is* final. Need to be sure for completion.
Explain.
Add completion via truncation support to SplitFileFetcher, with a
callback for ClientGetter. Not used yet.
Implement completion via truncation (ClientGetter side).
Make USKProxyCompletionCallback serializable
Fix length detection -> fix Unknown size
Logging (keep this for now)
Delete file on error.
Check disk space when creating file for completion-via-truncation.
Clear the ArchiveContext when restarting.
Cross-segment support.
Clarify locking
Check for need to decode/encode cross-segments on restart
Fix some cross-segment check blocks bugs and simplify dataBlocks +
crossSegmentCheckBlocks -> blocksForDecode()
Include the total number of data blocks and check blocks in the
basic settings, and check it on startup.
Write completeViaTruncation flag.
Write total cross-check blocks.
Keep cross-check blocks separately to the main blocks: Either
after the data and check blocks *for a segment* if not completing via
truncation, or after ALL the data blocks if we are. This is essential
for truncation to work.
Heavy logging to see if this does anything.
Actually enable cross-segment, ooops
Fix NPE
This was correct in the code it was copied from :|
Fix bugs
Bugfix - actually use tryDecode, don't start decoding if already
decoding.
Fix array bug
Fix calculation of locations
Pass in DiskCheckingRAFFactory from ClientContext, use it when
creating files for complete-via-truncate, don't just cast the provided
factory as it won't be the right type if non-persistent.
File was way too long! We only need to store the downloaded blocks
for each segment i.e. at most the number of data blocks for that segment
(they won't necessarily all be data blocks). Now the download tempfile
is only slightly bigger than the content. This also fixes a hash error
with completion via truncation.
Fix NPE in decoding
Fix bogus key comparison
Logging
Basic settings can be pretty big now.
Better error
Don't try to move it if it's not a persistent tempfile
Can definitely be a file other than a persistent-temp-file now.
Clarify and fix bugs reading in cross-segment
Logging
Fix block offsets
Log and check block offsets
Check a bit earlier for finished
Fix segment status offsets
Deconfuse!
Fix segment status offset
Simplify block count code
Fix resuming cross-segment downloads
Fix resuming cross-segment: Check for blocks after we know which
blocks we have!
Don't forget about the callbacks. We may lose the blocks etc.
May need to decode/encode cross-segments regardless of how we
restarted.
Explain.
Don't write metadata twice.
Don't write metadata immediately if checking the store.
Delete obsolete comment
Consistently use int for block numbers. Metadata uses an int, and
in future we may have different FEC algorithms which may need it. We
were inconsistent, sometimes using int, sometimes short. Changes the
on-disk format.
Don't re-encode the block (refactoring onGotBlock a bit)
Free data earlier and simplify code.
Write metadata lazily after getting a block, even from network. It
will get written in 10 minutes or on shutdown, and if we're getting a
lot of them in the <10min before a crash then we're gonna re-get them
easily enough after it.
Fix de-duplication of lazyWriteMetadata jobs
Keepalive plugin needs this to be public.
Need to update finishedFetcher to be accurate for hasFinished(),
though we're not going to close()
Missing close()
Fix cancellation of cross-segment splitfiles: Need to cancel the
cross-segments as well, similar to segments. Fixes not deleting massive
files!
Fix another disk space leak, trivial bug in changes to
DelayedFreeBucket.
Don't try to succeed if already failed.
Free the RAF when cancelling a completeViaTruncation request.
Better fix, always frees the data on cancel now.
Better check for finished, hopefully avoid errors.
Write a SHA256 hash of the metadata. It's way too big for a CRC to
make sense.
Cross-segments don't finish (except if they succeed or are
cancelled). We can succeed/fail/free as long as they are not actually
decoding right now.
Logging
Fix failure
Explain what these are for (now).
Don't setHasCheckedStore and thus write to disk if we're failing
anyway.
Write to disk in-thread, simplify especially in case of failure
(DNF with DSOnly=true e.g.)
Make sure we fail with the right error code.
Check for cross-segments
Better handling for DSOnly failure
Fix failing in finishedEncoding (this is mainly for DSOnly failures).
Distinguish between failed and run out of retries (for
cross-segment failure).
Implement a fixed maximum error code for fetch/insert exceptions.
Persistence for FailureCodeTracker
Logging
Remove unused methods.
Persist the FailureCodeTracker
Write errors when changed.
Fix unlikely NPE
Logging
Logging
Make Serializable.
Fix resuming a FileBucket
Need to resume the Bucket
Serializable
Fix synchronization.
Fix not reporting URIs for two block inserts, remove unused code
from old persistence.
Fix race condition causing requests to show up as Compressing or
Waiting indefinitely even though they are making progress
Add getCheckBlocks() (Copy from old FECCodec.standardOnionCheckBlocks)
Add a specific error for the 64TB limit.
Move earlyEncode and getCHKOnly into InsertContext
Add another fill method for unit tests
Add factory method for InsertContext for unit tests.
Document.
Enforce length.
Add adapter classes for read-only Bucket / InputStream from
RandomAccessThing
Add read-only proxy RAF (for unit tests and maybe wider use)
Rename SplitFileFetcherCallback -> SplitFileFetcherStorageCallback.
Implement storage for splitfile inserts, and some tests. Not
integrated yet, and cross-segment isn't tested.
Logging
Check blocks when reading them.
Fix allocation of cross-check blocks.
Fix reading the wrong block
Fix NPE, oops!
Test cross-segment splitfiles.
Check for changing keys.
Turn off cross-segment tests unless extensive is enabled.
Debugging code: Encode even earlier.
Update comment
Track which blocks have been inserted, and complete when all
segments have inserted all blocks.
Fix NPE
Factor out block choice and retry tracking code. Will reuse some
of this for inserts.
Use SimpleBlockChooser for inserts.
Make these fatal, can't retry, be consistent with FetchException
Handle failure.
Do all this risky stuff off-thread.
More statuses, always create Metadata before feeding it to callback.
Check for failure or completion before storeStatus()
Check status in tests.
We must always have a key when a block insert completes.
Test completion (success).
Make InsertException.mode public
Fix NPE
Include error codes in final failure InsertException
Add tests for simple failure modes.
TransientChosenBlock -> ChosenRequestImpl (now used for persistent
too)
Make sure callbacks are called on the jobRunner if necessary, and
always call them off-thread.
Always pass in the key in onSuccess, and simplify slightly.
Use KeysFetchingLocally.hasTransientInsert for persistent requests
too. (We can safely read persistent data structures from any thread, we
just can't modify them... I considered keeping this in the individual
senders but the memory we save is more important than a few clock cycles)
Rename hasTransientInsert etc as it's not transient any more
Pass in KeysFetchingLocally to SplitFileInserterSegmentBlockChooser
Add chooseBlock(), including KeysFetchingLocally support (i.e.
tracking of which blocks are currently inserting).
Implement n-consecutive-RNFs-count-as-success hack.
Count the RNFs if they are not consecutive.
Write the consecutiveRNFs hack data to disk
Fix concurrency glitch with failing at the same time as encoding.
Test failing while encoding.
Need to unlock AFTER calling callback. The callback could modify
stuff, it's still part of the persistent job.
If shutting down, throw in jobRunner.lock(). Handle this correctly.
Always call finishedEncoding()
Document.
Write overall status i.e. the FailureCodeTracker.
ALWAYS generate keys up front. This saves a lot of small random
disk writes, which are bad even for SSDs, replacing them with a more or
less linear write at the end of encoding check blocks. It wastes a bit
of CPU though as we'll have to re-encode later. This is an acceptable
tradeoff. Even better, it will allow us to write the segment status lazily.
Fix test
Fix bug in 3187afbc72fd8f5432a4ca9fab7ebed2a45f8f1d (inverted
condition)
Write the metadata (errors and the segments' blockChooser's) to
disk, lazily, after blocks succeed or fail.
Add a dirty flag for overall status (meaning errors) too.
Write on shutdown. (Will need to be wired in to SplitFileInserter
later)
Write offsets just after the main header.
Fix length check
Keep rafLength, remove unnecessary argument.
Pass less in for restoreRAFFrom(). onResume() is called later,
don't need ClientContext here.
Move ReadOnlyRandomAccessThing into freenet/support/io/
Make ReadOnlyRandomAccessThing wrapper persistent
Write more data in header needed for resuming
Keep rafLength
Checksum the offsets
Add preadChecksummed*, same as in SplitFileFetcherStorage, will be
used...
Set SUCCEEDED before calling callback, helpful for tests
Add getFixedLength()
Don't write segment number in fixed settings (there is an overall
checksum)
Add create ChecksumChecker by ID
Persist BlockChooser's (except cooldown)
Persistence for SplitFileInserterStorage, with a couple of tests.
More tests.
New interface RandomAccessBucket will be needed for compression etc.
Make ArrayBucket implement RandomAccessBucket
Missing file for 84e78990755ccd8f46b579371704e45635d414fe
Add flag to not delete on free() to PooledRandomAccessFileWrapper
Make all the FileBucket's into RandomAccessBucket's.
Fix delayedFreeBucket possible infinite loop in test class
Make NullBucket implement RandomAccessBucket
Make TempBucketFactory create RandomAccessBucket's, and disable
crypto.
Implement DelayedFreeRandomAccessThing, created from
DelayedFreeBucket, which is now a RandomAccessBucket.
Make factories produce RandomAccessBucket's
Simplify and reduce unnecessary permissions
Fix permissions and remove obsolete code
Fix migrating RAFs to disk not keeping contents, oops
Set hasMigrated to true if we convert to RAF after writing to
disk, so we don't break the bytes-in-use counter and leak memory. (Bug
introduced in a1438c383015549478513af5aa82e9ddb3fe04b2).
More tests.
Check for already freed
Prevent use of an ArrayBucket after using toRandomAccessThing()
Prevent reuse of BaseFileBucket after toRandomAccessThing and
check for already freed
Check for already freed, check for open streams
Document
Fix NPE, doh (bug in c39a59450417ced0e261a2c797d0f2f84e325538)
More tests.
Make SimpleReadOnlyArrayBucket a RandomAccessBucket
Use RandomAccessBucket for inserts, not Bucket.
Use RandomAccessBucket in InsertCompressor too.
Change SendableInsert API: Pass the block number identifier as
SendableRequestItem not Object
Add a method to convert LowLevelPutExceptions to InsertExceptions.
Will be used by splitfile code, should be used by SBI
Let BlockItem implement SendableRequestItem, and cache hashCode
Add an overall chooseBlock() for inserter, and add FIXME's
Add onResume()
Implement SplitFileInserter and SplitFileInserterSender. Not wired
in to SingleFileInserter yet...
Report blocks and update the total number of blocks for the final
top block
Turn off temp bucket tests with crypto for now.
Fix passing in null
Fix block counts
Actually start it!
Enable splitfile inserts.
Fix GetCHKOnly etc
Count blocks when inserted (missing callback etc)
Delete more cruft
Logging, better error
Rename innerDecode to innerEncode (more accurate)
Obsolete FIXME
Logging
Use the right factory!
Return the real block number, fix thinko adding the data block
count at the wrong point
Refactor for equal paranoia for both paths
Use the right BucketFactory.
Fix more block number issues
Fail here
Free the data if necessary, fix disk leak. (Also close it)
Add equals() and hashCode() to RandomAccessThing's where it makes
sense, and explain where it doesn't. Persistence will need this.
Fix storing and loading freed DelayedFreeRandomAccessThing's
Fix NPEs when persistent
Missing Serializable
Doh, revert 93c960675f68558e6be1f8ce279dcb40491a5368
Resume the RAFs first
Logging
Fix bogus open stream check
We need DelayedFreeRAT to have equals() in terms of underlying so
we can check it on resuming.
Move checking for whether it's the same originalData into the
constructor, and always use the passed in RAF so the two are the same
Fix typo in restoring cross-segments
Fix confusion with cross-segment block numbers vs segment block
numbers, also broke resuming cross-segments
Fix comment
Fix bugs in resuming cross-segments at SFIS constructor level,
here issues with the block of bytes containing the cross-segment fixed
settings
Add a test for cross-segment resumption. Like the other
cross-segment test this only runs with -Dtest.extensive=true, as it is
fairly heavy/time consuming.
Fix FailureCodeTracker not being fully Serializable by converting
it to use autoboxing rather than an inner class (slightly more memory
churn worst case but in practice probably less as small ints are interned)
Comments
Imports
Comment: no, we don't
Update comments re DB4O / persistence, add a few javadocs.
Remove now unused class DatastoreCheckerItem
Remove transientToString db4o madness
Remove more db4o stupidity
Remove spectacular db4o stupidity in Compressor
Remove ClientRequestSchedulerNonPersistent/Core
Rename ClientRequestSchedulerBase -> KeyListenerTracker
Remove more cruft
Add Serializable, serial version IDs
Rename TransientSendableRequestSet to SendableRequestSet and
remove the interface
Serializable
Don't need Encodeable.
Remove BackgroundBlockEncoder. No longer necessary.
Make FetchException modes an enum
Make InsertException use an enum too.
getClientDetail should return empty unless persistent
Check here too.
Explain.
Logging
Logging
Logging and better toString()
Move CooldownTracker to ClientRequestSelector, so there is one per
CRS; take the ClientRequestSelector whenever either accessing the RGA
tree *or* the CooldownTracker. Fixes a nasty stalling bug which caused
requests which can fail to never complete. Still rather ugly, I will try
to improve this further...
Need to setCachedWakeup() here because CooldownTracker doesn't
automatically check parents. It should, will look into this soon.
Remove db4o cruft
Fix comment typo
Explain why we need a single lock for the entire tree.
Pass in the root rather than the CooldownTracker.
Synchronize on root not on this
Synchronize in setParent
Remove moveElementsTo, and imports.
Always track retry count for simple one block fetches
Remove use of make(), keep cooldown times on the
BaseSingleFileFetcher.
Remove HasCooldownTrackerItem, make etc. Not needed post db4o.
Locking in setParent()
Add getParentGrabArray() to HasCooldownCacheItem
Rename HasCooldownCacheItem -> RequestSelectionTreeNode
FIXME
Get the parent directly, don't store it.
Rename newPriorities -> priorities
Remove unused class
Checks and logging
Remove the actual cooldown times cache and keep everything on the
RGAs/SRGAs, but keep CooldownTracker for now.
Implement (S)RGA.clearCachedWakeup recursively
Implement setCachedWakeup recursively too
Logging
Call clearCooldownTime directly
Wake up starter if reach root, implement reduceCooldownTime for
SendableRequest
Call reduceCooldownTime directly, and only call it if we are
actually reducing it (we don't need to e.g. register parents any more).
clearCooldownTime() must call parent, fix bug in
7c91ce42d09cf7ff4ea230ef6e1c9793d740872b, also delete duplicate code
Rename cooldowntime -> wakeuptime on RequestSelectionTreeNode
Update comments
Fix TheSeeker's NPE on ReturnType=none
Implement shutdown callbacks for inserts. Was already written for
splitfile insert but wasn't used.
Logging
Update comment, add FIXME
Logging, comment
Create the MemoryLimitedJobRunner in the NodeClientCore
Implement a thread limit for MemoryLimitedJobRunner, and a
reasonable heuristic for the limit in the node.
Make memory usage for FEC configurable too.
Increase the default memory limit for FEC if we have a lot of memory
Add FIXMEs
Reduce the number of threads to half the available processors.
There will be some disk I/O as well, but even so we don't want to have a
measurable impact on system performance...
Get rid of InsertCompressorTracker and restart insert compression
on resuming a SingleFileInserter, if it is necessary.
Fix not registering PooledRAF's that happen to be persistent temp
files
Fix garbage collection of persistent-temp files
No it isn't. Doesn't need to be serialized
Remove excludeSummarily()
Pass CompatibilityMode as a CompatibilityMode
Clarify and simplify: We convert COMPAT_CURRENT as early as possible
Check for COMPAT_CURRENT
Clarify and check.
It's up to the caller to get the compatibility mode right.
Fix the compatibility mode
Make sure we always report a URI even if LocalRequestOnly
Support calling onEncode twice, check for different keys
Call parent constructor, set realTime flag
Delete zero-arg constructors. These are NOT needed for
serialization and can cause subtle bugs.
Add assertions
Improve error
Logging
Keep the persistent temp ID when converting from a
PersistentTempFileBucket to a RAF -> hopefully fix losing files
Explain and don't call onResume twice for RAFs
Use ChosenBlockImpl
More robust.
Call removeFetchingKey etc in ChosenBlockImpl callbacks so that we
always remove after we have at least tried to call the callback, avoid
race conditions. Don't call removeFetchingKey etc elsewhere, use
ChosenBlockImpl more places.
Store as a CompatibilityMode
Fix max() (typo)
Simplify
Store a short code for each CompatibilityMode, and be able to look
up by these codes. We will consistently use short for
CompatibilityMode's in numerical form now...
Use short for modes in compatibility mode analyser, events
(changes on-disk format)
Use byCode etc
Check for valid modes
Missed a use of ordinal()
Don't send onEncode twice.
Check for onEncode twice
Ignore onEncode twice
Call onBlockSetFinished
Make sure we only call overall success once.
Fix big containers losing files: When we move a file to an archive
("external" container), we need to reset its name as we won't use the
full path when looking it up.
Rewrite completion logic again and complete late if collecting
binary blob.
Don't restart ContainerInserter's on resume unless they've already
been started.
Hopefully implement resuming for site inserts
Fix NPE on resume
Check for hashes earlier
Constructor isn't used
Fix minor regression in 4eaa9d0385d9b7818f4ae9a4fa4b1e288485319e
breaking request restarting
Fix bogus onEncode error, recording encoded uri wrong
If no hashes, return null
Implement the wakeup optimisation for inserts. That is, avoid
polling by returning a wakeup value of Long.MAX_VALUE when all our block
inserts are running and we can't choose another one. We don't do the
3-and-then-wait-half-an-hour thing for inserts which is "cooldown" as it
happens on requests, as it doesn't make sense for inserts.
Clearer
Don't send two lots of messages for each block for site uploads
Remove removePutHandlers(), not necessary any more.
Don't start ContainerInserter's. start() immediately transitions
to an SFI, so onResume() shouldn't be called after starting.
Comments
Add shutdown callbacks
Logging
Resume the origMetadata, which actually contains the Bucket's
until the ContainerInserter is started.
Turn notifyClients back on, it may be called explicitly
Remove BaseFileBucket.length evil hack to work around long-gone
file.length() bug.
Fix not calculating size correctly for site inserts
Fix error message just after cancelling: It is possible to call
callbacks while stopping (we wait for the actual segment encodes to
stop, but can't stop the callbacks)
Fix l10n strings
Fix another minor insert bug
Test splitfile with segments with 128 and 1 blocks
L10n error messages
Rename FCPClient to PersistentRequestClient
Rename FCPPersistentRoot -> PersistentRequestRoot
Consistently lock on ClientRequestSelector, and clarify. Partly
bug #3865 but also relevant to recent work in purge-db4o branch.
Use the right Bucket
Comments
Add shutdown()
Shutdown FEC threads and wait for them to finish during shutdown
Reduce the number of EnterFiniteCooldown events/messages
Fix not restarting encode
Clarify (is already synchronized)
MemoryLimitedJobRunner: Fix tracking threads in use! (Ever since
the threads-in-use limit came in, possibility of it breaking...)
Fix tracking which keys we have, should fix some insert stalling
after resuming bugs
Add tests for resuming inserts before encode finished.
Simplify
Write status after encoding a cross-segment
Read cross-segment status on startup.
Start encoding segments if cross-segments already done
Thorough tests for resuming encodes
Only run cross-segment tests if extensive
Fix logging (not transient)
Logging
Document and test fixed-length representation for FailureCodeTracker
Move calling WantsCooldownCallback to SendableGet, and add
getClientGetState()
Call the callback regardless
reduceCooldown when we recalculate cooldown, not when we fetch it
Not necessary here.
Logging
Fix synchronization when creating events
Run innerNotifyClients (formerly notifyClients) off-thread in
client/async. Better to do it this way so that events don't get
reordered; it's consistent when it runs.
Produce all the events off-thread.
Explain why we need to run callbacks on-thread and therefore
produce them off-thread
Always run trySendProgress on-thread.
Fix synchronization on lastActivity
Combine trySendProgress into receive()
Remove obsolete comments
Logging
This can happen if there's a race condition.
Obscure disk corruption error path
Test for corner case: even a cross-segment splitfile should work
if we feed it just the data blocks (note that this isn't always true for
*old* splitfiles)
Add ClientContext to onTransition()
Checkpoint on transition on ClientGetter
Add ClientContext to onTransition for putters too
Logging, comments
Checkpoint soon on transition in putter too
FIXME
ClientContext.jobRunner should be a PersistentJobRunner, not
ClientLayerPersister
Remove onMajorProgress(), not called anywhere. There are other
mechanisms for urgently saving to disk.
Update comment
Add the memory limit for the temp bucket factory to the persistent
temp bucket factory's disk space limit.
Explain in config
Fix minor locking issue/typo/NPE
Remove KeyListener.isRealTime()
Handle bad splitfiles better
Better error handling
Make fileRestartCounter persistent, if we test-create the file and
then restart...??
Delete the old blob file if present
Add minimal FCP classes needed for migration from db4o
Missed a file
Pass in the NodeClientCore not the FCPServer
Partial support for migrating persistent downloads
Missing file
Don't migrate global queue twice.
Migrate later on, avoid NPEs etc
Start the requests.
Register not resume. Now they show up.
Missing serialization
Maybe fix double remove from bloom filter
Logging
Start a bit later, avoid NPEs etc
Logging
Don't remove from filter twice.
Track whether we've successfully migrated everything...
Check for whether the target file exists in ClientGet constructor.
Allow clobbering a zero length file
Logging/errors
Return true ONLY if we actually wrote the block
Support resuming if successful and if normal failure (but not
failure to rename)
Remove unused rename failed code. The rename happens in the
FileBucket and it will call us with a bucket error if we fail.
Migration for failure case where we failed to rename (this doesn't
exist in the new code)
Fix bug in migration
Logging
Delete old database when migrated.
Don't create an empty database
Slightly quieter if no database
Remove defrag support
Don't migrate from encrypted to plaintext or vice versa, and don't
create a new database.
Missing files
Fix NPE when migrating downloads to temp space
Fix filename
Get rid of database encrypted flag
Remove alerts for not enough space for auto change crypt
Avoid NPE
Fix hasDatabase()
Remove autoChangeDatabaseEncryption, config option and warnings
Set up keys earlier on, regardless of whether we actually need
them (mostly we will)
Checkpoint ASAP after migrating.
Fix bizarre class loading issue
setCheckpointASAP() must actually start a checkpoint if possible.
Otherwise we can get long delays.
finishInitStorage should be treated as a PersistentJob
Persist the fields, relying on ClientGetter was a mistake. Also
fixes restarting after migrating a download-to-temp-space.
Imports
Maybe support binary blobs in resuming requests
Pass NodeClientCore rather than FCPServer here too
Implement migration for inserts.
Binary blobs
Minor persistence issues in migrating
Turn off exceptions on not storable for migration
Back compatibility hack for InsertContext CompatibilityMode
Fix blocks in segment limit being bogus too.
Create base interface DelayedFree for both DelayedFreeBucket and
DelayedFreeRandomAccessThing, write a single group of DelayedFree's.
Split DelayedFreeBucket into DelayedFreeBucket (not random access)
and DelayedFreeRandomAccessBucket
Doh
Use the right interface in the constructor
Add a method to convert Bucket's to RandomAccessBucket's,
efficiently if possible.
Use this here. Should allow recovering from uploads from encrypted
temp buckets.
Don't allow it to be freed via the DelayedFreeBucket. This is
especially a concern with java auto-closing.
Imports
Locking for DelayedFree*: Avoid calling delayedFree inside lock,
but lock when accessing the flags
Pass in readOnly to factory method
Move RAFBucket into src/
Fix wrong bucket type for DelayedFreeRandomAccessBucket (bug in
recent code)
Pass in fg and persistentFileTracker to restoreFrom(), just like
for RAFs
Persist RAFBucket's
size() should not throw.
Use Metadata.toBucket() instead of doing to bytes and immutable
bucket.
Write to Bucket rather than writing to bytes first. May be
slightly more disk I/O (because the bucket streams aren't buffered, but
they should be), but may save a lot of memory in some cases.
Add method for length of metadata if we don't actually need to
keep the bytes
Missed a RandomAccessThing in ef45e43ab57aa875d19dfa13c6fdb797a1125ba4
Use a proper Bucket for the metadata for redirects
Hack to make RAFBucket's RandomAccessBucket's
Use the right factory! Bug might have broken some persistent site
inserts.
Doh
Can throw. But at least it can be persistent.
Fix build for ef45e43ab57aa875d19dfa13c6fdb797a1125ba4
Open read-write if we have initial contents to write.
If read-only, don't allow changing length
Make migrateToDisk() return a boolean, and check for repeated
migration before migrating, not after.
Still need to call _hasFreed once only
Change the contract of toRandomAccessThing to make it possible to
reuse RandomAccessBucket's: The Bucket is still usable, but read-only,
and the RAT is also read-only. Freeing one frees the other. Add unit tests.
Fix resolve()
Don't leak buckets
Doh, fix bug in 3b356d7eac0429134be3f6d4d76ac9610e964d2f
Migrate failed and succeeded inserts
Fix progress
Logging / check for not existing data
Make data final
Remove freeData()
Move ManifestElement to freenet/support/api, but keep the old one
for migration for now
Implement migration of site inserts
Resume the files to avoid being deleted
Fix PersistentPutDir and migrating from an insert with temp buckets
Logging
Logging / race condition
Add shuttingDown() and logging
We create the file as a marker, so it does exist, we need to not
fail on it existing. Might fix weird failures on Windows.
Delete obsolete logging, always try to load at this point
Move RandomAccessBucket to freenet/support/api/ (it's used for
inserts, really it's part of the API not the implementation)
Check for available disk space periodically in persistent temp buckets
Call finishInitStorage even if container == null, need to GC
persistent-temp/
Fix restarting finished inserts
Buffer streams from Bucket's but add getInputStreamUnbuffered and
getOutputStreamUnbuffered to provide unbuffered streams to avoid double
buffering wasting memory.
Don't need to buffer here
Imports.
Fix Buffered*Stream for compressors
More stream buffering around decompressor threads etc
More Buffered*Stream stuff
Buffer before reaching the disk space checker
Use the same buffer size for the buffer as for checking for free space
Delete DelayedFree*'s immediately if they haven't been written to
disk. If they have been, we must wait until after the next commit.
Doh, critical bug in recent bucket changes
Show an alert while migrating
Logging
Fix bogus "MIME type is null" warnings
Keep the MIME type from the error message if possible
Keep the MIME type from the error
Keep the MIME type even if we fail because we don't like it
Always delete node.db4o* after migrating, even if it fails.
Don't imply client.dat is small.
Wait for the actual write to finish before we delete node.db4o*
Make UPLOAD_FROM into an enum
Move ReturnType to an enum too.
Move ReturnType to ClientGet
Move UploadFrom to ClientPutBase.
Remove some unnecessary code and imports from the migration code
Move persistence to an enum too
Persistence is always forever for migration code
Remove db4o cruft: Don't clone FreenetURI's
Fix using the wrong variable
Make Metadata document types an enum
Move splitfile algorithm to an enum
Fix resuming InsertContext splitfile algo's
Panic support for client.dat*
Javadocs for register()
Wipe the master.keys file too
Fix breaking FCP, regression in
6e9129296e99ac33fa9994fa88112c71fa9c8d68, also get rid of
PersistentGet.PersistenceType
Don't write to disk if panicked!
Lie about the number of blocks needed for cross-segment
splitfiles, to avoid going over 100%. Also fix a dodgy block count in
start()
Fix return value and thus fix test
Fix test
Fix unit tests (regression in commit adding getOutputStreamUnbuffered)
Logging
Logging
Fix splitfile insert cooldown breaking leading to inserts
stalling, with test. We were setting a flag when no blocks were
available, and clearing it when new blocks were encoded, but we were NOT
clearing it when blocks fail and become retryable!
Unnecessary here because failing
Test both code paths.
Fix splitfile insert callbacks being run on the wrong job runner.
The fact that the SplitFileInserterSender is not persistent doesn't
matter, that's a leftover from before I got rid of db4o (for a while I
thought we'd need to have both db4o and the new stuff).
Imports.
Sanity check
Only show the migration alert if we're actually going to migrate
Delete testing cruft
Rename RunningTransient to RunningInserts, no longer transient only
Rename to get rid of incorrect Transient and to get rid of
Fetching (an insert isn't fetching!)
Don't need schedCore/schedTransient
Rename removeRequest -> chooseRequest
Javadocs
Remove unnecessary arguments
Javadocs
Merge QueueItem and TransientItem, no longer transient
Explain
Rename as not just transient any more
Fix the merge. I need the merge because I need bcprov 1.51 for the
new crypto code.
Add junit 4 to eclipse classpath
Backport to Java 1.6 (and turn off BitSet ops). Two reasons:
1) Debian stable Eclipse doesn't support Java 1.7 syntax. So it's easier
for me to backport it. 2) We should release purge-db4o before
requiring Java 1.7, as for a large proportion of users the download
queue is unstable with Java 1.7, so we want to maximise the probability
of it actually migrating successfully to the new code, as well as give
them a chance to try it with Java 1.7.
Remove extractSmallerArray (seriously broken, wrap(buf, *,
*).array() == buf), and replace with Arrays.copyOfRange.
DO NOT use ByteBuffer.array(). It's only safe *SOMETIMES*; if an
API declares that it takes a ByteBuffer it needs to accept any
ByteBuffer, including one which has arrayOffset() != 0 and capacity() !=
array().length. Add Fields.copyToArray() to do what is intended.
Support even ByteBuffer's that don't have a backing array, but
untested. :|
Clarify the contract: We never modify the original data. Fix this
for RijndaelPCFB case.
Clarify the API for the ancient class PCFBMode: We always encrypt
the data in-place, we do NOT copy it and do not allocate a new buffer,
so it's best not to return a byte[].
Optimise a bit, we CAN use array() here but only if we're smart
about it
Clarify (it can have an IV, but not supported here)
Spelling
512 bits not 512 bytes
Closer to constant time verify for ByteBuffer's.
ByteBuffer.equal() is unlikely to be.
Use JUnit 4
Fix bad ordering in unit test
Fix another test. For PCFB or CTR, the 3 encryptions won't be the
same.
Fix another unit test - this one WAS caused by my changes.
Fix test
This is still wrong...
Don't let migration block startup. Hence we will allow local
requests during migration.
Only remove the alert if successfully migrate
Paranoid catch / log for some odd uncaught failure in migration,
seen in the wild.
Convert NPE to ERROR on calling completedInit() twice
Fix back compatibility of keys: Only fill in the top block data if
we have a top size; at the moment we never have a top size, because of a
bug. I will add a bug to actually implement top block data.
Don't need to migrate before starting plugins and IP detection
Fix bogus cast
Work around FileInputStream.skip() throwing a java.io.IOException:
Invalid argument
Logging
Remove from closables list when locking, ooops!
Expose closeRAF() for tests
Tests for removing from closables when locking
Tidy up slightly.
Always remove from closables, avoid closing self and re-opening
Rename and document OPEN_FDs -> totalOpenFDs
Improve sanity check
Load the clients before migrating them, and don't use constraint.
Possibly slightly more robust for migrating corrupted queues.
Rename
Write the client.dat after we migrate the global queue, and also
after we migrate the per-application queues.
Add logging to test a theory re stalling migration
Maybe fix stalling during migration: Notify when runningJobs = 0,
even if we're not going to write straight away. For previous code,
waitAndCheckpoint would likely never return if a job was already running.
Don't checkpoint twice
Explain.
Add a unit test for waitAndCheckpoint()
Even more logging (maybe unlock could break somehow?)
Increase runningJobs after successfully started job
Make sure the unlock gets called even if the callback throws
Add COMPAT_1466, 1416 allows bug for bug compatibility with 1465
(specifically don't set topDontCompress and topCompatibilityMode for
splitfiles).
Remove nodeDBHandle
Remove obsolete class PluginStoreContainer (we don't keep plugin
data in database any more since a while back)
Remove ArchiveExtractTag, not used post db4o
Add some more tests for cancellation
Don't encode if cancelled
Fix synchronization issue - using wrong lock!
Don't log failing with disk error if already failing / race condition
Check for cancelled when starting encode
Check that we don't go and encode everything before returning failure
Check for already closed here too
Could be already succeeded. Sometimes this is harmless, sometimes
it indicates we are sending inserts when we're supposed to have finished.
Check for double insert in encodeBlock()
Set closed here too
Check for impossible error (something very odd happening)
Fix metadata back compatibility (include cross check blocks in
topRequiredBlocks)
Revert "Check for double insert in encodeBlock()" -> Slightly
risky locking wise and not needed ...
Fix finalize() on a TempBucket killing the LockableRAF. Thanks
TheSeeker for persistence on this one!
Fix unit tests
Logging
Doh, really fix the CHK not compatible bug: Total blocks was wrong
this time.
Handle newer compatibility modes without losing the ability to
read the metadata
Indent.
Make inserts use COMPAT_1416 for now (** MUST REVERT IN 1467 **)
Change Metadata to keep topCompatibilityMode as a
CompatibilityMode (unknown == 0 so same behaviour). May not be back
compatible!
Check for COMPAT_CURRENT
Check for COMPAT_CURRENT here too
Use CompatibilityMode's in CompatibilityAnalyser and
SplitfileCompatibilityModeEvent too. Might break serialization but
shouldn't break downloads; non-splitfile downloads may restart. Inserts
may break.
Accurately detect largish 1416 inserts (because of the bug)
Don't resume returnBucket, ClientGet will do it for us.
Explain CompatibilityMode, and delete obsolete comment.
Explain.
Fix intermittent test failure
Increase default disk space limits
Revert "Make inserts use COMPAT_1416 for now (** MUST REVERT IN
1467 **)"
Centralise choice of default compatibility mode
Set default compatibility mode to COMPAT_1416 until after 1466 has
shipped (*** FIXME MUST REVERT ***)
Explain COMPAT_DEFAULT
Include compatibility mode in PersistentPutDir
Logging
More logging
Remove unnecessary indirection
Logging
This is actually an error...
Revert "Revert "Check for double insert in encodeBlock()" ->
Slightly risky locking wise and not needed ..."
Locking
Logging/toString
Store the SendableRequestItemKey's directly, we don't need the
SendableInsert.
Remove getSendableInsert() dependency from
SplitFileInserterStorage to SendableInsert
It is essential to only resume once for inserts, or really really
bizarre things can happen.
Logging
Fix ConcurrentModificationException
Fix breaking EarlyEncode inserts (single block) in
c0f368b8cbf2d8b27a1bb0091a0f2a56d5915ccf
Fix SimpleSendableInsert regression in
3928bb243e01b1076771f9a3a98064258b03ec08
Add wakeup for binary blob inserts, don't try (and fail) to
schedule SimpleSendableInsert's if already scheduled.
Explain.
Cleaner API: Return byte[] from encrypt(buf,...)/decrypt(buf,...),
which will always copy the input buffer.
Some tests for KeysFetchingLocally implementation
Rename encrypt/decrypt to encryptCopy / decryptCopy. It's
essential that this is absolutely clear, especially in the ByteBuffer case.
Add test for encrypting/decrypting direct bytebuffers
Fix abuse of ByteBuffer's
Delete bogus obsolete comments
Throw rather than logging. This is however impossible.
Implement new API, with the basic operation being decrypting or
encrypting between two buffers, and add unit tests.
Simplify, and use NIO more correctly
Add encrypt(ByteBuffer, ByteBuffer) and decrypt(ByteBuffer,
ByteBuffer).
Add some unit tests for ByteBuffer to ByteBuffer crypto
Document API better and check postconditions
Mark stream ciphers as such
Use update() not doFinal(): A CryptByteBuffer is a single stream,
be consistent. (IMPORTANT)
Check number of bytes encrypted
Check here too.
Test encrypting one byte at a time and a random number of bytes at
a time
Improve tests
Make encrypt/decrypt "copy safe", i.e. support overlapped input
and output
Fix typos
Add FIXME
Fix javadoc
Throw, don't log
Use fixed charset, and throw if not available
Throw rather than logging and causing an NPE
Throw uncaught exceptions in bug cases rather than logging and
silently breaking / NPEing / not encrypting
Fix more bogus Logger.error's
Constructors that take a key but not an IV should not
auto-generate an IV
Rename variable
Rename genIv and setIv to genIV and setIV
Imports
Remove unnecessary cast and this.
Copy some of the RandomAccessThing infrastructure, including
tests, from purge-db4o
Throw an IllegalArgumentException not an IOException for reading
from negative offset.
Enable thorough tests for ERAT based on purge-db4o's
RandomAccessThingTestBase
Merge LockableRAF and make ERAT implement it (but no store/resume
yet).
Fix build for LRAF changes, copy in RAFW changes for LRAF
Add master secret (for tempfile crypto) to master.keys. Separate
byte[], will be generated on migration.
Implement store/resume to/from Data*Stream
Add test for RAFW from purge-db4o
Test storeTo() for RAFW
Test persistence via storeTo/restoreFrom
Make RandomAccessFileWrapper serializable
Implement serialization for ERAT (make everything transient except
type/underlying/etc, and recreate in onResume())
Add RAFW.hashCode() and RAFW.equals()
Test equals() in restore
Add equals() and hashCode() to ERAT and check for equality
Missing file from purge-db4o
Add MasterKeysTest, and fix MasterSecret persistence.
Fix changing password and add unit tests for it
Remove duplicate writing code
Simplify writing code
New format for master.keys, auto-migrate from old format
Implement iteration for nontrivial passwords.
Make sure we don't go over iteration limit
Longer hash
We want a header not a footer after all. (Breaks one test)
Pass in a flag for whether the file is new or not.
Fix error message
Update test harness
Update from purge-db4o
Update from db4o (need RandomAccessBucket aspect)
Need RAF*
Add new class EncryptedRandomAccessBucket. This uses the same
crypto as ERAT, and writes a header, so it can be converted to an ERAT.
Pass in master key to restore methods
Add FIXME, javadoc
Fix ERABucket for get*StreamUnbuffered
ERABucket.onResume()
Use the bitmask, not the name
Persist ERATBucket's
Fix build for 5651e8932b0e1894a170df8b76cecd48e7e28891
Test persistence of ERABucket's via storeTo/restoreFrom
Serialize ERABucket's
Add equals/hashCode to FileBucket, TempFileBucket, ERABucket
Encrypt temp buckets if needed
Synchronization re encryption
Add FileRandomAccessThingFactory API, use it where we need to
create a RAF from a File, don't abuse DiskSpaceCheckingRAFF for this
purpose.
Move it up to NodeClientCore
Missing lock
Use a MaybeEncryptingRandomAccessThingFactory for persistent temp
RAFs (TempBucketFactory already does this for non-persistent)
Call setEncryption()
Pass in transient MasterSecret at construction to TempBucketFactory
Pass in persistent master secret to factories when load encrypted
persistent layer
Set up the master secret in the common case
Test encrypted buckets for TempBucketFactory.
Add missing file MaybeEncrypting* and rename to MaybeEncrypted*
Run separate tests for tempbucket->RAF with and without crypto
Add FIXME
Add TrivialPaddedRandomAccessThing
Pad persistent encrypted tempfiles
Encrypt and pad oversized RAFs created by TempBucketFactory
Cleanup slightly: TempBucketFactory doesn't need strong RNG
Doh
Don't pad if don't need to
Doh! Trivial but nasty bug in padded RAT
TrivialPaddedRandomAccessBucket
Pad tempfiles created as Bucket's by TBF
For persistent buckets too
Rename TrivialPaddedBucket -> PaddedBucket (it is definitely not
trivial), and the others too
Other way around (pad after encrypting)
RandomAccessBucket.createShadow() should return a RandomAccessBucket
Enable splitfile fetches when encrypted tempfiles enabled
Serializable
Tolerate double close
Fix skipping at end, add FIXME probably not needed
Pass in keys earlier
Set up encryption for new RAFs even if config already set
Fix resuming ERAB
Add equals() and hashCode() to PaddedRandomAccessThing
Logging
Better error
Synchronization may be needed in resume check
Legal to resume twice, should be handled specifically when it matters.
Try to catch shutdown hang
Fix tests post merge
Fix names to exclude abstract base test from junit build via ant
Move RandomAccessThing to freenet/support/api (RandomAccessBucket
is there already)
Move LockableRandomAccessThing too
Move the factory too
Rename RandomAccessThing -> RandomAccessBuffer, and rename lots of
classes accordingly (also fix a couple that had odd names e.g. pooled file)
Update javadocs.
Missed a couple of classes.
Need to explicitly clear keys
Logging
Fix not sending AllData on ReturnType=direct persistent fetches
Imports.
Refactor, create persistent secret earlier
Create the secret for MAXIMUM seclevel
Add disableWrite() which sets started = false, and don't write if
!started, even if previously started was true.
When setting MAXIMUM physical seclevel, stop writing, wait for
write to finish, and delete client.dat*
Check here too
Rename started -> enableCheckpointing
Separate boolean "loaded"
Don't even try to checkpoint if we're not going to write
Explain.
FIXMEs, comments
Keep MasterKeys object once we've loaded it, don't try to clear
keys. Simplifies code, doesn't reduce security (we keep all the secrets
elsewhere anyway), and will help with fixing MAXIMUM -> LOw
Create the keys file when going from MAXIMUM to NORMAL or LOW
Don't need container
Fix loading passworded client.dat when node.db4o does not exist.
Check earlier
Better error reporting
If not checkpointing, run jobs immediately
Always write after starting
Fix NodeClientCore.killedDatabase()
If start up at MAXIMUM, delete node.db4o*
Create a salt if MAXIMUM (fixes MAXIMUM seclevel)
Start even if MAXIMUM seclevel
Must clear writing flag
Trivial wrong condition
Clearer
Fix GCing files before starting up with HIGH (passworded)
seclevel: Only call finishInitStorage() after decrypting.
Fix not loading client cache (recent regression)
Want to call lateSetupDatabase if databaseAwaitingPassword,
regardless of old database, and clear the flag when we have.
Create the database key when creating keys
Clarify and fix changing password when changing mode
Delete bogus condition, avoid creating client cache repeatedly
Logging
Don't finishInitStorage() twice
Fix resuming ContainerInserter's (for more complex site inserts),
and document exactly what can be in the maps
Fix NPE
Run off-thread even if compression disabled
Synchronization needed on cancelled, started
Delete now unnecessary indexing params. Some of this was wrong
(e.g. new FCPClient not old FCPClient). Keep it as it was.
Logging
Major crypto optimisation when writing small nearby parts of a
large ERAB file, as in setting up a big splitfile.
Add FIXME
Make waitAndCheckpoint return if a checkpoint runs on another
thread. Which it will if the job runner is busy.
Logging
Do not delete on finalize for TempFileBucket's used internally by
TempBucketFactory. Leave that to the TempBucketFactory.
Set mustCheckpoint in waitAndCheckpoint() to speed things up a bit.
Document an important API glitch
Persistent BaseFileBucket's must NOT deleteOnFinalize()
Fix free-on-finalize for TempBucketFactory: Keep a reference in
TempRAB to the TempBucket, preventing finalize() on the TempBucket
unless the TempRAB is also unreachable, enable free on finalize for
TempBucket's
Free on finalize in TempRAB's iff they were NOT migrated from
TempBucket's
TRACE_BUCKET_LEAKS support for TempRAB's
Remove obsolete FIXME
Remove deleteOnFinalize. This has bad/complex interactions with
toRandomAccessBuffer() and isn't used except in the updater where it
isn't really needed. TempBucketFactory implements it separately. And we
can't use it for persistent buckets.
Pass in Random rather than RandomSource to MasterKeys and
DatabaseKey, and pass in the Node's global SecureRandom
Throttle fetches from the datastore in SplitFileFetcher, let
notification through every 200ms or 100 blocks.
Rename toRandomAccessThing -> toRandomAccessBuffer, thanks TheSeeker
Rename underlyingThing -> underlyingBuffer
Fix comments/logging
Imports
Logging: Free by finalize is a leak
Another Thing
More Thing's
Rename another Thing
Fix FCP PersistentPutDir not working if encryption enabled for a
site insert from temp space
Fix paused priority class
Rename MINIMUM_PRIORITY_CLASS -> PAUSED_PRIORITY_CLASS
Fix paused priority class: Only select requests of *higher*
priority than the minimum.
Another bug preventing pause priority from working
Remove unnecessary maxPrio argument
Fix priority handling for site inserts (PutHandlers have the same
priority as the parent site insert).
Implement bug #4397 : Fast priority changing. Useful in itself but
also needed for next fix.
Reinstate priority on simple mode
Generics
More generics.
Document the tree better
Simpler clearer shorter generics, and get rid of some casts.
Missing file
Rename
Group requests by ClientRequestSchedulerGroup rather than
ClientRequester, hence a site insert is a single group (even though
PutHandler is ako ClientRequester). Fixes changing priority of site
inserts and also makes them compete equally on the global queue with
e.g. ordinary inserts.
Fix problems introduced by generics changes (arrays)
Fix NPE
Pass in persistent root and global forever client earlier, fix
NPEs so we have reasonable FCP functionality prior to entering password
Missing string
Detect persistence disabled and send appropriate error. Race
conditions might be possible (-> NPE) but I don't think it matters.
Copy the right number of bytes even if something breaks. Should
fix bug #2444 too.
Better error
Check size so throw early
Fix creating empty tempfiles without a length and then passing
into PartiallyReceivedBulk (API change, we enforce length now)
Start the plugins off-thread. Don't let them block the rest of
startup. If they are loaded from Freenet, they could take a long time to
load, especially if they also block IP detection!
Fix another password-not-loaded FCP NPE
Make status cache final, create it with the
PersistentRequestClient if it is the global queue
Simplify
Fix clobbering old logs on startup.
if(db != null) is bogus, use if(!clientCore.killedDatabase()),
which is the modern equivalent: Have we loaded the client layer from disk?
Can be called twice, this is OK.
Clarify: We are interested in whether the database has been loaded.
TheSeeker (1):
Fix favicon.ico on the /feed/ screen
unixninja92 (30):
Added KeyGenUtils, MessageAuthCode, CryptBitSet, and ERAT plus
supporting type enums.
Added Tests for ERAT and MasterSecret. Renamed CryptBitSet to
CryptByteBuffer.
Wrote unit tests for MasterSecret
Documented MasterSecret
Wrote unit tests for ERAT and fixed some bugs that were found
becasue of it.
Worked more on ERAT unit tests
Check for fileOffset < 0 in ERAT
Fixed several bugs in ERAT
ERAT now performs sucessful round trip!
More ERAT tests
More ERAT testing and preping to document ERAT
Documented ERAT
Added Licence Notices
Finished adding Licence Notices
Documented EncryptedRandomAccessThingType
Documented key derivation in KeyGenUtils
Added more unit tests for ERAT
Added ivSize documentation to KeyType
Added comment explaining that the SuppressWarnings("deprecation")
at the top of CryptByteBuffer is for uses of CryptByteBuffer.RigndaelPCFB.
Added hasIv to CryptByteBuffer for better readability.
Fixed -1 that should have been null in CryptByteBufferType
Check for unsupportedType in getIV() in CryptByteBuffer
Fixed comments in CryptByteBuffer
Changed extra catch statements to multi-catch
Moved suggested algorithm/type choise from var to docs
Converted String comparisons to .equals from ==s.
Removed unused classwide var in ERAT
Cleaned up ERAT
Made isClosed volatile in ERAT and made more vars final.
Made cipherPrams final in ERAT
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Devl mailing list [email protected] https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
