Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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)));
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
 private double CalculateServerTimeForRequest(CachedServer cachedServer, RequestsDescription request)
 {
     return(request.Endpoint.ServersLatency.GetOrDefault(cachedServer, request.Endpoint.DataCenterLatency));
 }
Exemplo n.º 6
0
 private bool HasAvailableServer(RequestsDescription requestsDescription)
 {
     return(_input.CachedServers.Any(s => IsServerAvailableForVideo(s, requestsDescription.Video)));
 }