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