Raised This Month: $ Target: $400
 0% 

Server hangs on mapchange :(


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Gizmo
Senior Member
Join Date: May 2006
Location: Sweden
Old 05-31-2006 , 16:49   Server hangs on mapchange :(
Reply With Quote #1

Can anyone tell me why the server hangs on mapchange because of this plugin

Code:
#include <amxmodx> #include <amxmisc> #include <sqlx> new AUTH[] = "Gizmo" new PLUGIN_NAME[] = "Tidtest" new VERSION[] = "0.1b" new Handle:g_SqlX new g_table[32] new Float:g_onlinetime[33] new maxplayers new g_steamid[32] public plugin_init() {     register_plugin(PLUGIN_NAME, VERSION, AUTH)     register_cvar(PLUGIN_NAME, VERSION, FCVAR_SERVER | FCVAR_SPONLY)     // Sql settings     register_cvar("pi_sql_host", "127.0.0.1")     register_cvar("pi_sql_user", "*****")     register_cvar("pi_sql_pass", "*****")     register_cvar("pi_sql_db", "amx")     register_cvar("pi_sql_table", "amx_tidtest")     //register_logevent ("EndofRound", 2, "1=Round_End")//"0=World triggered" ,     maxplayers = get_maxplayers()     new modname[32]     get_modname(modname,31)     if(equali("cstrike",modname))     {         register_event("SendAudio","EndofRound","a","2=%!MRAD_terwin","2=%!MRAD_ctwin","2=%!MRAD_rounddraw")     }     else if(equali("ns",modname))     {         register_event("GameStatus", "EndofRound", "ab", "1=2")     }     else if(equali("dod",modname))     {         register_event("RoundState","EndofRound","a","1=3","1=4")     }     //Execute configfile for tidtest     new configsDir[64]     get_configsdir(configsDir, 63)     server_cmd("exec %s/tidtest.cfg", configsDir)     server_exec() } public plugin_cfg() {     new host[64], user[64], pass[64], db[64]     get_cvar_string("pi_sql_host", host, 63)     get_cvar_string("pi_sql_user", user, 63)     get_cvar_string("pi_sql_pass", pass, 63)     get_cvar_string("pi_sql_db", db, 63)         g_SqlX = SQL_MakeDbTuple(host, user, pass, db)     set_task(0.1, "create_table") } public create_table() {     new errnum, error[255]     get_cvar_string("pi_sql_table", g_table, 31)     new Handle:db = SQL_Connect(g_SqlX, errnum, error, 254)     if (!db)     {         server_print("Connection failed [%d] %s", errnum, error)         return     }     new Handle:query = SQL_PrepareQuery(db, "CREATE TABLE IF NOT EXISTS `%s` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `authid` VARCHAR(32) NOT NULL DEFAULT '0' , `time` INT(10) UNSIGNED NOT NULL DEFAULT '0' , `connects` INT(10) UNSIGNED NOT NULL DEFAULT '0' , `rounds` INT(10) UNSIGNED NOT NULL DEFAULT '0') ENGINE = MYISAM" , g_table )         if (!SQL_Execute(query))     {         errnum = SQL_QueryError(query, error, 254)         server_print("Query failed [%d] %s", errnum, error)         SQL_FreeHandle(query)         SQL_FreeHandle(db)         return     }     SQL_FreeHandle(query)     SQL_FreeHandle(db) } /////////////////////////////////////////////////////////// public client_putinserver(id) {     if(is_user_connected(id) && !is_user_bot(id))     {         get_user_authid(id, g_steamid, 31)         set_task(0.1, "select_user")         g_onlinetime[id] = get_gametime() - 3.0     }     return PLUGIN_CONTINUE } public select_user(id) {     new query[512]     new data[1]     format(query, 511, "SELECT authid FROM `%s` WHERE `authid` = '%s'", g_table, g_steamid)     data[0] = id     SQL_ThreadQuery(g_SqlX, "insert_user", query, data, 1)     return } public insert_user(failstate, Handle:query, error[], errnum, data[], size) {     new id = data[0]     if (failstate)     {         new szQuery[256]         MySqlX_ThreadError( query, szQuery, error, errnum, failstate, 1 )     }     else     {         new result = SQL_NumResults(query)         if(result == 0)         {             new query[512], data[1]             format(query, 511, "INSERT INTO `%s` ( `authid` , `time` , `connects` , `rounds`) VALUES ( '%s', '0', '1' , '0' )", g_table, g_steamid)             data[0] = id             SQL_ThreadQuery(g_SqlX, "insert_to_table", query, data, 1)         }         else         {             new query[512], data[1]             format(query, 511, "UPDATE `%s` SET `connects`=connects+1 WHERE `authid`='%s'", g_table, g_steamid)             data[0] = id             SQL_ThreadQuery(g_SqlX, "update_table", query, data, 1)         }     } } public insert_to_table(failstate, Handle:query, error[], errnum, data[], size) {     //new id = data[0]     if (failstate)     {         new szQuery[256]         MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 2)     }     SQL_FreeHandle(query) } public update_table(failstate, Handle:query, error[], errnum, data[], size) {     //new id = data[0]     if (failstate)     {         new szQuery[256]         MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 3)     }     SQL_FreeHandle(query) } /////////////////////////////////////////////////////////// public EndofRound() {     new Float:gametime = get_gametime()     for(new id = 1; id <= maxplayers; id++)     if( is_user_connected(id) && !is_user_bot(id))     {         rounds (id, floatround(gametime - g_onlinetime[id]))     } } rounds(id, onlinetime) {     new query[512], data[1]     format(query, 511, "UPDATE `%s` SET `time`=time+%i, `rounds`=rounds+1 WHERE `authid`='%s'", g_table, onlinetime, g_steamid)     data[0] = id     SQL_ThreadQuery(g_SqlX, "round_update", query, data, 1)     new Float:gametime = get_gametime()     g_onlinetime[id] = gametime } public round_update(failstate, Handle:query, error[], errnum, data[], size) {     //new id = data[0]     if (failstate)     {         new szQuery[256]         MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 4)     }     SQL_FreeHandle(query) } /////////////////////////////////////////////////////////// public client_disconnect(id) {     if(!is_user_bot(id))     _client_disconnect(id, floatround(get_gametime() - g_onlinetime[id]))     g_onlinetime[id] = 0.0     return PLUGIN_CONTINUE } _client_disconnect(id, onlinetime) {     new query[512], data[1]     format(query, 511, "UPDATE `%s` SET `time`=time+%i WHERE `authid`='%s'", g_table, onlinetime, g_steamid)     data[0] = id     SQL_ThreadQuery(g_SqlX, "disconnect_update", query, data, 1) } public disconnect_update(failstate, Handle:query, error[], errnum, data[], size) {     //new id = data[0]     if (failstate)     {         new szQuery[256]         MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 5)     }     SQL_FreeHandle(query) } /////////////////////////////////////////////////////////// //update user on map change but not 2 times public plugin_end() {     new Float:gametime = get_gametime()     for(new id = 1; id <= maxplayers; id++)     if( is_user_connected(id) )         endquery(floatround(gametime - g_onlinetime[id]))     SQL_FreeHandle(g_SqlX)     return } endquery(onlinetime) {     server_print("time: %i", onlinetime)     new errnum, error[255]     new Handle:db = SQL_Connect(g_SqlX, errnum, error, 254)     if (!db)     {         server_print("Connection failed [%d] %s", errnum, error)         return     }     new Handle:query = SQL_PrepareQuery(db, "UPDATE `%s` SET `time`=time+%i WHERE `authid`='%s'", g_table, onlinetime, g_steamid)     server_print("Saved userinfo")     if (!SQL_Execute(query))     {         errnum = SQL_QueryError(query, error, 254)         server_print("Query failed [%d] %s", errnum, error)         SQL_FreeHandle(query)         SQL_FreeHandle(db)         return     }     SQL_FreeHandle(query)     SQL_FreeHandle(db) } /////////////////////////////////////////////////////////// MySqlX_ThreadError(Handle:query, szQuery[], error[], errnum, failstate, id) {     if (failstate == TQUERY_CONNECT_FAILED)     {         server_print("TConnection failed!")     }     else if (failstate == TQUERY_QUERY_FAILED)     {         server_print("TQuery failed!")     }     server_print( "[MYSQLX] Threaded query error, location: %d", id );     server_print( "[MYSQLX] Message: %s (%d)", error, errnum );     server_print( "[MYSQLX] Query statement: %s ", szQuery );     SQL_FreeHandle(query) }
__________________
Gizmo is offline
Gizmo
Senior Member
Join Date: May 2006
Location: Sweden
Old 06-02-2006 , 08:28  
Reply With Quote #2

I found the problem.
As you can see i have a regular query at plugin_end for saving ppl at mapchange and another threaded query at client_disconnect.

The problem was that at plugin_end also client_disconnect is run so the query at plugin_end is unnecessary but even when i toke away the query at plugin_end the server still hangs at mapchange.
That was because if you run a threaded query on client_disconnect that is also run at plugin_end and that makes the server hang, probably because
the threaded query takes some time to finish and at plugin_end there is not time for that.

Im no expert at this but when i toke away the query at plugin_end and made the client_disconnect a regular query it works fine and saves the players excactly as i want it to.
__________________
Gizmo is offline
Xanimos
Veteran Member
Join Date: Apr 2005
Location: Florida
Old 06-02-2006 , 08:33  
Reply With Quote #3

When you use SQL_ThreadQuery() you don't use SQL_FreeHandle(query)
Xanimos is offline
Send a message via AIM to Xanimos Send a message via MSN to Xanimos
Gizmo
Senior Member
Join Date: May 2006
Location: Sweden
Old 06-02-2006 , 09:12  
Reply With Quote #4

ok, thx i missed that.....
__________________
Gizmo is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 16:21.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode