From 1e6422fd5df216b857c36c60e870ff78e852b75e Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Fri, 15 Nov 2024 14:15:51 -0500 Subject: [PATCH] Move autoremove builds logic to a scheduled job Separate the automatic removal of old builds from CDash's submission parsing logic. Instead, old builds will now be periodically cleaned up as a scheduled job. We use a new, lower priority queue to schedule these pruning jobs so they don't interfere with asychronous submission parsing. This commit moves the remove_builds function (and related helper functions) from common.php to DatabaseCleanupUtils. It also removes the "Cleanup database" from upgrade.php and moves this functionality to a new Artisan command instead: db:cleanup. We use this new db:cleanup command to remove shared records, such as testoutput. This allows us to remove a big chunk of custom logic from our removeBuilds funcion. While writing this commit, the following tables were already handled by db:cleanup: - buildfailuredetails - configure - configureerror - coveragefile - test2image The following tables represent potentially shared data that wasn't already handled by db:cleanup: - note - buildupdate - testoutput - updatefile - image - uploadfile The following tables were found to already have cascade-on-delete foreign keys, and thus their explicit DELETE logic was deemed safe to remove: - build2uploadfile - dynamicanalysisdefect - label2dynamicanalysis - label2buildfailure --- app/Console/Commands/CleanupDatabase.php | 90 +++++ app/Console/Kernel.php | 14 +- app/Http/Controllers/AdminController.php | 87 +---- app/Http/Controllers/BuildController.php | 3 +- app/Jobs/PruneBuilds.php | 30 ++ app/Jobs/PruneDatabase.php | 26 ++ app/Utils/DatabaseCleanupUtils.php | 76 ++++- app/Utils/SubmissionUtils.php | 2 +- app/cdash/app/Model/Build.php | 3 +- app/cdash/include/common.php | 307 +----------------- app/cdash/include/dailyupdates.php | 5 - app/cdash/public/upgrade.xsl | 8 - .../tests/autoremovebuilds/CMakeLists.txt | 6 +- .../tests/test_autoremovebuilds_on_submit.php | 168 ---------- app/cdash/tests/test_bazeljson.php | 23 +- app/cdash/tests/test_branchcoverage.php | 5 +- app/cdash/tests/test_buildconfigure.php | 6 +- app/cdash/tests/test_builddetails.php | 7 +- app/cdash/tests/test_buildfailuredetails.php | 5 +- app/cdash/tests/test_buildgrouprule.php | 3 +- app/cdash/tests/test_buildmodel.php | 6 +- app/cdash/tests/test_buildrelationship.php | 3 +- app/cdash/tests/test_deferredsubmissions.php | 3 +- app/cdash/tests/test_disabledtests.php | 3 +- app/cdash/tests/test_donehandler.php | 5 +- .../tests/test_dynamicanalysissummary.php | 3 +- .../tests/test_externallinksfromtests.php | 3 +- app/cdash/tests/test_filterbuilderrors.php | 3 +- app/cdash/tests/test_filtertestlabels.php | 6 +- app/cdash/tests/test_hidecolumns.php | 3 +- app/cdash/tests/test_imagecomparison.php | 3 +- app/cdash/tests/test_managemeasurements.php | 5 +- app/cdash/tests/test_multicoverage.php | 6 +- app/cdash/tests/test_multiplesubprojects.php | 5 +- app/cdash/tests/test_nobackup.php | 3 +- .../tests/test_notesparsererrormessages.php | 5 +- app/cdash/tests/test_opencovercoverage.php | 4 +- app/cdash/tests/test_parallelsubmissions.php | 4 +- app/cdash/tests/test_removebuilds.php | 5 +- app/cdash/tests/test_replacebuild.php | 5 +- .../tests/test_submission_assign_buildid.php | 3 +- .../tests/test_subprojectnextprevious.php | 5 +- app/cdash/tests/test_summaryemail.php | 5 +- app/cdash/tests/test_truncateoutput.php | 5 +- .../test_unparsedsubmissionshonorbuildid.php | 4 +- app/cdash/tests/test_updateappend.php | 6 +- app/cdash/tests/test_updateonlyuserstats.php | 3 +- app/cdash/tests/test_upgrade.php | 26 -- .../tests/test_viewdynamicanalysisfile.php | 3 +- docker/docker-entrypoint.sh | 2 +- docs/submissions.md | 2 +- phpstan-baseline.neon | 202 +++--------- 52 files changed, 388 insertions(+), 835 deletions(-) create mode 100644 app/Console/Commands/CleanupDatabase.php create mode 100644 app/Jobs/PruneBuilds.php create mode 100644 app/Jobs/PruneDatabase.php delete mode 100644 app/cdash/tests/test_autoremovebuilds_on_submit.php diff --git a/app/Console/Commands/CleanupDatabase.php b/app/Console/Commands/CleanupDatabase.php new file mode 100644 index 0000000000..fb7cc8b72f --- /dev/null +++ b/app/Console/Commands/CleanupDatabase.php @@ -0,0 +1,90 @@ +min($field); + $max = DB::table($table)->max($field); + if (!is_numeric($start) || !is_numeric($max)) { + echo "Could not determine min and max for $field on $table\n"; + return; + } + + $start = intval($start); + $max = intval($max); + + $total = $max - $start; + if ($total < 1) { + return; + } + $num_done = 0; + $next_report = 10; + $done = false; + echo "Pruning unused rows from $table\n"; + while (!$done) { + $end = $start + 49999; + DB::delete(" + DELETE FROM $table + WHERE $field BETWEEN $start AND $end + AND $field NOT IN (SELECT $selectfield FROM $targettable)"); + $num_done += 50000; + if ($end >= $max) { + $done = true; + } else { + usleep(1); + $start += 50000; + // Calculate percentage of work completed so far. + $percent = round(($num_done / $total) * 100, -1); + if ($percent > $next_report) { + echo "{$percent}%\n"; + $next_report = $next_report + 10; + } + } + } + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 20e6ebce3d..d5292969f1 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -3,6 +3,8 @@ namespace App\Console; use App\Jobs\PruneAuthTokens; +use App\Jobs\PruneBuilds; +use App\Jobs\PruneDatabase; use App\Jobs\PruneJobs; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -25,11 +27,19 @@ protected function schedule(Schedule $schedule) ->everySixHours() ->sendOutputTo($output_filename); - $schedule->job(new PruneJobs()) + $schedule->job(new PruneAuthTokens(), 'low') ->hourly() ->withoutOverlapping(); - $schedule->job(new PruneAuthTokens()) + $schedule->job(new PruneBuilds(), 'low') + ->hourly() + ->withoutOverlapping(); + + $schedule->job(new PruneDatabase(), 'low') + ->dailyAt('03:00') + ->withoutOverlapping(); + + $schedule->job(new PruneJobs(), 'low') ->hourly() ->withoutOverlapping(); diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 1eb47e8c60..4b862c7124 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; use App\Models\User; +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Project; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\DB; @@ -96,7 +97,7 @@ public function removeBuilds(): View|RedirectResponse $builds[] = (int) $build_array->id; } - remove_build_chunked($builds); + DatabaseCleanupUtils::removeBuildChunked($builds); $alert = 'Removed ' . count($builds) . ' builds.'; } @@ -325,12 +326,9 @@ public function upgrade() @$AssignBuildToDefaultGroups = $_POST['AssignBuildToDefaultGroups']; @$FixBuildBasedOnRule = $_POST['FixBuildBasedOnRule']; - @$DeleteBuildsWrongDate = $_POST['DeleteBuildsWrongDate']; - @$CheckBuildsWrongDate = $_POST['CheckBuildsWrongDate']; @$ComputeTestTiming = $_POST['ComputeTestTiming']; @$ComputeUpdateStatistics = $_POST['ComputeUpdateStatistics']; - @$Cleanup = $_POST['Cleanup']; @$Dependencies = $_POST['Dependencies']; @$Audit = $_POST['Audit']; @$ClearAudit = $_POST['Clear']; @@ -376,80 +374,6 @@ public function upgrade() unlink($configFile); } - - /* Cleanup the database */ - if ($Cleanup) { - self::delete_unused_rows('banner', 'projectid', 'project'); - self::delete_unused_rows('blockbuild', 'projectid', 'project'); - self::delete_unused_rows('build', 'projectid', 'project'); - self::delete_unused_rows('buildgroup', 'projectid', 'project'); - self::delete_unused_rows('labelemail', 'projectid', 'project'); - self::delete_unused_rows('project2repositories', 'projectid', 'project'); - self::delete_unused_rows('dailyupdate', 'projectid', 'project'); - self::delete_unused_rows('subproject', 'projectid', 'project'); - self::delete_unused_rows('coveragefilepriority', 'projectid', 'project'); - self::delete_unused_rows('user2project', 'projectid', 'project'); - self::delete_unused_rows('userstatistics', 'projectid', 'project'); - - self::delete_unused_rows('build2configure', 'buildid', 'build'); - self::delete_unused_rows('build2note', 'buildid', 'build'); - self::delete_unused_rows('build2test', 'buildid', 'build'); - self::delete_unused_rows('buildemail', 'buildid', 'build'); - self::delete_unused_rows('builderror', 'buildid', 'build'); - self::delete_unused_rows('builderrordiff', 'buildid', 'build'); - self::delete_unused_rows('buildfailure', 'buildid', 'build'); - self::delete_unused_rows('buildfailuredetails', 'id', 'buildfailure', 'detailsid'); - self::delete_unused_rows('buildtesttime', 'buildid', 'build'); - self::delete_unused_rows('configure', 'id', 'build2configure', 'configureid'); - self::delete_unused_rows('configureerror', 'configureid', 'configure'); - self::delete_unused_rows('configureerrordiff', 'buildid', 'build'); - self::delete_unused_rows('coverage', 'buildid', 'build'); - self::delete_unused_rows('coveragefilelog', 'buildid', 'build'); - self::delete_unused_rows('coveragesummary', 'buildid', 'build'); - self::delete_unused_rows('coveragesummarydiff', 'buildid', 'build'); - self::delete_unused_rows('dynamicanalysis', 'buildid', 'build'); - self::delete_unused_rows('label2build', 'buildid', 'build'); - self::delete_unused_rows('subproject2build', 'buildid', 'build'); - self::delete_unused_rows('summaryemail', 'buildid', 'build'); - self::delete_unused_rows('testdiff', 'buildid', 'build'); - - self::delete_unused_rows('dynamicanalysisdefect', 'dynamicanalysisid', 'dynamicanalysis'); - self::delete_unused_rows('subproject2subproject', 'subprojectid', 'subproject'); - - self::delete_unused_rows('dailyupdatefile', 'dailyupdateid', 'dailyupdate'); - self::delete_unused_rows('coveragefile', 'id', 'coverage', 'fileid'); - - self::delete_unused_rows('dailyupdatefile', 'dailyupdateid', 'dailyupdate'); - self::delete_unused_rows('test2image', 'outputid', 'testoutput'); - - $xml .= add_XML_value('alert', 'Database cleanup complete.'); - } - - /* Check the builds with wrong date */ - if ($CheckBuildsWrongDate) { - $currentdate = time() + 3600 * 24 * 3; // or 3 days away from now - $forwarddate = date(FMT_DATETIME, $currentdate); - - $builds = pdo_query("SELECT id,name,starttime FROM build WHERE starttime<'1975-12-31 23:59:59' OR starttime>'$forwarddate'"); - while ($builds_array = pdo_fetch_array($builds)) { - echo $builds_array['name'] . '-' . $builds_array['starttime'] . '
'; - } - } - - /* Delete the builds with wrong date */ - if ($DeleteBuildsWrongDate) { - $currentdate = time() + 3600 * 24 * 3; // or 3 days away from now - $forwarddate = date(FMT_DATETIME, $currentdate); - - $builds = pdo_query( - "SELECT id FROM build WHERE parentid IN (0, -1) AND - starttime<'1975-12-31 23:59:59' OR starttime>'$forwarddate'"); - while ($builds_array = pdo_fetch_array($builds)) { - $buildid = $builds_array['id']; - remove_build($buildid); - } - } - if ($FixBuildBasedOnRule) { // loop through the list of build2group $buildgroups = pdo_query('SELECT * from build2group'); @@ -505,11 +429,4 @@ public function userStatistics(): View { return $this->angular_view('userStatistics'); } - - /** Delete unused rows */ - private static function delete_unused_rows($table, $field, $targettable, $selectfield = 'id'): void - { - DB::delete("DELETE FROM $table WHERE $field NOT IN (SELECT $selectfield AS $field FROM $targettable)"); - echo pdo_error(); - } } diff --git a/app/Http/Controllers/BuildController.php b/app/Http/Controllers/BuildController.php index 2b64f88c10..0a6a3260eb 100644 --- a/app/Http/Controllers/BuildController.php +++ b/app/Http/Controllers/BuildController.php @@ -4,6 +4,7 @@ use App\Models\Comment; use App\Models\User; use App\Models\Build as EloquentBuild; +use App\Utils\DatabaseCleanupUtils; use App\Utils\PageTimer; use App\Utils\RepositoryUtils; use App\Utils\TestingDay; @@ -1470,7 +1471,7 @@ private function restApiPost(): JsonResponse private function restApiDelete(): JsonResponse { Log::info("Build #{$this->build->Id} removed manually."); - remove_build($this->build->Id); + DatabaseCleanupUtils::removeBuild($this->build->Id); return response()->json(); } } diff --git a/app/Jobs/PruneBuilds.php b/app/Jobs/PruneBuilds.php new file mode 100644 index 0000000000..3b9d6ba2a0 --- /dev/null +++ b/app/Jobs/PruneBuilds.php @@ -0,0 +1,30 @@ +|int $buildid + * @throws \InvalidArgumentException + */ + public static function removeBuild($buildid) : void + { + // TODO: (williamjallen) much of this work could be done on the DB side automatically by setting up + // proper foreign-key relationships between between entities, and using the DB's cascade functionality. + // For complex cascades, custom SQL functions can be written. + + if (!is_array($buildid)) { + $buildid = [$buildid]; + } + + $buildids = []; + foreach ($buildid as $b) { + if (!is_numeric($b)) { + throw new \InvalidArgumentException('Invalid Build ID'); + } + $buildids[] = intval($b); + } + + $db = Database::getInstance(); + $buildid_prepare_array = $db->createPreparedArray(count($buildids)); + + // Remove the buildfailureargument + $buildfailureids = []; + $buildfailure = DB::select("SELECT id FROM buildfailure WHERE buildid IN $buildid_prepare_array", $buildids); + foreach ($buildfailure as $buildfailure_array) { + $buildfailureids[] = intval($buildfailure_array->id); + } + if (count($buildfailureids) > 0) { + $buildfailure_prepare_array = $db->createPreparedArray(count($buildfailureids)); + DB::delete("DELETE FROM buildfailure2argument WHERE buildfailureid IN $buildfailure_prepare_array", $buildfailureids); + } + + // Remove any children of these builds. + // In order to avoid making the list of builds to delete too large + // we delete them in batches (one batch per parent). + foreach ($buildids as $parentid) { + $child_result = DB::select('SELECT id FROM build WHERE parentid=?', [intval($parentid)]); + + $childids = []; + foreach ($child_result as $child_array) { + $childids[] = intval($child_array->id); + } + if (!empty($childids)) { + self::removeBuildChunked($childids); + } + } + + // Only delete the buildid at the end so that no other build can get it in the meantime + DB::delete("DELETE FROM build WHERE id IN $buildid_prepare_array", $buildids); + } + + /** + * Call removeBuild() one at a time. + * @param array|int $buildids + */ + public static function removeBuildChunked($buildids): void + { + if (!is_array($buildids)) { + self::removeBuild($buildids); + } + foreach ($buildids as $buildid) { + self::removeBuild($buildid); + usleep(1); + } } } diff --git a/app/Utils/SubmissionUtils.php b/app/Utils/SubmissionUtils.php index d69a103e99..412f786617 100644 --- a/app/Utils/SubmissionUtils.php +++ b/app/Utils/SubmissionUtils.php @@ -91,7 +91,7 @@ public static function add_build(Build $build) if ($buildid > 0 && !$build->Append) { $build->Id = $buildid; if ($build->GetDone()) { - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); $build->Id = null; } } diff --git a/app/cdash/app/Model/Build.php b/app/cdash/app/Model/Build.php index b5ceadc92d..9060eba9dd 100644 --- a/app/cdash/app/Model/Build.php +++ b/app/cdash/app/Model/Build.php @@ -18,6 +18,7 @@ use App\Models\Test; use App\Models\Site; +use App\Utils\DatabaseCleanupUtils; use App\Utils\RepositoryUtils; use App\Utils\SubmissionUtils; use App\Utils\TestingDay; @@ -2199,7 +2200,7 @@ public function RemoveIfDone(): bool return false; } - remove_build($this->Id); + DatabaseCleanupUtils::removeBuild($this->Id); $this->Id = 0; return true; } diff --git a/app/cdash/include/common.php b/app/cdash/include/common.php index 8bda2bc22a..57ac44c0b2 100644 --- a/app/cdash/include/common.php +++ b/app/cdash/include/common.php @@ -14,6 +14,7 @@ PURPOSE. See the above copyright notices for more information. =========================================================================*/ +use App\Utils\DatabaseCleanupUtils; use App\Utils\SubmissionUtils; use Illuminate\Support\Facades\Auth; @@ -407,311 +408,7 @@ function remove_project_builds($projectid): void foreach ($build as $build_array) { $buildids[] = (int) $build_array->id; } - remove_build_chunked($buildids); -} - -/** - * Remove all related inserts for a given build or any build in an array of builds - */ -function remove_build($buildid) -{ - // TODO: (williamjallen) much of this work could be done on the DB side automatically by setting up - // proper foreign-key relationships between between entities, and using the DB's cascade functionality. - // For complex cascades, custom SQL functions can be written. - - if (!is_array($buildid)) { - $buildid = [$buildid]; - } - - $buildids = []; - foreach ($buildid as $b) { - if (!is_numeric($b)) { - throw new InvalidArgumentException('Invalid Build ID'); - } - $buildids[] = intval($b); - } - - $db = Database::getInstance(); - $buildid_prepare_array = $db->createPreparedArray(count($buildids)); - - // Remove the buildfailureargument - $buildfailureids = []; - $buildfailure = DB::select("SELECT id FROM buildfailure WHERE buildid IN $buildid_prepare_array", $buildids); - foreach ($buildfailure as $buildfailure_array) { - $buildfailureids[] = intval($buildfailure_array->id); - } - if (count($buildfailureids) > 0) { - $buildfailure_prepare_array = $db->createPreparedArray(count($buildfailureids)); - DB::delete("DELETE FROM buildfailure2argument WHERE buildfailureid IN $buildfailure_prepare_array", $buildfailureids); - DB::delete("DELETE FROM label2buildfailure WHERE buildfailureid IN $buildfailure_prepare_array", $buildfailureids); - } - - // Delete buildfailuredetails that are only used by builds that are being - // deleted. - DB::delete(" - DELETE FROM buildfailuredetails WHERE id IN ( - SELECT a.detailsid - FROM buildfailure AS a - LEFT JOIN buildfailure AS b ON ( - a.detailsid=b.detailsid - AND b.buildid NOT IN $buildid_prepare_array - ) - WHERE a.buildid IN $buildid_prepare_array - GROUP BY a.detailsid - HAVING count(b.detailsid)=0 - ) - ", array_merge($buildids, $buildids)); - - // Delete the configure if not shared. - $build2configure = DB::select(" - SELECT a.configureid - FROM build2configure AS a - LEFT JOIN build2configure AS b ON ( - a.configureid=b.configureid - AND b.buildid NOT IN $buildid_prepare_array - ) - WHERE a.buildid IN $buildid_prepare_array - GROUP BY a.configureid - HAVING count(b.configureid)=0 - ", array_merge($buildids, $buildids)); - - $configureids = []; - foreach ($build2configure as $build2configure_array) { - // It is safe to delete this configure because it is only used - // by builds that are being deleted. - $configureids[] = intval($build2configure_array->configureid); - } - if (count($configureids) > 0) { - $configureids_prepare_array = $db->createPreparedArray(count($configureids)); - DB::delete("DELETE FROM configure WHERE id IN $configureids_prepare_array", $configureids); - DB::delete("DELETE FROM configureerror WHERE configureid IN $configureids_prepare_array", $configureids); - } - - // coverage files are kept unless they are shared - DB::delete(" - DELETE FROM coveragefile - WHERE id IN ( - SELECT f1.id - FROM ( - SELECT a.fileid AS id, COUNT(DISTINCT a.buildid) AS c - FROM coverage a - WHERE a.buildid IN $buildid_prepare_array - GROUP BY a.fileid - ) AS f1 - INNER JOIN ( - SELECT b.fileid AS id, COUNT(DISTINCT b.buildid) AS c - FROM coverage b - INNER JOIN ( - SELECT fileid - FROM coverage - WHERE buildid IN $buildid_prepare_array - ) AS d ON b.fileid = d.fileid - GROUP BY b.fileid - ) AS f2 ON (f1.id = f2.id) - WHERE f1.c = f2.c - ) - ", array_merge($buildids, $buildids)); - - // dynamicanalysisdefect - $dynamicanalysis = DB::select(" - SELECT id - FROM dynamicanalysis - WHERE buildid IN $buildid_prepare_array - ", $buildids); - - $dynids = []; - foreach ($dynamicanalysis as $dynamicanalysis_array) { - $dynids[] = intval($dynamicanalysis_array->id); - } - - if (count($dynids) > 0) { - $dynids_prepare_array = $db->createPreparedArray(count($dynids)); - DB::delete("DELETE FROM dynamicanalysisdefect WHERE dynamicanalysisid IN $dynids_prepare_array", $dynids); - DB::delete("DELETE FROM label2dynamicanalysis WHERE dynamicanalysisid IN $dynids_prepare_array", $dynids); - } - - // Delete the note if not shared - DB::delete(" - DELETE FROM note WHERE id IN ( - SELECT f1.id - FROM ( - SELECT a.noteid AS id, COUNT(DISTINCT a.buildid) AS c - FROM build2note a - WHERE a.buildid IN $buildid_prepare_array - GROUP BY a.noteid - ) AS f1 - INNER JOIN ( - SELECT b.noteid AS id, COUNT(DISTINCT b.buildid) AS c - FROM build2note b - INNER JOIN ( - SELECT noteid - FROM build2note - WHERE buildid IN $buildid_prepare_array - ) AS d ON b.noteid = d.noteid - GROUP BY b.noteid - ) AS f2 ON (f1.id = f2.id) - WHERE f1.c = f2.c - ) - ", array_merge($buildids, $buildids)); - - // Delete the update if not shared - $build2update = DB::select(" - SELECT a.updateid - FROM build2update AS a - LEFT JOIN build2update AS b ON ( - a.updateid=b.updateid - AND b.buildid NOT IN $buildid_prepare_array - ) - WHERE a.buildid IN $buildid_prepare_array - GROUP BY a.updateid - HAVING count(b.updateid)=0 - ", array_merge($buildids, $buildids)); - - $updateids = []; - foreach ($build2update as $build2update_array) { - // Update is not shared we delete - $updateids[] = intval($build2update_array->updateid); - } - - if (count($updateids) > 0) { - $updateids_prepare_array = $db->createPreparedArray(count($updateids)); - DB::delete("DELETE FROM buildupdate WHERE id IN $updateids_prepare_array", $updateids); - DB::delete("DELETE FROM updatefile WHERE updateid IN $updateids_prepare_array", $updateids); - } - - // Delete tests and testoutputs that are not shared. - // First find all the tests and testoutputs from builds that are about to be deleted. - $b2t_result = DB::select(" - SELECT DISTINCT outputid - FROM build2test - WHERE buildid IN $buildid_prepare_array - ", $buildids); - - $all_outputids = []; - foreach ($b2t_result as $b2t_row) { - $all_outputids[] = intval($b2t_row->outputid); - } - - // Delete un-shared testoutput rows. - if (!empty($all_outputids)) { - // Next identify tests from this list that should be preserved - // because they are shared with builds that are not about to be deleted. - $all_outputids_prepare_array = $db->createPreparedArray(count($all_outputids)); - $save_test_result = DB::select(" - SELECT DISTINCT outputid - FROM build2test - WHERE - outputid IN $all_outputids_prepare_array - AND buildid NOT IN $buildid_prepare_array - ", array_merge($all_outputids, $buildids)); - $testoutputs_to_save = []; - foreach ($save_test_result as $save_test_row) { - $testoutputs_to_save[] = intval($save_test_row->outputid); - } - - // Use array_diff to get the list of tests that should be deleted. - $testoutputs_to_delete = array_diff($all_outputids, $testoutputs_to_save); - if (!empty($testoutputs_to_delete)) { - delete_rows_chunked('DELETE FROM testoutput WHERE id IN ', $testoutputs_to_delete); - - $testoutputs_to_delete_prepare_array = $db->createPreparedArray(count($testoutputs_to_delete)); - // Check if the images for the test are not shared - $test2image = DB::select(" - SELECT a.imgid - FROM test2image AS a - LEFT JOIN test2image AS b ON ( - a.imgid=b.imgid - AND b.outputid NOT IN $testoutputs_to_delete_prepare_array - ) - WHERE a.outputid IN $testoutputs_to_delete_prepare_array - GROUP BY a.imgid - HAVING count(b.imgid)=0 - ", array_merge($testoutputs_to_delete, $testoutputs_to_delete)); - - $imgids = []; - foreach ($test2image as $test2image_array) { - $imgids[] = intval($test2image_array->imgid); - } - - if (count($imgids) > 0) { - $imgids_prepare_array = $db->createPreparedArray(count($imgids)); - DB::delete("DELETE FROM image WHERE id IN $imgids_prepare_array", $imgids); - } - delete_rows_chunked('DELETE FROM test2image WHERE outputid IN ', $testoutputs_to_delete); - } - } - - // Delete the uploaded files if not shared - $build2uploadfiles = DB::select(" - SELECT a.fileid - FROM build2uploadfile AS a - LEFT JOIN build2uploadfile AS b ON ( - a.fileid=b.fileid - AND b.buildid NOT IN $buildid_prepare_array - ) - WHERE a.buildid IN $buildid_prepare_array - GROUP BY a.fileid - HAVING count(b.fileid)=0 - ", array_merge($buildids, $buildids)); - - $fileids = []; - foreach ($build2uploadfiles as $build2uploadfile_array) { - $fileid = intval($build2uploadfile_array->fileid); - $fileids[] = $fileid; - unlink_uploaded_file($fileid); - } - - if (count($fileids) > 0) { - $fileids_prepare_array = $db->createPreparedArray(count($fileids)); - DB::delete("DELETE FROM uploadfile WHERE id IN $fileids_prepare_array", $fileids); - DB::delete("DELETE FROM build2uploadfile WHERE fileid IN $fileids_prepare_array", $fileids); - } - - // Remove any children of these builds. - // In order to avoid making the list of builds to delete too large - // we delete them in batches (one batch per parent). - foreach ($buildids as $parentid) { - $child_result = DB::select('SELECT id FROM build WHERE parentid=?', [intval($parentid)]); - - $childids = []; - foreach ($child_result as $child_array) { - $childids[] = intval($child_array->id); - } - if (!empty($childids)) { - remove_build($childids); - } - } - - // Only delete the buildid at the end so that no other build can get it in the meantime - DB::delete("DELETE FROM build WHERE id IN $buildid_prepare_array", $buildids); - - add_last_sql_error('remove_build'); -} - -/** - * Call remove_build() in batches of 100. - */ -function remove_build_chunked($buildid): void -{ - if (!is_array($buildid)) { - remove_build($buildid); - } - foreach (array_chunk($buildid, 100) as $chunk) { - remove_build($chunk); - } -} - -/** - * Chunk up DELETE queries into batches of 100. - */ -function delete_rows_chunked(string $query, array $ids): void -{ - foreach (array_chunk($ids, 100) as $chunk) { - $chunk_prepared_array = Database::getInstance()->createPreparedArray(count($chunk)); - DB::delete("$query $chunk_prepared_array", $chunk); - // Sleep for a microsecond to give other processes a chance. - usleep(1); - } + DatabaseCleanupUtils::removeBuildChunked($buildids); } /** diff --git a/app/cdash/include/dailyupdates.php b/app/cdash/include/dailyupdates.php index 8877841521..668840aa23 100644 --- a/app/cdash/include/dailyupdates.php +++ b/app/cdash/include/dailyupdates.php @@ -22,7 +22,6 @@ require_once 'include/cdashmail.php'; -use App\Utils\DatabaseCleanupUtils; use CDash\Database; use CDash\Model\BuildGroup; use CDash\Model\BuildGroupRule; @@ -1151,9 +1150,5 @@ function addDailyChanges(int $projectid): void $buildgroup->SetId($row['id']); $buildgroup->Delete(); } - - // Remove the first builds of the project - DatabaseCleanupUtils::removeFirstBuilds($projectid, $project->AutoremoveTimeframe, $project->AutoremoveMaxBuilds); - DatabaseCleanupUtils::removeBuildsGroupwise($projectid, $project->AutoremoveMaxBuilds); } } diff --git a/app/cdash/public/upgrade.xsl b/app/cdash/public/upgrade.xsl index 6142c3acf9..82d5e22871 100644 --- a/app/cdash/public/upgrade.xsl +++ b/app/cdash/public/upgrade.xsl @@ -18,10 +18,6 @@
Fix build group based on build rules:
- -
Delete builds with wrong start date:
-
-
Compute test timing:
for the last days
@@ -30,10 +26,6 @@
Compute update statistics:
for the last days
- -
Cleanup CDash (can take a long time):
- -
Manage CDash dependencies:
diff --git a/app/cdash/tests/autoremovebuilds/CMakeLists.txt b/app/cdash/tests/autoremovebuilds/CMakeLists.txt index afdf392d3b..df55f3f9ef 100644 --- a/app/cdash/tests/autoremovebuilds/CMakeLists.txt +++ b/app/cdash/tests/autoremovebuilds/CMakeLists.txt @@ -1,10 +1,6 @@ # These tests should go last so the removal of builds doesn't clobber other tests - -add_php_test(autoremovebuilds_on_submit) -set_tests_properties(autoremovebuilds_on_submit PROPERTIES DEPENDS cypress/e2e/build-configure) - add_php_test(deletesubproject) -set_tests_properties(deletesubproject PROPERTIES DEPENDS autoremovebuilds_on_submit) +set_tests_properties(deletesubproject PROPERTIES DEPENDS cypress/e2e/build-configure) add_test( NAME removebuilds diff --git a/app/cdash/tests/test_autoremovebuilds_on_submit.php b/app/cdash/tests/test_autoremovebuilds_on_submit.php deleted file mode 100644 index 80b45be4ce..0000000000 --- a/app/cdash/tests/test_autoremovebuilds_on_submit.php +++ /dev/null @@ -1,168 +0,0 @@ -config_file = base_path('.env'); - } - - public function __destruct() - { - rename("{$this->config_file}.bak", $this->config_file); - } - - public function enableAutoRemoveConfigSetting() - { - copy($this->config_file, "{$this->config_file}.bak"); - file_put_contents($this->config_file, "AUTOREMOVE_BUILDS=true", FILE_APPEND); - } - - public function setAutoRemoveTimeFrame() - { - // set project autoremovetimeframe - $db = Database::getInstance(); - $sql = 'UPDATE project SET autoremovetimeframe=:time WHERE name=:project'; - /** @var PDOStatement $stmt */ - $stmt = $db->prepare($sql); - $stmt->bindValue(':time', 7); - $stmt->bindValue(':project', 'EmailProjectExample'); - $stmt->execute(); - } - - public function testBuildsRemovedOnSubmission() - { - $this->enableAutoRemoveConfigSetting(); - - $this->setAutoRemoveTimeFrame(); - $this->deleteLog($this->logfilename); - - /** @var \CDash\Database $db */ - $db = Database::getInstance(); - - $result = $db->query("SELECT id FROM project WHERE name = 'EmailProjectExample'"); - $projectid = $result->fetchColumn(); - - // Submit the first build - $rep = dirname(__FILE__) . '/data/EmailProjectExample'; - $testxml1 = "$rep/1_test.xml"; - - if (!$this->submission('EmailProjectExample', $testxml1)) { - $this->fail('submission 1 failed'); - return; - } - - // Check that the test is actually there - $sql = "SELECT name FROM build WHERE projectid=:id AND stamp=:stamp"; - - /** @var PDOStatement $stmt */ - $stmt = $db->prepare($sql); - $stmt->bindValue(':id', $projectid); - $stmt->bindValue(':stamp', '20090223-0100-Nightly'); - - if (!$stmt->execute()) { - $this->fail('pdo_query returned false'); - return 1; - } - $query_array = pdo_fetch_array($stmt); - - if ($query_array[0] != 'Win32-MSVC2009') { - echo $query_array[0]; - $this->fail('First build not inserted correctly'); - return 1; - } - - // Make an expired buildgroup and rule to verify that they get deleted. - $projectid = get_project_id('EmailProjectExample'); - $new_build_group = new BuildGroup(); - $new_build_group->SetProjectId($projectid); - $new_build_group->SetName('delete me'); - $new_build_group->SetEndTime(Carbon::create(2010)); - $new_build_group->Save(); - $new_group_id = $new_build_group->GetId(); - - $existing_build_group = new BuildGroup(); - $existing_build_group->SetProjectId($projectid); - $existing_build_group->SetName('Experimental'); - $existing_group_id = $existing_build_group->GetId(); - $db = Database::getInstance(); - $stmt = $db->prepare( - 'INSERT INTO build2grouprule (groupid, endtime) - VALUES (:groupid, :endtime)'); - $query_params = [ - ':groupid' => $existing_group_id, - ':endtime' => '2010-02-25 00:00:00', - ]; - $db->execute($stmt, $query_params); - - // Looks like it's a new day - DB::delete("DELETE FROM dailyupdate WHERE projectid='{$projectid}'"); - - $testxml2 = "$rep/2_test.xml"; - if (!$this->submission('EmailProjectExample', $testxml2)) { - $this->fail('submission 2 failed'); - return 1; - } - - // The removal of the builds are done asynchronously so we might need to wait a little bit - // in order for the process to be done - sleep(10); // seconds - - $sql = "SELECT id FROM build WHERE projectid=? AND stamp=?"; - - $results = DB::select($sql, [$projectid, '20090223-0100-Nightly']); - - if (count($results) > 0) { - $this->fail('Auto remove build on submit failed'); - return 1; - } - - // Check that the build group and rule were properly deleted. - $stmt = $db->prepare('SELECT id FROM buildgroup WHERE id = ?'); - $db->execute($stmt, [$new_group_id]); - if ($stmt->fetchColumn()) { - $this->fail('build group not deleted'); - } - $stmt = $db->prepare('SELECT groupid FROM build2grouprule WHERE id = ? AND endtime = ?'); - $db->execute($stmt, [$existing_group_id, '2010-01-01 00:00:00']); - if ($stmt->fetchColumn()) { - $this->fail('build group rule not deleted'); - } - - // Make sure we didn't inadvertently delete the whole upload directory. - if (!Storage::exists('upload')) { - $this->fail('upload directory does not exist'); - } - - // Make sure the dailyupdate was recorded for the correct day. - $stmt = $db->prepare('SELECT date FROM dailyupdate WHERE projectid = ?'); - $db->execute($stmt, [$projectid]); - $found = $stmt->fetchColumn(); - $project = new Project(); - $project->Id = $projectid; - $project->Fill(); - $expected = TestingDay::get($project, date(FMT_DATETIME)); - $this->assertEqual($expected, $found); - - $this->pass('Passed'); - } -} diff --git a/app/cdash/tests/test_bazeljson.php b/app/cdash/tests/test_bazeljson.php index 30b6de050c..1b3936d634 100644 --- a/app/cdash/tests/test_bazeljson.php +++ b/app/cdash/tests/test_bazeljson.php @@ -1,6 +1,7 @@ assertTrue($testdiff_stmt->fetchColumn() === false); // Cleanup. - remove_build($buildid); - remove_build($buildid2); + DatabaseCleanupUtils::removeBuild($buildid); + DatabaseCleanupUtils::removeBuild($buildid2); } public function testFilterBazelJSON() @@ -130,7 +131,7 @@ public function testFilterBazelJSON() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); $project->Delete(); } @@ -297,7 +298,7 @@ public function testBazelTestFailed() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } public function testBazelTimeout() @@ -353,7 +354,7 @@ public function testBazelTimeout() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } public function testBazelConfigure() @@ -389,7 +390,7 @@ public function testBazelConfigure() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } public function testBazelDuplicateTests() @@ -425,7 +426,7 @@ public function testBazelDuplicateTests() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } public function testMultipleLineError() @@ -470,7 +471,7 @@ public function testMultipleLineError() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } public function testShardTest() @@ -526,7 +527,7 @@ public function testShardTest() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } public function testShardTestFailures() @@ -622,7 +623,7 @@ public function testShardTestFailures() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } public function testShardTestTimeout() @@ -709,7 +710,7 @@ public function testShardTestTimeout() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } private function submit_data($project_name, $upload_type, $md5, $file_path, diff --git a/app/cdash/tests/test_branchcoverage.php b/app/cdash/tests/test_branchcoverage.php index 7e62ba47f0..7df6b563bb 100644 --- a/app/cdash/tests/test_branchcoverage.php +++ b/app/cdash/tests/test_branchcoverage.php @@ -5,8 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; - - +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Build; use CDash\Model\PendingSubmissions; use Illuminate\Support\Facades\DB; @@ -35,7 +34,7 @@ protected function clearPriorBranchCoverageResults() SELECT id FROM build WHERE name = 'branch_coverage'"); $existing_buildid = $stmt->fetchColumn(); if ($existing_buildid !== false) { - remove_build($existing_buildid); + DatabaseCleanupUtils::removeBuild((int) $existing_buildid); } $files = Storage::allFiles('inbox'); diff --git a/app/cdash/tests/test_buildconfigure.php b/app/cdash/tests/test_buildconfigure.php index 50e3842d72..f472a4d775 100644 --- a/app/cdash/tests/test_buildconfigure.php +++ b/app/cdash/tests/test_buildconfigure.php @@ -5,9 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; - - - +use App\Utils\DatabaseCleanupUtils; use CDash\Database; use CDash\Model\Build; use CDash\Model\BuildConfigure; @@ -90,7 +88,7 @@ public function testBuildConfigureDiff() "SELECT id FROM build WHERE name = 'configure_warning_diff'"); $this->PDO->execute($stmt); while ($row = $stmt->fetch()) { - remove_build($row['id']); + DatabaseCleanupUtils::removeBuild($row['id']); } // Make two consecutive builds. diff --git a/app/cdash/tests/test_builddetails.php b/app/cdash/tests/test_builddetails.php index 3fafd1cb91..d6a2a41226 100644 --- a/app/cdash/tests/test_builddetails.php +++ b/app/cdash/tests/test_builddetails.php @@ -3,6 +3,7 @@ // After including cdash_test_case.php, subsequent require_once calls are // relative to the top of the CDash source tree // +use App\Utils\DatabaseCleanupUtils; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__) . '/cdash_test_case.php'; @@ -41,7 +42,7 @@ public function __construct() public function __destruct() { foreach ($this->builds as $build) { - remove_build($build['id']); + DatabaseCleanupUtils::removeBuild($build['id']); } } @@ -125,7 +126,7 @@ public function testViewTestReturnsProperFormat() $this->assertEqual($actualResponse->numNotRun, $expectedResponse->numNotRun); $this->assertEqual($actualResponse->numTimeFailed, $expectedResponse->numTimeFailed); - remove_build($buildId->id); + DatabaseCleanupUtils::removeBuild($buildId->id); } public function testViewTestReturnsProperFormatForParentBuilds() @@ -147,6 +148,6 @@ public function testViewTestReturnsProperFormatForParentBuilds() $this->assertTrue($test->subprojectname == 'some-subproject'); } - remove_build($buildId->id); + DatabaseCleanupUtils::removeBuild($buildId->id); } } diff --git a/app/cdash/tests/test_buildfailuredetails.php b/app/cdash/tests/test_buildfailuredetails.php index 5a994fce9a..323dd42d54 100644 --- a/app/cdash/tests/test_buildfailuredetails.php +++ b/app/cdash/tests/test_buildfailuredetails.php @@ -3,6 +3,7 @@ // After including cdash_test_case.php, subsequent require_once calls are // relative to the top of the CDash source tree // +use App\Utils\DatabaseCleanupUtils; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__) . '/cdash_test_case.php'; @@ -68,7 +69,7 @@ public function testBuildFailureDetails() } // Delete one of the builds. - remove_build($buildids[0]); + DatabaseCleanupUtils::removeBuild($buildids[0]); // Verify 2 buildfailures, 1 build, and 2 details. $count_results = DB::select($count_query)[0]; @@ -89,7 +90,7 @@ public function testBuildFailureDetails() } // Delete the other build. - remove_build($buildids[1]); + DatabaseCleanupUtils::removeBuild($buildids[1]); // Verify that the rest of our data is now gone. $count_results = DB::select($count_query)[0]; diff --git a/app/cdash/tests/test_buildgrouprule.php b/app/cdash/tests/test_buildgrouprule.php index 0af2c03a21..b46a20da42 100644 --- a/app/cdash/tests/test_buildgrouprule.php +++ b/app/cdash/tests/test_buildgrouprule.php @@ -6,6 +6,7 @@ require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use App\Utils\SubmissionUtils; use CDash\Database; use CDash\Model\Build; @@ -108,7 +109,7 @@ public function testOnlyExpireRulesFromSameProject() "SELECT id FROM build WHERE name = 'no-project-leakage'"); pdo_execute($stmt); while ($row = $stmt->fetch()) { - remove_build($row['id']); + DatabaseCleanupUtils::removeBuild($row['id']); } DB::delete("DELETE FROM build2grouprule WHERE buildname = 'no-project-leakage'"); diff --git a/app/cdash/tests/test_buildmodel.php b/app/cdash/tests/test_buildmodel.php index 59143817f9..2814786212 100644 --- a/app/cdash/tests/test_buildmodel.php +++ b/app/cdash/tests/test_buildmodel.php @@ -7,7 +7,7 @@ - +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Build; use CDash\Model\BuildError; use Illuminate\Support\Facades\DB; @@ -63,7 +63,7 @@ public function __construct() public function __destruct() { foreach ($this->builds as $build) { - remove_build($build['id']); + DatabaseCleanupUtils::removeBuild($build['id']); } } @@ -322,6 +322,6 @@ public function testBuildModelAddBuild() $build2 = new Build(); $this->assertFalse($build2->AddBuild()); - remove_build($build->Id); + DatabaseCleanupUtils::removeBuild($build->Id); } } diff --git a/app/cdash/tests/test_buildrelationship.php b/app/cdash/tests/test_buildrelationship.php index 56d94ea822..aad402c142 100644 --- a/app/cdash/tests/test_buildrelationship.php +++ b/app/cdash/tests/test_buildrelationship.php @@ -6,6 +6,7 @@ require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use App\Utils\SubmissionUtils; use CDash\Database; use CDash\Model\Build; @@ -27,7 +28,7 @@ public function testBuildRelationships() "SELECT id FROM build WHERE name = 'test-build-relationships'"); pdo_execute($stmt); while ($row = $stmt->fetch()) { - remove_build($row['id']); + DatabaseCleanupUtils::removeBuild($row['id']); } // Login as admin. diff --git a/app/cdash/tests/test_deferredsubmissions.php b/app/cdash/tests/test_deferredsubmissions.php index 64c4359077..4a42b6c5ba 100644 --- a/app/cdash/tests/test_deferredsubmissions.php +++ b/app/cdash/tests/test_deferredsubmissions.php @@ -9,6 +9,7 @@ use App\Models\AuthToken; +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Project; class DeferredSubmissionsTestCase extends BranchCoverageTestCase @@ -86,7 +87,7 @@ private function prepareForNormalSubmission() ->where('name', '=', 'deferred_submission') ->first(); if ($existing_build_row) { - remove_build($existing_build_row->id); + DatabaseCleanupUtils::removeBuild($existing_build_row->id); } // Make sure inbox is empty. diff --git a/app/cdash/tests/test_disabledtests.php b/app/cdash/tests/test_disabledtests.php index 4aba1a22c1..fa1decdc01 100644 --- a/app/cdash/tests/test_disabledtests.php +++ b/app/cdash/tests/test_disabledtests.php @@ -5,6 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use CDash\Database; class DisabledTestsTestCase extends KWWebTestCase @@ -71,6 +72,6 @@ public function testDisabledTests() $this->fail("Erroneous email sent for test 'ThisTestIsDisabled'"); } - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } } diff --git a/app/cdash/tests/test_donehandler.php b/app/cdash/tests/test_donehandler.php index d1c11b1c01..ac3387b0fa 100644 --- a/app/cdash/tests/test_donehandler.php +++ b/app/cdash/tests/test_donehandler.php @@ -4,9 +4,10 @@ require_once 'include/ctestparser.php'; +use App\Models\Site; +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Build; use CDash\Model\PendingSubmissions; -use App\Models\Site; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Storage; @@ -106,6 +107,6 @@ private function performTest($remote = false) $this->assertTrue(strpos($contents, "Done retries=\"5\"") !== false); unlink($tmpfname); - remove_build($build->Id); + DatabaseCleanupUtils::removeBuild($build->Id); } } diff --git a/app/cdash/tests/test_dynamicanalysissummary.php b/app/cdash/tests/test_dynamicanalysissummary.php index 020bec6c14..b71c9ed7b7 100644 --- a/app/cdash/tests/test_dynamicanalysissummary.php +++ b/app/cdash/tests/test_dynamicanalysissummary.php @@ -15,6 +15,7 @@ =========================================================================*/ +use App\Utils\DatabaseCleanupUtils; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__) . '/cdash_test_case.php'; @@ -68,7 +69,7 @@ public function testSubProjectDynamicAnalysisSummary() public function testDynamicAnalysisSummaryGetsDeleted() { // Remove the builds we just created. - remove_build($this->ParentId); + DatabaseCleanupUtils::removeBuild($this->ParentId); // Verify that the dynamicanalysisssummary rows got deleted. $result = DB::select(" diff --git a/app/cdash/tests/test_externallinksfromtests.php b/app/cdash/tests/test_externallinksfromtests.php index 300dccff62..03197ec0aa 100644 --- a/app/cdash/tests/test_externallinksfromtests.php +++ b/app/cdash/tests/test_externallinksfromtests.php @@ -3,6 +3,7 @@ // After including cdash_test_case.php, subsequent require_once calls are // relative to the top of the CDash source tree // +use App\Utils\DatabaseCleanupUtils; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__) . '/cdash_test_case.php'; @@ -60,7 +61,7 @@ public function testExternalLinksFromTests() } // Delete the build that we created during this test. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); if (!$success) { $this->fail($error_msg); diff --git a/app/cdash/tests/test_filterbuilderrors.php b/app/cdash/tests/test_filterbuilderrors.php index 1f8e9164d8..721790649b 100644 --- a/app/cdash/tests/test_filterbuilderrors.php +++ b/app/cdash/tests/test_filterbuilderrors.php @@ -5,6 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use CDash\Database; use CDash\Model\Project; @@ -71,7 +72,7 @@ public function testFilterBuildErrors() } // Cleanup. - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); $project->Delete(); } } diff --git a/app/cdash/tests/test_filtertestlabels.php b/app/cdash/tests/test_filtertestlabels.php index cc3aedd67d..9e4570905a 100644 --- a/app/cdash/tests/test_filtertestlabels.php +++ b/app/cdash/tests/test_filtertestlabels.php @@ -5,7 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; - +use App\Utils\DatabaseCleanupUtils; class FilterTestLabelsTestCase extends KWWebTestCase { @@ -41,7 +41,7 @@ public function testFilterLabels() if (count($buildids) != 1) { foreach ($buildids as $id) { - remove_build($id); + DatabaseCleanupUtils::removeBuild($id); } $this->fail('Expected 1 build, found ' . count($buildids)); return 1; @@ -88,7 +88,7 @@ public function testFilterLabels() } // Delete the build - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); // Turn the option back off. pdo_query("UPDATE project SET sharelabelfilters=0 diff --git a/app/cdash/tests/test_hidecolumns.php b/app/cdash/tests/test_hidecolumns.php index abf594db52..3b5a64a5db 100644 --- a/app/cdash/tests/test_hidecolumns.php +++ b/app/cdash/tests/test_hidecolumns.php @@ -3,6 +3,7 @@ // After including cdash_test_case.php, subsequent require_once calls are // relative to the top of the CDash source tree // +use App\Utils\DatabaseCleanupUtils; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__) . '/cdash_test_case.php'; @@ -95,7 +96,7 @@ public function onlyColumn($method) $buildid_results = DB::select( "SELECT id FROM build WHERE name='HideColumns'")[0]; $buildid = $buildid_results->id; - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); return $retval; } } diff --git a/app/cdash/tests/test_imagecomparison.php b/app/cdash/tests/test_imagecomparison.php index 71602c3aed..3a81d1e325 100644 --- a/app/cdash/tests/test_imagecomparison.php +++ b/app/cdash/tests/test_imagecomparison.php @@ -5,6 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use CDash\Database; use CDash\Model\Image; @@ -54,6 +55,6 @@ public function testImageComparison() } } - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } } diff --git a/app/cdash/tests/test_managemeasurements.php b/app/cdash/tests/test_managemeasurements.php index 247c57bebc..95b256ebcb 100644 --- a/app/cdash/tests/test_managemeasurements.php +++ b/app/cdash/tests/test_managemeasurements.php @@ -7,6 +7,7 @@ require_once dirname(__FILE__) . '/cdash_test_case.php'; use App\Models\Measurement; +use App\Utils\DatabaseCleanupUtils; class ManageMeasurementsTestCase extends KWWebTestCase { @@ -31,10 +32,10 @@ public function __construct() public function __destruct() { if (!is_null($this->BuildId)) { - remove_build($this->BuildId); + DatabaseCleanupUtils::removeBuild($this->BuildId); } if (!is_null($this->SubProjectBuildId)) { - remove_build($this->SubProjectBuildId); + DatabaseCleanupUtils::removeBuild($this->SubProjectBuildId); } Measurement::destroy($this->MeasurementIds); diff --git a/app/cdash/tests/test_multicoverage.php b/app/cdash/tests/test_multicoverage.php index ecc3266145..a9296dc0f3 100644 --- a/app/cdash/tests/test_multicoverage.php +++ b/app/cdash/tests/test_multicoverage.php @@ -5,7 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; - +use App\Utils\DatabaseCleanupUtils; class MultiCoverageTestCase extends KWWebTestCase { @@ -30,7 +30,7 @@ public function testXMLFirst() $this->pass("Passed"); } - remove_build($this->BuildId); + DatabaseCleanupUtils::removeBuild($this->BuildId); return $success; } @@ -47,7 +47,7 @@ public function testTarFirst() $this->pass("Passed"); } - remove_build($this->BuildId); + DatabaseCleanupUtils::removeBuild($this->BuildId); return $success; } diff --git a/app/cdash/tests/test_multiplesubprojects.php b/app/cdash/tests/test_multiplesubprojects.php index f229eeb7df..9cb752f2eb 100644 --- a/app/cdash/tests/test_multiplesubprojects.php +++ b/app/cdash/tests/test_multiplesubprojects.php @@ -5,6 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use CDash\Database; class MultipleSubprojectsTestCase extends KWWebTestCase @@ -122,7 +123,7 @@ private function submitBuild() if ($total_builds != 5) { // parent + 4 subprojects foreach ($this->buildIds as $id) { - remove_build($id); + DatabaseCleanupUtils::removeBuild($id); } $this->fail("Expected 5 Builds found {$total_builds}"); return 1; @@ -131,7 +132,7 @@ private function submitBuild() private function restoreState() { - remove_build($this->buildIds); + DatabaseCleanupUtils::removeBuild($this->buildIds); $this->restoreEmailPreference(); diff --git a/app/cdash/tests/test_nobackup.php b/app/cdash/tests/test_nobackup.php index 9c73419dd2..b288ea4da0 100644 --- a/app/cdash/tests/test_nobackup.php +++ b/app/cdash/tests/test_nobackup.php @@ -5,6 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use CDash\Database; class NoBackupTestCase extends KWWebTestCase @@ -86,6 +87,6 @@ public function testNoBackup() $this->checkLog($this->logfilename); - remove_build($buildid); + DatabaseCleanupUtils::removeBuild((int) $buildid); } } diff --git a/app/cdash/tests/test_notesparsererrormessages.php b/app/cdash/tests/test_notesparsererrormessages.php index 8a592b5ca3..6389b9c339 100644 --- a/app/cdash/tests/test_notesparsererrormessages.php +++ b/app/cdash/tests/test_notesparsererrormessages.php @@ -38,12 +38,9 @@ public function testNotesParserErrorMessages() $this->submission('NotesParserErrorMessages', "{$test_dir}/NoName.xml"); $expected = [ - 'about to query for builds to remove', - 'removing old buildids for projectid:', - 'removing old buildids for projectid:', 'Note missing name for build', ]; - $this->assertLogContains($expected, 5); + $this->assertLogContains($expected, 2); $this->deleteLog($this->logfilename); $this->submission('NotesParserErrorMessages', "{$test_dir}/NoText.xml"); diff --git a/app/cdash/tests/test_opencovercoverage.php b/app/cdash/tests/test_opencovercoverage.php index 123c25e06a..d14d1a5e26 100644 --- a/app/cdash/tests/test_opencovercoverage.php +++ b/app/cdash/tests/test_opencovercoverage.php @@ -5,7 +5,7 @@ // require_once(dirname(__FILE__).'/cdash_test_case.php'); - +use App\Utils\DatabaseCleanupUtils; class OpenCoverCoverageTestCase extends KWWebTestCase { @@ -17,7 +17,7 @@ public function __construct() } public function tearDown() { - remove_build($this->buildId); + DatabaseCleanupUtils::removeBuild($this->buildId); } public function testOpenCoverCoverage() { diff --git a/app/cdash/tests/test_parallelsubmissions.php b/app/cdash/tests/test_parallelsubmissions.php index f273bfebf0..e87639ebdb 100644 --- a/app/cdash/tests/test_parallelsubmissions.php +++ b/app/cdash/tests/test_parallelsubmissions.php @@ -8,7 +8,7 @@ require_once 'tests/trilinos_submission_test.php'; - +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Project; class ParallelSubmissionsTestCase extends TrilinosSubmissionTestCase @@ -47,7 +47,7 @@ public function testParallelSubmissions() ->whereBetween('starttime', ['2011-07-22 00:00:00', '2011-07-22 23:59:59']) ->first(); if ($trilinos_build_row) { - remove_build($trilinos_build_row->id); + DatabaseCleanupUtils::removeBuild($trilinos_build_row->id); } // Change CDash config to queue submissions in the database. diff --git a/app/cdash/tests/test_removebuilds.php b/app/cdash/tests/test_removebuilds.php index 83a5f74d59..33b4138f20 100644 --- a/app/cdash/tests/test_removebuilds.php +++ b/app/cdash/tests/test_removebuilds.php @@ -6,6 +6,7 @@ require_once dirname(__FILE__) . '/cdash_test_case.php'; use App\Models\TestMeasurement; +use App\Utils\DatabaseCleanupUtils; use App\Utils\TestCreator; use App\Utils\NoteCreator; @@ -26,6 +27,7 @@ use CDash\Model\Image; use CDash\Model\Label; use CDash\Model\UploadFile; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; class RemoveBuildsTestCase extends KWWebTestCase @@ -429,7 +431,8 @@ public function testBuildRemovalWorksAsExpected() return; // Remove the build. - remove_build($build->Id); + DatabaseCleanupUtils::removeBuild($build->Id); + Artisan::call('db:cleanup'); // Check that everything was deleted properly. $this->verify('build', 'id', '=', $build->Id, 0, true); diff --git a/app/cdash/tests/test_replacebuild.php b/app/cdash/tests/test_replacebuild.php index b79810916e..798e0afabd 100644 --- a/app/cdash/tests/test_replacebuild.php +++ b/app/cdash/tests/test_replacebuild.php @@ -3,6 +3,7 @@ // After including cdash_test_case.php, subsequent require_once calls are // relative to the top of the CDash source tree // +use App\Utils\DatabaseCleanupUtils; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__) . '/cdash_test_case.php'; @@ -62,7 +63,7 @@ public function testReplaceBuild() $error_msg = "Expected 0 rows, found $num_rows"; echo "$error_msg\n"; $success = false; - remove_build($first_buildid); + DatabaseCleanupUtils::removeBuild($first_buildid); } // Verify the replacement build. @@ -76,7 +77,7 @@ public function testReplaceBuild() } // Delete the build that we created during this test. - remove_build($second_buildid); + DatabaseCleanupUtils::removeBuild($second_buildid); if ($success) { $this->pass('Test passed'); diff --git a/app/cdash/tests/test_submission_assign_buildid.php b/app/cdash/tests/test_submission_assign_buildid.php index d92e9e000a..32de80684c 100644 --- a/app/cdash/tests/test_submission_assign_buildid.php +++ b/app/cdash/tests/test_submission_assign_buildid.php @@ -2,6 +2,7 @@ require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Build; class SubmissionAssignBuildIdTestCase extends KWWebTestCase @@ -37,6 +38,6 @@ public function testSubmissionAssignBuildId() $this->assertEqual('gcc', $build->CompilerName); $this->assertEqual('5.5.0', $build->CompilerVersion); - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } } diff --git a/app/cdash/tests/test_subprojectnextprevious.php b/app/cdash/tests/test_subprojectnextprevious.php index 528cb29066..b1ba02b68a 100644 --- a/app/cdash/tests/test_subprojectnextprevious.php +++ b/app/cdash/tests/test_subprojectnextprevious.php @@ -3,6 +3,7 @@ // After including cdash_test_case.php, subsequent require_once calls are // relative to the top of the CDash source tree // +use App\Utils\DatabaseCleanupUtils; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__) . '/cdash_test_case.php'; @@ -323,8 +324,8 @@ public function testSubProjectNextPrevious() } // Delete the builds that we created during this test. - remove_build($second_parentid); - remove_build($third_parentid); + DatabaseCleanupUtils::removeBuild($second_parentid); + DatabaseCleanupUtils::removeBuild($third_parentid); if (!$success) { $this->fail($error_msg); diff --git a/app/cdash/tests/test_summaryemail.php b/app/cdash/tests/test_summaryemail.php index 746056f48c..6dfb9df67c 100644 --- a/app/cdash/tests/test_summaryemail.php +++ b/app/cdash/tests/test_summaryemail.php @@ -43,9 +43,6 @@ public function testSummaryEmail() } $expected = [ - 'about to query for builds to remove', - 'removing old buildids for projectid:', - 'removing old buildids for projectid:', 'simpletest@localhost', 'FAILED (w=3): SummaryEmailProject - Win32-MSVC2009 - Nightly', 'The "Nightly" group has errors, warnings, or test failures.', @@ -65,7 +62,7 @@ public function testSummaryEmail() '3>f:\program files\microsoft sdks\windows\v6.0a\include\servprov.h(79) : warning C4068: unknown pragma', '-CDash on', ]; - if (!$this->assertLogContains($expected, 28)) { + if (!$this->assertLogContains($expected, 25)) { $this->fail('Log did not contain expected contents'); } } diff --git a/app/cdash/tests/test_truncateoutput.php b/app/cdash/tests/test_truncateoutput.php index a1306f6ec8..d0f329f9cf 100644 --- a/app/cdash/tests/test_truncateoutput.php +++ b/app/cdash/tests/test_truncateoutput.php @@ -3,6 +3,8 @@ // After including cdash_test_case.php, subsequent require_once calls are // relative to the top of the CDash source tree // +use App\Utils\DatabaseCleanupUtils; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; require_once dirname(__FILE__).'/cdash_test_case.php'; @@ -102,7 +104,8 @@ public function testTruncateOutput() private function removeBuild() { if ($this->BuildId > 0) { - remove_build($this->BuildId); + DatabaseCleanupUtils::removeBuild($this->BuildId); + Artisan::call('db:cleanup'); $this->BuildId = 0; } } diff --git a/app/cdash/tests/test_unparsedsubmissionshonorbuildid.php b/app/cdash/tests/test_unparsedsubmissionshonorbuildid.php index b0b2f412d7..bfaa848b35 100644 --- a/app/cdash/tests/test_unparsedsubmissionshonorbuildid.php +++ b/app/cdash/tests/test_unparsedsubmissionshonorbuildid.php @@ -6,6 +6,8 @@ require_once dirname(__FILE__) . '/cdash_test_case.php'; require_once 'tests/test_branchcoverage.php'; +use App\Utils\DatabaseCleanupUtils; + class UnparsedSubmissionsHonorBuildIdTestCase extends BranchCoverageTestCase { protected $projectname; @@ -38,6 +40,6 @@ public function testBranchCoverage(): void $this->verifyResults(); DB::delete("DELETE FROM buildfile WHERE buildid='{$old_buildid}'"); - remove_build($old_buildid); + DatabaseCleanupUtils::removeBuild($old_buildid); } } diff --git a/app/cdash/tests/test_updateappend.php b/app/cdash/tests/test_updateappend.php index 0942d503d3..f4cf07a97e 100644 --- a/app/cdash/tests/test_updateappend.php +++ b/app/cdash/tests/test_updateappend.php @@ -5,7 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; - +use App\Utils\DatabaseCleanupUtils; class UppdateAppendTestCase extends KWWebTestCase { @@ -46,7 +46,7 @@ public function testUpdateAppend() if (count($buildids) != 1) { foreach ($buildids as $id) { - remove_build($id); + DatabaseCleanupUtils::removeBuild($id); } $this->fail('Expected 1 build, found ' . count($buildids)); return 1; @@ -114,7 +114,7 @@ public function testUpdateAppend() } // Delete the build - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); if ($success) { $this->pass('Test passed'); diff --git a/app/cdash/tests/test_updateonlyuserstats.php b/app/cdash/tests/test_updateonlyuserstats.php index ef6b6f21c8..6c53b9b535 100644 --- a/app/cdash/tests/test_updateonlyuserstats.php +++ b/app/cdash/tests/test_updateonlyuserstats.php @@ -17,6 +17,7 @@ use CDash\Database; use App\Models\User; +use App\Utils\DatabaseCleanupUtils; use CDash\Model\UserProject; class UpdateOnlyUserStatsTestCase extends KWWebTestCase @@ -162,7 +163,7 @@ public function testCleanup() "SELECT id FROM build WHERE name='GithubUserStats'"); $stmt->execute(); while ($row = $stmt->fetch()) { - remove_build($row['id']); + DatabaseCleanupUtils::removeBuild($row['id']); } // Delete project. diff --git a/app/cdash/tests/test_upgrade.php b/app/cdash/tests/test_upgrade.php index a697b37266..eb65ebb246 100644 --- a/app/cdash/tests/test_upgrade.php +++ b/app/cdash/tests/test_upgrade.php @@ -36,20 +36,6 @@ public function testFixBuildGroups() } } - public function testCheckAndDeleteBuildsWrongDate() - { - if (!$this->getMaintenancePage()) { - return 1; - } - if (!$this->clickSubmitByName('CheckBuildsWrongDate')) { - $this->fail('clicking CheckBuildsWrongDate returned false'); - } - if (!$this->clickSubmitByName('DeleteBuildsWrongDate')) { - $this->fail('clicking DeleteBuildsWrongDate returned false'); - } - $this->pass('Passed'); - } - public function testComputeTestTiming() { if (!$this->getMaintenancePage()) { @@ -76,18 +62,6 @@ function testComputeUpdateStatistics() } */ - public function testCleanup() - { - if (!$this->getMaintenancePage()) { - return 1; - } - set_time_limit(0); - if (!$this->clickSubmitByName('Cleanup')) { - $this->fail('clicking Cleanup returned false'); - } - $this->assertText('Database cleanup complete.'); - } - public function getMaintenancePage() { $this->login(); diff --git a/app/cdash/tests/test_viewdynamicanalysisfile.php b/app/cdash/tests/test_viewdynamicanalysisfile.php index 1834a7f525..3a84e90157 100644 --- a/app/cdash/tests/test_viewdynamicanalysisfile.php +++ b/app/cdash/tests/test_viewdynamicanalysisfile.php @@ -5,6 +5,7 @@ // require_once dirname(__FILE__) . '/cdash_test_case.php'; +use App\Utils\DatabaseCleanupUtils; use CDash\Model\Build; use CDash\Model\DynamicAnalysis; use CDash\Database; @@ -86,7 +87,7 @@ public function testNextPrevious() pdo_execute($stmt, [$id_to_delete]); $row = $stmt->fetch(); $buildid = $row['buildid']; - remove_build($buildid); + DatabaseCleanupUtils::removeBuild($buildid); } } } diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh index 04e357394d..66d69fd446 100755 --- a/docker/docker-entrypoint.sh +++ b/docker/docker-entrypoint.sh @@ -38,7 +38,7 @@ if [ "$1" = "start-website" ] ; then # If the start-worker argument was provided, start a worker process instead elif [ "$1" = "start-worker" ] ; then - php -d memory_limit=-1 artisan queue:work + php -d memory_limit=-1 artisan queue:work --queue=default,low # Otherwise, throw an error... else diff --git a/docs/submissions.md b/docs/submissions.md index 5e13c753a7..20794498a8 100644 --- a/docs/submissions.md +++ b/docs/submissions.md @@ -40,7 +40,7 @@ User=www-data WorkingDirectory=/var/www/CDash Restart=always RestartSec=5s -ExecStart=/usr/bin/php artisan queue:work --max-time=3600 +ExecStart=/usr/bin/php artisan queue:work --max-time=3600 --queue=default,low [Install] WantedBy=multi-user.target diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 1f9b2963bf..cd71efe0dd 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -301,7 +301,7 @@ parameters: #^Call to deprecated function pdo_error\\(\\)\\: 04/01/2023$# """ - count: 7 + count: 6 path: app/Http/Controllers/AdminController.php - @@ -309,7 +309,7 @@ parameters: #^Call to deprecated function pdo_fetch_array\\(\\)\\: 04/01/2023$# """ - count: 12 + count: 10 path: app/Http/Controllers/AdminController.php - @@ -317,7 +317,7 @@ parameters: #^Call to deprecated function pdo_query\\(\\)\\: 04/01/2023$# """ - count: 14 + count: 12 path: app/Http/Controllers/AdminController.php - @@ -410,26 +410,6 @@ parameters: count: 1 path: app/Http/Controllers/AdminController.php - - - message: "#^Method App\\\\Http\\\\Controllers\\\\AdminController\\:\\:delete_unused_rows\\(\\) has parameter \\$field with no type specified\\.$#" - count: 1 - path: app/Http/Controllers/AdminController.php - - - - message: "#^Method App\\\\Http\\\\Controllers\\\\AdminController\\:\\:delete_unused_rows\\(\\) has parameter \\$selectfield with no type specified\\.$#" - count: 1 - path: app/Http/Controllers/AdminController.php - - - - message: "#^Method App\\\\Http\\\\Controllers\\\\AdminController\\:\\:delete_unused_rows\\(\\) has parameter \\$table with no type specified\\.$#" - count: 1 - path: app/Http/Controllers/AdminController.php - - - - message: "#^Method App\\\\Http\\\\Controllers\\\\AdminController\\:\\:delete_unused_rows\\(\\) has parameter \\$targettable with no type specified\\.$#" - count: 1 - path: app/Http/Controllers/AdminController.php - - message: "#^Method App\\\\Http\\\\Controllers\\\\AdminController\\:\\:removeBuilds\\(\\) never returns Illuminate\\\\Http\\\\RedirectResponse so it can be removed from the return type\\.$#" count: 1 @@ -447,7 +427,7 @@ parameters: - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" - count: 9 + count: 6 path: app/Http/Controllers/AdminController.php - @@ -3943,6 +3923,16 @@ parameters: count: 1 path: app/Utils/AuthTokenUtil.php + - + message: "#^Argument of an invalid type array\\\\|int supplied for foreach, only iterables are supported\\.$#" + count: 1 + path: app/Utils/DatabaseCleanupUtils.php + + - + message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" + count: 1 + path: app/Utils/DatabaseCleanupUtils.php + - message: "#^Dynamic call to static method Illuminate\\\\Database\\\\Eloquent\\\\Builder\\\\:\\:limit\\(\\)\\.$#" count: 1 @@ -3953,6 +3943,11 @@ parameters: count: 1 path: app/Utils/DatabaseCleanupUtils.php + - + message: "#^Parameter \\#1 \\$buildids of static method App\\\\Utils\\\\DatabaseCleanupUtils\\:\\:removeBuildChunked\\(\\) expects array\\\\|int, array given\\.$#" + count: 1 + path: app/Utils/DatabaseCleanupUtils.php + - message: """ #^Call to deprecated function pdo_real_escape_string\\(\\)\\: @@ -13885,14 +13880,6 @@ parameters: count: 1 path: app/cdash/include/common.php - - - message: """ - #^Call to deprecated function add_last_sql_error\\(\\)\\: - 04/22/2023$# - """ - count: 1 - path: app/cdash/include/common.php - - message: """ #^Call to deprecated function add_log\\(\\)\\: @@ -14030,7 +14017,7 @@ parameters: - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 5 + count: 2 path: app/cdash/include/common.php - @@ -14118,11 +14105,6 @@ parameters: count: 1 path: app/cdash/include/common.php - - - message: "#^Function delete_rows_chunked\\(\\) has parameter \\$ids with no value type specified in iterable type array\\.$#" - count: 1 - path: app/cdash/include/common.php - - message: "#^Function generate_XSLT\\(\\) has parameter \\$xml with no type specified\\.$#" count: 1 @@ -14263,21 +14245,6 @@ parameters: count: 1 path: app/cdash/include/common.php - - - message: "#^Function remove_build\\(\\) has no return type specified\\.$#" - count: 1 - path: app/cdash/include/common.php - - - - message: "#^Function remove_build\\(\\) has parameter \\$buildid with no type specified\\.$#" - count: 1 - path: app/cdash/include/common.php - - - - message: "#^Function remove_build_chunked\\(\\) has parameter \\$buildid with no type specified\\.$#" - count: 1 - path: app/cdash/include/common.php - - message: "#^Function remove_project_builds\\(\\) has parameter \\$projectid with no type specified\\.$#" count: 1 @@ -21384,93 +21351,6 @@ parameters: count: 3 path: app/cdash/tests/test_autoremovebuilds.php - - - message: """ - #^Call to deprecated function pdo_fetch_array\\(\\)\\: - 04/01/2023$# - """ - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: """ - #^Call to deprecated method execute\\(\\) of class CDash\\\\Database\\: - 04/22/2023 Use Laravel query builder or Eloquent instead$# - """ - count: 4 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Call to deprecated method pass\\(\\) of class SimpleTestCase\\.$#" - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: """ - #^Call to deprecated method prepare\\(\\) of class CDash\\\\Database\\: - 04/22/2023 Use Laravel query builder or Eloquent instead$# - """ - count: 6 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: """ - #^Call to deprecated method query\\(\\) of class CDash\\\\Database\\: - 04/22/2023 Use Laravel query builder or Eloquent instead$# - """ - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Cannot access offset 0 on array\\|false\\|null\\.$#" - count: 2 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Cannot call method fetchColumn\\(\\) on PDOStatement\\|false\\.$#" - count: 4 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Loose comparison via \"\\!\\=\" is not allowed\\.$#" - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Method AutoRemoveBuildsOnSubmitTestCase\\:\\:enableAutoRemoveConfigSetting\\(\\) has no return type specified\\.$#" - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Method AutoRemoveBuildsOnSubmitTestCase\\:\\:setAutoRemoveTimeFrame\\(\\) has no return type specified\\.$#" - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Method AutoRemoveBuildsOnSubmitTestCase\\:\\:testBuildsRemovedOnSubmission\\(\\) has no return type specified\\.$#" - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Only booleans are allowed in an if condition, int\\|string\\|false\\|null given\\.$#" - count: 2 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Parameter \\#1 \\$stmt of method CDash\\\\Database\\:\\:execute\\(\\) expects PDOStatement, PDOStatement\\|false given\\.$#" - count: 4 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Parameter \\#1 \\$time of method CDash\\\\Model\\\\BuildGroup\\:\\:SetEndTime\\(\\) expects Illuminate\\\\Support\\\\Carbon, Illuminate\\\\Support\\\\Carbon\\|false given\\.$#" - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - - - message: "#^Property AutoRemoveBuildsOnSubmitTestCase\\:\\:\\$config_file has no type specified\\.$#" - count: 1 - path: app/cdash/tests/test_autoremovebuilds_on_submit.php - - message: "#^Binary operation \"\\.\" between 'Expected error at…' and mixed results in an error\\.$#" count: 1 @@ -21816,6 +21696,11 @@ parameters: count: 1 path: app/cdash/tests/test_buildconfigure.php + - + message: "#^Parameter \\#1 \\$buildid of static method App\\\\Utils\\\\DatabaseCleanupUtils\\:\\:removeBuild\\(\\) expects array\\\\|int, mixed given\\.$#" + count: 1 + path: app/cdash/tests/test_buildconfigure.php + - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, string\\|false given\\.$#" count: 2 @@ -23326,6 +23211,11 @@ parameters: count: 1 path: app/cdash/tests/test_disabledtests.php + - + message: "#^Parameter \\#1 \\$buildid of static method App\\\\Utils\\\\DatabaseCleanupUtils\\:\\:removeBuild\\(\\) expects array\\\\|int, mixed given\\.$#" + count: 1 + path: app/cdash/tests/test_disabledtests.php + - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, string\\|false given\\.$#" count: 2 @@ -24402,6 +24292,11 @@ parameters: count: 1 path: app/cdash/tests/test_imagecomparison.php + - + message: "#^Parameter \\#1 \\$buildid of static method App\\\\Utils\\\\DatabaseCleanupUtils\\:\\:removeBuild\\(\\) expects array\\\\|int, mixed given\\.$#" + count: 1 + path: app/cdash/tests/test_imagecomparison.php + - message: "#^Part \\$imgid \\(mixed\\) of encapsed string cannot be cast to string\\.$#" count: 1 @@ -25661,6 +25556,11 @@ parameters: count: 7 path: app/cdash/tests/test_multiplesubprojects.php + - + message: "#^Parameter \\#1 \\$buildid of static method App\\\\Utils\\\\DatabaseCleanupUtils\\:\\:removeBuild\\(\\) expects array\\\\|int, mixed given\\.$#" + count: 1 + path: app/cdash/tests/test_multiplesubprojects.php + - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, int\\|string\\|false\\|null given\\.$#" count: 1 @@ -28562,6 +28462,11 @@ parameters: count: 1 path: app/cdash/tests/test_updateonlyuserstats.php + - + message: "#^Parameter \\#1 \\$buildid of static method App\\\\Utils\\\\DatabaseCleanupUtils\\:\\:removeBuild\\(\\) expects array\\\\|int, mixed given\\.$#" + count: 1 + path: app/cdash/tests/test_updateonlyuserstats.php + - message: "#^Parameter \\#1 \\$key of function array_key_exists expects int\\|string, mixed given\\.$#" count: 1 @@ -28599,7 +28504,7 @@ parameters: - message: "#^Call to deprecated method pass\\(\\) of class SimpleTestCase\\.$#" - count: 2 + count: 1 path: app/cdash/tests/test_upgrade.php - @@ -28617,16 +28522,6 @@ parameters: count: 1 path: app/cdash/tests/test_upgrade.php - - - message: "#^Method UpgradeTestCase\\:\\:testCheckAndDeleteBuildsWrongDate\\(\\) has no return type specified\\.$#" - count: 1 - path: app/cdash/tests/test_upgrade.php - - - - message: "#^Method UpgradeTestCase\\:\\:testCleanup\\(\\) has no return type specified\\.$#" - count: 1 - path: app/cdash/tests/test_upgrade.php - - message: "#^Method UpgradeTestCase\\:\\:testComputeTestTiming\\(\\) has no return type specified\\.$#" count: 1 @@ -28783,6 +28678,11 @@ parameters: count: 1 path: app/cdash/tests/test_viewdynamicanalysisfile.php + - + message: "#^Parameter \\#1 \\$buildid of static method App\\\\Utils\\\\DatabaseCleanupUtils\\:\\:removeBuild\\(\\) expects array\\\\|int, mixed given\\.$#" + count: 1 + path: app/cdash/tests/test_viewdynamicanalysisfile.php + - message: "#^Parameter \\#1 \\$object_or_class of function property_exists expects object\\|string, mixed given\\.$#" count: 1