[svn] - use a hashtable for fdlist storage. first step to making the amount of allowed clients dynamic and removing MAXCONNECTIONS.

This commit is contained in:
nenolod 2007-03-05 09:23:07 -08:00
parent 14e23b0e1e
commit e70f8e928e
10 changed files with 138 additions and 52 deletions

View file

@ -1,3 +1,15 @@
jilles 2007/03/05 01:14:46 UTC (20070305-3227)
Log:
Fix some cases where the size argument to strlcpy()
for usernames and hostnames is 1 too small.
Changes: Modified:
+1 -1 trunk/modules/m_chghost.c (File Modified)
+2 -2 trunk/src/res.c (File Modified)
+2 -2 trunk/src/s_user.c (File Modified)
jilles 2007/03/04 23:42:55 UTC (20070304-3225)
Log:
Cut down quit/part/kick reasons to avoid quit reasons

View file

@ -1 +1 @@
#define SERNO "20070304-3225"
#define SERNO "20070305-3227"

View file

@ -21,7 +21,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* $Id: commio.c 1779 2006-07-30 16:36:39Z jilles $
* $Id: commio.c 3229 2007-03-05 17:23:07Z nenolod $
*/
#include "libcharybdis.h"
@ -43,7 +43,8 @@ static const char *comm_err_str[] = { "Comm OK", "Error during bind()",
"Comm Error"
};
fde_t *fd_table = NULL;
#define FD_HASH_SIZE 128
static dlink_list fd_table[FD_HASH_SIZE];
static void fdlist_update_biggest(int fd, int opening);
@ -56,9 +57,60 @@ static PF comm_connect_timeout;
static void comm_connect_dns_callback(void *vptr, struct DNSReply *reply);
static PF comm_connect_tryconnect;
inline fde_t *
comm_locate_fd(int fd)
{
int bucket = fd % FD_HASH_SIZE;
dlink_list *list = &fd_table[bucket];
dlink_node *n;
DLINK_FOREACH(n, list->head)
{
fde_t *F = (fde_t *) n->data;
if (F->fd == fd)
return F;
}
return NULL;
}
inline fde_t *
comm_add_fd(int fd)
{
fde_t *F = comm_locate_fd(fd);
dlink_list *list;
if (F != NULL)
return F;
F = calloc(sizeof(fde_t), 1);
F->fd = fd;
list = &fd_table[fd % FD_HASH_SIZE];
dlinkAdd(F, &F->node, list);
return F;
}
inline void
comm_remove_fd(int fd)
{
int bucket = fd % FD_HASH_SIZE;
fde_t *F;
dlink_list *list = &fd_table[bucket];
F = comm_locate_fd(fd);
if (F == NULL)
return;
dlinkDelete(&F->node, list);
MyFree(F);
}
/* 32bit solaris is kinda slow and stdio only supports fds < 256
* so we got to do this crap below.
* (BTW Fuck you Sun, I hate your guts and I hope you go bankrupt soon)
* XXX: this is no longer needed in Solaris 10. --nenolod
*/
#if defined (__SVR4) && defined (__sun)
static void comm_fd_hack(int *fd)
@ -93,7 +145,9 @@ comm_close_all(void)
for (i = 4; i < MAXCONNECTIONS; ++i)
{
if(fd_table[i].flags.open)
fde_t *F = comm_locate_fd(i);
if(F != NULL && F->flags.open)
comm_close(i);
else
close(i);
@ -168,13 +222,16 @@ comm_set_nb(int fd)
{
int nonb = 0;
int res;
fde_t *F = comm_locate_fd(fd);
nonb |= O_NONBLOCK;
res = fcntl(fd, F_GETFL, 0);
if(-1 == res || fcntl(fd, F_SETFL, res | nonb) == -1)
return 0;
fd_table[fd].flags.nonblocking = 1;
if (F != NULL)
F->flags.nonblocking = 1;
return 1;
}
@ -217,7 +274,7 @@ comm_settimeout(int fd, time_t timeout, PF * callback, void *cbdata)
{
fde_t *F;
s_assert(fd >= 0);
F = &fd_table[fd];
F = comm_locate_fd(fd);
s_assert(F->flags.open);
F->timeout = CurrentTime + (timeout / 1000);
@ -241,7 +298,7 @@ comm_setflush(int fd, time_t timeout, PF * callback, void *cbdata)
{
fde_t *F;
s_assert(fd >= 0);
F = &fd_table[fd];
F = comm_locate_fd(fd);
s_assert(F->flags.open);
F->flush_timeout = CurrentTime + (timeout / 1000);
@ -266,7 +323,9 @@ comm_checktimeouts(void *notused)
fde_t *F;
for (fd = 0; fd <= highest_fd; fd++)
{
F = &fd_table[fd];
F = comm_locate_fd(fd);
if(F == NULL)
continue;
if(!F->flags.open)
continue;
if(F->flags.closing)
@ -316,7 +375,7 @@ comm_connect_tcp(int fd, const char *host, u_short port,
void *ipptr = NULL;
fde_t *F;
s_assert(fd >= 0);
F = &fd_table[fd];
F = comm_locate_fd(fd);
F->flags.called_connect = 1;
s_assert(callback);
F->connect.callback = callback;
@ -388,10 +447,12 @@ static void
comm_connect_callback(int fd, int status)
{
CNCB *hdl;
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
/* This check is gross..but probably necessary */
if(F->connect.callback == NULL)
if(F == NULL || F->connect.callback == NULL)
return;
/* Clear the connect flag + handler */
hdl = F->connect.callback;
F->connect.callback = NULL;
@ -473,13 +534,13 @@ static void
comm_connect_tryconnect(int fd, void *notused)
{
int retval;
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
if(F->connect.callback == NULL)
return;
/* Try the connect() */
retval = connect(fd, (struct sockaddr *) &fd_table[fd].connect.hostaddr,
GET_SS_LEN(fd_table[fd].connect.hostaddr));
retval = connect(fd, (struct sockaddr *) &F->connect.hostaddr,
GET_SS_LEN(F->connect.hostaddr));
/* Error? */
if(retval < 0)
{
@ -667,7 +728,7 @@ fdlist_update_biggest(int fd, int opening)
* re-opening it
*/
s_assert(!opening);
while (highest_fd >= 0 && !fd_table[highest_fd].flags.open)
while (highest_fd >= 0 && comm_locate_fd(fd)->flags.open) /* XXX */
highest_fd--;
}
@ -679,8 +740,7 @@ fdlist_init(void)
if(!initialized)
{
/* Since we're doing this once .. */
fd_table = MyMalloc((MAXCONNECTIONS + 1) * sizeof(fde_t));
memset(&fd_table, '\0', sizeof(dlink_list) * FD_HASH_SIZE);
initialized = 1;
}
}
@ -689,7 +749,7 @@ fdlist_init(void)
void
comm_open(int fd, unsigned int type, const char *desc)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_add_fd(fd);
s_assert(fd >= 0);
if(F->flags.open)
@ -718,7 +778,7 @@ comm_open(int fd, unsigned int type, const char *desc)
void
comm_close(int fd)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
s_assert(F->flags.open);
/* All disk fd's MUST go through file_close() ! */
s_assert(F->type != FD_FILE);
@ -740,13 +800,13 @@ comm_close(int fd)
F->flags.open = 0;
fdlist_update_biggest(fd, 0);
number_fd--;
memset(F, '\0', sizeof(fde_t));
comm_remove_fd(fd);
F->timeout = 0;
/* Unlike squid, we're actually closing the FD here! -- adrian */
close(fd);
}
/*
* comm_dump() - dump the list of active filedescriptors
*/
@ -755,14 +815,24 @@ comm_dump(struct Client *source_p)
{
int i;
for (i = 0; i <= highest_fd; i++)
for (i = 0; i <= FD_HASH_SIZE; i++)
{
if(!fd_table[i].flags.open)
dlink_node *n;
if (dlink_list_length(&fd_table[i]) <= 0)
continue;
sendto_one_numeric(source_p, RPL_STATSDEBUG,
"F :fd %-3d desc '%s'",
i, fd_table[i].desc);
DLINK_FOREACH(n, fd_table[i].head)
{
fde_t *F = (fde_t *) n->data;
if(F == NULL || !F->flags.open)
continue;
sendto_one_numeric(source_p, RPL_STATSDEBUG,
"F :fd %-3d bucket %-3d desc '%s'",
F->fd, i, F->desc);
}
}
}
@ -776,15 +846,16 @@ void
comm_note(int fd, const char *format, ...)
{
va_list args;
fde_t *F = comm_add_fd(fd); /* XXX: epoll, kqueue. */
if(format)
{
va_start(args, format);
ircvsnprintf(fd_table[fd].desc, FD_DESC_SZ, format, args);
ircvsnprintf(F->desc, FD_DESC_SZ, format, args);
va_end(args);
}
else
fd_table[fd].desc[0] = '\0';
F->desc[0] = '\0';
}

View file

@ -21,7 +21,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* $Id: commio.h 1757 2006-07-25 23:34:45Z jilles $
* $Id: commio.h 3229 2007-03-05 17:23:07Z nenolod $
*/
#ifndef INCLUDED_commio_h
@ -30,6 +30,7 @@
#include "setup.h"
#include "config.h"
#include "ircd_defs.h"
#include "tools.h"
/* Callback for completed IO events */
typedef void PF(int fd, void *);
@ -128,11 +129,10 @@ struct _fde
}
connect;
int pflags;
dlink_node node;
};
extern fde_t *fd_table;
void fdlist_init(void);
extern void comm_open(int, unsigned int, const char *);
@ -188,5 +188,6 @@ extern void mangle_mapped_sockaddr(struct sockaddr *in);
#define mangle_mapped_sockaddr(x)
#endif
extern fde_t *comm_locate_fd(int fd);
#endif /* INCLUDED_commio_h */

View file

@ -22,7 +22,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* $Id: devpoll.c 390 2005-12-07 18:46:56Z nenolod $
* $Id: devpoll.c 3229 2007-03-05 17:23:07Z nenolod $
*/
#include "config.h"
@ -77,24 +77,26 @@ devpoll_update_events(int fd, short filter, PF * handler)
int cur_mask = fdmask[fd];
PF *cur_handler;
fdmask[fd] = 0;
fde_t *F = comm_locate_fd(fd);
switch (filter)
{
case COMM_SELECT_READ:
cur_handler = fd_table[fd].read_handler;
cur_handler = F->read_handler;
if(handler)
fdmask[fd] |= POLLRDNORM;
else
fdmask[fd] &= ~POLLRDNORM;
if(fd_table[fd].write_handler)
if(F->write_handler)
fdmask[fd] |= POLLWRNORM;
break;
case COMM_SELECT_WRITE:
cur_handler = fd_table[fd].write_handler;
cur_handler = F->write_handler;
if(handler)
fdmask[fd] |= POLLWRNORM;
else
fdmask[fd] &= ~POLLWRNORM;
if(fd_table[fd].read_handler)
if(F->read_handler)
fdmask[fd] |= POLLRDNORM;
break;
default:
@ -166,7 +168,7 @@ void
comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler,
void *client_data, time_t timeout)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
s_assert(fd >= 0);
s_assert(F->flags.open);
@ -235,7 +237,7 @@ comm_select(unsigned long delay)
{
int fd = dopoll.dp_fds[i].fd;
PF *hdl = NULL;
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
if((dopoll.dp_fds[i].
revents & (POLLRDNORM | POLLIN | POLLHUP |
POLLERR))

View file

@ -23,7 +23,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* $Id: epoll.c 390 2005-12-07 18:46:56Z nenolod $
* $Id: epoll.c 3229 2007-03-05 17:23:07Z nenolod $
*/
#include "config.h"
@ -80,7 +80,7 @@ comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler,
void *client_data, time_t timeout)
{
struct epoll_event ep_event;
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
int old_flags = F->pflags;
int op = -1;

View file

@ -22,7 +22,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* $Id: kqueue.c 3205 2007-02-09 22:18:23Z nenolod $
* $Id: kqueue.c 3229 2007-03-05 17:23:07Z nenolod $
*/
#include "stdinc.h"
@ -156,7 +156,7 @@ void
comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler,
void *client_data, time_t timeout)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
s_assert(fd >= 0);
s_assert(F->flags.open);
@ -239,7 +239,7 @@ comm_select(unsigned long delay)
{
int fd = (int) ke[i].ident;
PF *hdl = NULL;
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
if(ke[i].flags & EV_ERROR)
{

View file

@ -22,7 +22,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* $Id: poll.c 390 2005-12-07 18:46:56Z nenolod $
* $Id: poll.c 3229 2007-03-05 17:23:07Z nenolod $
*/
#include "config.h"
@ -81,7 +81,7 @@ poll_findslot(void)
static void
poll_update_pollfds(int fd, short event, PF * handler)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_table(fd);
int comm_index;
if(F->comm_index < 0)
@ -155,7 +155,7 @@ void
comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler,
void *client_data, time_t timeout)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
s_assert(fd >= 0);
s_assert(F->flags.open);
@ -255,7 +255,7 @@ comm_select(unsigned long delay)
(pollfd_list.pollfds[ci].fd) == -1)
continue;
fd = pollfd_list.pollfds[ci].fd;
F = &fd_table[fd];
F = comm_locate_fd(fd);
if(revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR))
{
hdl = F->read_handler;

View file

@ -98,7 +98,7 @@ void
ircd_setselect(int fd, fdlist_t list, unsigned int type, PF * handler,
void *client_data)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
s_assert(fd >= 0);
s_assert(F->flags.open);
@ -148,7 +148,7 @@ ircd_select(unsigned long delay)
case PORT_SOURCE_FD:
fd = pelst[i].portev_object;
PF *hdl = NULL;
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
if ((pelst[i].portev_events & POLLRDNORM) && (hdl = F->read_handler)) {
F->read_handler = NULL;

View file

@ -22,7 +22,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* $Id: select.c 390 2005-12-07 18:46:56Z nenolod $
* $Id: select.c 3229 2007-03-05 17:23:07Z nenolod $
*/
#include "config.h"
@ -105,7 +105,7 @@ void
comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler,
void *client_data, time_t timeout)
{
fde_t *F = &fd_table[fd];
fde_t *F = comm_locate_fd(fd);
s_assert(fd >= 0);
s_assert(F->flags.open);
@ -172,7 +172,7 @@ comm_select(unsigned long delay)
/* XXX we *could* optimise by falling out after doing num fds ... */
for (fd = 0; fd < highest_fd + 1; fd++)
{
F = &fd_table[fd];
F = comm_locate_fd(fd);
if(FD_ISSET(fd, &tmpreadfds))
{