Skip to content

Commit 74cdd88

Browse files
committed
Fix - backport files remap for root.cern website
CI fails too often with plain root.cern website
1 parent 5084f83 commit 74cdd88

2 files changed

Lines changed: 62 additions & 7 deletions

File tree

modules/core.mjs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,15 @@ settings = {
277277
* @desc Some http server has limitations for number of bytes rannges therefore let change maximal number via setting
278278
* @default 200 */
279279
MaxRanges: 200,
280-
/** @summary Configure xhr.withCredentials = true when submitting http requests from JSROOT */
280+
/** @summary File read timeout in ms
281+
* @desc Configures timeout for each http operation for reading ROOT files
282+
* @default 0 */
283+
FilesTimeout: 0,
284+
/** @summary Default remap object for files loading
285+
* @desc Allows to retry files reading if original URL fails
286+
* @private */
287+
FilesRemap: { 'https://root.cern/': 'https://root-eos.web.cern.ch/' },
288+
/** @summary Configure xhr.withCredentials = true when submitting http requests from JSROOT */
281289
WithCredentials: false,
282290
/** @summary Skip streamer infos from the GUI */
283291
SkipStreamerInfos: false,

modules/io.mjs

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2660,6 +2660,7 @@ class TFile {
26602660
this.fStreamers = 0;
26612661
this.fStreamerInfos = null;
26622662
this.fFileName = '';
2663+
this.fTimeout = settings.FilesTimeout ?? 0;
26632664
this.fStreamers = [];
26642665
this.fBasicTypes = {}; // custom basic types, in most case enumerations
26652666

@@ -2692,6 +2693,28 @@ class TFile {
26922693
this.fFileName = pos >= 0 ? this.fURL.slice(pos + 1) : this.fURL;
26932694
}
26942695

2696+
/** @summary Set timeout for File instance
2697+
* @desc Timeout used when submitting http requests to the server */
2698+
setTimeout(v) {
2699+
this.fTimeout = v;
2700+
}
2701+
2702+
/** @summary Assign remap for web servers
2703+
* @desc Allows to specify fallback server if main server fails
2704+
* @param {Object} remap - looks like { 'https://original.server/': 'https://fallback.server/' } */
2705+
assignRemap(remap) {
2706+
if (!remap && !isObject(remap))
2707+
return;
2708+
2709+
for (const key in remap) {
2710+
if (this.fURL.indexOf(key) === 0) {
2711+
this.fURL2 = remap[key] + this.fURL.slice(key.length);
2712+
if (!this.fTimeout)
2713+
this.fTimeout = 10000;
2714+
}
2715+
}
2716+
}
2717+
26952718
/** @summary Assign BufferArray with file contentOpen file
26962719
* @private */
26972720
assignFileContent(bufArray) {
@@ -2719,15 +2742,23 @@ class TFile {
27192742
blobs = [], // array of requested segments
27202743
promise = new Promise((resolve, reject) => { resolveFunc = resolve; rejectFunc = reject; });
27212744

2722-
let fileurl = file.fURL,
2723-
first = 0, last = 0,
2745+
let fileurl, first = 0, last = 0,
27242746
// eslint-disable-next-line prefer-const
27252747
read_callback, first_req,
27262748
first_block_retry = false;
27272749

2728-
if (isStr(filename) && filename) {
2729-
const pos = fileurl.lastIndexOf('/');
2730-
fileurl = (pos < 0) ? filename : fileurl.slice(0, pos + 1) + filename;
2750+
function setFileUrl(use_second) {
2751+
if (use_second) {
2752+
console.log('Failure - try to repait with URL2', file.fURL2);
2753+
file.fURL = file.fURL2;
2754+
delete file.fURL2;
2755+
}
2756+
2757+
fileurl = file.fURL;
2758+
if (isStr(filename) && filename) {
2759+
const pos = fileurl.lastIndexOf('/');
2760+
fileurl = (pos < 0) ? filename : fileurl.slice(0, pos + 1) + filename;
2761+
}
27312762
}
27322763

27332764
function send_new_request(increment) {
@@ -2759,6 +2790,9 @@ class TFile {
27592790
xhr.expected_size = Math.max(Math.round(1.1 * totalsz), totalsz + 200); // 200 if offset for the potential gzip
27602791
}
27612792

2793+
if (file.fTimeout)
2794+
xhr.timeout = file.fTimeout;
2795+
27622796
if (isFunc(progress_callback) && isFunc(xhr.addEventListener)) {
27632797
let sum1 = 0, sum2 = 0, sum_total = 0;
27642798
for (let n = 1; n < place.length; n += 2) {
@@ -2798,6 +2832,10 @@ class TFile {
27982832
file.fUseStampPar = false;
27992833
return send_new_request();
28002834
}
2835+
if (file.fURL2) {
2836+
setFileUrl(true);
2837+
return send_new_request();
2838+
}
28012839
if (file.fAcceptRanges) {
28022840
file.fAcceptRanges = false;
28032841
first_block_retry = true;
@@ -2850,6 +2888,11 @@ class TFile {
28502888
return send_new_request();
28512889
}
28522890

2891+
if (first_block && file.fURL2) {
2892+
setFileUrl(true);
2893+
return send_new_request();
2894+
}
2895+
28532896
return rejectFunc(Error('Fail to read with several ranges'));
28542897
}
28552898

@@ -2996,6 +3039,8 @@ class TFile {
29963039
send_new_request(true);
29973040
};
29983041

3042+
setFileUrl();
3043+
29993044
return send_new_request(true).then(() => promise);
30003045
}
30013046

@@ -3865,8 +3910,10 @@ function openFile(arg) {
38653910
if (!file && isObject(arg) && arg.size && arg.name)
38663911
file = new TLocalFile(arg);
38673912

3868-
if (!file)
3913+
if (!file) {
38693914
file = new TFile(arg);
3915+
file.assignRemap(settings.FilesRemap);
3916+
}
38703917

38713918
return file._open();
38723919
}

0 commit comments

Comments
 (0)