cxplot 0.1.25 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/hash.js +17 -1
- package/package.json +1 -1
package/lib/hash.js
CHANGED
|
@@ -19,12 +19,28 @@ function hashCorpus(entries, opts) {
|
|
|
19
19
|
settle: (opts && opts.settle) || 'full',
|
|
20
20
|
figures: {}, failed: []
|
|
21
21
|
};
|
|
22
|
+
// Each figure renders in its own fresh Chromium, which can crash natively (SIGSEGV)
|
|
23
|
+
// on a transient container hiccup -- a flake, not a figure change. Retry a rejected
|
|
24
|
+
// render a few times (a new browser each attempt) so one crash does not fail the whole
|
|
25
|
+
// determinism manifest. The hash is deterministic, so a clean attempt reproduces it;
|
|
26
|
+
// a genuine (reproducible) failure still surfaces after the attempts are spent.
|
|
27
|
+
var MAX_ATTEMPTS = opts && opts.renderAttempts > 0 ? opts.renderAttempts : 3;
|
|
28
|
+
function renderWithRetry(spec, key, attempt) {
|
|
29
|
+
return render.renderFigure(spec, opts).then(null, function (err) {
|
|
30
|
+
if (attempt < MAX_ATTEMPTS) {
|
|
31
|
+
process.stderr.write('retry ' + key + ' attempt ' + (attempt + 1) + '/' + MAX_ATTEMPTS +
|
|
32
|
+
' after render crash: ' + String((err && err.message) || err).slice(0, 80) + '\n');
|
|
33
|
+
return renderWithRetry(spec, key, attempt + 1);
|
|
34
|
+
}
|
|
35
|
+
throw err;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
22
38
|
var i = 0;
|
|
23
39
|
function next() {
|
|
24
40
|
if (i >= entries.length) return Promise.resolve(manifest);
|
|
25
41
|
var e = entries[i++];
|
|
26
42
|
var key = path.basename(e.file);
|
|
27
|
-
return
|
|
43
|
+
return renderWithRetry(e.spec, key, 1).then(function (res) {
|
|
28
44
|
manifest.engineVersion = manifest.engineVersion || res.engineVersion;
|
|
29
45
|
manifest.engineSource = manifest.engineSource || res.engineSource;
|
|
30
46
|
manifest.figures[key] = { sha256: sha256(res.png), width: res.width, height: res.height, settled: res.settled, waitedMs: res.waitedMs, errors: res.errors };
|