Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

bsched.c File Reference


Detailed Description

Bandwidth scheduling.

Author:
Raphael Manfredi
Date:
2002-2003

#include "common.h"
#include "bsched.h"
#include "inet.h"
#include "uploads.h"
#include "if/core/wrap.h"
#include "if/gnet_property_priv.h"
#include "lib/glib-missing.h"
#include "lib/walloc.h"
#include "lib/misc.h"
#include "lib/override.h"

Defines

#define BW_SLOT_MIN   64 /**< Minimum bandwidth/slot for realloc */
 Minimum bandwidth/slot for realloc.

#define BW_OUT_UP_MIN   8192 /**< Minimum out bandwidth for becoming ultra */
 Minimum out bandwidth for becoming ultra.

#define BW_OUT_GNET_MIN   128 /**< Minimum out bandwidth per Gnet connection */
 Minimum out bandwidth per Gnet connection.

#define BW_OUT_LEAF_MIN   32 /**< Minimum out bandwidth per leaf connection */
 Minimum out bandwidth per leaf connection.

#define BW_TCP_MSG   40 /**< Smallest size of a TCP message */
 Smallest size of a TCP message.

#define BW_UDP_MSG   20 /**< Minimal IP overhead for a UDP message */
 Minimal IP overhead for a UDP message.

#define BW_UDP_OVERSIZE   512 /**< Allow that many bytes over available b/w */
 Allow that many bytes over available b/w.


Functions

 RCSID ("$Id:bsched.c, v 1.45 2005/12/11 14:32:10 rmanfredi Exp $")
bsched_tbsched_make (gchar *name, gint type, guint32 mode, gint bandwidth, gint period)
 Create a new bandwidth scheduler.

void bsched_free (bsched_t *bs)
 Free bandwidth scheduler.

void bsched_add_stealer (bsched_t *bs, bsched_t *stealer)
 Add `stealer' as a bandwidth stealer for underused bandwidth in `bs'.

void bsched_reset_stealers (bsched_t *bs)
 Reset `stealer' list for scheduler.

void bsched_config_steal_http_gnet (void)
 Allow cross-stealing of unused bandwidth between HTTP/gnet.

void bsched_config_steal_gnet (void)
 Allow cross-stealing of unused bandwidth between TCP and UDP gnet only.

void bsched_init (void)
 Initialize global bandwidth schedulers.

void bsched_close (void)
 Discard global bandwidth schedulers.

void bsched_set_peermode (node_peer_t mode)
 Adapt the overall Gnet/HTTP bandwidth repartition depending on the current peermode.

void bsched_enable (bsched_t *bs)
 Enable scheduling, marks the start of the period.

void bsched_disable (bsched_t *bs)
 Disable scheduling.

void bsched_enable_all (void)
 Enable all known bandwidth schedulers.

void bsched_shutdown (void)
 Shutdowning program.

void bio_enable (bio_source_t *bio)
 Enable an I/O source.

void bio_disable (bio_source_t *bio)
 Disable I/O source.

void bio_add_callback (bio_source_t *bio, inputevt_handler_t callback, gpointer arg)
 Add I/O callback to a "passive" I/O source.

void bio_remove_callback (bio_source_t *bio)
 Remove I/O callback from I/O source.

void bsched_no_more_bandwidth (bsched_t *bs)
 Disable all sources and flag that we have no more bandwidth.

void bsched_clear_active (bsched_t *bs)
 Remove activation indication on all the sources.

void bsched_begin_timeslice (bsched_t *bs)
 Called whenever a new scheduling timeslice begins.

void bsched_bio_add (bsched_t *bs, bio_source_t *bio)
 Add new source to the source list of scheduler.

void bsched_bio_remove (bsched_t *bs, bio_source_t *bio)
 Remove source from the source list of scheduler.

bio_source_tbsched_source_add (bsched_t *bs, wrap_io_t *wio, guint32 flags, inputevt_handler_t callback, gpointer arg)
 Declare fd as a new source for the scheduler.

void bsched_source_remove (bio_source_t *bio)
 Remove bio_source object from the scheduler.

void bsched_set_bandwidth (bsched_t *bs, gint bandwidth)
 On-the-fly changing of the allowed bandwidth.

gint bw_available (bio_source_t *bio, gint len)
void bsched_bw_update (bsched_t *bs, gint used, gint requested)
 Update bandwidth used, and scheduler statistics.

ssize_t bio_write (bio_source_t *bio, gconstpointer data, size_t len)
 Write at most `len' bytes from `buf' to source's fd, as bandwidth permits.

