/// <summary> /// Размещает запросы в очереди по серверам /// </summary> /// <param name="k">Количество мест в очереди сервера</param> void QueueAllocation(int k) { for (int j = 0; j < k; j++) { for (int i = 0; i < Clusters.Count; i++) { cluster cl = (cluster)Clusters[i]; if ((cl.GetQueueCount() < 2) && local_queue.Count > 0) { int[] arr = (int[])local_queue.Peek(); //если запрос из своего региона if (arr[2] == Region_num) { cluster_client cl_w = (cluster_client)Clients[arr[1]]; if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cl_w.GetWieghtQuery(); } } else { if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cluster_query.GetQueryWeightByNum(arr[0]); } } cl.QueueAdd((int[])local_queue.Dequeue()); cl.SetQueryTime(); } } } }
int kol_iterations = 1; //Количество итераций вызова функции QueueRecive() /// <summary> /// Получение новых запросов от клиентов и запись в очередь РБН /// </summary> void QueueRecive() { for (int i = last_client_num; i < Clients.Count; i++, last_client_num++) { cluster_client cl = (cluster_client)Clients[i]; if (!cl.request_sended && local_queue.Count < local_queue_length) { cl.NewRequest(time); CURENT_TOTAL_W += cl.GetWieghtQuery(); local_queue.Enqueue(cl.GetParametrs()); } if (QueueIsFull()) { break; } } if (last_client_num == Clients.Count) { last_client_num = 0; if (kol_iterations++ <= 2) { QueueRecive(); } else { kol_iterations = 1; } } }
/// <summary> /// Получает ответ от сервера из другого региона /// </summary> /// <param name="arr">Информация о запросе и клиенте</param> /// <param name="anotherRegion">номер другого региона</param> public void ReciveAns(int[] arr, int anotherRegion) { TOTAL_QUERY_COUNT++; cluster_client client = (cluster_client)Clients[arr[1]]; client.ReciveAns(time); //Номер региона;номер запроса в регионе;номер запроса;номер клиента; //номер региона клиента; время задержки; время string output = String.Format("{0};{1};{2};{3};{4};{5:F2};{6:F2};{7}", anotherRegion, TOTAL_QUERY_COUNT, arr[0], arr[1], arr[2], client.recive_time, time, local_queue.Count); OutputHandler.WriteLine(output); }
/// <summary> /// Инициализая серверов и клиентов /// </summary> private void InitClientCluster() { for (int i = 0; i < Clients.Capacity; i++) { cluster_client cl = new cluster_client(i, Region_num); Clients.Add(cl); } QueueRecive(); //Инициализация очереди РБН for (int i = 0; i < Clusters.Capacity; i++) { cluster cl = new cluster(); Clusters.Add(cl); } QueueAllocation(2); //Инициализация очереди серверов QueueRecive(); //Заполенение очереди РБН }
/// <summary> /// Очищает очередь региона и серверов в регионе /// (нужна для старта в момент времени 0) /// </summary> public void ClearQueue() { local_queue.Clear(); for (int i = 0; i < Clusters.Count; i++) { cluster cl = (cluster)Clusters[i]; cl.QueueRemove(); cl.QueueRemove(); } for (int i = 0; i < Clients.Count; i++) { cluster_client cl = (cluster_client)Clients[i]; cl.request_sended = false; } CURENT_TOTAL_W = 0; }
/// <summary> /// Отправляет первый элемент очереди РБН /// </summary> /// <returns>массив с информацией о запросе и клиенте</returns> public int[] GetQueryFromQueue() { int[] arr = (int[])local_queue.Peek(); if (arr[2] == Region_num) { cluster_client cl_w = (cluster_client)Clients[arr[1]]; if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cl_w.GetWieghtQuery(); } } else { if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cluster_query.GetQueryWeightByNum(arr[0]); } } return((int[])local_queue.Dequeue()); }
/// <summary> /// Отправляет последний элемент очереди РБН /// </summary> /// <returns>>массив с информацией о запросе и клиенте</returns> public int[] GetLastQueryFromQueue() { object first = local_queue.Peek(); object current = null; while (true) { current = local_queue.Dequeue(); if (local_queue.Count == 0) { break; } if (local_queue.Peek() == first) { break; } local_queue.Enqueue(current); } int[] arr = (int[])current; if (arr[2] == Region_num) { cluster_client cl_w = (cluster_client)Clients[((int[])current)[1]]; if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cl_w.GetWieghtQuery(); } } else { if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cluster_query.GetQueryWeightByNum(arr[0]); } } return((int[])current); }
/// <summary> /// проверяет кластеры на наличие выполненных запросов /// </summary> /// <returns>true - если есть сервера с выполенными запросами</returns> bool CheckClusters() { bool flag = false; for (int i = 0; i < Clusters.Count; i++) { cluster cl = (cluster)Clusters[i]; if (cl.query_time < 0.01 && cl.GetQueueCount() > 0) { int[] arr = cl.GetQueryInfo(true); //если запрос из своего региона if (arr[2] == Region_num) { TOTAL_QUERY_COUNT++; cluster_client client = (cluster_client)Clients[arr[1]]; client.ReciveAns(time); //Номер региона;номер запроса в регионе;номер запроса; //номер клиента;номер региона клиента; время задержки; время string output = String.Format( "{0};{1};{2};{3};{4};{5:F2};{6:F2};{7}", Region_num, TOTAL_QUERY_COUNT, arr[0], arr[1], arr[2], client.recive_time, time, local_queue.Count); OutputHandler.WriteLine(output); } else { AnotherQueries.Add(arr); } if (cl.GetQueueCount() > 0) { cl.SetQueryTime(); } flag = true; } } return(flag); }