protected override void HandlePullRequest(PullRequest message, List <int> candidates) { var ncandidates = candidates.Take((int)TestedHostsCount).ToList(); int instanceId = RandomNumberGenerator.GetInstanceRandomNumber(); // int count = candidates.Count(); MostFullAuction pullAuction = new MostFullAuction(instanceId, message.SenderId, ncandidates, StrategyActionType.PullAction); Console.WriteLine($"\tMaster: Initiate a Pull Auction of Host#{message.SenderId} with #{instanceId}"); foreach (var candidateHostId in ncandidates) { if (candidateHostId == 0) { throw new NotImplementedException(); } PullLoadAvailabilityRequest request = new PullLoadAvailabilityRequest(candidateHostId, this.MachineId, instanceId, pullAuction.Owner); CommunicationModule.SendMessage(request); } if (_currentAuction != null) { throw new NotImplementedException(); } //Auctions.Add(pushAuction); Used = message.SenderId; _currentAuction = pullAuction; }
private void HandlePullRequest(PullRequest message, List <int> candidates) { var ncandidates = candidates.Take(calculateCountFromPercent(candidates.Count, TestedHostsCount)).ToList(); // int count = candidates.Count(); Auction pullAuction = CreateAuctionInstance(PullAuctionType, message.SenderId, ncandidates, StrategyActionType.PullAction); foreach (var candidateHostId in ncandidates) { if (candidateHostId == 0) { throw new NotImplementedException(); } PullLoadAvailabilityRequest request = new PullLoadAvailabilityRequest(candidateHostId, this.MachineId, pullAuction.InstanceId, pullAuction.Owner); CommunicationModule.SendMessage(request); } if (_masterState.Auction != null) { throw new NotImplementedException(); } //Auctions.Add(pushAuction); //_masterState.CurrentAction = MasterCurrentAction.PullAuction; _masterState.CurrentHost = message.SenderId; _masterState.Auction = pullAuction; }
private void HandlePullLoadAvailabilityRequest(PullLoadAvailabilityRequest message) { Console.WriteLine($"Pull : I'm Host #{MachineId}: I've got message from # {message.SenderId}" + $" for auction # {message.AuctionId}"); Bid bid; if (BidLock == -1 && !EvacuateMode) { ContainerLoadInfo selectedContainerload = GetToBeRemovedContainerLoadInfo(); if (selectedContainerload != null) { var oldstate = LoadManager.GetPredictedHostLoadInfo().CalculateTotalUtilizationState(MinUtilization, MaxUtilization); var load = LoadManager.GetHostLoadInfoAWithoutContainer(selectedContainerload); var newState = load.CalculateTotalUtilizationState(MinUtilization, MaxUtilization); if (oldstate == UtilizationStates.Normal && newState == UtilizationStates.UnderUtilization) { bid = new Bid(MachineId, false, load, message.AuctionId, selectedContainerload.ContainerId, BidReasons.MinimumLoad); } else { var breason = BidReasons.ValidBid; if (oldstate == UtilizationStates.UnderUtilization) { EvacuateMode = true; breason = BidReasons.Evacuate; } bid = new Bid(MachineId, true, load, message.AuctionId, selectedContainerload.ContainerId, breason); BidLock = bid.AuctionId; } Console.WriteLine($"I am Host #{MachineId} I am bidding for AuctionId {bid.AuctionId}"); } else { bid = new Bid(MachineId, false, null, message.AuctionId, -1, BidReasons.Empty); } } else { Console.WriteLine($"I am Host #{MachineId} I am Not I'm not Bidlocked {BidLock}"); bid = new Bid(MachineId, false, null, message.AuctionId, -1, BidReasons.CantBid); } Console.WriteLine($"I am Host #{MachineId} for Pull Auction {message.AuctionId} with {bid.Valid}"); LoadAvailabilityResponce availabilityResponce = new LoadAvailabilityResponce(message.SenderId, this.MachineId, message.AuctionId, bid); // var responce = new GetHostLoadInfoResponce(this.HostId, load); CommunicationModule.SendMessage(availabilityResponce); }
protected override void HandlePullRequest(PullRequest message, List <int> candidates) { int instanceId = Helpers.RandomNumberGenerator.GetInstanceRandomNumber(); var inOrderInstance = new InOrderProping(instanceId, message.SenderId, candidates, StrategyActionType.PullAction, null); var candidateHostId = inOrderInstance.GetNextCandidate(); PullLoadAvailabilityRequest request = new PullLoadAvailabilityRequest(candidateHostId, this.MachineId, instanceId, inOrderInstance.Owner); CommunicationModule.SendMessage(request); if (_currentProping != null) { throw new NotImplementedException(); } Used = message.SenderId; _currentProping = inOrderInstance; }
private void HandlePullLoadAvailabilityRequest(PullLoadAvailabilityRequest message) { Bid bid; if (_hostState.CurrentAction == HostCurrentAction.None && !_hostState.EvacuationMode) { ContainerLoadInfo selectedContainerload = GetToBeRemovedContainerLoadInfo(); if (selectedContainerload != null) { var oldstate = LoadManager.GetPredictedHostLoadInfo().CalculateTotalUtilizationState(MinUtilization, MaxUtilization); var load = LoadManager.GetHostLoadInfoAWithoutContainer(selectedContainerload); var newState = load.CalculateTotalUtilizationState(MinUtilization, MaxUtilization); //Comment this condition if (oldstate == UtilizationStates.Normal && newState == UtilizationStates.UnderUtilization) { bid = new AuctionBid(MachineId, false, load, message.AuctionId, -1, BidReasons.MinimumLoad, 0); } else { //try to find how many pulls the target will need !!! var pullsCountRequest = new PullsCountRequest(message.RequestOwner, this.MachineId, selectedContainerload.ImageId); var t = CommunicationModule.RequestData(pullsCountRequest); t.Wait(); var pullsCountResponce = t.Result as PullsCountResponce; bid = new AuctionBid(MachineId, true, load, message.AuctionId, selectedContainerload.ContainerId, BidReasons.ValidBid, pullsCountResponce.PullsCount); _hostState.CurrentAction = HostCurrentAction.Bidding; _hostState.AuctionId = message.AuctionId; } } else { bid = new AuctionBid(MachineId, false, null, message.AuctionId, -1, BidReasons.Empty, 0); } } else { bid = new AuctionBid(MachineId, false, null, message.AuctionId, -1, BidReasons.CantBid, 0); } LoadAvailabilityResponce availabilityResponce = new LoadAvailabilityResponce(message.SenderId, this.MachineId, message.AuctionId, bid); CommunicationModule.SendMessage(availabilityResponce); }
public override void HandleLoadAvailabilityResponce(LoadAvailabilityResponce message) { // var currentInOrderPrope = _currentStrategyInstance as InOrderProping; if (!message.HostBid.Valid) { BidCancellationRequest brequest = new BidCancellationRequest(message.SenderId, this.MachineId, _currentProping.InstanceId); CommunicationModule.SendMessage(brequest); //Should try to find another one before rejection if (_currentProping.OpenSession) { int candidateHostId = _currentProping.GetNextCandidate(); switch (_currentProping.ActionType) { case StrategyActionType.PushAction: var aRequest1 = new PushLoadAvailabilityRequest(candidateHostId, this.MachineId, _currentProping.ContainerLoadInfo, _currentProping.InstanceId, _currentProping.Owner); CommunicationModule.SendMessage(aRequest1); break; case StrategyActionType.PullAction: var aRequest2 = new PullLoadAvailabilityRequest(candidateHostId, this.MachineId, _currentProping.InstanceId, _currentProping.Owner); CommunicationModule.SendMessage(aRequest2); break; default: throw new ArgumentOutOfRangeException(); } return; } else { InitiateRejectAction(_currentProping.Owner, _currentProping.ActionType); } } else { if (message.HostBid.Reason == BidReasons.ValidBid) { } else if (message.HostBid.Reason == BidReasons.Evacuate) { //EvacuatingHost = message.SenderId; EvacuatingHosts.Add(message.SenderId); if (EvacuatingHosts.Count > 1) { } DataHolder.SetUtilization(message.SenderId, UtilizationStates.Evacuating); } else { throw new NotImplementedException("from in order"); } if (_currentProping.ActionType == StrategyActionType.PushAction) { InitiateMigration(_currentProping.Owner, message.HostBid.BiddingHost, message.HostBid.ContainerId); } else { InitiateMigration(message.HostBid.BiddingHost, _currentProping.Owner, message.HostBid.ContainerId); } } if (Used == 0 || _currentProping == null) { throw new NotImplementedException(""); } Used = 0; _currentProping = null; }