إصلاح جميع الأخطاء: حزمة السيد

يستورد (
 "إف إم تي"
 "سجل"
 "شبكة"
 "نت/http"
 "صافي/RPC"
 "نظام التشغيل"
 "مزامنة"
 "وقت"
)

اكتب حالة المهمة int

مقدار ثابت (
 NotStarted TaskStatus = iota
 في تَقَدم
 مكتمل
)

اكتب هيكل المنسق {
 NReduce int // عدد المهام التي سيتم تنفيذها
 InputFiles []string // قائمة بملفات الإدخال المراد معالجتها
 MapTaskSt Map[string]TaskStatus // خريطة لأرقام مهام الخريطة لحالتها الحالية
 ReduceTaskSt Map[int]TaskStatus // خريطة لتقليل أرقام المهام إلى حالتها الحالية
 خريطة العمال[string]WorkerStatus // خريطة معرفات العمال لحالتهم الحالية
 IntermediateFiles [][]سلسلة // شريحة ثنائية الأبعاد تحتوي على أسماء الملفات الوسيطة التي تنتجها مهام الخريطة، يمثل كل صف مهمة تقليل مختلفة
 MapIndex int // مهمة الخريطة التالية التي سيتم تعيينها
 ReduceIndex int // تقليل المهمة التالية التي سيتم تعيينها
 MapFinished bool // صحيح عند اكتمال جميع مهام الخريطة
 ReduceFinished bool // صحيح عند اكتمال جميع مهام التصغير
 Finish bool // صحيح عند اكتمال جميع مهام الخريطة والتقليل
 WriterLock \*sync.RWMutex // قفل للتحكم في المتغيرات المشتركة
 MapTasks chan MapTask // قناة لمهام الخريطة غير المكتملة
 تقليل المهام chan int // قناة لتقليل المهام غير المكتملة
}

// بدء منطق المنسق
وظيفة (ج \*المنسق) ابدأ() {
 fmt.Println("بدء المنسق وإضافة مهام الخريطة إلى القناة")
 // قم بإعداد MapTasks الأولي وإضافتها إلى قائمة الانتظار
 للفهرس، الملف: = النطاق c.InputFiles {
 c.MapTaskSt[file] = NotStarted
 مابتاسك := مابتاسك{
 اسم الملف: ملف،
 NReduce: ج.NReduce،
 الفهرس: الفهرس،
 }
 c.MapTasks <-mapTask
 fmt.Println("MapTask"، MapTask، "تمت الإضافة إلى القناة")
 }
 ج.الخادم()
}

func (c \*Coordinator) getNextMapTask() (string, TaskStatus) {
 للملف، الحالة: = النطاق c.MapTaskSt {
 إذا كانت الحالة == لم تبدأ {
 ملف الإرجاع، الحالة
 }
 }
 تمت الاستعادة
}

// الكود الخاص بك هنا - معالجات RPC التي يمكن للعامل الاتصال بها.
// مثال لمعالج RPC.
// يتم تعريف وسيطة RPC وأنواع الرد في rpc.go.
func (c \*Coordinator) AssignMapTask(args \*EmptyArgs, Response \*MapTaskReply) خطأ {
 fmt.Println("تم طلب مهمة الخريطة")
 ج.WriterLock.Lock()
 تأجيل c.WriterLock.Unlock()

 إذا !c.MapFinished {
 // ابحث عن مهمة خريطة غير مكتملة
 الملف، الحالة: = c.getNextMapTask ()
 إذا كانت الحالة == لم تبدأ {
 المهمة := <-c.MapTasks
 fmt.Println("تم العثور على مهمة الخريطة"، ملف)
 c.MapTaskSt[file] = InProgress
 اسم الملف = ملف
 رد.NReduce = c.NReduce
 Response.Index = c.MapIndex
 ج.MapIndex++
 انتقل إلى c.WaitForMapWorker(مهمة)
 العودة لا شيء
 }
 }
 // لا مزيد من مهام الخريطة لتعيينها
 اسم الملف = ""
 رد.NReduce = c.NReduce
 الرد. الفهرس = -1
 العودة لا شيء
}

