| 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.
|
|
|