@@ -11,13 +11,11 @@ import kotlinx.coroutines.Dispatchers
1111import kotlinx.coroutines.SupervisorJob
1212import kotlinx.coroutines.launch
1313import org.apache.logging.log4j.LogManager
14- import org.opensearch.action.bulk.BackoffPolicy
1514import org.opensearch.action.support.WriteRequest
1615import org.opensearch.client.Client
1716import org.opensearch.cluster.metadata.IndexNameExpressionResolver
1817import org.opensearch.cluster.service.ClusterService
1918import org.opensearch.common.settings.Settings
20- import org.opensearch.common.unit.TimeValue
2119import org.opensearch.common.xcontent.NamedXContentRegistry
2220import org.opensearch.index.shard.ShardId
2321import org.opensearch.indexmanagement.opensearchapi.IndexManagementSecurityContext
@@ -31,10 +29,8 @@ import org.opensearch.indexmanagement.transform.model.ContinuousTransformStats
3129import org.opensearch.indexmanagement.transform.model.Transform
3230import org.opensearch.indexmanagement.transform.model.TransformMetadata
3331import org.opensearch.indexmanagement.transform.model.initializeShardsToSearch
34- import org.opensearch.indexmanagement.transform.settings.TransformSettings
35- import org.opensearch.indexmanagement.util.acquireLockForScheduledJob
36- import org.opensearch.indexmanagement.util.releaseLockForScheduledJob
37- import org.opensearch.indexmanagement.util.renewLockForScheduledJob
32+ import org.opensearch.indexmanagement.transform.util.TransformContext
33+ import org.opensearch.indexmanagement.transform.util.TransformLockManager
3834import org.opensearch.jobscheduler.spi.JobExecutionContext
3935import org.opensearch.jobscheduler.spi.ScheduledJobParameter
4036import org.opensearch.jobscheduler.spi.ScheduledJobRunner
@@ -108,18 +104,18 @@ object TransformRunner :
108104 var newGlobalCheckpoints: Map <ShardId , Long >? = null
109105 var newGlobalCheckpointTime: Instant ? = null
110106 var currentMetadata = metadata
111- val backoffPolicy = BackoffPolicy .exponentialBackoff(
112- TimeValue .timeValueMillis(TransformSettings .DEFAULT_RENEW_LOCK_RETRY_DELAY ),
113- TransformSettings .DEFAULT_RENEW_LOCK_RETRY_COUNT
114- )
107+
115108 val transformProcessedBucketLog = TransformProcessedBucketLog ()
116109 var bucketsToTransform = BucketsToTransform (HashSet (), metadata)
117- var lock = acquireLockForScheduledJob(transform, context, backoffPolicy)
110+
111+ val transformContext = TransformContext .initTransformContext(transform, context)
112+ val transformLockManager = transformContext.transformLockManager
118113 try {
119114 do {
120115 when {
121- lock == null -> {
122- logger.warn(" Cannot acquire lock for transform job ${transform.id} " )
116+ transformLockManager.getLock() == null -> {
117+ val thread = Thread .currentThread().id
118+ logger.warn(" Cannot acquire lock for transform job ${transform.id} and thread $thread " )
123119 // If we fail to get the lock we won't fail the job, instead we return early
124120 return
125121 }
@@ -128,6 +124,9 @@ object TransformRunner :
128124 return
129125 }
130126 else -> {
127+ val thread = Thread .currentThread().id
128+ logger.warn(" Thread $thread acquired a lock" )
129+
131130 val validatedMetadata = validateTransform(transform, currentMetadata)
132131 if (validatedMetadata.status == TransformMetadata .Status .FAILED ) {
133132 currentMetadata = validatedMetadata
@@ -147,15 +146,15 @@ object TransformRunner :
147146 // If there are shards to search do it here
148147 if (bucketsToTransform.currentShard != null ) {
149148 // Computes aggregation on modified documents for current shard to get modified buckets
150- bucketsToTransform = getBucketsToTransformIteration(transform, bucketsToTransform).also {
149+ bucketsToTransform = getBucketsToTransformIteration(transform, bucketsToTransform, transformContext ).also {
151150 currentMetadata = it.metadata
152151 }
153152 // Filter out already processed buckets
154153 val modifiedBuckets = bucketsToTransform.modifiedBuckets.filter {
155154 transformProcessedBucketLog.isNotProcessed(it)
156155 }.toMutableSet()
157156 // Recompute modified buckets and update them in targetIndex
158- currentMetadata = recomputeModifiedBuckets(transform, currentMetadata, modifiedBuckets)
157+ currentMetadata = recomputeModifiedBuckets(transform, currentMetadata, modifiedBuckets, transformContext )
159158 // Add processed buckets to 'processed set' so that we don't try to reprocess them again
160159 transformProcessedBucketLog.addBuckets(modifiedBuckets.toList())
161160 // Update TransformMetadata
@@ -164,16 +163,12 @@ object TransformRunner :
164163 }
165164 } else {
166165 // Computes buckets from source index and stores them in targetIndex as transform docs
167- currentMetadata = computeBucketsIteration(transform, currentMetadata)
166+ currentMetadata = computeBucketsIteration(transform, currentMetadata, transformContext )
168167 // Update TransformMetadata
169168 currentMetadata = transformMetadataService.writeMetadata(currentMetadata, true )
170169 }
171170 // we attempt to renew lock for every loop of transform
172- val renewedLock = renewLockForScheduledJob(context, lock, backoffPolicy)
173- if (renewedLock == null ) {
174- releaseLockForScheduledJob(context, lock)
175- }
176- lock = renewedLock
171+ transformLockManager.renewLockForScheduledJob()
177172 }
178173 }
179174 } while (bucketsToTransform.currentShard != null || currentMetadata.afterKey != null )
@@ -185,7 +180,7 @@ object TransformRunner :
185180 failureReason = e.localizedMessage
186181 )
187182 } finally {
188- lock?. let {
183+ if (transformLockManager.getLock() != null ) {
189184 // Update the global checkpoints only after execution finishes successfully
190185 if (transform.continuous && currentMetadata.status != TransformMetadata .Status .FAILED ) {
191186 currentMetadata = currentMetadata.copy(
@@ -198,20 +193,20 @@ object TransformRunner :
198193 logger.info(" Disabling the transform job ${transform.id} " )
199194 updateTransform(transform.copy(enabled = false , enabledAt = null ))
200195 }
201- releaseLockForScheduledJob(context, it )
196+ transformLockManager. releaseLockForScheduledJob()
202197 }
203198 }
204199 }
205200
206- private suspend fun getBucketsToTransformIteration (transform : Transform , bucketsToTransform : BucketsToTransform ): BucketsToTransform {
201+ private suspend fun getBucketsToTransformIteration (transform : Transform , bucketsToTransform : BucketsToTransform , transformContext : TransformContext ): BucketsToTransform {
207202 var currentBucketsToTransform = bucketsToTransform
208203 val currentShard = bucketsToTransform.currentShard
209204 // Clear modified buckets from previous iteration
210205 currentBucketsToTransform.modifiedBuckets.clear()
211206
212207 if (currentShard != null ) {
213208 val shardLevelModifiedBuckets = withTransformSecurityContext(transform) {
214- transformSearchService.getShardLevelModifiedBuckets(transform, currentBucketsToTransform.metadata.afterKey, currentShard)
209+ transformSearchService.getShardLevelModifiedBuckets(transform, currentBucketsToTransform.metadata.afterKey, currentShard, transformContext )
215210 }
216211 currentBucketsToTransform.modifiedBuckets.addAll(shardLevelModifiedBuckets.modifiedBuckets)
217212 val mergedSearchTime = currentBucketsToTransform.metadata.stats.searchTimeInMillis +
@@ -258,13 +253,15 @@ object TransformRunner :
258253 private suspend fun computeBucketsIteration (
259254 transform : Transform ,
260255 metadata : TransformMetadata ,
256+ transformContext : TransformContext
261257 ): TransformMetadata {
262258
263259 val transformSearchResult = withTransformSecurityContext(transform) {
264260 transformSearchService.executeCompositeSearch(
265261 transform,
266262 metadata.afterKey,
267- null
263+ null ,
264+ transformContext
268265 )
269266 }
270267 val indexTimeInMillis = withTransformSecurityContext(transform) {
@@ -287,11 +284,15 @@ object TransformRunner :
287284 private suspend fun recomputeModifiedBuckets (
288285 transform : Transform ,
289286 metadata : TransformMetadata ,
290- modifiedBuckets : MutableSet <Map <String , Any >>
287+ modifiedBuckets : MutableSet <Map <String , Any >>,
288+ transformContext : TransformContext
291289 ): TransformMetadata {
292290 val updatedMetadata = if (modifiedBuckets.isNotEmpty()) {
291+
292+ Thread .sleep(61000 )
293+
293294 val transformSearchResult = withTransformSecurityContext(transform) {
294- transformSearchService.executeCompositeSearch(transform, null , modifiedBuckets)
295+ transformSearchService.executeCompositeSearch(transform, null , modifiedBuckets, transformContext )
295296 }
296297 val indexTimeInMillis = withTransformSecurityContext(transform) {
297298 transformIndexer.index(transformSearchResult.docsToIndex)
0 commit comments