mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Bug 812608 - Part 4: Serially initialize providers; r=rnewman
This commit is contained in:
parent
2ed3cb15f7
commit
b25fe48781
@ -27,6 +27,8 @@ this.Collector = function (storage) {
|
||||
this._providers = new Map();
|
||||
this._storage = storage;
|
||||
|
||||
this._providerInitQueue = [];
|
||||
this._providerInitializing = false;
|
||||
this.providerErrors = new Map();
|
||||
}
|
||||
|
||||
@ -49,6 +51,9 @@ Collector.prototype = Object.freeze({
|
||||
* The returned value is a promise that will be resolved once registration
|
||||
* is complete.
|
||||
*
|
||||
* Providers are initialized as part of registration by calling
|
||||
* provider.init().
|
||||
*
|
||||
* @param provider
|
||||
* (Metrics.Provider) The provider instance to register.
|
||||
*
|
||||
@ -63,16 +68,61 @@ Collector.prototype = Object.freeze({
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return provider.init(this._storage).then(function afterInit() {
|
||||
this._providers.set(provider.name, {
|
||||
provider: provider,
|
||||
constantsCollected: false,
|
||||
});
|
||||
let deferred = Promise.defer();
|
||||
this._providerInitQueue.push([provider, deferred]);
|
||||
|
||||
this.providerErrors.set(provider.name, []);
|
||||
if (this._providerInitQueue.length == 1) {
|
||||
this._popAndInitProvider();
|
||||
}
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
_popAndInitProvider: function () {
|
||||
if (!this._providerInitQueue.length || this._providerInitializing) {
|
||||
return;
|
||||
}
|
||||
|
||||
let [provider, deferred] = this._providerInitQueue.pop();
|
||||
this._providerInitializing = true;
|
||||
|
||||
this._log.info("Initializing provider with storage: " + provider.name);
|
||||
let initPromise;
|
||||
try {
|
||||
initPromise = provider.init(this._storage);
|
||||
} catch (ex) {
|
||||
this._log.warn("Provider failed to initialize: " +
|
||||
CommonUtils.exceptionStr(ex));
|
||||
this._providerInitializing = false;
|
||||
deferred.reject(ex);
|
||||
this._popAndInitProvider();
|
||||
return;
|
||||
}
|
||||
|
||||
initPromise.then(
|
||||
function onSuccess(result) {
|
||||
this._log.info("Provider finished initialization: " + provider.name);
|
||||
this._providerInitializing = false;
|
||||
|
||||
this._providers.set(provider.name, {
|
||||
provider: provider,
|
||||
constantsCollected: false,
|
||||
});
|
||||
|
||||
this.providerErrors.set(provider.name, []);
|
||||
|
||||
deferred.resolve(result);
|
||||
this._popAndInitProvider();
|
||||
}.bind(this),
|
||||
function onError(error) {
|
||||
this._log.warn("Provider initialization failed: " +
|
||||
CommonUtils.exceptionStr(error));
|
||||
this._providerInitializing = false;
|
||||
deferred.reject(error);
|
||||
this._popAndInitProvider();
|
||||
}.bind(this)
|
||||
);
|
||||
|
||||
return Promise.resolve();
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user