func (c \*Coordinator) getNextReduceTask() (int, TaskStatus) {
 بالنسبة إلى int، الحالة: = النطاق c.ReduceTaskSt {
 إذا كانت الحالة == لم تبدأ {
 العودة كثافة العمليات، الحالة
 }
 }
 العودة -1، مكتملة
}
func (c \*Coordinator) AssignReduceTask(args \*EmptyArgs, Response \*ReduceTaskReply) خطأ {
 fmt.Println("تقليل المهمة المطلوبة")
 ج.WriterLock.Lock()
 تأجيل c.WriterLock.Unlock()

 إذا !c.ReduceFinished {
 // ابحث عن مهمة التصغير التالية غير المكتملة
 أنا، الحالة: = c.getNextReduceTask()
 إذا كانت الحالة == لم تبدأ {
 NumReduce := <-c.ReduceTasks
 الرد.IntermediateFiles = c.IntermediateFiles[NumReduce]
 fmt.Println("NumReduce:"، NumReduce، "Files:"، c.IntermediateFiles[NumReduce])
 الرد. الفهرس = i
 c.ReduceTaskSt[NumReduce] = InProgress
 انتقل إلى c.WaitForReduceWorker(NumReduce)
 العودة لا شيء
 }
 }
 // لا مزيد من تقليل المهام لتعيينها
 fmt.Println("لا مزيد من التخفيض")
 الرد.الملفات الوسيطة = []سلسلة{}
 الرد. الفهرس = -1
 العودة لا شيء
}

// سينتظر Goroutine لمدة 10 ثوانٍ ويتحقق مما إذا كانت مهمة الخريطة قد اكتملت أم لا
func (c \*Coordinator) WaitForMapWorker(task MapTask) {
 الوقت.النوم(الوقت.الثانية \* 10)
 ج.WriterLock.Lock()
 إذا c.MapTaskSt[task.FileName] == NotStarted {
 fmt.Println("انتهت صلاحية المؤقت، المهمة"، Task.FileName، "لم يتم الانتهاء. إعادة الوضع إلى قائمة الانتظار")
 c.MapTasks <- المهمة
 } آخر {
 إذا كان c.MapTaskSt[task.FileName] == مكتمل {
 ج.WriterLock.Unlock()
 يعود
 }
 }
 ج.WriterLock.Unlock()
}

// سوف ينتظر Goroutine 10 ثوانٍ ويتحقق مما إذا كانت مهمة التصغير قد اكتملت أم لا
func (c \*Coordinator) WaitForReduceWorker(NumReduce int) {
 الوقت.النوم(الوقت.الثانية \* 10)
 ج.WriterLock.Lock()
 إذا c.ReduceTaskSt[NumReduce] == NotStarted {
 fmt.Println("انتهت صلاحية المؤقت، قلل رقم المهمة"، NumReduce، "لم ينته بعد. إعادة الوضع إلى قائمة الانتظار")
 ج.ReduceTasks <- NumReduce
 } آخر {
 إذا c.ReduceTaskSt[NumReduce] == مكتمل {
 ج.WriterLock.Unlock()
 يعود
 }
 }
 ج.WriterLock.Unlock()
}

func (c \*Coordinator) MapTaskCompleted(args \*MapTaskReply, Response \*EmptyReply) خطأ {
 ج.WriterLock.Lock()
 تأجيل c.WriterLock.Unlock()

 c.MapTaskSt[args.Filename] = مكتمل

 لـ \_، الحالة:= النطاق c.MapTaskSt {
 إذا كانت الحالة ! = مكتملة {
 العودة لا شيء
 }
 }

 c.MapFinished = true
 إذا ج.MapFinished {
 ل س := 0; x <c.NRreduce; س++ {
 ج.تقليل المهام <- س
 c.ReduceTaskSt[x] = NotStarted
 }
 }

 // fmt.Println("المهمة"، args، "مكتملة")
 العودة لا شيء
}

