Skip to content

Commit

Permalink
Delete finished propagation jobs in PropagateDirectory #5269
Browse files Browse the repository at this point in the history
  • Loading branch information
jturcotte committed Jan 25, 2017
1 parent de2458d commit 55dab17
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 27 deletions.
42 changes: 18 additions & 24 deletions src/libsync/owncloudpropagator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -588,17 +588,12 @@ OwncloudPropagator *PropagatorJob::propagator() const
PropagatorJob::JobParallelism PropagateDirectory::parallelism()
{
// If any of the non-finished sub jobs is not parallel, we have to wait

// FIXME! we should probably cache this result

if (_firstJob && _firstJob->_state != Finished) {
if (_firstJob->parallelism() != FullParallelism)
return WaitForFinished;
if (_firstJob && _firstJob->parallelism() != FullParallelism) {
return WaitForFinished;
}

// FIXME: use the cached value of finished job
for (int i = 0; i < _subJobs.count(); ++i) {
if (_subJobs.at(i)->_state != Finished && _subJobs.at(i)->parallelism() != FullParallelism) {
if (_subJobs.at(i)->parallelism() != FullParallelism) {
return WaitForFinished;
}
}
Expand Down Expand Up @@ -629,15 +624,8 @@ bool PropagateDirectory::scheduleNextJob()
return false;
}

// cache the value of first unfinished subjob
bool stopAtDirectory = false;
int i = _firstUnfinishedSubJob;
int subJobsCount = _subJobs.count();
while (i < subJobsCount && _subJobs.at(i)->_state == Finished) {
_firstUnfinishedSubJob = ++i;
}

for (int i = _firstUnfinishedSubJob; i < subJobsCount; ++i) {
for (int i = 0; i < _subJobs.size(); ++i) {
if (_subJobs.at(i)->_state == Finished) {
continue;
}
Expand Down Expand Up @@ -665,8 +653,20 @@ bool PropagateDirectory::scheduleNextJob()

void PropagateDirectory::slotSubJobFinished(SyncFileItem::Status status)
{
PropagatorJob *subJob = static_cast<PropagatorJob *>(sender());

// Delete the job and remove it from our list of jobs.
subJob->deleteLater();
if (subJob == _firstJob.data()) {
_firstJob.reset();
} else {
bool removed = _subJobs.removeOne(subJob);
// FIXME: Try debug build
Q_ASSERT(removed);
}

if (status == SyncFileItem::FatalError ||
(sender() == _firstJob.data() && status != SyncFileItem::Success && status != SyncFileItem::Restoration)) {
(subJob == _firstJob.data() && status != SyncFileItem::Success && status != SyncFileItem::Restoration)) {
abort();
_state = Finished;
emit finished(status);
Expand All @@ -675,16 +675,10 @@ void PropagateDirectory::slotSubJobFinished(SyncFileItem::Status status)
_hasError = status;
}
_runningNow--;
_jobsFinished++;

int totalJobs = _subJobs.count();
if (_firstJob) {
totalJobs++;
}

// We finished processing all the jobs
// check if we finished
if (_jobsFinished >= totalJobs) {
if (!_firstJob && _subJobs.isEmpty()) {
Q_ASSERT(!_runningNow); // how can we be finished if there are still jobs running now
finalize();
} else {
Expand Down
4 changes: 1 addition & 3 deletions src/libsync/owncloudpropagator.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,14 +192,12 @@ class OWNCLOUDSYNC_EXPORT PropagateDirectory : public PropagatorJob {

SyncFileItemPtr _item;

int _jobsFinished; // number of jobs that have completed
int _runningNow; // number of subJobs running right now
SyncFileItem::Status _hasError; // NoStatus, or NormalError / SoftError if there was an error
int _firstUnfinishedSubJob;

explicit PropagateDirectory(OwncloudPropagator *propagator, const SyncFileItemPtr &item = SyncFileItemPtr(new SyncFileItem))
: PropagatorJob(propagator)
, _firstJob(0), _item(item), _jobsFinished(0), _runningNow(0), _hasError(SyncFileItem::NoStatus), _firstUnfinishedSubJob(0)
, _item(item), _runningNow(0), _hasError(SyncFileItem::NoStatus)
{ }

virtual ~PropagateDirectory() {
Expand Down

0 comments on commit 55dab17

Please sign in to comment.