Skip to content

Commit c7928b4

Browse files
committed
Fix - backport files remap for root.cern website
CI fails too often with plain root.cern website
1 parent 45bcbd7 commit c7928b4

File tree

2 files changed

+62
-7
lines changed

2 files changed

+62
-7
lines changed

modules/core.mjs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,15 @@ settings = {
294294
* @desc Some http server has limitations for number of bytes ranges therefore let change maximal number via setting
295295
* @default 200 */
296296
MaxRanges: 200,
297-
/** @summary Configure xhr.withCredentials = true when submitting http requests from JSROOT */
297+
/** @summary File read timeout in ms
298+
* @desc Configures timeout for each http operation for reading ROOT files
299+
* @default 0 */
300+
FilesTimeout: 0,
301+
/** @summary Default remap object for files loading
302+
* @desc Allows to retry files reading if original URL fails
303+
* @private */
304+
FilesRemap: { 'https://root.cern/': 'https://root-eos.web.cern.ch/' },
305+
/** @summary Configure xhr.withCredentials = true when submitting http requests from JSROOT */
298306
WithCredentials: false,
299307
/** @summary Skip streamer infos from the GUI */
300308
SkipStreamerInfos: false,

modules/io.mjs

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2646,6 +2646,7 @@ class TFile {
26462646
this.fStreamers = 0;
26472647
this.fStreamerInfos = null;
26482648
this.fFileName = '';
2649+
this.fTimeout = settings.FilesTimeout ?? 0;
26492650
this.fStreamers = [];
26502651
this.fBasicTypes = {}; // custom basic types, in most case enumerations
26512652

@@ -2678,6 +2679,28 @@ class TFile {
26782679
this.fFileName = pos >= 0 ? this.fURL.slice(pos + 1) : this.fURL;
26792680
}
26802681

2682+
/** @summary Set timeout for File instance
2683+
* @desc Timeout used when submitting http requests to the server */
2684+
setTimeout(v) {
2685+
this.fTimeout = v;
2686+
}
2687+
2688+
/** @summary Assign remap for web servers
2689+
* @desc Allows to specify fallback server if main server fails
2690+
* @param {Object} remap - looks like { 'https://original.server/': 'https://fallback.server/' } */
2691+
assignRemap(remap) {
2692+
if (!remap && !isObject(remap))
2693+
return;
2694+
2695+
for (const key in remap) {
2696+
if (this.fURL.indexOf(key) === 0) {
2697+
this.fURL2 = remap[key] + this.fURL.slice(key.length);
2698+
if (!this.fTimeout)
2699+
this.fTimeout = 10000;
2700+
}
2701+
}
2702+
}
2703+
26812704
/** @summary Assign BufferArray with file contentOpen file
26822705
* @private */
26832706
assignFileContent(bufArray) {
@@ -2705,15 +2728,23 @@ class TFile {
27052728
blobs = [], // array of requested segments
27062729
promise = new Promise((resolve, reject) => { resolveFunc = resolve; rejectFunc = reject; });
27072730

2708-
let fileurl = file.fURL,
2709-
first = 0, last = 0,
2731+
let fileurl, first = 0, last = 0,
27102732
// eslint-disable-next-line prefer-const
27112733
read_callback, first_req,
27122734
first_block_retry = false;
27132735

2714-
if (isStr(filename) && filename) {
2715-
const pos = fileurl.lastIndexOf('/');
2716-
fileurl = (pos < 0) ? filename : fileurl.slice(0, pos + 1) + filename;
2736+
function setFileUrl(use_second) {
2737+
if (use_second) {
2738+
console.log('Failure - try to repait with URL2', file.fURL2);
2739+
file.fURL = file.fURL2;
2740+
delete file.fURL2;
2741+
}
2742+
2743+
fileurl = file.fURL;
2744+
if (isStr(filename) && filename) {
2745+
const pos = fileurl.lastIndexOf('/');
2746+
fileurl = (pos < 0) ? filename : fileurl.slice(0, pos + 1) + filename;
2747+
}
27172748
}
27182749

27192750
function send_new_request(increment) {
@@ -2745,6 +2776,9 @@ class TFile {
27452776
xhr.expected_size = Math.max(Math.round(1.1 * totalsz), totalsz + 200); // 200 if offset for the potential gzip
27462777
}
27472778

2779+
if (file.fTimeout)
2780+
xhr.timeout = file.fTimeout;
2781+
27482782
if (isFunc(progress_callback) && isFunc(xhr.addEventListener)) {
27492783
let sum1 = 0, sum2 = 0, sum_total = 0;
27502784
for (let n = 1; n < place.length; n += 2) {
@@ -2784,6 +2818,10 @@ class TFile {
27842818
file.fUseStampPar = false;
27852819
return send_new_request();
27862820
}
2821+
if (file.fURL2) {
2822+
setFileUrl(true);
2823+
return send_new_request();
2824+
}
27872825
if (file.fAcceptRanges) {
27882826
file.fAcceptRanges = false;
27892827
first_block_retry = true;
@@ -2836,6 +2874,11 @@ class TFile {
28362874
return send_new_request();
28372875
}
28382876

2877+
if (first_block && file.fURL2) {
2878+
setFileUrl(true);
2879+
return send_new_request();
2880+
}
2881+
28392882
return rejectFunc(Error('Fail to read with several ranges'));
28402883
}
28412884

@@ -2982,6 +3025,8 @@ class TFile {
29823025
send_new_request(true);
29833026
};
29843027

3028+
setFileUrl();
3029+
29853030
return send_new_request(true).then(() => promise);
29863031
}
29873032

@@ -3850,8 +3895,10 @@ function openFile(arg) {
38503895
if (!file && isObject(arg) && arg.size && arg.name)
38513896
file = new TLocalFile(arg);
38523897

3853-
if (!file)
3898+
if (!file) {
38543899
file = new TFile(arg);
3900+
file.assignRemap(settings.FilesRemap);
3901+
}
38553902

38563903
return file._open();
38573904
}

0 commit comments

Comments
 (0)