Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.

Commit 90aae26

Browse files
committed
Merge pull request #3064 from adobe/pflynn/fileindexmanager-reentrancy
Fix bug #330 (Calling FileIndexManager.getFileInfoList() fails if another such call in progress)
2 parents cb262fa + 9102a15 commit 90aae26

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

src/project/FileIndexManager.js

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -280,39 +280,36 @@ define(function (require, exports, module) {
280280
* Used by syncFileIndex function to prevent reentrancy
281281
* @private
282282
*/
283-
var _syncFileIndexReentracyGuard = false;
283+
var _ongoingSyncPromise = null;
284284

285285
/**
286286
* Clears and rebuilds all of the fileIndexes and sets _indexListDirty to false
287287
* @return {$.Promise} resolved when index has been updated
288288
*/
289289
function syncFileIndex() {
290290

291-
// TODO (issue 330) - allow multiple calls to syncFileIndex to be batched up so that this code isn't necessary
292-
if (_syncFileIndexReentracyGuard) {
293-
console.error("syncFileIndex cannot be called Recursively");
294-
return;
291+
// If we're already syncing, don't kick off a second one
292+
if (_ongoingSyncPromise) {
293+
return _ongoingSyncPromise;
295294
}
296295

297-
_syncFileIndexReentracyGuard = true;
298-
299296
var rootDir = ProjectManager.getProjectRoot();
300297
if (_indexListDirty) {
301298
PerfUtils.markStart(PerfUtils.FILE_INDEX_MANAGER_SYNC);
302299

303300
_clearIndexes();
304-
305-
return _scanDirectorySubTree(rootDir)
301+
302+
_ongoingSyncPromise = _scanDirectorySubTree(rootDir)
306303
.done(function () {
307304
PerfUtils.addMeasurement(PerfUtils.FILE_INDEX_MANAGER_SYNC);
308305
_indexListDirty = false;
309-
_syncFileIndexReentracyGuard = false;
306+
_ongoingSyncPromise = null;
310307

311308
//_logFileList(_indexList["all"].fileInfos);
312309
//_logFileList(_indexList["css"].fileInfos);
313310
});
311+
return _ongoingSyncPromise;
314312
} else {
315-
_syncFileIndexReentracyGuard = false;
316313
return $.Deferred().resolve().promise();
317314
}
318315
}

test/spec/FileIndexManager-test.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
/*jslint vars: true, plusplus: true, devel: true, browser: true, nomen: true, indent: 4, maxerr: 50 */
26-
/*global define: false, describe: false, beforeEach: false, afterEach: false, it: false, runs: false, waitsFor: false, expect: false, brackets: false */
26+
/*global define, describe, beforeEach, afterEach, it, runs, waitsFor, waitsForDone, expect, spyOn */
2727

2828
define(function (require, exports, module) {
2929
'use strict';
@@ -89,6 +89,41 @@ define(function (require, exports, module) {
8989

9090
});
9191

92+
it("should handle simultaneous requests without doing extra work", function () { // #330
93+
// Open a directory
94+
SpecRunnerUtils.loadProjectInTestWindow(testPath);
95+
96+
var projectRoot;
97+
var promise1, promise2;
98+
var allFiles1, allFiles2;
99+
runs(function () {
100+
projectRoot = ProjectManager.getProjectRoot();
101+
spyOn(projectRoot, "createReader").andCallThrough();
102+
103+
// Kick off two index requests in parallel
104+
promise1 = FileIndexManager.getFileInfoList("all")
105+
.done(function (result) {
106+
allFiles1 = result;
107+
});
108+
promise2 = FileIndexManager.getFileInfoList("all")
109+
.done(function (result) {
110+
allFiles2 = result;
111+
});
112+
113+
waitsForDone(promise1, "First FileIndexManager.getFileInfoList()");
114+
waitsForDone(promise2, "Second FileIndexManager.getFileInfoList()");
115+
});
116+
117+
runs(function () {
118+
// Correct response to both promises
119+
expect(allFiles1.length).toEqual(8);
120+
expect(allFiles2.length).toEqual(8);
121+
122+
// Didn't scan project tree twice
123+
expect(projectRoot.createReader.callCount).toBe(1);
124+
});
125+
});
126+
92127
it("should match a specific filename and return the correct FileInfo", function () {
93128
// Open a directory
94129
SpecRunnerUtils.loadProjectInTestWindow(testPath);

0 commit comments

Comments
 (0)