When a message is shared, share its transitive dependencies

Like other recursive operations on the dependency graph, this is
not done in a single transaction to prevent an attacker from creating
arbitrary large transactions.

So at startup, the `ValidationManager` finds and resumes any
unfinished operations, by looking for shared messages with unshared
dependencies.
This commit is contained in:
Torsten Grote
2016-08-31 13:15:59 -03:00
parent 7a0db798d1
commit d058172429
19 changed files with 480 additions and 76 deletions

View File

@@ -258,6 +258,15 @@ public interface DatabaseComponent {
Collection<MessageId> getPendingMessages(Transaction txn, ClientId c)
throws DbException;
/**
* Returns the IDs of any messages from the given client
* that have a shared dependent, but are still not shared themselves.
* <p/>
* Read-only.
*/
Collection<MessageId> getMessagesToShare(Transaction txn,
ClientId c) throws DbException;
/**
* Returns the message with the given ID, in serialised form, or null if
* the message has been deleted.
@@ -456,10 +465,9 @@ public interface DatabaseComponent {
throws DbException;
/**
* Marks the given message as shared or unshared.
* Marks the given message as shared.
*/
void setMessageShared(Transaction txn, MessageId m, boolean shared)
throws DbException;
void setMessageShared(Transaction txn, MessageId m) throws DbException;
/**
* Sets the validation and delivery state of the given message.