[Spread-cvs] commit: r456 - trunk/daemon
jschultz at spread.org
jschultz at spread.org
Tue Jan 10 12:40:41 EST 2012
Author: jschultz
Date: 2012-01-10 12:40:40 -0500 (Tue, 10 Jan 2012)
New Revision: 456
Modified:
trunk/daemon/Changelog
trunk/daemon/session.c
Log:
Changed the way we badger sessions to now also monitor for writeability with LOW_PRIORITY.
Modified: trunk/daemon/Changelog
===================================================================
--- trunk/daemon/Changelog 2012-01-09 20:35:02 UTC (rev 455)
+++ trunk/daemon/Changelog 2012-01-10 17:40:40 UTC (rev 456)
@@ -1,3 +1,17 @@
+Tue Jan 10 12:30:48 2012 John Schultz <jschultz at spreadconcepts.com>
+
+ * session.c: Changed the way we "badger" client sessions that have
+ blocked. We now schedule both timeout and write-ability callbacks
+ on the client session. This should ensure that clients usuaully
+ don't see long delays in the delivery of their messages due to the
+ badger timeout. That old behavior can reassert itself during
+ memberships where we block LOW_PRIORITY events. It was felt that
+ condition is so rare and we will likely block delivery of messages
+ right around the membership regardless (until EVS closes) as to
+ be a minimal concern versus treating writeable clients as
+ MEDIUM or HIGH priority events, which could have unforseen negative
+ effects on Spread's event processing.
+
Mon Jan 9 12:52:10 2012 John Schultz <jschultz at spreadconcepts.com>
* sp.c, session.c: Added SO_KEEPALIVE to client sessions.
Modified: trunk/daemon/session.c
===================================================================
--- trunk/daemon/session.c 2012-01-09 20:35:02 UTC (rev 455)
+++ trunk/daemon/session.c 2012-01-10 17:40:40 UTC (rev 456)
@@ -110,7 +110,9 @@
static void Sess_accept( mailbox mbox, int domain, void *dummy );
static void Sess_accept_continue( mailbox, int, void * );
static void Sess_read( mailbox mbox, int domain, void *dummy );
-static void Sess_badger( mailbox mbox, void *dummy );
+static void Sess_badger( mailbox mbox );
+static void Sess_badger_TO( mailbox mbox, void *dummy );
+static void Sess_badger_FD( mailbox mbox, int dmy, void *dmy2 );
static void Sess_kill( mailbox mbox );
static void Sess_handle_join( message_link *mess_link );
static void Sess_handle_leave( message_link *mess_link );
@@ -1456,9 +1458,10 @@
}
/* close the mailbox and mark it unoperational */
- E_dequeue( Sess_badger, mbox, NULL );
+ E_dequeue( Sess_badger_TO, mbox, NULL );
E_detach_fd( mbox, READ_FD );
E_detach_fd( mbox, EXCEPT_FD );
+ E_detach_fd( mbox, WRITE_FD );
close( mbox );
/* the mailbox is closed but the entry still points to it */
Sessions[ses].status = Clear_op_session( Sessions[ses].status );
@@ -1552,7 +1555,7 @@
if( Sessions[ses].num_mess > 0 )
{
- Sess_badger( Sessions[ses].mbox , NULL);
+ Sess_badger( Sessions[ses].mbox );
}
msg = mess_link->mess;
@@ -1656,7 +1659,8 @@
Message_calculate_current_location(tmp_link->mess, len_sent, &(Sessions[ses].write) );
/* We will need to badger this guy */
- E_queue( Sess_badger, Sessions[ses].mbox, NULL, Badger_timeout );
+ E_queue( Sess_badger_TO, Sessions[ses].mbox, NULL, Badger_timeout );
+ E_attach_fd( Sessions[ses].mbox, WRITE_FD, Sess_badger_FD, 0, NULL, LOW_PRIORITY );
}else{
/* This guy was already badgered */
Sessions[ses].last->next = tmp_link;
@@ -1667,7 +1671,7 @@
Message_Dec_Refcount(msg);
}
-static void Sess_badger( mailbox mbox, void *dummy )
+static void Sess_badger( mailbox mbox )
{
int ses;
message_link *mess_link;
@@ -1681,11 +1685,8 @@
Alarm( SESSION, "Sess_badger: for mbox %d\n", mbox );
ses = Sess_get_session_index( mbox );
- if( ses < 0 || ses >= MAX_SESSIONS ) return;
- if( !Is_op_session( Sessions[ses].status ) ) return;
+ if( ses < 0 || ses >= MAX_SESSIONS || !Is_op_session( Sessions[ses].status ) || Sessions[ses].num_mess <= 0 ) goto NO_WORK;
- if( Sessions[ses].num_mess <= 0 ) return;
-
/* set file descriptor to non blocking */
ioctl_cmd = 1;
ret = ioctl( mbox, FIONBIO, &ioctl_cmd);
@@ -1751,9 +1752,27 @@
ioctl_cmd = 0;
ret = ioctl( mbox, FIONBIO, &ioctl_cmd);
- if( Sessions[ses].num_mess > 0 ) E_queue( Sess_badger, mbox, NULL, Badger_timeout );
+ if( Sessions[ses].num_mess > 0 ) {
+ E_queue( Sess_badger_TO, mbox, NULL, Badger_timeout );
+ E_attach_fd( mbox, WRITE_FD, Sess_badger_FD, 0, NULL, LOW_PRIORITY );
+
+ }else{
+ NO_WORK:
+ E_dequeue( Sess_badger_TO, mbox, NULL );
+ E_detach_fd( mbox, WRITE_FD );
+ }
}
+static void Sess_badger_TO( mailbox mbox, void *dmy )
+{
+ Sess_badger( mbox );
+}
+
+static void Sess_badger_FD( mailbox mbox, int dmy, void *dmy2 )
+{
+ Sess_badger( mbox );
+}
+
static void Sess_kill( mailbox mbox )
{
int ses;
@@ -1813,9 +1832,10 @@
Sessions[ses].read_mess = NULL;
/* close the mailbox and mark it unoperational */
- E_dequeue( Sess_badger, mbox, NULL );
+ E_dequeue( Sess_badger_TO, mbox, NULL );
E_detach_fd( mbox, READ_FD );
E_detach_fd( mbox, EXCEPT_FD );
+ E_detach_fd( mbox, WRITE_FD );
close(mbox);
/* the mailbox is closed but the entry still points to it */
Sessions[ses].status = Clear_op_session( Sessions[ses].status );
More information about the Spread-cvs
mailing list