Commit 2ee5f5df authored by tzik's avatar tzik Committed by Commit bot

[SyncFS] Fix unexpected delay on running sync task

 * Don't count demoted dirty tracker as pending.
 * Notify observer of service state update when the initialization is completed.

BUG=410675

Review URL: https://codereview.chromium.org/537883002

Cr-Commit-Position: refs/heads/master@{#293474}
parent 94652f8e
...@@ -416,7 +416,7 @@ bool MetadataDatabaseIndex::PromoteDemotedDirtyTrackers() { ...@@ -416,7 +416,7 @@ bool MetadataDatabaseIndex::PromoteDemotedDirtyTrackers() {
} }
size_t MetadataDatabaseIndex::CountDirtyTracker() const { size_t MetadataDatabaseIndex::CountDirtyTracker() const {
return dirty_trackers_.size() + demoted_dirty_trackers_.size(); return dirty_trackers_.size();
} }
size_t MetadataDatabaseIndex::CountFileMetadata() const { size_t MetadataDatabaseIndex::CountFileMetadata() const {
......
...@@ -515,6 +515,7 @@ void MetadataDatabaseIndexOnDisk::DemoteDirtyTracker(int64 tracker_id) { ...@@ -515,6 +515,7 @@ void MetadataDatabaseIndexOnDisk::DemoteDirtyTracker(int64 tracker_id) {
db_->Delete(key); db_->Delete(key);
db_->Put(GenerateDemotedDirtyIDKey(tracker_id), std::string()); db_->Put(GenerateDemotedDirtyIDKey(tracker_id), std::string());
--num_dirty_trackers_;
} }
bool MetadataDatabaseIndexOnDisk::HasDemotedDirtyTracker() const { bool MetadataDatabaseIndexOnDisk::HasDemotedDirtyTracker() const {
...@@ -532,6 +533,7 @@ void MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTracker(int64 tracker_id) { ...@@ -532,6 +533,7 @@ void MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTracker(int64 tracker_id) {
if (db_->Get(demoted_key, &empty).ok()) { if (db_->Get(demoted_key, &empty).ok()) {
db_->Delete(demoted_key); db_->Delete(demoted_key);
db_->Put(GenerateDirtyIDKey(tracker_id), std::string()); db_->Put(GenerateDirtyIDKey(tracker_id), std::string());
++num_dirty_trackers_;
} }
} }
...@@ -549,6 +551,7 @@ bool MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTrackers() { ...@@ -549,6 +551,7 @@ bool MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTrackers() {
db_->Delete(itr->key().ToString()); db_->Delete(itr->key().ToString());
db_->Put(GenerateDirtyIDKey(tracker_id), std::string()); db_->Put(GenerateDirtyIDKey(tracker_id), std::string());
++num_dirty_trackers_;
promoted = true; promoted = true;
} }
return promoted; return promoted;
...@@ -696,6 +699,7 @@ int64 MetadataDatabaseIndexOnDisk::DeleteTrackerIndexes() { ...@@ -696,6 +699,7 @@ int64 MetadataDatabaseIndexOnDisk::DeleteTrackerIndexes() {
int64 num_deletes_before = db_->num_deletes(); int64 num_deletes_before = db_->num_deletes();
for (size_t i = 0; i < arraysize(kIndexPrefixes); ++i) for (size_t i = 0; i < arraysize(kIndexPrefixes); ++i)
DeleteKeyStartsWith(kIndexPrefixes[i]); DeleteKeyStartsWith(kIndexPrefixes[i]);
num_dirty_trackers_ = 0;
return db_->num_deletes() - num_deletes_before; return db_->num_deletes() - num_deletes_before;
} }
...@@ -704,7 +708,8 @@ LevelDBWrapper* MetadataDatabaseIndexOnDisk::GetDBForTesting() { ...@@ -704,7 +708,8 @@ LevelDBWrapper* MetadataDatabaseIndexOnDisk::GetDBForTesting() {
} }
MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(LevelDBWrapper* db) MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(LevelDBWrapper* db)
: db_(db) { : db_(db),
num_dirty_trackers_(0) {
// TODO(peria): Add UMA to measure the number of FileMetadata, FileTracker, // TODO(peria): Add UMA to measure the number of FileMetadata, FileTracker,
// and AppRootId. // and AppRootId.
service_metadata_ = InitializeServiceMetadata(db_); service_metadata_ = InitializeServiceMetadata(db_);
...@@ -727,9 +732,9 @@ MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(LevelDBWrapper* db) ...@@ -727,9 +732,9 @@ MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(LevelDBWrapper* db)
BuildTrackerIndexes(); BuildTrackerIndexes();
db_->Put(kLastValidationTimeKey, db_->Put(kLastValidationTimeKey,
base::Int64ToString(base::Time::Now().ToInternalValue())); base::Int64ToString(base::Time::Now().ToInternalValue()));
} else {
num_dirty_trackers_ = CountDirtyTrackerInternal();
} }
num_dirty_trackers_ = CountDirtyTrackerInternal();
} }
void MetadataDatabaseIndexOnDisk::AddToAppIDIndex(const FileTracker& tracker) { void MetadataDatabaseIndexOnDisk::AddToAppIDIndex(const FileTracker& tracker) {
...@@ -1000,9 +1005,10 @@ void MetadataDatabaseIndexOnDisk::UpdateInDirtyTrackerIndexes( ...@@ -1000,9 +1005,10 @@ void MetadataDatabaseIndexOnDisk::UpdateInDirtyTrackerIndexes(
DVLOG(1) << " Remove from dirty trackers IDs: " << tracker_id; DVLOG(1) << " Remove from dirty trackers IDs: " << tracker_id;
if (DBHasKey(dirty_key))
--num_dirty_trackers_;
db_->Delete(dirty_key); db_->Delete(dirty_key);
db_->Delete(demoted_key); db_->Delete(demoted_key);
--num_dirty_trackers_;
} else if (!old_tracker.dirty() && new_tracker.dirty()) { } else if (!old_tracker.dirty() && new_tracker.dirty()) {
DCHECK(!DBHasKey(dirty_key)); DCHECK(!DBHasKey(dirty_key));
DCHECK(!DBHasKey(demoted_key)); DCHECK(!DBHasKey(demoted_key));
...@@ -1023,9 +1029,10 @@ void MetadataDatabaseIndexOnDisk::RemoveFromDirtyTrackerIndexes( ...@@ -1023,9 +1029,10 @@ void MetadataDatabaseIndexOnDisk::RemoveFromDirtyTrackerIndexes(
DCHECK(DBHasKey(dirty_key) || DBHasKey(demoted_key)); DCHECK(DBHasKey(dirty_key) || DBHasKey(demoted_key));
DVLOG(1) << " Remove from dirty tracker IDs: " << tracker_id; DVLOG(1) << " Remove from dirty tracker IDs: " << tracker_id;
if (DBHasKey(dirty_key))
--num_dirty_trackers_;
db_->Delete(dirty_key); db_->Delete(dirty_key);
db_->Delete(demoted_key); db_->Delete(demoted_key);
--num_dirty_trackers_;
} }
} }
...@@ -1137,12 +1144,6 @@ size_t MetadataDatabaseIndexOnDisk::CountDirtyTrackerInternal() const { ...@@ -1137,12 +1144,6 @@ size_t MetadataDatabaseIndexOnDisk::CountDirtyTrackerInternal() const {
++num_dirty_trackers; ++num_dirty_trackers;
} }
for (itr->Seek(kDemotedDirtyIDKeyPrefix); itr->Valid(); itr->Next()) {
if (!StartsWithASCII(itr->key().ToString(), kDemotedDirtyIDKeyPrefix, true))
break;
++num_dirty_trackers;
}
return num_dirty_trackers; return num_dirty_trackers;
} }
......
...@@ -591,7 +591,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) { ...@@ -591,7 +591,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) {
index()->DemoteDirtyTracker(kPlaceholderTrackerID); index()->DemoteDirtyTracker(kPlaceholderTrackerID);
WriteToDB(); WriteToDB();
EXPECT_TRUE(index()->HasDemotedDirtyTracker()); EXPECT_TRUE(index()->HasDemotedDirtyTracker());
EXPECT_EQ(1U, index()->CountDirtyTracker()); EXPECT_EQ(0U, index()->CountDirtyTracker());
const int64 tracker_id = 13; const int64 tracker_id = 13;
scoped_ptr<FileTracker> app_root_tracker(new FileTracker); scoped_ptr<FileTracker> app_root_tracker(new FileTracker);
...@@ -604,7 +604,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) { ...@@ -604,7 +604,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) {
app_root_tracker.get()); app_root_tracker.get());
index()->StoreFileTracker(tracker.Pass()); index()->StoreFileTracker(tracker.Pass());
WriteToDB(); WriteToDB();
EXPECT_EQ(2U, index()->CountDirtyTracker()); EXPECT_EQ(1U, index()->CountDirtyTracker());
EXPECT_EQ(tracker_id, index()->PickDirtyTracker()); EXPECT_EQ(tracker_id, index()->PickDirtyTracker());
// Testing UpdateDirtyTrackerIndexes // Testing UpdateDirtyTrackerIndexes
...@@ -614,7 +614,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) { ...@@ -614,7 +614,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) {
tracker->set_dirty(false); tracker->set_dirty(false);
index()->StoreFileTracker(tracker.Pass()); index()->StoreFileTracker(tracker.Pass());
WriteToDB(); WriteToDB();
EXPECT_EQ(1U, index()->CountDirtyTracker()); EXPECT_EQ(0U, index()->CountDirtyTracker());
EXPECT_EQ(kInvalidTrackerID, index()->PickDirtyTracker()); EXPECT_EQ(kInvalidTrackerID, index()->PickDirtyTracker());
tracker = test_util::CreatePlaceholderTracker("placeholder", tracker = test_util::CreatePlaceholderTracker("placeholder",
...@@ -622,13 +622,13 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) { ...@@ -622,13 +622,13 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) {
app_root_tracker.get()); app_root_tracker.get());
index()->StoreFileTracker(tracker.Pass()); index()->StoreFileTracker(tracker.Pass());
WriteToDB(); WriteToDB();
EXPECT_EQ(2U, index()->CountDirtyTracker()); EXPECT_EQ(1U, index()->CountDirtyTracker());
EXPECT_EQ(tracker_id, index()->PickDirtyTracker()); EXPECT_EQ(tracker_id, index()->PickDirtyTracker());
// Testing RemoveFromDirtyTrackerIndexes // Testing RemoveFromDirtyTrackerIndexes
index()->RemoveFileTracker(tracker_id); index()->RemoveFileTracker(tracker_id);
WriteToDB(); WriteToDB();
EXPECT_EQ(1U, index()->CountDirtyTracker()); EXPECT_EQ(0U, index()->CountDirtyTracker());
EXPECT_EQ(kInvalidTrackerID, index()->PickDirtyTracker()); EXPECT_EQ(kInvalidTrackerID, index()->PickDirtyTracker());
// Demoted trackers // Demoted trackers
......
...@@ -358,7 +358,6 @@ void SyncEngine::InitializeInternal( ...@@ -358,7 +358,6 @@ void SyncEngine::InitializeInternal(
drive_service_->AddObserver(this); drive_service_->AddObserver(this);
service_state_ = REMOTE_SERVICE_TEMPORARY_UNAVAILABLE; service_state_ = REMOTE_SERVICE_TEMPORARY_UNAVAILABLE;
SetSyncEnabled(sync_enabled_);
OnNetworkChanged(net::NetworkChangeNotifier::GetConnectionType()); OnNetworkChanged(net::NetworkChangeNotifier::GetConnectionType());
if (drive_service_->HasRefreshToken()) if (drive_service_->HasRefreshToken())
OnReadyToSendRequests(); OnReadyToSendRequests();
...@@ -665,7 +664,7 @@ void SyncEngine::OnNotificationReceived() { ...@@ -665,7 +664,7 @@ void SyncEngine::OnNotificationReceived() {
"Got push notification for Drive")); "Got push notification for Drive"));
} }
void SyncEngine::OnPushNotificationEnabled(bool) {} void SyncEngine::OnPushNotificationEnabled(bool /* enabled */) {}
void SyncEngine::OnReadyToSendRequests() { void SyncEngine::OnReadyToSendRequests() {
has_refresh_token_ = true; has_refresh_token_ = true;
......
...@@ -392,9 +392,12 @@ void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, ...@@ -392,9 +392,12 @@ void SyncWorker::DidInitialize(SyncEngineInitializer* initializer,
scoped_ptr<MetadataDatabase> metadata_database = scoped_ptr<MetadataDatabase> metadata_database =
initializer->PassMetadataDatabase(); initializer->PassMetadataDatabase();
if (metadata_database) if (metadata_database) {
context_->SetMetadataDatabase(metadata_database.Pass()); context_->SetMetadataDatabase(metadata_database.Pass());
return;
}
UpdateServiceState(REMOTE_SERVICE_OK, std::string());
UpdateRegisteredApps(); UpdateRegisteredApps();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment