ANNA Suite  2020b
Multipurpose development suite for Telco applications
Classes | Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Friends | List of all members
anna::comm::CongestionController Class Reference

#include <CongestionController.hpp>

Inheritance diagram for anna::comm::CongestionController:
Inheritance graph
[legend]
Collaboration diagram for anna::comm::CongestionController:
Collaboration graph
[legend]

Classes

struct  Advice
 
struct  Mode
 

Public Types

typedef std::pair< int, int > Workload
 

Public Member Functions

Mode::_v getMode () const
 
int getMessageCounter () const
 
int getSuccessCounter () const
 
void setLimit (const int limit)
 
void setMode (const Mode::_v mode)
 
bool isEmpty () const
 
void setMaxPendingBytes (const int maxPendingBytes) noexcept(false)
 
Advice::_v getAdvice (const ClientSocket &clientSocket)
 
Advice::_v getAdvice (const ClientSocket *clientSocket)
 
Workload getAccumulatedWorkload () const
 
Workload getCurrentWorkload (const ClientSocket &clientSocket) const
 
xml::NodeasXML (xml::Node *parent) const
 

Static Public Member Functions

static int getLoad (const Workload &workload)
 
static int getLevel (const Workload &workload)
 
- Static Public Member Functions inherited from anna::Singleton< CongestionController >
static CongestionController & instantiate ()
 
static void release ()
 

Static Public Attributes

static const int MaxLevel = 4
 
static const int DefaultLimit = 60
 
static const int MaxPendingBytes
 

Friends

class Singleton< CongestionController >
 
class ClientSocket
 
class handler::LocalConnection
 

Detailed Description

Gestor de congestion autonomo.

Su funcionamiento a grandes rasgos es el siguiente:

  1. El campo getsockopt (...SO_RCVBUF...) nos da el tamaño maximo del buffer de recepcion para un socket dado. Segun hemos visto puede varias desde 32K hasta 80 K, dependiendo del sistema operativo y la configuracion. Independientemente del valor particular este sera nuestro limite maximo (100%), ya que si la longitud de la cola de espera alcanza este valor, el socket dejara de estar disponible para todos los clientes.
  2. El metodo ioctl (....FIONREAD...) nos da el numero de bytes pendientes de tratar en el socket.
  3. La carga del socket estara definida por (2) * 100 / (1).
  4. Con esta clase podemos limitar la carga maxima soportada por los sockets de nuestra aplicacion. Por defecto sera 60% del valor (1), un valor mas conservador podria ser 40%.
  5. La zona sin congestion estara entre 0% y el valor (4). La zona de congestion estara entre (valor (4) + 1)% y el 100%.
  6. La zona de congestion se divide, a su vez, en 4 zonas logicas: Si la carga del socket esta en el primer 25% se descartan mensajes con una probabilidad del 25%. Si la carga esta en el segundo 25% se descartan mensajes con una probabilidad del 50%. Si la carga esta entre el 51% y el 85% se descartan paquetes con una probabilidad del 85% y si esta entre el 86% y el 100% se descartan los paquetes con una probabilidad del 99%.

Ventajas:

Member Typedef Documentation

◆ Workload

typedef std::pair<int, int> anna::comm::CongestionController::Workload

Member Function Documentation

◆ asXML()

xml::Node* anna::comm::CongestionController::asXML ( xml::Node parent) const

Devuelve un documento XML con la informacion relevante sobre esta clase.

Returns
un documento XML con la informacion relevante sobre esta clase.

◆ getAccumulatedWorkload()

Workload anna::comm::CongestionController::getAccumulatedWorkload ( ) const

Devuelve información sobre las estadísticas de carga en las que se basó para hacer los cálculos.

Warning
Sólo debería invocarse a este método después de invocar a getAdvice.
Este método no es MT-estricto, por lo que en un entorno MT los valores sobre los que se calculó el último getAdvice y los datos obtenidos con este método pueden haber variado ligeramente.
See also
getLoad
getLevel

◆ getAdvice() [1/2]

Advice::_v anna::comm::CongestionController::getAdvice ( const ClientSocket clientSocket)

Devuelve el consejo sobre si debemos tratar/o no el ultimo mensaje recibido por el ClientSocket recibido como parametro.

Parameters
clientSocketSocket cliente por el que hemos recibido el ultimo mensaje.
Returns
Advice::Process para indicar que debemos procesar el mensaje , Advice::None para indicar que todavia no tiene datos para tomar una decision clara o Advice::Discard para indicar que debemos descartar.

◆ getAdvice() [2/2]

Advice::_v anna::comm::CongestionController::getAdvice ( const ClientSocket clientSocket)
inline

Devuelve el consejo sobre si debemos tratar/o no el ultimo mensaje recibido por el ClientSocket recibido como parametro.