ssize_t bio_writev (bio_source_t *bio, struct iovec *iov, gint iovcnt)
 Write at most `len' bytes from `iov' to source's fd, as bandwidth permits, `len' being determined by the size of the supplied I/O vector.

ssize_t bio_sendto (bio_source_t *bio, gnet_host_t *to, gconstpointer data, size_t len)
 Send UDP datagram to specified destination `to'.

ssize_t bio_sendfile (sendfile_ctx_t *ctx, bio_source_t *bio, gint in_fd, off_t *offset, size_t len)
 Write at most `len' bytes to source's fd, as bandwidth permits.

ssize_t bio_read (bio_source_t *bio, gpointer data, size_t len)
 Read at most `len' bytes from `buf' from source's fd, as bandwidth permits.

ssize_t bio_readv (bio_source_t *bio, struct iovec *iov, gint iovcnt)
 Read at most `len' bytes from `iov' to source's fd, as bandwidth permits, `len' being determined by the size of the supplied I/O vector.

ssize_t bws_write (bsched_t *bs, wrap_io_t *wio, gconstpointer data, size_t len)
 Write at most `len' bytes from `buf' to specified fd, and account the bandwidth used.

ssize_t bws_read (bsched_t *bs, wrap_io_t *wio, gpointer data, size_t len)
 Read at most `len' bytes from `buf' from specified fd, and account the bandwidth used.

void bws_udp_count_read (gint len)
 Account for read data from UDP.

void bws_udp_count_written (gint len)
 Account for written data to UDP.

bsched_tbs_socket (enum socket_direction dir, enum socket_type type)
 Returns adequate b/w shaper depending on the socket type.

void bws_sock_connect (enum socket_type type)
 Record that we're issuing a TCP/IP connection of a particular type.

void bws_sock_connect_failed (enum socket_type type)
 Record that the connection attempt failed.

void bws_sock_connect_timeout (enum socket_type type)
 A connection attempt of `type' timed out.

void bws_sock_connected (enum socket_type type)
 Record that the connection attempt succeeded.

void bws_sock_accepted (enum socket_type type)
 We accepted an incoming connection of `type'.

void bws_sock_closed (enum socket_type type, gboolean remote)
 The connection was closed, remotely if `remote' is true.

gboolean bws_can_connect (enum socket_type type)
 Do we have the bandwidth to issue a new TCP/IP connection of `type'?

void bsched_heartbeat (bsched_t *bs, tm_t *tv)
 Periodic heartbeat.

void bsched_stealbeat (bsched_t *bs)
 Periodic stealing beat, occurs after the heartbeat.

void bsched_timer (void)
 Periodic timer.

gboolean bsched_enough_up_bandwidth (void)
 Needs very short description so that doxygen can parse the following list properly.


Variables

bws_set bws = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
GSList * bws_list = NULL
GSList * bws_gsteal_list = NULL
GSList * bws_out_list = NULL
GSList * bws_in_list = NULL
gint bws_out_ema = 0
gint bws_in_ema = 0


Define Documentation

#define BW_OUT_GNET_MIN   128 /**< Minimum out bandwidth per Gnet connection */
 

Minimum out bandwidth per Gnet connection.

#define BW_OUT_LEAF_MIN   32 /**< Minimum out bandwidth per leaf connection */
 

Minimum out bandwidth per leaf connection.

#define BW_OUT_UP_MIN   8192 /**< Minimum out bandwidth for becoming ultra */
 

Minimum out bandwidth for becoming ultra.

#define BW_SLOT_MIN   64 /**< Minimum bandwidth/slot for realloc */
 

Minimum bandwidth/slot for realloc.

#define BW_TCP_MSG   40 /**< Smallest size of a TCP message */
 

Smallest size of a TCP message.

#define BW_UDP_MSG   20 /**< Minimal IP overhead for a UDP message */
 

Minimal IP overhead for a UDP message.

#define BW_UDP_OVERSIZE   512 /**< Allow that many bytes over available b/w */
 

Allow that many bytes over available b/w.


Function Documentation

void bio_add_callback bio_source_t bio,
inputevt_handler_t  callback,
gpointer  arg
 

Add I/O callback to a "passive" I/O source.

void bio_disable bio_source_t bio  )  [static]
 

Disable I/O source.

The value of `bw_available' is ignored, as this is a fairly low-level call. If it is called, then the caller has already taken care of redispatching any remaining bandwidth.

void bio_enable bio_source_t bio  )  [static]
 

Enable an I/O source.

ssize_t bio_read bio_source_t bio,
gpointer  data,
size_t  len
 

Read at most `len' bytes from `buf' from source's fd, as bandwidth permits.

