bool SyncEngine::checkErrorBlacklisting( SyncFileItem &item ) { if( !_journal ) { qWarning() << "Journal is undefined!"; return false; } SyncJournalErrorBlacklistRecord entry = _journal->errorBlacklistEntry(item._file); item._hasBlacklistEntry = false; if( !entry.isValid() ) { return false; } item._hasBlacklistEntry = true; // If duration has expired, it's not blacklisted anymore time_t now = Utility::qDateTimeToTime_t(QDateTime::currentDateTime()); if( now > entry._lastTryTime + entry._ignoreDuration ) { qDebug() << "blacklist entry for " << item._file << " has expired!"; return false; } // If the file has changed locally or on the server, the blacklist // entry no longer applies if( item._direction == SyncFileItem::Up ) { // check the modtime if(item._modtime == 0 || entry._lastTryModtime == 0) { return false; } else if( item._modtime != entry._lastTryModtime ) { qDebug() << item._file << " is blacklisted, but has changed mtime!"; return false; } } else if( item._direction == SyncFileItem::Down ) { // download, check the etag. if( item._etag.isEmpty() || entry._lastTryEtag.isEmpty() ) { qDebug() << item._file << "one ETag is empty, no blacklisting"; return false; } else if( item._etag != entry._lastTryEtag ) { qDebug() << item._file << " is blacklisted, but has changed etag!"; return false; } } qDebug() << "Item is on blacklist: " << entry._file << "retries:" << entry._retryCount << "for another" << (entry._lastTryTime + entry._ignoreDuration - now) << "s"; item._instruction = CSYNC_INSTRUCTION_ERROR; item._status = SyncFileItem::FileIgnored; item._errorString = tr("The item is not synced because of previous errors: %1").arg(entry._errorString); return true; }
/** Updates or creates a blacklist entry for the given item. * * Returns whether the file is in the blacklist now. */ static bool blacklist(SyncJournalDb* journal, const SyncFileItem& item) { SyncJournalErrorBlacklistRecord oldEntry = journal->errorBlacklistEntry(item._file); SyncJournalErrorBlacklistRecord newEntry = SyncJournalErrorBlacklistRecord::update(oldEntry, item); if (newEntry.isValid()) { journal->updateErrorBlacklistEntry(newEntry); } else if (oldEntry.isValid()) { journal->wipeErrorBlacklistEntry(item._file); } return newEntry.isValid(); }
/** Updates, creates or removes a blacklist entry for the given item. * * May adjust the status or item._errorString. */ static void blacklistUpdate(SyncJournalDb *journal, SyncFileItem &item) { SyncJournalErrorBlacklistRecord oldEntry = journal->errorBlacklistEntry(item._file); bool mayBlacklist = item._errorMayBeBlacklisted // explicitly flagged for blacklisting || ((item._status == SyncFileItem::NormalError || item._status == SyncFileItem::SoftError || item._status == SyncFileItem::DetailError) && item._httpErrorCode != 0 // or non-local error ); // No new entry? Possibly remove the old one, then done. if (!mayBlacklist) { if (oldEntry.isValid()) { journal->wipeErrorBlacklistEntry(item._file); } return; } auto newEntry = createBlacklistEntry(oldEntry, item); journal->setErrorBlacklistEntry(newEntry); // Suppress the error if it was and continues to be blacklisted. // An ignoreDuration of 0 mean we're tracking the error, but not actively // suppressing it. if (item._hasBlacklistEntry && newEntry._ignoreDuration > 0) { item._status = SyncFileItem::BlacklistedError; qCInfo(lcPropagator) << "blacklisting " << item._file << " for " << newEntry._ignoreDuration << ", retry count " << newEntry._retryCount; return; } // Some soft errors might become louder on repeat occurrence if (item._status == SyncFileItem::SoftError && newEntry._retryCount > 1) { qCWarning(lcPropagator) << "escalating soft error on " << item._file << " to normal error, " << item._httpErrorCode; item._status = SyncFileItem::NormalError; return; } }