// check the flow live type based on current time, then set and add it into corresponding table private boolean checkAndMoveLiveFlowInternal(TypedStoredFlowEntry fe, long cTime) { long curTime = (cTime > 0 ? cTime : System.currentTimeMillis()); // For latency adjustment(default=500 millisecond) between FlowStatsRequest and Reply long fromLastSeen = ((curTime - fe.lastSeen() + latencyFlowStatsRequestAndReplyMillis) / 1000); // fe.life() unit is SECOND! long liveTime = fe.life() + fromLastSeen; switch (fe.flowLiveType()) { case IMMEDIATE_FLOW: if (liveTime >= longPollInterval) { fe.setFlowLiveType(FlowLiveType.LONG_FLOW); longFlows.add(fe); } else if (liveTime >= midPollInterval) { fe.setFlowLiveType(FlowLiveType.MID_FLOW); midFlows.add(fe); } else if (liveTime >= calAndPollInterval) { fe.setFlowLiveType(FlowLiveType.SHORT_FLOW); shortFlows.add(fe); } break; case SHORT_FLOW: if (liveTime >= longPollInterval) { fe.setFlowLiveType(FlowLiveType.LONG_FLOW); shortFlows.remove(fe); longFlows.add(fe); } else if (liveTime >= midPollInterval) { fe.setFlowLiveType(FlowLiveType.MID_FLOW); shortFlows.remove(fe); midFlows.add(fe); } break; case MID_FLOW: if (liveTime >= longPollInterval) { fe.setFlowLiveType(FlowLiveType.LONG_FLOW); midFlows.remove(fe); longFlows.add(fe); } break; case LONG_FLOW: if (fromLastSeen > entirePollInterval) { log.trace("checkAndMoveLiveFlowInternal, flow is already removed at switch."); return false; } break; case UNKNOWN_FLOW: // Unknown flow is an internal error flow type, just fall through default: // Error Unknown Live Type log.error( "checkAndMoveLiveFlowInternal, Unknown Live Type error!" + "AdaptiveStats collection thread for {}", sw.getStringId()); return false; } log.debug( "checkAndMoveLiveFlowInternal, FlowId=" + Long.toHexString(fe.id().value()) + ", state=" + fe.state() + ", After liveType=" + fe.flowLiveType() + ", liveTime=" + liveTime + ", life=" + fe.life() + ", bytes=" + fe.bytes() + ", packets=" + fe.packets() + ", fromLastSeen=" + fromLastSeen + ", priority=" + fe.priority() + ", selector=" + fe.selector().criteria() + ", treatment=" + fe.treatment() + " AdaptiveStats collection thread for {}", sw.getStringId()); return true; }