func (c \*Coordinator) ReduceTaskCompleted(args \*ReduceTaskCompleted, Response \*EmptyReply) خطأ {
 ج.WriterLock.Lock()
 تأجيل c.WriterLock.Unlock()

 if \_, ok := c.ReduceTaskSt[args.Index]; نعم {
 c.ReduceTaskSt[args.Index] = مكتمل

 انتهى := صحيح
 لـ \_، الحالة:= النطاق c.ReduceTaskSt {
 إذا كانت الحالة ! = مكتملة {
 العودة لا شيء
 }
 }
 إذا انتهى {
 ج.ReduceFinished = صحيح
 }
 } آخر {
 log.Printf ("فهرس مهمة التصغير غير صالح: %d"، args.Index)
 }
 العودة لا شيء
}

func (c \*Coordinator) IntermediateFilesCompleted(args \*IntermediateFilesArgs, Response \*EmptyReply) خطأ {
 ج.WriterLock.Lock()
 تأجيل c.WriterLock.Unlock()

 c.IntermediateFiles[args.Index] = append(c.IntermediateFiles[args.Index], args.Filename)
 العودة لا شيء
}

// ابدأ سلسلة رسائل تستمع إلى RPCs من عامل.go
وظيفة (ج \*المنسق) الخادم() {
 rpc.تسجيل (ج)
 rpc.HandleHTTP()
 //ل، ه:= net.Listen("tcp"، ":1234")
 اسم الجورب := coordinatorSock()
 نظام التشغيل.إزالة (اسم الجورب)
 ل، ه:= net.Listen("يونيكس"، سوكنام)
 إذا ه!= لا شيء {
 log.Fatal("خطأ في الاستماع:"، هـ)
 }
 انتقل إلى http.Serve (l، nil)
}

// main/mrcoordinator.go يستدعي Done() بشكل دوري لمعرفة ذلك
// إذا انتهت المهمة بأكملها.
func (c \*Coordinator) تم() bool {
 // الحصول على قفل الكاتب لحماية البيانات المشتركة
 ج.WriterLock.Lock()
 تأجيل c.WriterLock.Unlock()

 // هل اكتملت جميع مهام الخريطة والتقليل
 c.Finish = c.MapFinished && c.ReduceFinished
 العودة ج.إنهاء

}

// إنشاء منسق.
// main/mrcoordinator.go يستدعي هذه الوظيفة.
// nReduce هو عدد المهام المخفضة التي سيتم استخدامها.
func MakeCoordinator(files []string, NReduce int) \*Coordinator {
 ج := المنسق{
 MapTaskSt: جعل (خريطة [سلسلة] حالة المهمة)،
 تقليل المهام: جعل (خريطة[int]TaskStatus)،
 تم الانتهاء من الخريطة: خطأ،
 تقليل انتهى: خطأ،
 الانتهاء: كاذبة،
 WriterLock: &sync.RWMutex{}،
 العمال: جعل (خريطة [سلسلة] حالة العامل)،
 NReduce: NReduce،
 ملفات الإدخال: الملفات،
 الملفات الوسيطة: make([][]string, NReduce)،
 مؤشر الخريطة: 0,
 تقليل الفهرس: 0,
 MapTasks: جعل (تشان MapTask، لين (ملفات))،
 تقليل المهام: جعل (تشان int، NReduce)،
 }

 fmt.Println("بدء الاتصال ()")
 c.Start() // وظيفة بدء المكالمات

 العودة & ج
}
{"source": "ewof/sharegpt-instruct-unfiltered-deduped", "kind": "human", "evolved_from": null}