Returns:
-1 with errno set to EAGAIN, if we cannot read anything due to bandwidth constraints.

ssize_t bio_readv bio_source_t bio,
struct iovec *  iov,
gint  iovcnt
 

Read at most `len' bytes from `iov' to source's fd, as bandwidth permits, `len' being determined by the size of the supplied I/O vector.

If we cannot write anything due to bandwidth constraints, return -1 with errno set to EAGAIN.

void bio_remove_callback bio_source_t bio  ) 
 

Remove I/O callback from I/O source.

ssize_t bio_sendfile sendfile_ctx_t ctx,
bio_source_t bio,
gint  in_fd,
off_t *  offset,
size_t  len
 

Write at most `len' bytes to source's fd, as bandwidth permits.

Bytes are read from `offset' in the in_fd file descriptor, and the value is updated in place by the kernel.

Returns:
-1 with errno set to EAGAIN, if we cannot write anything due to bandwidth constraints.

ssize_t bio_sendto bio_source_t bio,
gnet_host_t to,
gconstpointer  data,
size_t  len
 

Send UDP datagram to specified destination `to'.

Returns:
-1 with errno set to EAGAIN, if we cannot write anything due to bandwidth constraints.

ssize_t bio_write bio_source_t bio,
gconstpointer  data,
size_t  len
 

Write at most `len' bytes from `buf' to source's fd, as bandwidth permits.

If we cannot write anything due to bandwidth constraints, return -1 with errno set to EAGAIN.

ssize_t bio_writev bio_source_t bio,
struct iovec *  iov,
gint  iovcnt
 

Write at most `len' bytes from `iov' to source's fd, as bandwidth permits, `len' being determined by the size of the supplied I/O vector.

If we cannot write anything due to bandwidth constraints, return -1 with errno set to EAGAIN.

bsched_t* bs_socket enum socket_direction  dir,
enum socket_type  type
[static]
 

Returns adequate b/w shaper depending on the socket type.

Returns:
NULL if there is no b/w shaper to consider.

void bsched_add_stealer bsched_t bs,
bsched_t stealer
[static]
 

Add `stealer' as a bandwidth stealer for underused bandwidth in `bs'.

Both must be either reading or writing schedulers.

void bsched_begin_timeslice bsched_t bs  )  [static]
 

Called whenever a new scheduling timeslice begins.

Re-enable all sources and flag that we have bandwidth. Update the per-source bandwidth statistics. Clears all activation indication on all sources.

void bsched_bio_add bsched_t bs,
bio_source_t bio
[static]
 

Add new source to the source list of scheduler.

void bsched_bio_remove bsched_t bs,
bio_source_t bio
[static]
 

Remove source from the source list of scheduler.

void bsched_bw_update bsched_t bs,
gint  used,
gint  requested
[static]
 

Update bandwidth used, and scheduler statistics.

If no more bandwidth is available, disable all sources.

Parameters:
`bs' no brief description.
`used' is the amount of bytes used by the I/O.
`requested' is the amount of bytes requested for the I/O.

void bsched_clear_active bsched_t bs  )  [static]
 

Remove activation indication on all the sources.

void bsched_close void   ) 
 

Discard global bandwidth schedulers.

void bsched_config_steal_gnet void   ) 
 

Allow cross-stealing of unused bandwidth between TCP and UDP gnet only.

void bsched_config_steal_http_gnet void   ) 
 

Allow cross-stealing of unused bandwidth between HTTP/gnet.

void bsched_disable bsched_t bs  ) 
 

Disable scheduling.

void bsched_enable bsched_t bs  ) 
 

Enable scheduling, marks the start of the period.

void bsched_enable_all void   ) 
 

Enable all known bandwidth schedulers.

gboolean bsched_enough_up_bandwidth void   ) 
 

Needs very short description so that doxygen can parse the following list properly.

Determine whether we have enough bandwidth to possibly become an ultra node:

  1. There must be more than BW_OUT_UP_MIN outgoing bandwidth available.
  2. If bandwidth schedulers are enabled, leaf nodes must not be configured to steal all the HTTP outgoing bandwidth, unless they disabled uploads.
  3. If Gnet out scheduler is enabled, there must be at least BW_OUT_GNET_MIN bytes per gnet connection.
  4. Overall, there must be BW_OUT_LEAF_MIN bytes per configured leaf plus BW_OUT_GNET_MIN bytes per gnet connection available.

void bsched_free bsched_t bs  )  [static]
 

Free bandwidth scheduler.

All sources have their bsched pointer reset to NULL but are not disposed of. Naturally, they cannot be used for I/O any more.

void bsched_heartbeat bsched_t bs,
tm_t tv
[static]
 

Periodic heartbeat.

void bsched_init void   ) 
 

Initialize global bandwidth schedulers.

bsched_t* bsched_make gchar *  name,
gint  type,
guint32  mode,
gint  bandwidth,
gint  period
 

Create a new bandwidth scheduler.

Parameters:
`name' no brief description.
`type' refers to the scheduling model. Only BS_T_STREAM for now.
`mode' refers to the nature of the sources: either reading or writing.
`bandwidth' is the expected bandwidth in bytes per second.
`period' is the scheduling period in ms.

