Changeset 270607 in webkit
- Timestamp:
- Dec 9, 2020, 3:13:28 PM (6 years ago)
- Location:
- trunk/Websites/perf.webkit.org
- Files:
-
- 1 added
- 7 edited
-
ChangeLog (modified) (1 diff)
-
public/include/manifest-generator.php (modified) (1 diff)
-
public/v3/models/build-request.js (modified) (2 diffs)
-
public/v3/models/commit-set.js (modified) (1 diff)
-
public/v3/models/manifest.js (modified) (2 diffs)
-
server-tests/api-manifest-tests.js (modified) (2 diffs)
-
unit-tests/build-request-tests.js (modified) (12 diffs)
-
unit-tests/manifest-test.js (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Websites/perf.webkit.org/ChangeLog
r270140 r270607 1 2020-12-09 Dewei Zhu <dewei_zhu@apple.com> 2 3 Add max age for a root to be reused. 4 https://bugs.webkit.org/show_bug.cgi?id=219628 5 6 Reviewed by Ryosuke Niwa. 7 8 In order to prevent reusing a stale root, we should set a limit on the age of a root to be reused. 9 * public/include/manifest-generator.php: Added 'maxRootReuseAgeInDays' to manifest. 10 * public/v3/models/build-request.js: Added root age check. 11 (BuildRequest.prototype.async findBuildRequestWithSameRoots): 12 * public/v3/models/commit-set.js: Extended 'areAllRootsAvailable' with root age check. 13 (CommitSet.prototype.areAllRootsAvailable): 14 * public/v3/models/manifest.js: 15 (Manifest.fetch): Made it async. 16 (Manifest.async fetchRawResponse): Extract fetching raw manifest out so that 'maxRootReuseAgeInDays' 17 can be read without resetting other data models. Also added code to only fetch from API if requesting 18 /data/manifest.json returns 404. 19 (Manifest._didFetchManifest): 20 * server-tests/api-manifest-tests.js: Updated unit tests. 21 * unit-tests/build-request-tests.js: Updated unit tests and add new tests. 22 * unit-tests/manifest-test.js: Added unit tests. 23 1 24 2020-11-20 Dewei Zhu <dewei_zhu@apple.com> 2 25 -
trunk/Websites/perf.webkit.org/public/include/manifest-generator.php
r269083 r270607 51 51 'fileUploadSizeLimit' => config('uploadFileLimitInMB', 0) * 1024 * 1024, 52 52 'testAgeToleranceInHours' => config('testAgeToleranceInHours'), 53 'maxRootReuseAgeInDays' => config('maxRootReuseAgeInDays'), 53 54 ); 54 55 -
trunk/Websites/perf.webkit.org/public/v3/models/build-request.js
r269871 r270607 96 96 // Set ignoreCache = true as latest status of test groups is expected. 97 97 const allTestGroupsInTask = await TestGroup.fetchForTask(this.analysisTaskId(), true); 98 const rawManifest = await Manifest.fetchRawResponse(); 99 const earliestRootCreatingTimeForReuse = rawManifest.maxRootReuseAgeInDays ? 100 Date.now() - rawManifest.maxRootReuseAgeInDays * 24 * 3600 * 1000 : 0; 101 98 102 for (const group of allTestGroupsInTask) { 99 103 if (group.id() == this.testGroupId()) … … 108 112 if (!buildRequest.commitSet().equalsIgnoringRoot(this.commitSet())) 109 113 continue; 110 if (!buildRequest.commitSet().areAllRootsAvailable( ))114 if (!buildRequest.commitSet().areAllRootsAvailable(earliestRootCreatingTimeForReuse)) 111 115 continue; 112 116 if (buildRequest.hasCompleted()) -
trunk/Websites/perf.webkit.org/public/v3/models/commit-set.js
r269871 r270607 75 75 commits() { return Array.from(this._repositoryToCommitMap.values()); } 76 76 77 areAllRootsAvailable() 78 { 79 return this.allRootFiles().every(rootFile => !rootFile.deletedAt() || this.customRoots().find(rootFile)); 77 areAllRootsAvailable(earliestCreationTime) 78 { 79 return this.allRootFiles().every(rootFile => (!rootFile.deletedAt() || this.customRoots().find(rootFile)) 80 && rootFile.createdAt() >= earliestCreationTime); 80 81 } 81 82 -
trunk/Websites/perf.webkit.org/public/v3/models/manifest.js
r269083 r270607 23 23 } 24 24 25 static fetch()25 static async fetch() 26 26 { 27 27 this.reset(); 28 return RemoteAPI.getJSON('/data/manifest.json').catch(function () { 29 return RemoteAPI.getJSON('/api/manifest/'); 30 }).then(this._didFetchManifest.bind(this)); 28 const rawManifest = await this.fetchRawResponse(); 29 return this._didFetchManifest(rawManifest); 30 } 31 32 static async fetchRawResponse() 33 { 34 try { 35 return await RemoteAPI.getJSON('/data/manifest.json'); 36 } catch(error) { 37 if (error != 404) 38 throw `Failed to fetch manifest.json with ${error}` 39 return await RemoteAPI.getJSON('/api/manifest/'); 40 } 31 41 } 32 42 … … 92 102 dashboards: rawResponse.dashboards, // FIXME: Add an abstraction around dashboards. 93 103 summaryPages: rawResponse.summaryPages, 104 testAgeToleranceInHours: rawResponse.testAgeToleranceInHours, 105 maxRootReuseAgeInDays: rawResponse.maxRootReuseAgeInDays, 94 106 } 95 107 } -
trunk/Websites/perf.webkit.org/server-tests/api-manifest-tests.js
r269083 r270607 15 15 return TestServer.remoteAPI().getJSON('/api/manifest').then((manifest) => { 16 16 assert.deepEqual(Object.keys(manifest).sort(), ['all', 'bugTrackers', 'builders', 'dashboard', 'dashboards', 17 'fileUploadSizeLimit', 'metrics', 'platformGroups', 'repositories', 'siteTitle', 'status', 'summaryPages', 'testAgeToleranceInHours', 'tests', 'triggerables']); 17 'fileUploadSizeLimit', 'maxRootReuseAgeInDays', 'metrics', 'platformGroups', 'repositories', 'siteTitle', 18 'status', 'summaryPages', 'testAgeToleranceInHours', 'tests', 'triggerables']); 18 19 19 20 assert.deepStrictEqual(manifest, { … … 25 26 dashboards: {}, 26 27 fileUploadSizeLimit: 2097152, // 2MB during testing. 28 maxRootReuseAgeInDays: null, 27 29 metrics: {}, 28 30 platformGroups: {}, -
trunk/Websites/perf.webkit.org/unit-tests/build-request-tests.js
r269871 r270607 2 2 3 3 const assert = require('assert'); 4 const crypto = require('crypto'); 4 5 5 6 require('../tools/js/v3-models.js'); … … 170 171 if (!thirdTestGroupOverrides) 171 172 thirdTestGroupOverrides = {}; 173 const yesterday = Date.now() - 24 * 3600 * 1000; 172 174 return { 173 175 "testGroups": [{ … … 370 372 "commitSets": [{ 371 373 "id": "4255", 372 "revisionItems": [{"commit": "87832" }, {"commit": "93116"}],374 "revisionItems": [{"commit": "87832", rootFile: 101}, {"commit": "93116"}], 373 375 "customRoots": [], 374 376 }, { … … 398 400 "time": 1448225325650 399 401 }], 400 "uploadedFiles": [], 402 "uploadedFiles": [{id: 101, filename: 'root-101', extension: '.tgz', size: 1, 403 createdAt: yesterday, sha256: crypto.createHash('sha256').update('root-101').digest('hex')}], 401 404 "status": "OK" 402 405 }; … … 427 430 assert.equal(requests[0].method, 'GET'); 428 431 requests[0].resolve(oneTestGroup()); 432 433 await MockRemoteAPI.waitForRequest(); 434 assert.equal(requests.length, 2); 435 assert.equal(requests[1].url, '/data/manifest.json'); 436 assert.equal(requests[1].method, 'GET'); 437 requests[1].resolve({maxRootReuseAgeInDays: 30}); 429 438 430 439 const result = await promise; … … 449 458 requests[0].resolve(threeTestGroups(overrides)); 450 459 460 await MockRemoteAPI.waitForRequest(); 461 assert.equal(requests.length, 2); 462 assert.equal(requests[1].url, '/data/manifest.json'); 463 assert.equal(requests[1].method, 'GET'); 464 requests[1].resolve({maxRootReuseAgeInDays: 30}); 465 451 466 const result = await promise; 452 467 assert.equal(result, BuildRequest.findById(16989)) 468 }); 469 470 it('should not reuse a root that is older than "maxReuseRootAge"', async () => { 471 const overrides = { 472 task: '1376', 473 platform: '32', 474 status: ['completed', 'pending', 'pending', 'pending'] 475 } 476 const data = threeTestGroups(overrides); 477 478 const platformId = data.buildRequests[0].platform; 479 Platform.ensureSingleton(platformId, {id: platformId, metrics: [], name: 'some platform'}); 480 const request = BuildRequest.constructBuildRequestsFromData(data)[0]; 481 const promise = request.findBuildRequestWithSameRoots(); 482 assert.equal(requests.length, 1); 483 484 assert.equal(requests[0].url, '/api/test-groups?task=1376'); 485 assert.equal(requests[0].method, 'GET'); 486 requests[0].resolve(threeTestGroups(overrides)); 487 488 await MockRemoteAPI.waitForRequest(); 489 assert.equal(requests.length, 2); 490 assert.equal(requests[1].url, '/data/manifest.json'); 491 assert.equal(requests[1].method, 'GET'); 492 requests[1].resolve({maxRootReuseAgeInDays: 0.5}); 493 494 const result = await promise; 495 assert.equal(result, null) 453 496 }); 454 497 … … 470 513 requests[0].resolve(threeTestGroups(overrides)); 471 514 515 await MockRemoteAPI.waitForRequest(); 516 assert.equal(requests.length, 2); 517 assert.equal(requests[1].url, '/data/manifest.json'); 518 assert.equal(requests[1].method, 'GET'); 519 requests[1].resolve({maxRootReuseAgeInDays: 30}); 520 472 521 let result = await promise; 473 522 assert.equal(result, BuildRequest.findById(16989)) … … 480 529 assert.equal(requests[0].method, 'GET'); 481 530 requests[0].resolve(threeTestGroups(overrides)); 531 532 await MockRemoteAPI.waitForRequest(); 533 assert.equal(requests.length, 2); 534 assert.equal(requests[1].url, '/data/manifest.json'); 535 assert.equal(requests[1].method, 'GET'); 536 requests[1].resolve({maxRootReuseAgeInDays: 30}); 482 537 483 538 result = await promise; … … 502 557 assert.equal(requests[0].method, 'GET'); 503 558 requests[0].resolve(threeTestGroups(overrides)); 559 560 await MockRemoteAPI.waitForRequest(); 561 assert.equal(requests.length, 2); 562 assert.equal(requests[1].url, '/data/manifest.json'); 563 assert.equal(requests[1].method, 'GET'); 564 requests[1].resolve({maxRootReuseAgeInDays: 30}); 504 565 505 566 const result = await promise; … … 525 586 assert.equal(requests[0].method, 'GET'); 526 587 requests[0].resolve(threeTestGroups(overrides)); 588 589 await MockRemoteAPI.waitForRequest(); 590 assert.equal(requests.length, 2); 591 assert.equal(requests[1].url, '/data/manifest.json'); 592 assert.equal(requests[1].method, 'GET'); 593 requests[1].resolve({maxRootReuseAgeInDays: 30}); 527 594 528 595 const result = await promise; … … 552 619 requests[0].resolve(threeTestGroups(secondOverrides, thirdOverrides)); 553 620 621 await MockRemoteAPI.waitForRequest(); 622 assert.equal(requests.length, 2); 623 assert.equal(requests[1].url, '/data/manifest.json'); 624 assert.equal(requests[1].method, 'GET'); 625 requests[1].resolve({maxRootReuseAgeInDays: 30}); 626 554 627 const result = await promise; 555 628 assert.equal(result, BuildRequest.findById(16993)) … … 578 651 requests[0].resolve(threeTestGroups(secondOverrides, thirdOverrides)); 579 652 653 await MockRemoteAPI.waitForRequest(); 654 assert.equal(requests.length, 2); 655 assert.equal(requests[1].url, '/data/manifest.json'); 656 assert.equal(requests[1].method, 'GET'); 657 requests[1].resolve({maxRootReuseAgeInDays: 30}); 658 580 659 const result = await promise; 581 660 assert.equal(result, BuildRequest.findById(16993));
Note:
See TracChangeset
for help on using the changeset viewer.