/*******************************************************************************
* Copyright 2016 Klaus Pfeiffer - klaus@allpiper.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.jfastnet.state;
import com.jfastnet.Config;
import com.jfastnet.peers.CongestionControl;
import com.jfastnet.processors.ReliableModeSequenceProcessor;
import lombok.ToString;
import java.util.SortedSet;
import java.util.TreeSet;
/** @author Klaus Pfeiffer - klaus@allpiper.com */
@ToString(of = "qualityFactor")
public class NetworkQuality {
/** 1f => Best, 0f => Worst quality */
public float qualityFactor = 1f;
private int countRequestedMessages = 0;
private SortedSet<Long> missingMessageTimestamps = new TreeSet<>();
private final Config config;
private final long consideredTimeFrameInMs;
public NetworkQuality(Config config) {
this.config = config;
CongestionControl.CongestionControlConfig congestionControlConfig = config.getAdditionalConfig(CongestionControl.CongestionControlConfig.class);
consideredTimeFrameInMs = congestionControlConfig.consideredTimeFrameInMs;
}
public void requestedMissingMessages(int size, long timeStamp) {
countRequestedMessages += size;
for (int i = 0; i < size; i++) {
missingMessageTimestamps.add(timeStamp);
}
}
void calculateQuality() {
final long currentTimestamp = config.timeProvider.get();
missingMessageTimestamps.removeIf(timestamp -> timestamp < currentTimestamp - consideredTimeFrameInMs);
int missingMessagesInTimeFrame = missingMessageTimestamps.size();
ReliableModeSequenceProcessor.ProcessorConfig processorConfig = config.getAdditionalConfig(ReliableModeSequenceProcessor.ProcessorConfig.class);
float maximumNumberOfRequestedMessages = consideredTimeFrameInMs / (float) processorConfig.requestMissingIdsIntervalMs * processorConfig.maximumMissingIdsRequestCount;
float missingFactor = Math.min(1f, missingMessagesInTimeFrame / maximumNumberOfRequestedMessages);
this.qualityFactor = 1f - missingFactor;
}
}