Index: chrome/browser/chromeos/drive/resource_metadata_storage.cc |
diff --git a/chrome/browser/chromeos/drive/resource_metadata_storage.cc b/chrome/browser/chromeos/drive/resource_metadata_storage.cc |
index 13c88f0dd60b1ef14910b6a1d5cb89b0564fdee9..8d178c6c1208d0c0c0de873cffde3e4ea8d831b3 100644 |
--- a/chrome/browser/chromeos/drive/resource_metadata_storage.cc |
+++ b/chrome/browser/chromeos/drive/resource_metadata_storage.cc |
@@ -285,8 +285,34 @@ bool ResourceMetadataStorage::UpgradeOldDB( |
UMA_HISTOGRAM_SPARSE_SLOWLY("Drive.MetadataDBVersionBeforeUpgradeCheck", |
header.version()); |
- if (header.version() == kDBVersion) { // Nothing to do. |
- return true; |
+ if (header.version() == kDBVersion) { |
+ // Before r272134, UpgradeOldDB() was not deleting unused ID entries. |
+ // Delete unused ID entries to fix crbug.com/374648. |
+ std::set<std::string> used_ids; |
+ |
+ scoped_ptr<leveldb::Iterator> it( |
+ resource_map->NewIterator(leveldb::ReadOptions())); |
+ it->Seek(leveldb::Slice(GetHeaderDBKey())); |
+ it->Next(); |
+ for (; it->Valid(); it->Next()) { |
+ if (IsCacheEntryKey(it->key())) { |
+ used_ids.insert(GetIdFromCacheEntryKey(it->key())); |
+ } else if (!IsChildEntryKey(it->key()) && !IsIdEntryKey(it->key())) { |
+ used_ids.insert(it->key().ToString()); |
+ } |
+ } |
+ if (!it->status().ok()) |
+ return false; |
+ |
+ leveldb::WriteBatch batch; |
+ for (it->SeekToFirst(); it->Valid(); it->Next()) { |
+ if (IsIdEntryKey(it->key()) && !used_ids.count(it->value().ToString())) |
+ batch.Delete(it->key()); |
+ } |
+ if (!it->status().ok()) |
+ return false; |
+ |
+ return resource_map->Write(leveldb::WriteOptions(), &batch).ok(); |
} else if (header.version() < 6) { // Too old, nothing can be done. |
return false; |
} else if (header.version() < 11) { // Cache entries can be reused. |