From b521d36be54f16f9e55397fcb038ec9391cc7f48 Mon Sep 17 00:00:00 2001 From: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com> Date: Tue, 11 Jul 2023 08:21:17 +0000 Subject: [PATCH] Now in hook_pre_recieve.go, when cat file -s is called - the work is no longer shared among workers - race condition fixed --- routers/private/hook_pre_receive.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 88cb1c48672..06c46f228f9 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -262,15 +262,21 @@ func loadObjectsSizesViaCatFile(ctx *gitea_context.PrivateContext, opts *git.Run var wg sync.WaitGroup var mu sync.Mutex - reducedObjectIDs := make([]string, 0, len(objectIDs)) + // Prepare numWorker slices to store the work + reducedObjectIDs := make([][]string, 0, numWorkers) + for i := 0; i < numWorkers; i++ { + reducedObjectIDs[i] = make([]string, 0, len(objectIDs)/numWorkers+1) + } // Loop over all objectIDs and find which ones are missing size information + i := 0 for _, objectID := range objectIDs { _, exists := objectsSizes[objectID] // If object doesn't yet have size in objectsSizes add it for further processing if !exists { - reducedObjectIDs = append(reducedObjectIDs, objectID) + reducedObjectIDs[i%numWorkers] = append(reducedObjectIDs[i%numWorkers], objectID) + i++ } } @@ -280,12 +286,14 @@ func loadObjectsSizesViaCatFile(ctx *gitea_context.PrivateContext, opts *git.Run go func(reducedObjectIDs []string) { defer wg.Done() for _, objectID := range reducedObjectIDs { + ctx := ctx + opts := opts objectSize := calculateSizeOfObject(ctx, opts, objectID) mu.Lock() // Protecting shared resource objectsSizes[objectID] = objectSize mu.Unlock() // Releasing shared resource for other goroutines } - }(reducedObjectIDs) + }(reducedObjectIDs[(w-1)%numWorkers]) } // Wait for all workers to finish processing.