mirror of
https://gitlab.xiph.org/xiph/icecast-server.git
synced 2024-12-04 14:46:30 -05:00
if a directory server times out, reset the failing server stream entries so
that the streams go through the add process again in 15 mins. closes #689 svn path=/icecast/trunk/icecast/; revision=14452
This commit is contained in:
parent
22ee7b6b6e
commit
3344ff6f09
62
src/yp.c
62
src/yp.c
@ -77,7 +77,7 @@ typedef struct ypdata_tag
|
|||||||
time_t next_update;
|
time_t next_update;
|
||||||
unsigned touch_interval;
|
unsigned touch_interval;
|
||||||
char *error_msg;
|
char *error_msg;
|
||||||
unsigned (*process)(struct ypdata_tag *yp, char *s, unsigned len);
|
int (*process)(struct ypdata_tag *yp, char *s, unsigned len);
|
||||||
|
|
||||||
struct ypdata_tag *next;
|
struct ypdata_tag *next;
|
||||||
} ypdata_t;
|
} ypdata_t;
|
||||||
@ -96,9 +96,9 @@ static volatile char *server_version = NULL;
|
|||||||
|
|
||||||
static void *yp_update_thread(void *arg);
|
static void *yp_update_thread(void *arg);
|
||||||
static void add_yp_info (ypdata_t *yp, void *info, int type);
|
static void add_yp_info (ypdata_t *yp, void *info, int type);
|
||||||
static unsigned do_yp_remove (ypdata_t *yp, char *s, unsigned len);
|
static int do_yp_remove (ypdata_t *yp, char *s, unsigned len);
|
||||||
static unsigned do_yp_add (ypdata_t *yp, char *s, unsigned len);
|
static int do_yp_add (ypdata_t *yp, char *s, unsigned len);
|
||||||
static unsigned do_yp_touch (ypdata_t *yp, char *s, unsigned len);
|
static int do_yp_touch (ypdata_t *yp, char *s, unsigned len);
|
||||||
static void yp_destroy_ypdata(ypdata_t *ypdata);
|
static void yp_destroy_ypdata(ypdata_t *ypdata);
|
||||||
|
|
||||||
|
|
||||||
@ -284,7 +284,9 @@ void yp_initialize(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* handler for curl, checks if successful handling occurred */
|
/* handler for curl, checks if successful handling occurred
|
||||||
|
* return 0 for ok, -1 for this entry failed, -2 for server fail
|
||||||
|
*/
|
||||||
static int send_to_yp (const char *cmd, ypdata_t *yp, char *post)
|
static int send_to_yp (const char *cmd, ypdata_t *yp, char *post)
|
||||||
{
|
{
|
||||||
int curlcode;
|
int curlcode;
|
||||||
@ -298,9 +300,9 @@ static int send_to_yp (const char *cmd, ypdata_t *yp, char *post)
|
|||||||
if (curlcode)
|
if (curlcode)
|
||||||
{
|
{
|
||||||
yp->process = do_yp_add;
|
yp->process = do_yp_add;
|
||||||
yp->next_update += 300;
|
yp->next_update += 900;
|
||||||
ERROR2 ("connection to %s failed with \"%s\"", server->url, server->curl_error);
|
ERROR2 ("connection to %s failed with \"%s\"", server->url, server->curl_error);
|
||||||
return -1;
|
return -2;
|
||||||
}
|
}
|
||||||
if (yp->cmd_ok == 0)
|
if (yp->cmd_ok == 0)
|
||||||
{
|
{
|
||||||
@ -317,16 +319,18 @@ static int send_to_yp (const char *cmd, ypdata_t *yp, char *post)
|
|||||||
|
|
||||||
|
|
||||||
/* routines for building and issues requests to the YP server */
|
/* routines for building and issues requests to the YP server */
|
||||||
static unsigned do_yp_remove (ypdata_t *yp, char *s, unsigned len)
|
static int do_yp_remove (ypdata_t *yp, char *s, unsigned len)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (yp->sid)
|
if (yp->sid)
|
||||||
{
|
{
|
||||||
int ret = snprintf (s, len, "action=remove&sid=%s", yp->sid);
|
ret = snprintf (s, len, "action=remove&sid=%s", yp->sid);
|
||||||
if (ret >= (signed)len)
|
if (ret >= (signed)len)
|
||||||
return ret+1;
|
return ret+1;
|
||||||
|
|
||||||
INFO1 ("clearing up YP entry for %s", yp->mount);
|
INFO1 ("clearing up YP entry for %s", yp->mount);
|
||||||
send_to_yp ("remove", yp, s);
|
ret = send_to_yp ("remove", yp, s);
|
||||||
free (yp->sid);
|
free (yp->sid);
|
||||||
yp->sid = NULL;
|
yp->sid = NULL;
|
||||||
}
|
}
|
||||||
@ -334,11 +338,11 @@ static unsigned do_yp_remove (ypdata_t *yp, char *s, unsigned len)
|
|||||||
yp->remove = 1;
|
yp->remove = 1;
|
||||||
yp->process = do_yp_add;
|
yp->process = do_yp_add;
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned do_yp_add (ypdata_t *yp, char *s, unsigned len)
|
static int do_yp_add (ypdata_t *yp, char *s, unsigned len)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char *value;
|
char *value;
|
||||||
@ -382,18 +386,19 @@ static unsigned do_yp_add (ypdata_t *yp, char *s, unsigned len)
|
|||||||
yp->server_type, yp->subtype, yp->bitrate, yp->audio_info);
|
yp->server_type, yp->subtype, yp->bitrate, yp->audio_info);
|
||||||
if (ret >= (signed)len)
|
if (ret >= (signed)len)
|
||||||
return ret+1;
|
return ret+1;
|
||||||
if (send_to_yp ("add", yp, s) == 0)
|
ret = send_to_yp ("add", yp, s);
|
||||||
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
yp->process = do_yp_touch;
|
yp->process = do_yp_touch;
|
||||||
/* force first touch in 5 secs */
|
/* force first touch in 5 secs */
|
||||||
yp->next_update = time(NULL) + 5;
|
yp->next_update = time(NULL) + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned do_yp_touch (ypdata_t *yp, char *s, unsigned len)
|
static int do_yp_touch (ypdata_t *yp, char *s, unsigned len)
|
||||||
{
|
{
|
||||||
unsigned listeners = 0, max_listeners = 1;
|
unsigned listeners = 0, max_listeners = 1;
|
||||||
char *val, *artist, *title;
|
char *val, *artist, *title;
|
||||||
@ -450,27 +455,26 @@ static unsigned do_yp_touch (ypdata_t *yp, char *s, unsigned len)
|
|||||||
if (ret >= (signed)len)
|
if (ret >= (signed)len)
|
||||||
return ret+1; /* space required for above text and nul*/
|
return ret+1; /* space required for above text and nul*/
|
||||||
|
|
||||||
send_to_yp ("touch", yp, s);
|
return send_to_yp ("touch", yp, s);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void process_ypdata (struct yp_server *server, ypdata_t *yp)
|
static int process_ypdata (struct yp_server *server, ypdata_t *yp)
|
||||||
{
|
{
|
||||||
unsigned len = 512;
|
unsigned len = 512;
|
||||||
char *s = NULL, *tmp;
|
char *s = NULL, *tmp;
|
||||||
|
|
||||||
if (now < yp->next_update)
|
if (now < yp->next_update)
|
||||||
return;
|
return 0;
|
||||||
yp->next_update = now + yp->touch_interval;
|
yp->next_update = now + yp->touch_interval;
|
||||||
|
|
||||||
/* loop just in case the memory area isn't big enough */
|
/* loop just in case the memory area isn't big enough */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
unsigned ret;
|
int ret;
|
||||||
if ((tmp = realloc (s, len)) == NULL)
|
if ((tmp = realloc (s, len)) == NULL)
|
||||||
return;
|
return 0;
|
||||||
s = tmp;
|
s = tmp;
|
||||||
|
|
||||||
if (yp->release)
|
if (yp->release)
|
||||||
@ -483,23 +487,35 @@ static void process_ypdata (struct yp_server *server, ypdata_t *yp)
|
|||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
free (s);
|
free (s);
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
len = ret;
|
len = ret;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void yp_process_server (struct yp_server *server)
|
static void yp_process_server (struct yp_server *server)
|
||||||
{
|
{
|
||||||
ypdata_t *yp;
|
ypdata_t *yp;
|
||||||
|
int state = 0;
|
||||||
|
|
||||||
/* DEBUG1("processing yp server %s", server->url); */
|
/* DEBUG1("processing yp server %s", server->url); */
|
||||||
yp = server->mounts;
|
yp = server->mounts;
|
||||||
while (yp)
|
while (yp)
|
||||||
{
|
{
|
||||||
now = time (NULL);
|
now = time (NULL);
|
||||||
process_ypdata (server, yp);
|
/* if one of the streams shows that the server cannot be contacted then mark the
|
||||||
|
* other entries for an update later. Assume YP server is dead and skip it for now
|
||||||
|
*/
|
||||||
|
if (state == -2)
|
||||||
|
{
|
||||||
|
DEBUG2 ("skiping %s on %s", yp->mount, server->url);
|
||||||
|
yp->process = do_yp_add;
|
||||||
|
yp->next_update += 900;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
state = process_ypdata (server, yp);
|
||||||
yp = yp->next;
|
yp = yp->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user