Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(225)

Side by Side Diff: chrome/browser/resources/file_manager/foreground/js/metadata/metadata_cache.js

Issue 113293007: [Files.app] Change sort timing during metadata fetch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressed comments Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/resources/file_manager/foreground/js/file_manager.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * MetadataCache is a map from url to an object containing properties. 8 * MetadataCache is a map from url to an object containing properties.
9 * Properties are divided by types, and all properties of one type are accessed 9 * Properties are divided by types, and all properties of one type are accessed
10 * at once. 10 * at once.
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 * callback - the callback. 70 * callback - the callback.
71 * TODO(dgozman): pass entries to observer if present. 71 * TODO(dgozman): pass entries to observer if present.
72 * @private 72 * @private
73 */ 73 */
74 this.observers_ = []; 74 this.observers_ = [];
75 this.observerId_ = 0; 75 this.observerId_ = 0;
76 76
77 this.batchCount_ = 0; 77 this.batchCount_ = 0;
78 this.totalCount_ = 0; 78 this.totalCount_ = 0;
79 79
80 this.currentCacheSize_ = 0;
81
80 /** 82 /**
81 * Time of first get query of the current batch. Items updated later than this 83 * Time of first get query of the current batch. Items updated later than this
82 * will not be evicted. 84 * will not be evicted.
83 * @private 85 * @private
84 */ 86 */
85 this.lastBatchStart_ = new Date(); 87 this.lastBatchStart_ = new Date();
86 } 88 }
87 89
88 /** 90 /**
89 * Observer type: it will be notified if the url changed is exactly the same 91 * Observer type: it will be notified if the url changed is exactly the same
90 * as the url passed. 92 * as the url passed.
91 */ 93 */
92 MetadataCache.EXACT = 0; 94 MetadataCache.EXACT = 0;
93 95
94 /** 96 /**
95 * Observer type: it will be notified if the url changed is an immediate child 97 * Observer type: it will be notified if the url changed is an immediate child
96 * of the url passed. 98 * of the url passed.
97 */ 99 */
98 MetadataCache.CHILDREN = 1; 100 MetadataCache.CHILDREN = 1;
99 101
100 /** 102 /**
101 * Observer type: it will be notified if the url changed is any descendant 103 * Observer type: it will be notified if the url changed is any descendant
102 * of the url passed. 104 * of the url passed.
103 */ 105 */
104 MetadataCache.DESCENDANTS = 2; 106 MetadataCache.DESCENDANTS = 2;
105 107
106 /** 108 /**
107 * Minimum number of items in cache to start eviction. 109 * Margin of the cache size. This amount of caches may be kept in addition.
108 */ 110 */
109 MetadataCache.EVICTION_NUMBER = 1000; 111 MetadataCache.EVICTION_THRESHOLD_MARGIN = 500;
110 112
111 /** 113 /**
112 * @return {MetadataCache!} The cache with all providers. 114 * @return {MetadataCache!} The cache with all providers.
113 */ 115 */
114 MetadataCache.createFull = function() { 116 MetadataCache.createFull = function() {
115 var cache = new MetadataCache(); 117 var cache = new MetadataCache();
116 cache.providers_.push(new FilesystemProvider()); 118 cache.providers_.push(new FilesystemProvider());
117 cache.providers_.push(new DriveProvider()); 119 cache.providers_.push(new DriveProvider());
118 cache.providers_.push(new ContentProvider()); 120 cache.providers_.push(new ContentProvider());
119 return cache; 121 return cache;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 * @return {boolean} Whether all providers are ready. 154 * @return {boolean} Whether all providers are ready.
153 */ 155 */
154 MetadataCache.prototype.isInitialized = function() { 156 MetadataCache.prototype.isInitialized = function() {
155 for (var index = 0; index < this.providers_.length; index++) { 157 for (var index = 0; index < this.providers_.length; index++) {
156 if (!this.providers_[index].isInitialized()) return false; 158 if (!this.providers_[index].isInitialized()) return false;
157 } 159 }
158 return true; 160 return true;
159 }; 161 };
160 162
161 /** 163 /**
164 * Sets the size of cache. The acutual cache size may be larger than the given
mtomasz 2014/01/08 08:11:02 nit: actual
yoshiki 2014/01/08 09:04:45 Done.
165 * value.
166 * @param {number} size The cache size to be set.
167 */
168 MetadataCache.prototype.setCacheSize = function(size) {
169 this.currentCacheSize_ = size;
170
171 if (this.totalCount_ > this.currentEvictionThreshold_())
172 this.evict_();
173 };
174
175 /**
176 * Returns the current threshold to evict caches. When the number of caches
177 * exceeds this, the cache should be evicted.
178 * @return {number} Threshold to evict caches.
179 * @private
180 */
181 MetadataCache.prototype.currentEvictionThreshold_ = function() {
182 return this.currentCacheSize_ * 2 + MetadataCache.EVICTION_THRESHOLD_MARGIN;
183 };
184
185 /**
162 * Fetches the metadata, puts it in the cache, and passes to callback. 186 * Fetches the metadata, puts it in the cache, and passes to callback.
163 * If required metadata is already in the cache, does not fetch it again. 187 * If required metadata is already in the cache, does not fetch it again.
164 * @param {string|Entry|Array.<string|Entry>} items The list of entries or 188 * @param {string|Entry|Array.<string|Entry>} items The list of entries or
165 * file urls. May be just a single item. 189 * file urls. May be just a single item.
166 * @param {string} type The metadata type. 190 * @param {string} type The metadata type.
167 * @param {function(Object)} callback The metadata is passed to callback. 191 * @param {function(Object)} callback The metadata is passed to callback.
168 */ 192 */
169 MetadataCache.prototype.get = function(items, type, callback) { 193 MetadataCache.prototype.get = function(items, type, callback) {
170 if (!(items instanceof Array)) { 194 if (!(items instanceof Array)) {
171 this.getOne(items, type, callback); 195 this.getOne(items, type, callback);
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 if (this.batchCount_ == 1) 473 if (this.batchCount_ == 1)
450 this.lastBatchStart_ = new Date(); 474 this.lastBatchStart_ = new Date();
451 }; 475 };
452 476
453 /** 477 /**
454 * End batch updates. Notifies observers if all nested updates are finished. 478 * End batch updates. Notifies observers if all nested updates are finished.
455 */ 479 */
456 MetadataCache.prototype.endBatchUpdates = function() { 480 MetadataCache.prototype.endBatchUpdates = function() {
457 this.batchCount_--; 481 this.batchCount_--;
458 if (this.batchCount_ != 0) return; 482 if (this.batchCount_ != 0) return;
459 if (this.totalCount_ > MetadataCache.EVICTION_NUMBER) 483 if (this.totalCount_ > this.currentEvictionThreshold_())
460 this.evict_(); 484 this.evict_();
461 for (var index = 0; index < this.observers_.length; index++) { 485 for (var index = 0; index < this.observers_.length; index++) {
462 var observer = this.observers_[index]; 486 var observer = this.observers_[index];
463 var urls = []; 487 var urls = [];
464 var properties = []; 488 var properties = [];
465 for (var url in observer.pending) { 489 for (var url in observer.pending) {
466 if (observer.pending.hasOwnProperty(url) && url in this.cache_) { 490 if (observer.pending.hasOwnProperty(url) && url in this.cache_) {
467 urls.push(url); 491 urls.push(url);
468 properties.push(this.cache_[url].properties[observer.type] || null); 492 properties.push(this.cache_[url].properties[observer.type] || null);
469 } 493 }
(...skipping 27 matching lines...) Expand all
497 521
498 /** 522 /**
499 * Removes the oldest items from the cache. 523 * Removes the oldest items from the cache.
500 * This method never removes the items from last batch. 524 * This method never removes the items from last batch.
501 * @private 525 * @private
502 */ 526 */
503 MetadataCache.prototype.evict_ = function() { 527 MetadataCache.prototype.evict_ = function() {
504 var toRemove = []; 528 var toRemove = [];
505 529
506 // We leave only a half of items, so we will not call evict_ soon again. 530 // We leave only a half of items, so we will not call evict_ soon again.
507 var desiredCount = Math.round(MetadataCache.EVICTION_NUMBER / 2); 531 var desiredCount = this.currentEvictionThreshold();
508 var removeCount = this.totalCount_ - desiredCount; 532 var removeCount = this.totalCount_ - desiredCount;
509 for (var url in this.cache_) { 533 for (var url in this.cache_) {
510 if (this.cache_.hasOwnProperty(url) && 534 if (this.cache_.hasOwnProperty(url) &&
511 this.cache_[url].time < this.lastBatchStart_) { 535 this.cache_[url].time < this.lastBatchStart_) {
512 toRemove.push(url); 536 toRemove.push(url);
513 } 537 }
514 } 538 }
515 539
516 toRemove.sort(function(a, b) { 540 toRemove.sort(function(a, b) {
517 var aTime = this.cache_[a].time; 541 var aTime = this.cache_[a].time;
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 1066
1043 /** 1067 /**
1044 * Handles the 'log' message from the worker. 1068 * Handles the 'log' message from the worker.
1045 * @param {Array.<*>} arglist Log arguments. 1069 * @param {Array.<*>} arglist Log arguments.
1046 * @private 1070 * @private
1047 */ 1071 */
1048 ContentProvider.prototype.onLog_ = function(arglist) { 1072 ContentProvider.prototype.onLog_ = function(arglist) {
1049 if (MetadataCache.log) // Avoid log spam by default. 1073 if (MetadataCache.log) // Avoid log spam by default.
1050 console.log.apply(console, ['metadata:'].concat(arglist)); 1074 console.log.apply(console, ['metadata:'].concat(arglist));
1051 }; 1075 };
OLDNEW
« no previous file with comments | « chrome/browser/resources/file_manager/foreground/js/file_manager.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698