private Tuple <CachedServer, double> GetBestTimeForRequest(RequestsDescription requestsDescription) { double time; var server = _input.CachedServers.ArgMin(s => CalculateServerTimeForRequest(s, requestsDescription), out time); return(new Tuple <CachedServer, double>(server, time)); }
private double CalculateRequestValue(RequestsDescription requestsDescription) { double currentTime = _currentTime.GetOrCreate(requestsDescription, CalculateCurrentTime); var bestTuple = _bestTime.GetOrCreate(requestsDescription, GetBestTimeForRequest); _serverToRequests.GetOrCreate(bestTuple.Item1, _ => new HashSet <RequestsDescription>()).Add(requestsDescription); double bestTime = bestTuple.Item2; return(requestsDescription.NumOfRequests * (currentTime - bestTime) / (requestsDescription.Video.Size)); }
private double CalculateCurrentTime(RequestsDescription requestsDescription) { var serversWithVideo = _output.ServerAssignments.Where(kvp => kvp.Value.Contains(requestsDescription.Video)).ToList(); if (!serversWithVideo.Any()) { return(requestsDescription.Endpoint.DataCenterLatency); } return(serversWithVideo.Min(kvp => CalculateServerTimeForRequest(kvp.Key, requestsDescription))); }
private void AssignVideoToServer(CachedServer selectedServer, RequestsDescription request) { assigned++; if (assigned % 200 == 0) { Console.WriteLine("Assigned " + assigned); } _input.RequestsDescriptions.Remove(request); if (CalculateServerTimeForRequest(selectedServer, request) >= request.Endpoint.DataCenterLatency) { return; } if (_output.ServerAssignments.GetOrDefault(selectedServer, new List <Video>()).Contains(request.Video)) { return; } selectedServer.Capacity -= request.Video.Size; _output.ServerAssignments.GetOrCreate(selectedServer, _ => new List <Video>()).Add(request.Video); foreach (var rr in _videoToDescription[request.Video]) { if (rr.Endpoint.ServersLatency.ContainsKey(selectedServer)) { _currentTime.Remove(rr); } } foreach ( var rr in _serverToRequests.GetOrDefault(selectedServer, new HashSet <RequestsDescription>()) .Where(rrr => selectedServer.Capacity < rrr.Video.Size) .ToList()) { _bestTime.Remove(rr); _serverToRequests[selectedServer].Remove(rr); } }
private double CalculateServerTimeForRequest(CachedServer cachedServer, RequestsDescription request) { return(request.Endpoint.ServersLatency.GetOrDefault(cachedServer, request.Endpoint.DataCenterLatency)); }
private bool HasAvailableServer(RequestsDescription requestsDescription) { return(_input.CachedServers.Any(s => IsServerAvailableForVideo(s, requestsDescription.Video))); }