void bsched_no_more_bandwidth bsched_t bs  )  [static]
 

Disable all sources and flag that we have no more bandwidth.

void bsched_reset_stealers bsched_t bs  )  [static]
 

Reset `stealer' list for scheduler.

void bsched_set_bandwidth bsched_t bs,
gint  bandwidth
 

On-the-fly changing of the allowed bandwidth.

void bsched_set_peermode node_peer_t  mode  ) 
 

Adapt the overall Gnet/HTTP bandwidth repartition depending on the current peermode.

This routine is called each time the peermode changes or each time the settings for the traffic shapers changes.

void bsched_shutdown void   ) 
 

Shutdowning program.

Disable all known bandwidth schedulers, so that any pending I/O can go through as quickly as possible.

bio_source_t * bsched_source_add bsched_t bs,
wrap_io_t wio,
guint32  flags,
inputevt_handler_t  callback,
gpointer  arg
 

Declare fd as a new source for the scheduler.

When `callback' is NULL, the source will be "passive", i.e. its bandwidth will be limited when calls to bio_write() or bio_read() are made, but whether the source can accept those calls without blocking will have to be determined explicitly.

Returns:
new bio_source object.

void bsched_source_remove bio_source_t bio  ) 
 

Remove bio_source object from the scheduler.

The bio_source object is freed and must not be re-used.

void bsched_stealbeat bsched_t bs  )  [static]
 

Periodic stealing beat, occurs after the heartbeat.

Note that we do not use the theoric bandwidth, but bs->bw_max to estimate the amount of underused bandwidth. The reason is that bs->bw_max can be corrected due to traffic spikes.

void bsched_timer void   ) 
 

Periodic timer.

gint bw_available bio_source_t bio,
gint  len
[static]
 

Parameters:
`bio' no brief description.
`len' is the amount of bytes requested by the application.
Returns:
the bandwidth available for a given source.

gboolean bws_can_connect enum socket_type  type  ) 
 

Do we have the bandwidth to issue a new TCP/IP connection of `type'?

ssize_t bws_read bsched_t bs,
wrap_io_t wio,
gpointer  data,
size_t  len
 

Read at most `len' bytes from `buf' from specified fd, and account the bandwidth used.

Any overused bandwidth will be tracked, so that on average, we stick to the requested bandwidth rate.

void bws_sock_accepted enum socket_type  type  ) 
 

We accepted an incoming connection of `type'.

void bws_sock_closed enum socket_type  type,
gboolean  remote
 

The connection was closed, remotely if `remote' is true.

void bws_sock_connect enum socket_type  type  ) 
 

Record that we're issuing a TCP/IP connection of a particular type.

void bws_sock_connect_failed enum socket_type  type  ) 
 

Record that the connection attempt failed.

void bws_sock_connect_timeout enum socket_type  type  ) 
 

A connection attempt of `type' timed out.

void bws_sock_connected enum socket_type  type  ) 
 

Record that the connection attempt succeeded.

void bws_udp_count_read gint  len  ) 
 

Account for read data from UDP.

void bws_udp_count_written gint  len  ) 
 

Account for written data to UDP.

ssize_t bws_write bsched_t bs,
wrap_io_t wio,
gconstpointer  data,
size_t  len
 

Write at most `len' bytes from `buf' to specified fd, and account the bandwidth used.

Any overused bandwidth will be tracked, so that on average, we stick to the requested bandwidth rate.

Returns:
The amount of bytes written or (-1) if an error occurred.

RCSID "$Id:bsched.  c,
v 1.45 2005/12/11 14:32:10 rmanfredi Exp $" 
 


Variable Documentation

struct bws_set bws = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
 

GSList* bws_gsteal_list = NULL [static]
 

gint bws_in_ema = 0 [static]
 

GSList* bws_in_list = NULL [static]
 

GSList* bws_list = NULL [static]
 

gint bws_out_ema = 0 [static]
 

GSList* bws_out_list = NULL [static]
 


Generated on Sun Feb 12 10:49:59 2006 for Gtk-Gnutella by doxygen 1.3.6