Age | Commit message (Collapse) | Author |
|
When async decrypting, we want to finish as fast as possible. When encrypting,
though, we don't have such a rush. With an encryption loop period of 2
seconds, we're able to encrypt 30 documents in one minute (the current bitmask
client sync period), which is meaningful: should moderatelly use the processor
while not syncing and relief from some work when actually syncing.
|
|
Previous to this change, the actual encryption method used to run on its own
thread. When the close method was called from another thread, the queue could
be deleted after the encryption method loop had started, but before the queue
was checked for new items.
By removing that thread and moving the encryption loop to the reactor, that
race condition should disappear.
Closes: #7088.
|
|
Queue exceptions are not in multiprocessing.Queue module, but in plain Queue
instead.
|
|
|
|
- Related: #6359
|
|
|
|
I tested that code and this cant happen. We need to iterate keys and
then ask 'del'. The previous method raised: RuntimeError: dictionary
changed size during iteration
|
|
When handling this exception Python got lost because the import was
incorrect. Queue.Empty comes from Queue, not from multiprocessing.Queue
|
|
|
|
Instead of opening one TCP connection for each HTTP request, we want to reuse
connections. Also, we need to be able to verify SSL certificates. This commit
implements both features in the twisted http client sync.
|
|
The whole idea of the encrypter/decrypter pool is to be able to use multiple
cores to allow parallel encryption/decryption. Previous to this commit, the
encryptor/decryptor pools could be configured to not use workers and instead
do encryption/decryption inline. That was meant for testing purposes and
defeated the purpose of the pools.
This commit removes the possibility of inline encrypting/decrypting when using
the pools. It also refactors the enc/dec pool code so any failures while using
the pool are correctly grabbed and raised to the top of the sync deferred
chain.
|
|
When we initialized the async decrypter pool in the target's init method we
needed a proxy to ensure we could update the insert doc callback with the
correct method later on. Now we initialize the decrypter only when we need it,
so we don't need this proxy anymore. This commit removes the unneeded proxy.
|
|
We have to make sure any failures in asynchronous decryption code is grabbed
and properly transmitted up the deferred chain so it can be logged. This
commit adds errbacks in the decryption pool that grab any failure and a
check on the http target the failure if that is the case.
|
|
|
|
|
|
|
|
This commit does the following:
* Remove the autocreate parameter from the sync() method.
* Remove the syncing lock from the sync module because it did the same job
as the lock in the sqlcipher module.
* Remove the close/stop methods from sync module as they don't make sense
after we started to use twisted in client-side sync.
|
|
This change uses twisted deferreds for the whole syncing process and paves the
way to implementing other transport schemes. It removes a lot of threaded code
that used locks and was very difficult to maintain, and lets twisted to the
dirty work. Furthermore, all blocking network i/o is now handled
asynchronously by the twisted.
This commit removes the possibility of interrupting a sync, and we should
reimplement it using cancellable deferreds if we need it.
|
|
The access to the sync db was modified to use twisted.enterprise.adbapi, but
only the asynchronous decryption of incoming documents during sync was
adapted. This commit modifies the asynchornous encryption of documents to also
use the adbapi for accessing the sync db.
|
|
When we started implementing the sync db, one of the ideas was to reuse the
data in the database in the case of a sync interruption. We don't do that now
and thus the pending documents exception is unneeded. This commit removes that
exception from the code.
|
|
The b64 encoding of the auth token was introducing an illegal character
(\n), which was breaking the authentication step since an exception was
being raised - when that multi-line header was attempted to be built.
this commit fixes that bug.
- Resolves: #6959
|
|
This commit actually does some different things:
* When doing asynchronous decryption of incoming documents in soledad client
during a sync, there was the possibility that a document corresponding to
a newer generation would be decrypted and inserted in the local database
before a document corresponding to an older generation. When this
happened, the metadata about the target database (i.e. its locally-known
generation) would be first updated to the newer generation, and then an
attempt to insert a document corresponding to an older generation would
cause the infamous InvalidGeneration error.
To fix that we use the sync-index information that is contained in the
sync stream to correctly find the insertable docs to be inserted in the
local database, thus avoiding the problem described above.
* Refactor the sync encrypt/decrypt pool to its own file.
* Fix the use of twisted adbapi with multiprocessing.
Closes: #6757.
|
|
Since we started implementing twisted api in soledad, some pieces are missing.
Accessing the sqlcipher database directly with the twisted adbapi facilities
is one of them. The async encryption/decryption was touching the database
directly, and this was causing some difficulties like having different threads
accessing the same database. This commit implements the twisted adbapi stuff
for the asynchronous encryption/decryption facilities.
Next steps would be use async adbapi for async encryption and use async adbapi
for all sqlcipher access.
|
|
|
|
We always got a log message saying "canceling sync threads" in the end of the
sync process, even when there was no error during the sync. This commit
changes that in a way that we only have that log when the sync was actually
cancelled because of an error.
|
|
Both deferred encryption and decryption rely on a special sync db. Previous to
this fix, the sync db was only initialized if a syncer was configured with
deferred encryption capabilities. This was a problem when the syncer was not
configured like so, but the actual sync method was initiated configured to do
deferred decryption.
This commit fixes this by always initializing the sync db, so we have the
option of doing all combinations of deferred encryption and decryption.
|
|
|
|
The database initialization on the client sync module is deferred to another
thread. As there is only one thread in the thread pool, this should not be a
problem for now, as operations will actually be queued in that thread. There
was some old code left from when we had to explicitelly wait for the db to be
initialize before using it. This commit removes that old code and introduces
some documentation so we remember to deal with deferred db init if we ever
change the number of threads in the thread pool.
|
|
|
|
Conversion of Twisted failures to string that rely on __str__ or __repr__
might not return all the information we would like to have, especially on sync
failures. This commit asks for a detailed traceback of such failures and logs
them both in Twisted and client logs.
|
|
This commit makes 2 changes that allow sync failures to raise exceptions that
can be caught by the api:
1. Remove try/except statements in sync.py level that would prevent an
exception to be caught by the soledad client api.
2. Ensure that if an asynchronous decrypting process fails the exception
will be re-raised to eventually reach the api.
Related: #6757.
|
|
With new soledad async api, we need to catch errors using errbacks instead of
catching exceptions explicitelly. This commit fixed the api sync() call to
intercept sync failures, log them, and do not propagate them down the callback
chain.
|
|
In the past, we wanted dependency on leap.common to be optional, but now
because of the explicit use of the config path prefix and signaling, we want
to enforce dependency on leap.common.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* Fix arg passing to syncing failure method.
* Do not try to start sync loop which should be already running.
* Adapt to removal of old multiprocessing safe db, now accesses the
sqlcipher database directly.
|
|
* Add copy of SQLCipherOptions object to avoid modifying the options object
in place when instantiating the sync db.
* Add string representation of SQLCipherOptions for easiness of debugging.
* Make sync db always "ready".
* Fix passing options for sync db initialization.
* Fix typ0 that made SQLCipherU1DBSync._sync_loop be a tuple.
* Do not defer requests for stopping sync to a thread pool.
* Do not make pysqlcipher check if object is using in distinct threads.
* Reset the sync loop when stopping the syncer.
* Fix docstrings.
* Check for _db_handle attribute when closing the database.
|
|
* Remove check for HTTPS address.
* Remove creation of shared database.
* Fix docstrings.
|
|
* Adapt to removal of the old multiprocessing safe database, by directly
querying the sync database.
* Fix docstrings.
|
|
* Get replica uid upon U1DBConnectionPool initialization.
* Fix docstrings.
|
|
* Allow passing shared_db to Soledad constructor.
* Close syncers on Soledad close.
* Fix docstrings.
|
|
|
|
|
|
|
|
after drebs review
|