Parameters
clientSocketSocket cliente por el que hemos recibido el ultimo mensaje.
Returns
Advice::Process para indicar que debemos procesar el mensaje , Advice::None para indicar que todavia no tiene datos para tomar una decision clara o Advice::Discard para indicar que debemos descartar.
174  {
175  return (clientSocket == NULL) ? Advice::Process : getAdvice(*clientSocket);
176  }
Advice::_v getAdvice(const ClientSocket &clientSocket)
Definition: CongestionController.hpp:76

◆ getCurrentWorkload()

Workload anna::comm::CongestionController::getCurrentWorkload ( const ClientSocket clientSocket) const

Devuelve información sobre las estadísticas de carga del socket recibido como parámetro.

Parameters
clientSocketSocket del que se quiere obtener el estado actual de ocupación.
Warning
Sólo debería invocarse a este método después de invocar a getAdvice.
Este método no es MT-estricto, por lo que en un entorno MT los valores sobre los que se calculó el último getAdvice y los datos obtenidos con este método pueden haber variado ligeramente.
See also
getLoad
getLevel

◆ getLevel()

static int anna::comm::CongestionController::getLevel ( const Workload workload)
inlinestatic

Extrae el nivel de carga en la que está el proceso. El nivel de carga es un número en [0, 4].

Returns
el nivel de carga en la que está el proceso. El nivel de carga es un número en [0, 4].
224 { return workload.first; }

◆ getLoad()

static int anna::comm::CongestionController::getLoad ( const Workload workload)
inlinestatic

Extrae la carga media que soporta es proceso. La carga es un número en [0, 100].

Returns
la carga media que soporta es proceso. La carga es un número en [0, 100].
218 { return workload.second; }

◆ getMessageCounter()

int anna::comm::CongestionController::getMessageCounter ( ) const
inline

Devuelve el número total de mensajes recibididos.

Returns
el número total de mensajes recibididos.
114 { return a_messageCounter; }

◆ getMode()

Mode::_v anna::comm::CongestionController::getMode ( ) const
inline

Devuelve el modo que estamos usando para calcular la carga.

Returns
El modo que estamos usando para calcular la carga.
108 { return a_mode; }

◆ getSuccessCounter()

int anna::comm::CongestionController::getSuccessCounter ( ) const
inline

Devuelve el número de mensajes tratados correctamente.

Returns
el número de mensajes tratados correctamente.
120 { return a_messageCounter - a_discardedCounter; }

◆ isEmpty()

bool anna::comm::CongestionController::isEmpty ( ) const
inline

Devuelve true si esta instancia ha recibido datos o false en otro caso.

Returns
true si esta instancia ha recibido datos o false en otro caso.
144 { return a_avgWorkload.isEmpty(); }
bool isEmpty() const
Definition: Average.hpp:38

◆ setLimit()

void anna::comm::CongestionController::setLimit ( const int  limit)

Establece el limite de carga que vamos a imponer.

Parameters
limitLimite de carga. Debe ser un valor entre 0 y 100.

◆ setMaxPendingBytes()

void anna::comm::CongestionController::setMaxPendingBytes ( const int  maxPendingBytes)
noexcept

Establece el nº máximo de bytes que deberían tener los socket en la cola de entrada.

Parameters
maxPendingBytesNúmero máximo de bytes que debería tener los socket en la cola de entrada.
Warning
El valor indicado debe estar dentro del siguiente ámbito:
[#comm::Communicator::getReadingChunkSize, min (#comm::Communicator::getReadingChunkSize * 4, #MaxPendingBytes)]

◆ setMode()

void anna::comm::CongestionController::setMode ( const Mode::_v  mode)
inline

Establece el modo en que vamos a calcular la carga.

Parameters
modeModo usado para calcular la carga.
132  {
133  if((a_mode = mode) == Mode::Auto) {
134  WHEN_MULTITHREAD(a_effectiveMode = Mode::Local);
135  WHEN_SINGLETHREAD(a_effectiveMode = Mode::Global);
136  } else
137  a_effectiveMode = mode;
138  }
#define WHEN_MULTITHREAD(a)
Definition: defines.hpp:96
#define WHEN_SINGLETHREAD(a)
Definition: defines.hpp:97
Definition: CongestionController.hpp:86
Definition: CongestionController.hpp:90
Definition: CongestionController.hpp:91

Friends And Related Function Documentation

◆ ClientSocket

friend class ClientSocket
friend

◆ handler::LocalConnection

friend class handler::LocalConnection
friend

◆ Singleton< CongestionController >

friend class Singleton< CongestionController >
friend

Member Data Documentation

◆ DefaultLimit

const int anna::comm::CongestionController::DefaultLimit = 60
static

◆ MaxLevel

const int anna::comm::CongestionController::MaxLevel = 4
static

Nivel máximo de congestión.

◆ MaxPendingBytes

const int anna::comm::CongestionController::MaxPendingBytes
static

Valor máximo que se puede asignar al control de bytes pendientes de tratar.


The documentation for this class was generated from the following file: