Make the commit API record completion in the Changesets table

Summary:
We want to use the Changeset table as source of truth for changesets.
Record completed changesets in the database.

Additionally, now that completion is a database matter, increase the available
parallelism marginally, by allowing the changeset to upload while its parents
are still uploading

Reviewed By: jsgf

Differential Revision: D7071700

fbshipit-source-id: 405bf84eba4a06e3d6c6299ade2fbea99edf9c19
This commit is contained in:
Simon Farnsworth 2018-02-27 02:12:28 -08:00 committed by Facebook Github Bot
parent 5e074bdd43
commit 282db746c5

View File

@ -20,7 +20,7 @@ use futures_ext::{BoxFuture, BoxStream, FutureExt, StreamExt};
use blobstore::Blobstore;
use bookmarks::Bookmarks;
use changesets::{Changesets, SqliteChangesets};
use changesets::{ChangesetInsert, Changesets, SqliteChangesets};
use fileblob::Fileblob;
use filebookmarks::FileBookmarks;
use fileheads::FileHeads;
@ -402,10 +402,25 @@ impl BlobRepo {
let parents_complete =
parents_complete.map_err(|e| ErrorKind::ParentsFailed.context(e).into());
// TODO This should call the completion API before returning changeset
let complete_changesets = self.changesets.clone();
let repo_id = self.repoid;
ChangesetHandle::new_pending(
can_be_parent.shared(),
parents_complete.and_then(|_| changeset).boxify().shared(),
changeset
.join(parents_complete)
.and_then(move |(cs, _)| {
let completion_record = ChangesetInsert {
repo_id: repo_id,
cs_id: cs.get_changeset_id(),
parents: cs.parents()
.into_iter()
.map(|n| ChangesetId::new(n))
.collect(),
};
complete_changesets.add(&completion_record).map(|_| cs)
})
.boxify()
.shared(),
)
}
}