Esempio n. 1
0
        private void ProcessBatches <T>(string id, bool ignoreExistingStudent, bool ignoreMissingStudent, IList <ClientServiceRequest <T> > requests, PoolItem <ClassroomService> poolService, Func <CourseStudentRequestBatchHelper <T>, OnResponse <CoursesResource.StudentsResource> > onResponse)
        {
            CourseStudentRequestBatchHelper <T> batchHelper = new CourseStudentRequestBatchHelper <T>()
            {
                FailedStudents        = new List <string>(),
                Failures              = new List <Exception>(),
                IgnoreExistingStudent = ignoreExistingStudent,
                IgnoreMissingStudent  = ignoreMissingStudent,
                RequestsToRetry       = new Dictionary <string, ClientServiceRequest <T> >()
            };

            int batchCount = 0;

            foreach (IEnumerable <ClientServiceRequest <T> > batch in requests.Batch(CourseStudentRequestFactory.BatchSize))
            {
                BatchRequest batchRequest = new BatchRequest(poolService.Item);
                Trace.WriteLine($"Executing student batch {++batchCount} for course {id}");

                foreach (ClientServiceRequest <T> request in batch)
                {
                    batchHelper.Request = request;
                    batchRequest.Queue <CoursesResource.StudentsResource>(request, onResponse.Invoke(batchHelper));
                }

                batchRequest.ExecuteWithRetryOnBackoff(poolService.Item.Name);

                batchHelper.BaseCount += CourseStudentRequestFactory.BatchSize;
            }

            if (batchHelper.RequestsToRetry.Count > 0)
            {
                Trace.WriteLine($"Retrying {batchHelper.RequestsToRetry} student change requests");
            }

            foreach (KeyValuePair <string, ClientServiceRequest <T> > request in batchHelper.RequestsToRetry)
            {
                try
                {
                    request.Value.ExecuteWithRetry(RetryEvents.Backoff | RetryEvents.Timeout, RetryCount);
                }
                catch (GoogleApiException e)
                {
                    if (!(ignoreMissingStudent && this.IsMissingStudentError(e.HttpStatusCode, e.Message)))
                    {
                        if (!(ignoreExistingStudent && this.IsExistingStudentError(e.HttpStatusCode, e.Message)))
                        {
                            batchHelper.Failures.Add(e);
                            batchHelper.FailedStudents.Add(request.Key);
                        }
                    }
                }
                catch (Exception ex)
                {
                    batchHelper.Failures.Add(ex);
                    batchHelper.FailedStudents.Add(request.Key);
                }
            }

            if (batchHelper.Failures.Count == 1)
            {
                throw batchHelper.Failures[0];
            }
            else if (batchHelper.Failures.Count > 1)
            {
                throw new AggregateCourseStudentException(id, batchHelper.FailedStudents, batchHelper.Failures);
            }
        }
Esempio n. 2
0
        private void ProcessBatches <T>(string id, IList <T> members, bool ignoreExistingMember, bool ignoreMissingMember, IList <ClientServiceRequest <T> > requests, PoolItem <DirectoryService> poolService)
        {
            List <string>    failedMembers = new List <string>();
            List <Exception> failures      = new List <Exception>();
            Dictionary <string, ClientServiceRequest <T> > requestsToRetry = new Dictionary <string, ClientServiceRequest <T> >();

            int baseCount  = 0;
            int batchCount = 0;

            foreach (IEnumerable <ClientServiceRequest <T> > batch in requests.Batch(GroupMemberRequestFactory.BatchSize))
            {
                BatchRequest batchRequest = new BatchRequest(poolService.Item);
                Trace.WriteLine($"Executing batch {++batchCount} for group {id}");

                foreach (ClientServiceRequest <T> request in batch)
                {
                    batchRequest.Queue <MembersResource>(request,
                                                         (content, error, i, message) =>
                    {
                        int index = baseCount + i;
                        this.ProcessMemberResponse(id, members[index], ignoreExistingMember, ignoreMissingMember, error, message, requestsToRetry, request, failedMembers, failures);
                    });
                }

                batchRequest.ExecuteWithRetryOnBackoff(poolService.Item.Name);

                baseCount += GroupMemberRequestFactory.BatchSize;
            }

            if (requestsToRetry.Count > 0)
            {
                Trace.WriteLine($"Retrying {requestsToRetry} member change requests");
            }

            foreach (KeyValuePair <string, ClientServiceRequest <T> > request in requestsToRetry)
            {
                try
                {
                    request.Value.ExecuteWithRetryOnBackoff();
                }
                catch (GoogleApiException e)
                {
                    if (!(ignoreMissingMember && this.IsMissingMemberError(e.HttpStatusCode, e.Message)))
                    {
                        if (!(ignoreExistingMember && this.IsExistingMemberError(e.HttpStatusCode, e.Message)))
                        {
                            failures.Add(e);
                            failedMembers.Add(request.Key);
                        }
                    }
                }
                catch (Exception ex)
                {
                    failures.Add(ex);
                    failedMembers.Add(request.Key);
                }
            }

            if (failures.Count == 1)
            {
                throw failures[0];
            }
            else if (failures.Count > 1)
            {
                throw new AggregateGroupUpdateException(id, failedMembers, failures);
            }
        }