public async Task OccupyRoom(OccupyRequest request) { var room = await UnitOfWork.GetDbSet <ProjectAccommodation>() .Include(r => r.Inhabitants) .Include(r => r.ProjectAccommodationType) .Where(r => r.ProjectId == request.ProjectId && r.Id == request.RoomId) .FirstOrDefaultAsync(); var accommodationRequests = await UnitOfWork.GetDbSet <AccommodationRequest>() .Include(r => r.Subjects.Select(s => s.Player)) .Include(r => r.Project) .Where(r => r.ProjectId == request.ProjectId && request.AccommodationRequestIds.Contains(r.Id)) .ToListAsync(); room.Project.RequestMasterAccess(CurrentUserId, acl => acl.CanSetPlayersAccommodations); foreach (var accommodationRequest in accommodationRequests) { var freeSpace = room.GetRoomFreeSpace(); if (freeSpace < accommodationRequest.Subjects.Count) { throw new JoinRpgInsufficientRoomSpaceException(room); } accommodationRequest.AccommodationId = room.Id; accommodationRequest.Accommodation = room; } await UnitOfWork.SaveChangesAsync(); await EmailService.Email(await CreateRoomEmail <OccupyRoomEmail>(room, accommodationRequests.SelectMany(ar => ar.Subjects).ToArray())); }
public async Task <OccupyResponse> OccupyAsync(OccupyRequest request) { var result = await _context.OccupyAsync(new OccupyInstance(this.GetActorId().GetGuidId(), request.PartitionId, request.ServiceInstanceName), _cancellation); //calculate a seed value to the nearest 100ms to stagger the due time of the different actors. //this prevents from all actors occupied within milliseconds of each other from all vacating at exactly the same time //which will cause a deadlock on the pool actor. var expirationQuanta = await _repository.GetExpirationQuantaAsync(_cancellation); var intervalMs = (int)Math.Round(expirationQuanta.TotalMilliseconds / 5); var dueMs = ((int)Math.Round((GetInstanceId().GetHashCode() % 1000) / 100.0) * 100) + intervalMs; await RegisterReminderAsync("expiration-quanta", null, TimeSpan.FromMilliseconds(dueMs), TimeSpan.FromMilliseconds(intervalMs)); return(new OccupyResponse(result.ServiceName)); }
public Task <OccupyResponse> OccupyAsync(Guid instanceId, OccupyRequest request) => GetProxy(instanceId).OccupyAsync(request);