diff --git a/src/backend/ci/.kotlin/sessions/kotlin-compiler-11097786827844662422.salive b/src/backend/ci/.kotlin/sessions/kotlin-compiler-11097786827844662422.salive new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/dao/record/BuildRecordModelDao.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/dao/record/BuildRecordModelDao.kt index c009d89399e1..aabe582bc12f 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/dao/record/BuildRecordModelDao.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/dao/record/BuildRecordModelDao.kt @@ -107,6 +107,7 @@ class BuildRecordModelDao { fun updateStatus( dslContext: DSLContext, projectId: String, + pipelineId: String, buildId: String, buildStatus: BuildStatus, executeCount: Int @@ -116,6 +117,7 @@ class BuildRecordModelDao { .where( PROJECT_ID.eq(projectId) .and(BUILD_ID.eq(buildId)) + .and(PIPELINE_ID.eq(pipelineId)) .and(EXECUTE_COUNT.eq(executeCount)) ).execute() } diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/lock/PipelineBuildRecordLock.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/lock/PipelineBuildRecordLock.kt index 7b0d9b21f069..5ef3afc11ca2 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/lock/PipelineBuildRecordLock.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/lock/PipelineBuildRecordLock.kt @@ -30,14 +30,100 @@ package com.tencent.devops.process.engine.control.lock import com.tencent.devops.common.redis.RedisLock import com.tencent.devops.common.redis.RedisOperation -class PipelineBuildRecordLock(redisOperation: RedisOperation, buildId: String, executeCount: Int) : - RedisLock( - redisOperation = redisOperation, - lockKey = "process.build.record.lock.$buildId.$executeCount", - expiredTimeInSeconds = 10L - ) { +/** + * 构建记录锁抽象基类 + * 统一管理公共字段和行为,减少重复代码 + */ +abstract class AbstractBuildRecordLock( + redisOperation: RedisOperation, + buildId: String, + executeCount: Int, + lockKeySuffix: String = "" +) : RedisLock( + redisOperation = redisOperation, + lockKey = buildLockKey(buildId, executeCount, lockKeySuffix), + expiredTimeInSeconds = 10L +) { + override fun decorateKey(key: String): String { // buildId,key无需加上集群信息前缀来区分 return key } + + companion object { + private const val LOCK_KEY_PREFIX = "process.build.record.lock" + + /** + * 构建锁的key + * @param buildId 构建ID + * @param executeCount 执行次数 + * @param suffix 额外的后缀(如stageId、containerId、taskId) + */ + private fun buildLockKey(buildId: String, executeCount: Int, suffix: String): String { + return if (suffix.isBlank()) { + "$LOCK_KEY_PREFIX.$buildId.$executeCount" + } else { + "$LOCK_KEY_PREFIX.$buildId.$suffix.$executeCount" + } + } + } } + +/** + * Pipeline级别的构建记录锁 - 暂时无用BuildIdLock功能冲突 + */ +class PipelineBuildRecordLock( + redisOperation: RedisOperation, + buildId: String, + executeCount: Int +) : AbstractBuildRecordLock( + redisOperation = redisOperation, + buildId = buildId, + executeCount = executeCount, + lockKeySuffix = "" +) + +/** + * Stage级别的构建记录锁 + */ +class StageBuildRecordLock( + redisOperation: RedisOperation, + buildId: String, + stageId: String, + executeCount: Int +) : AbstractBuildRecordLock( + redisOperation = redisOperation, + buildId = buildId, + executeCount = executeCount, + lockKeySuffix = stageId +) + +/** + * Container级别的构建记录锁 + */ +class ContainerBuildRecordLock( + redisOperation: RedisOperation, + buildId: String, + containerId: String, + executeCount: Int +) : AbstractBuildRecordLock( + redisOperation = redisOperation, + buildId = buildId, + executeCount = executeCount, + lockKeySuffix = containerId +) + +/** + * Task级别的构建记录锁 + */ +class TaskBuildRecordLock( + redisOperation: RedisOperation, + buildId: String, + taskId: String, + executeCount: Int +) : AbstractBuildRecordLock( + redisOperation = redisOperation, + buildId = buildId, + executeCount = executeCount, + lockKeySuffix = taskId +) diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/pojo/event/PipelineBuildWebSocketPushEvent.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/pojo/event/PipelineBuildWebSocketPushEvent.kt index d76128f9bd3d..92c357d199b4 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/pojo/event/PipelineBuildWebSocketPushEvent.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/pojo/event/PipelineBuildWebSocketPushEvent.kt @@ -42,7 +42,8 @@ data class PipelineBuildWebSocketPushEvent( override val source: String, override val projectId: String, override val pipelineId: String, - override val userId: String, + @Deprecated("推送状态消息无需关系事件来源") + override val userId: String = "", val buildId: String, val refreshTypes: Long, // HISTORY or DETAIL or STATUS 位运算 val executeCount: Int? = null, diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRuntimeService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRuntimeService.kt index 76343a74cef9..20d903bc10f5 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRuntimeService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRuntimeService.kt @@ -1400,6 +1400,7 @@ class PipelineRuntimeService @Autowired constructor( recordModelDao.updateStatus( dslContext = transactionContext, projectId = buildInfo.projectId, + pipelineId = buildInfo.pipelineId, buildId = buildInfo.buildId, buildStatus = newBuildStatus, executeCount = executeCount @@ -1820,6 +1821,7 @@ class PipelineRuntimeService @Autowired constructor( recordModelDao.updateStatus( dslContext = transactionContext, projectId = latestRunningBuild.projectId, + pipelineId = latestRunningBuild.pipelineId, buildId = latestRunningBuild.buildId, executeCount = latestRunningBuild.executeCount, buildStatus = BuildStatus.RUNNING diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/BaseBuildRecordService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/BaseBuildRecordService.kt index ba59b5e2216c..2707d163f4ec 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/BaseBuildRecordService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/BaseBuildRecordService.kt @@ -52,7 +52,7 @@ import com.tencent.devops.common.web.utils.I18nUtil import com.tencent.devops.common.websocket.enum.RefreshType import com.tencent.devops.process.constant.ProcessMessageCode import com.tencent.devops.process.dao.record.BuildRecordModelDao -import com.tencent.devops.process.engine.control.lock.PipelineBuildRecordLock +import com.tencent.devops.process.engine.control.lock.AbstractBuildRecordLock import com.tencent.devops.process.engine.dao.PipelineBuildDao import com.tencent.devops.process.engine.dao.PipelineResourceDao import com.tencent.devops.process.engine.dao.PipelineResourceVersionDao @@ -77,7 +77,7 @@ open class BaseBuildRecordService( private val buildRecordModelDao: BuildRecordModelDao, val pipelineBuildDao: PipelineBuildDao, private val pipelineEventDispatcher: PipelineEventDispatcher, - private val redisOperation: RedisOperation, + val redisOperation: RedisOperation, private val stageTagService: StageTagService, private val recordModelService: PipelineRecordModelService, private val pipelineResourceDao: PipelineResourceDao, @@ -90,62 +90,25 @@ open class BaseBuildRecordService( buildId: String, executeCount: Int, buildStatus: BuildStatus, - cancelUser: String? = null, operation: String = "", + lock: AbstractBuildRecordLock, refreshOperation: () -> Unit ) { val watcher = Watcher(id = "updateRecord#$buildId#$operation") - var message = "nothing" - val lock = PipelineBuildRecordLock(redisOperation, buildId, executeCount) - var startUser: String? = null + var message = "" try { watcher.start("lock") - lock.lock() - - watcher.start("getRecord") - val record = buildRecordModelDao.getRecord( - dslContext = dslContext, projectId = projectId, pipelineId = pipelineId, - buildId = buildId, executeCount = executeCount - ) ?: run { - message = "Model record is empty" - return - } - startUser = record.startUser - - watcher.start("refreshOperation") - refreshOperation() - watcher.stop() - - watcher.start("updatePipelineRecord") - val (change, finalStatus) = takeBuildStatus(record, buildStatus) - if (!change && cancelUser.isNullOrBlank()) { - message = "Build status did not change" - return + lock.use { + watcher.start("refreshOperation") + refreshOperation() } - buildRecordModelDao.updateRecord( - dslContext = dslContext, - projectId = projectId, - pipelineId = pipelineId, - buildId = buildId, - executeCount = executeCount, - buildStatus = finalStatus, - modelVar = record.modelVar, // 暂时没有变量,保留修改可能 - startTime = null, - endTime = null, - errorInfoList = null, - cancelUser = cancelUser // 系统行为导致的取消状态(仅当在取消状态时,还没有设置过取消人,才默认为System) - ?: if (buildStatus.isCancel() && record.cancelUser.isNullOrBlank()) "System" else null, - timestamps = null - ) - message = "Will not update" } catch (ignored: Throwable) { message = ignored.message ?: "" logger.warn("[$buildId]| Fail to update the build record: ${ignored.message}", ignored) } finally { - lock.unlock() logger.info("[$buildId|$buildStatus]|$operation|update_detail_record| $message") watcher.start("dispatchEvent") - pipelineRecordChangeEvent(projectId, pipelineId, buildId, startUser, executeCount) + pipelineRecordChangeEvent(projectId, pipelineId, buildId, executeCount) watcher.stop() LogUtils.printCostTimeWE(watcher) } @@ -290,10 +253,9 @@ open class BaseBuildRecordService( } private fun takeBuildStatus( - record: BuildRecordModel, + oldStatus: BuildStatus, buildStatus: BuildStatus ): Pair { - val oldStatus = BuildStatus.parse(record.status) return if (!oldStatus.isFinish()) { (oldStatus != buildStatus) to buildStatus } else { @@ -305,18 +267,13 @@ open class BaseBuildRecordService( projectId: String, pipelineId: String, buildId: String, - startUser: String?, executeCount: Int ) { - val userId = startUser - ?: pipelineBuildDao.getUserBuildInfo(dslContext, projectId, buildId)?.startUser - ?: return pipelineEventDispatcher.dispatch( PipelineBuildWebSocketPushEvent( source = "recordChange", projectId = projectId, pipelineId = pipelineId, - userId = userId, buildId = buildId, executeCount = executeCount, refreshTypes = RefreshType.RECORD.binary diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/ContainerBuildRecordService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/ContainerBuildRecordService.kt index d6d5a49b9d8a..cb5d81ad67da 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/ContainerBuildRecordService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/ContainerBuildRecordService.kt @@ -44,6 +44,7 @@ import com.tencent.devops.process.dao.record.BuildRecordModelDao import com.tencent.devops.process.dao.record.BuildRecordTaskDao import com.tencent.devops.process.engine.common.BuildTimeCostUtils.generateContainerTimeCost import com.tencent.devops.process.engine.common.BuildTimeCostUtils.generateMatrixTimeCost +import com.tencent.devops.process.engine.control.lock.ContainerBuildRecordLock import com.tencent.devops.process.engine.dao.PipelineBuildDao import com.tencent.devops.process.engine.dao.PipelineResourceDao import com.tencent.devops.process.engine.dao.PipelineResourceVersionDao @@ -158,7 +159,8 @@ class ContainerBuildRecordService( containerBuildDetailService.containerPreparing(projectId, buildId, containerId) update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "containerPreparing#$containerId" + operation = "containerPreparing#$containerId", + lock = ContainerBuildRecordLock(redisOperation, buildId, containerId, executeCount) ) { updateContainerRecord( projectId = projectId, pipelineId = pipelineId, buildId = buildId, @@ -191,7 +193,8 @@ class ContainerBuildRecordService( ) update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "containerStarted#$containerId" + operation = "containerStarted#$containerId", + lock = ContainerBuildRecordLock(redisOperation, buildId, containerId, executeCount) ) { updateContainerRecord( projectId = projectId, pipelineId = pipelineId, buildId = buildId, @@ -231,7 +234,8 @@ class ContainerBuildRecordService( ) update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "$operation#$containerId" + operation = "$operation#$containerId", + lock = ContainerBuildRecordLock(redisOperation, buildId, containerId, executeCount) ) { dslContext.transaction { configuration -> val context = DSL.using(configuration) @@ -338,7 +342,8 @@ class ContainerBuildRecordService( ) update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "updateMatrixGroupContainer#$matrixGroupId" + operation = "updateMatrixGroupContainer#$matrixGroupId", + lock = ContainerBuildRecordLock(redisOperation, buildId, matrixGroupId, executeCount) ) { logger.info( "[$buildId]|matrix_group_record|j(${modelContainer?.containerId})|" + @@ -365,7 +370,8 @@ class ContainerBuildRecordService( containerBuildDetailService.containerSkip(projectId, buildId, containerId) update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "containerSkip#$containerId" + operation = "containerSkip#$containerId", + lock = ContainerBuildRecordLock(redisOperation, buildId, containerId, executeCount) ) { logger.info("[$buildId]|container_skip|j($containerId)") recordTaskDao.updateRecordStatus( @@ -401,7 +407,8 @@ class ContainerBuildRecordService( if (executeCount == null) return update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "saveBuildVmInfo($projectId,$pipelineId)" + operation = "saveBuildVmInfo($projectId,$pipelineId)", + lock = ContainerBuildRecordLock(redisOperation, buildId, containerId, executeCount) ) { dslContext.transaction { configuration -> val context = DSL.using(configuration) diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/PipelineBuildRecordService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/PipelineBuildRecordService.kt index 28edd92180e4..d31f51015435 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/PipelineBuildRecordService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/PipelineBuildRecordService.kt @@ -632,7 +632,6 @@ class PipelineBuildRecordService @Autowired constructor( projectId = projectId, pipelineId = pipelineId, buildId = buildId, - startUser = recordModel.startUser, executeCount = executeCount ) } @@ -719,7 +718,6 @@ class PipelineBuildRecordService @Autowired constructor( projectId = projectId, pipelineId = pipelineId, buildId = buildId, - startUser = recordModel.startUser, executeCount = executeCount ) allStageStatus = fetchHistoryStageStatus( diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/StageBuildRecordService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/StageBuildRecordService.kt index 0345a47593f4..9e209c251409 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/StageBuildRecordService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/StageBuildRecordService.kt @@ -40,6 +40,7 @@ import com.tencent.devops.process.dao.record.BuildRecordModelDao import com.tencent.devops.process.dao.record.BuildRecordStageDao import com.tencent.devops.process.dao.record.BuildRecordTaskDao import com.tencent.devops.process.engine.common.BuildTimeCostUtils.generateStageTimeCost +import com.tencent.devops.process.engine.control.lock.StageBuildRecordLock import com.tencent.devops.process.engine.dao.PipelineBuildDao import com.tencent.devops.process.engine.dao.PipelineResourceDao import com.tencent.devops.process.engine.dao.PipelineResourceVersionDao @@ -115,7 +116,8 @@ class StageBuildRecordService( ) update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "updateStageStatus#$stageId" + operation = "updateStageStatus#$stageId", + lock = StageBuildRecordLock(redisOperation, buildId, stageId, executeCount) ) { val stageVar = mutableMapOf() if (buildStatus.isRunning()) { @@ -176,7 +178,8 @@ class StageBuildRecordService( logger.info("[$buildId]|stage_skip|stageId=$stageId") update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "stageSkip#$stageId" + operation = "stageSkip#$stageId", + lock = StageBuildRecordLock(redisOperation, buildId, stageId, executeCount) ) { recordContainerDao.updateRecordStatus( dslContext, projectId = projectId, pipelineId = pipelineId, buildId = buildId, @@ -220,7 +223,8 @@ class StageBuildRecordService( update( projectId, pipelineId, buildId, executeCount, BuildStatus.STAGE_SUCCESS, - cancelUser = null, operation = "stagePause#$stageId" + operation = "stagePause#$stageId", + lock = StageBuildRecordLock(redisOperation, buildId, stageId, executeCount) ) { val stageVar = mutableMapOf() stageVar[Stage::startEpoch.name] = System.currentTimeMillis() @@ -268,7 +272,8 @@ class StageBuildRecordService( logger.info("[$buildId]|stage_cancel|stageId=$stageId") update( projectId, pipelineId, buildId, executeCount, BuildStatus.CANCELED, - cancelUser = null, operation = "stageCancel#$stageId" + operation = "stageCancel#$stageId", + lock = StageBuildRecordLock(redisOperation, buildId, stageId, executeCount) ) { val stageVar = mutableMapOf() stageVar[Stage::stageControlOption.name] = controlOption.stageControlOption @@ -329,7 +334,8 @@ class StageBuildRecordService( update( projectId, pipelineId, buildId, executeCount, newBuildStatus, - cancelUser = null, operation = "stageCheckQuality#$stageId" + operation = "stageCheckQuality#$stageId", + lock = StageBuildRecordLock(redisOperation, buildId, stageId, executeCount) ) { val stageVar = mutableMapOf() stageVar[Stage::stageControlOption.name] = controlOption.stageControlOption @@ -379,7 +385,8 @@ class StageBuildRecordService( ) update( projectId, pipelineId, buildId, executeCount, BuildStatus.STAGE_SUCCESS, - cancelUser = null, operation = "stageReview#$stageId" + operation = "stageReview#$stageId", + lock = StageBuildRecordLock(redisOperation, buildId, stageId, executeCount) ) { val stageVar = mutableMapOf() stageVar[Stage::stageControlOption.name] = controlOption.stageControlOption @@ -411,7 +418,8 @@ class StageBuildRecordService( logger.info("[$buildId]|stage_start|stageId=$stageId") update( projectId, pipelineId, buildId, executeCount, BuildStatus.RUNNING, - cancelUser = null, operation = "stageStart#$stageId" + operation = "stageStart#$stageId", + lock = StageBuildRecordLock(redisOperation, buildId, stageId, executeCount) ) { val stageVar = mutableMapOf() stageVar[Stage::stageControlOption.name] = controlOption.stageControlOption diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/TaskBuildRecordService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/TaskBuildRecordService.kt index 1dac90be26b4..a560568c75c4 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/TaskBuildRecordService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/record/TaskBuildRecordService.kt @@ -46,6 +46,7 @@ import com.tencent.devops.process.dao.record.BuildRecordModelDao import com.tencent.devops.process.dao.record.BuildRecordTaskDao import com.tencent.devops.process.engine.common.BuildTimeCostUtils.generateTaskTimeCost import com.tencent.devops.process.engine.common.VMUtils +import com.tencent.devops.process.engine.control.lock.TaskBuildRecordLock import com.tencent.devops.process.engine.dao.PipelineBuildDao import com.tencent.devops.process.engine.dao.PipelineBuildTaskDao import com.tencent.devops.process.engine.dao.PipelineResourceDao @@ -143,7 +144,8 @@ class TaskBuildRecordService( update( projectId = projectId, pipelineId = pipelineId, buildId = buildId, executeCount = executeCount, buildStatus = BuildStatus.RUNNING, - cancelUser = null, operation = "taskStart#$taskId" + operation = "taskStart#$taskId", + lock = TaskBuildRecordLock(redisOperation, buildId, taskId, executeCount) ) { val delimiters = "," dslContext.transaction { configuration -> @@ -390,7 +392,8 @@ class TaskBuildRecordService( update( projectId = projectId, pipelineId = pipelineId, buildId = buildId, executeCount = executeCount, buildStatus = BuildStatus.RUNNING, - cancelUser = null, operation = "taskEnd#$taskId" + operation = "taskEnd#$taskId", + lock = TaskBuildRecordLock(redisOperation, buildId, taskId, executeCount) ) { dslContext.transaction { configuration -> val context = DSL.using(configuration) @@ -621,7 +624,8 @@ class TaskBuildRecordService( update( projectId = projectId, pipelineId = pipelineId, buildId = buildId, executeCount = executeCount, buildStatus = BuildStatus.RUNNING, - cancelUser = null, operation = operation + operation = operation, + lock = TaskBuildRecordLock(redisOperation, buildId, taskId, executeCount) ) { dslContext.transaction { configuration -> val transactionContext = DSL.using(configuration) diff --git a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/ContainerControl.kt b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/ContainerControl.kt index db6c0075a808..a65bf7eeb5d6 100644 --- a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/ContainerControl.kt +++ b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/ContainerControl.kt @@ -103,7 +103,6 @@ class ContainerControl @Autowired constructor( val containerIdLock = ContainerIdLock(redisOperation, buildId, containerId) try { containerIdLock.lock() - watcher.start("execute") watcher.start("getContainer") val projectId = event.projectId // #5951 在已结束或不存在的stage下,不再受理,抛弃消息 @@ -121,6 +120,7 @@ class ContainerControl @Autowired constructor( LOG.warn("ENGINE|$buildId|$source|$stageId|j($containerId)|bad container") return } + watcher.start("execute") // 防止关键信息传入错误信息,做一次更正 val fixEvent = this.copy( stageId = container.stageId,