diff --git a/xwords4/common/comms.c b/xwords4/common/comms.c index 0dbaa0272..8d961cc8a 100644 --- a/xwords4/common/comms.c +++ b/xwords4/common/comms.c @@ -216,6 +216,33 @@ CommsRelayState2Str( CommsRelayState state ) #undef CASE_STR return NULL; } + +const char* +XWREASON2Str( XWREASON reason ) +{ +#define CASE_STR(s) case s: return #s + switch( reason ) { + CASE_STR(XWRELAY_ERROR_NONE); + CASE_STR(XWRELAY_ERROR_OLDFLAGS); + CASE_STR(XWRELAY_ERROR_BADPROTO); + CASE_STR(XWRELAY_ERROR_RELAYBUSY); + CASE_STR(XWRELAY_ERROR_SHUTDOWN); + CASE_STR(XWRELAY_ERROR_TIMEOUT); + CASE_STR(XWRELAY_ERROR_HEART_YOU); + CASE_STR(XWRELAY_ERROR_HEART_OTHER); + CASE_STR(XWRELAY_ERROR_LOST_OTHER); + CASE_STR(XWRELAY_ERROR_OTHER_DISCON); + CASE_STR(XWRELAY_ERROR_NO_ROOM); + CASE_STR(XWRELAY_ERROR_DUP_ROOM); + CASE_STR(XWRELAY_ERROR_TOO_MANY); + CASE_STR(XWRELAY_ERROR_DELETED); + CASE_STR(XWRELAY_ERROR_LASTERR); + default: + XP_ASSERT(0); + } +#undef CASE_STR + return NULL; +} #endif static void @@ -236,7 +263,7 @@ static void init_relay( CommsCtxt* comms, XP_U16 nPlayersHere, XP_U16 nPlayersTotal ) { comms->r.myHostID = comms->isServer? HOST_ID_SERVER: HOST_ID_NONE; - XP_LOGF( "%s: set myHostID to %d", __func__, comms->r.myHostID ); + XP_LOGF( "%s: set hostid: %x", __func__, comms->r.myHostID ); set_relay_state( comms, COMMS_RELAYSTATE_UNCONNECTED ); comms->r.nPlayersHere = nPlayersHere; comms->r.nPlayersTotal = nPlayersTotal; @@ -1173,6 +1200,7 @@ got_connect_cmd( CommsCtxt* comms, XWStreamCtxt* stream, set_relay_state( comms, reconnected ? COMMS_RELAYSTATE_RECONNECTED : COMMS_RELAYSTATE_CONNECTED ); comms->r.myHostID = stream_getU8( stream ); + XP_LOGF( "%s: set hostid: %x", __func__, comms->r.myHostID ); isServer = HOST_ID_SERVER == comms->r.myHostID; if ( isServer != comms->isServer ) { comms->isServer = isServer; @@ -1241,7 +1269,7 @@ relayPreProcess( CommsCtxt* comms, XWStreamCtxt* stream, XWHostID* senderID ) XP_ASSERT( comms->r.myHostID == HOST_ID_NONE || comms->r.myHostID == srcID ); comms->r.myHostID = srcID; - XP_LOGF( "set hostid: %x", comms->r.myHostID ); + XP_LOGF( "%s: set hostid: %x", __func__, comms->r.myHostID ); #ifdef DEBUG { diff --git a/xwords4/common/comms.h b/xwords4/common/comms.h index 902e01504..939acf9b4 100644 --- a/xwords4/common/comms.h +++ b/xwords4/common/comms.h @@ -195,6 +195,7 @@ XP_Bool comms_isConnected( const CommsCtxt* const comms ); void comms_getStats( CommsCtxt* comms, XWStreamCtxt* stream ); const char* ConnType2Str( CommsConnType typ ); const char* CommsRelayState2Str( CommsRelayState state ); +const char* XWREASON2Str( XWREASON reason ); # endif EXTERN_C_END diff --git a/xwords4/linux/cursesmain.c b/xwords4/linux/cursesmain.c index 6ff5f44dc..34ed7f8c0 100644 --- a/xwords4/linux/cursesmain.c +++ b/xwords4/linux/cursesmain.c @@ -1432,9 +1432,11 @@ relay_connd_curses( void* XP_UNUSED(closure), XP_UCHAR* const XP_UNUSED(room), } static void -relay_error_curses( void* XP_UNUSED(closure), XWREASON XP_UNUSED(relayErr) ) +relay_error_curses( void* XP_UNUSED(closure), XWREASON XP_UNUSED_DBG(relayErr) ) { - LOG_FUNC(); +#ifdef DEBUG + XP_LOGF( "%s(%s)", __func__, XWREASON2Str( relayErr ) ); +#endif } void diff --git a/xwords4/linux/scripts/discon_ok2.sh b/xwords4/linux/scripts/discon_ok2.sh index 5135f81df..bad85f7da 100755 --- a/xwords4/linux/scripts/discon_ok2.sh +++ b/xwords4/linux/scripts/discon_ok2.sh @@ -8,6 +8,7 @@ PORT=${PORT:-10997} TIMEOUT=${TIMEOUT:-$((NGAMES*60+500))} DICTS=${DICTS:-dict.xwd} SAVE_GOOD=${SAVE_GOOD:-YES} +RESIGN_RATIO=${RESIGN_RATIO:-$((NGAMES/3))} declare -a DICTS_ARR for DICT in $DICTS; do @@ -24,6 +25,8 @@ if [ "$SAVE_GOOD" = YES ]; then DONEDIR=$LOGDIR/done mkdir -p $DONEDIR fi +DEADDIR=$LOGDIR/dead +mkdir -p $DEADDIR USE_GTK=${USE_GTK:-FALSE} @@ -109,7 +112,8 @@ build_cmds() { COUNTER=$((COUNTER+1)) done done -} + echo "finished creating $COUNTER commands" +} # build_cmds launch() { LOG=${LOGS[$1]} @@ -137,6 +141,28 @@ close_device() { unset LOGS[$ID] } +kill_from_log() { + LOG=$1 + RELAYID=$(./scripts/relayID.sh $LOG) + if [ -n "$RELAYID" ]; then + ../relay/rq -d $RELAYID 2>/dev/null || true + return 0 # success + fi + return 1 +} + +maybe_resign() { + KEY=$1 + LOG=${LOGS[$KEY]} + if grep -q XWRELAY_ALLHERE $LOG; then + if [ 0 -eq $(($RANDOM % $RESIGN_RATIO)) ]; then + echo "making $LOG $(connName $LOG) resign..." + kill_from_log $LOG && close_device $KEY $DEADDIR + fi + fi +} + + check_game() { KEY=$1 LOG=${LOGS[$KEY]} @@ -164,13 +190,16 @@ check_game() { echo -n "Closing $CONNNAME: " for ID in $OTHERS $KEY; do echo -n "${LOGS[$ID]}, " - RELAYID=$(./scripts/relayID.sh ${LOGS[$ID]}) - if [ -n "$RELAYID" ]; then - ../relay/rq -d $RELAYID 2>/dev/null || true - fi + kill_from_log ${LOGS[$ID]} || true close_device $ID $DONEDIR done date + elif grep -q 'relay_error_curses(XWRELAY_ERROR_DELETED)' $LOG; then + echo "deleting $LOG $(connName $LOG) b/c another resigned" + kill_from_log $LOG || true + close_device $KEY $DEADDIR + else + maybe_resign $KEY fi }