Narutimmy Posted December 22, 2015 Share Posted December 22, 2015 Hola tengo este sistema de grupos pero tengo un problema no lo e editado en los ultimos meses y ase unso 2 dias ahi un bug algo raro, de la nada comienza a hacer algun proceso infinito, me tira el mensaje de abortado, pero mientras lo aborta ya me subio a 100% CPU, y eso lo hace por ratos cada 30seg aprox ... Server: ------------------------------------------------------------------------------------ -- PROJECT: N/A -- RIGHTS: All rights reserved by developers -- FILE: groupSystem/group.slua -- DEVELOPER: Sebbe (Smart) ------------------------------------------------------------------------------------ local groupTable = {} local logging = false -- Set this to false if you don't want group stuff to be logged in your server.log local debugInfo = false -- Set this to false if you don't want to see see group logs in your debug mode. local GAC = {} -- index = account (string), [1] = group name, [2] = rank, [3] = warning level, [4] = date Joined, [5] = last time online (Not Available) local users = {} local myGang = {} local char = "[^0-9a-zA-Z_]" local rankCache = {} local db = dbConnect("sqlite", "group/database.db") dbExec(db, "CREATE TABLE IF NOT EXISTS groupmember (account TEXT, groupName TEXT, rank TEXT, warningLvl TEXT, joined TEXT, lastTime TEXT)") dbExec(db, "CREATE TABLE IF NOT EXISTS groups (name TEXT, leader TEXT, message TEXT, chatcolor TEXT, notecolor TEXT, date TEXT, turfcolor TEXT, cashflow TEXT)") dbExec(db, "CREATE TABLE IF NOT EXISTS groupRanks (groupName TEXT, name TEXT, permissions TEXT)") dbExec(db, "CREATE TABLE IF NOT EXISTS groupVault (groupName TEXT, leader TEXT)") playerTeam = createTeam("Player") --Some misc functions _outputDebugString = outputDebugString function outputDebugString(string) if (debugInfo) then _outputDebugString(string) end end function getTheTime() local time = getRealTime() local date = string.format("%02d/%02d/%02d", time.monthday, (time.month+1), (time.year-100) ) local time = string.format("%02d:%02d", time.hour, time.minute) return date, time end MTAoutput = outputChatBox function outputChatBox(message, player, r, g, b, bool) if (isElement(message) and getElementType(message) == "player") then MTAoutput(player, message, r, g, b, bool) else MTAoutput(message, player, r, g, b, bool) end end function groupLog(group, message) if (logging) then outputServerLog("GROUP: "..group.." - "..message) end --[[ if (debugInfo) then outputDebugString("GROUP: "..group.." - "..message) end ]] end --Lets start local permToTable = { [1] = "invite", [2] = "promote", [3] = "demote", [4] = "kick", [5] = "warn", [6] = "delete", [7] = "deposit", [8] = "withdraw", [9] = "editInfo", [10] = "viewLog", [11] = "viewBlacklist", [12] = "addBlacklist", [13] = "modifyAlliance", [14] = "modifyRanks", } function GetAccount(plr) if (plr and isElement(plr)) then return getAccountName(getPlayerAccount(plr)) end end function loadGroupRanks(query) local the_table = dbPoll(query, 0) if (the_table) then for ind, data in pairs(the_table) do if (not rankCache[data.groupName]) then rankCache[data.groupName] = {} end if (not rankCache[data.groupName][data.name]) then rankCache[data.groupName][data.name] = {} end local JSONtable = fromJSON(data.permissions) for ind, value in pairs(JSONtable) do if (value and ind) then rankCache[data.groupName][data.name][ind] = true end end end end end dbQuery(loadGroupRanks, db, "SELECT * FROM groupRanks") function loadGroupStuff(query) local g_table = dbPoll(query, 0) if (not g_table) then return end for ind, data in ipairs(g_table) do groupTable[data.name] = {data.leader, data.message, data.chatcolor, data.notecolor, data.date, data.turfcolor, data.cashflow} end end dbQuery(loadGroupStuff, db, "SELECT * FROM groups") function loadClientGroup(query) local g_table = dbPoll(query, 0) if (not g_table) then return end for ind, data in ipairs(g_table) do if (getAccount(data.account)) then local player = getAccountPlayer(getAccount(data.account)) users[data.groupName] = {} table.insert(users[data.groupName], data.account) if (player) then setElementData(player, "gang", data.groupName) myGang[player] = data.groupName end GAC[data.account] = {data.groupName, data.rank, data.warningLvl, data.joined, data.lastTime or 0} end end end dbQuery(loadClientGroup, db, "SELECT * FROM groupmember") function addRank(group, rank, permissionTable) if (not rankCache[group]) then rankCache[group] = {} end --rankCache[group][rank] = {fromJSON(permissionTable)} dbExec(db, "INSERT INTO groupRanks VALUES (?, ?, ?)", tostring(group), tostring(rank), permissionTable) dbQuery(loadGroupRanks, db, "SELECT * FROM groupRanks") end function removeRank(group, rank) if (not rankCache[group]) then return true end if (rankCache[group][rank]) then rankCache[group][rank] = nil dbExec(db, "DELETE FROM groupRanks WHERE name=? AND groupName=?", tostring(rank), tostring(group)) dbQuery(loadGroupRanks, db, "SELECT * FROM groupRanks") return true end end function isRank(group, rank) if (not rankCache[group]) then return false end return rankCache[group][rank] end function groupMemberLogin() if (GAC[GetAccount(source)]) then myGang[source] = GAC[GetAccount(source)][1] setElementData(source, "gang", GAC[GetAccount(source)][1]) setPlayerTeam(source,playerTeam) local date, time = getTheTime() local date = date.." - "..time GAC[GetAccount(source)][5] = date end end addEventHandler("onPlayerLogin", root, groupMemberLogin) function groupMemberQuit() if (GAC[GetAccount(source)]) then local date, time = getTheTime() local date = date.." - "..time GAC[GetAccount(source)][5] = date end end addEventHandler("onPlayerQuit", root, groupMemberQuit) function getGroupMembers(group) local temp = {} for ind, data in pairs(users) do if (ind == group) then table.insert(temp, data[1]) end end return temp end function getPlayerGroup(player) if (not GAC[GetAccount(player)]) then return false end return GAC[GetAccount(player)][1] end function getPlayerGroupRank(player) if (not GAC[GetAccount(player)]) then return false end return GAC[GetAccount(player)][2] end function getPlayerWarningLevel(player) if (not GAC[GetAccount(player)]) then return false end return GAC[GetAccount(player)][3] end function getGroupBankAmount(group) if (not groupTable[group]) then return end return groupTable[group][7] end function getPlayerJoinDate(player) if (not GAC[GetAccount(player)]) then return false end return GAC[GetAccount(player)][4] end function getHexCode(r, g, b) if (r and g and b) then return string.format("#%.2X%.2X%.2X", r, g, b) end end function getGroupChatColor(group) if (not groupTable[group]) then return 255, 255, 255 end local color = fromJSON(groupTable[group][3]) return color[1], color[2], color[3] end function getGroupTurfColor(group) if (not groupTable[group]) then return 255, 255, 255 end local color = fromJSON(groupTable[group][6]) return color[1], color[2], color[3] end function outputGroupMessage(message, group) for ind, data in pairs(GAC) do if (data[1] == group) then local acc = getAccount(ind) if (getAccountPlayer(acc)) then local color = fromJSON(groupTable[group][3]) local hex = getHexCode(color[1], color[2], color[3]) outputChatBox("[CAMP] "..message, getAccountPlayer(acc), 9,249,17, true) groupLog(group, message) end end end end function checkGroupAccess(player, actionID) local rank = getPlayerGroupRank(player) local group = getPlayerGroup(player) if (not rankCache[group]) then return false end if (rankCache[group] and rankCache[group][rank]) then if (tostring(actionID)) then for ind, data in pairs(permToTable) do if (data == actionID) then actionID = ind break end Link to comment
Narutimmy Posted December 22, 2015 Author Share Posted December 22, 2015 ¿En dónde ocurre? No lose por eso lo publique , ese es el resource completo de la nada comienza ese problema tengo meses sin editar el resource, y de hace 2 dias comenzo a pasar esto. y pasa cada nose 3h por ejemplo , durante unos 30mins o mas.... este mismo error una y otra vez Link to comment
Narutimmy Posted January 12, 2016 Author Share Posted January 12, 2016 Por favor? alguien que sepa como arreglarlo? me esta matando el servidor esto Link to comment
Tomas Posted January 12, 2016 Share Posted January 12, 2016 ¿Idea de cuándo pasa? ¿Alguna relación entre las veces que pasa? (cada x segundos, siempre), addonGrup es el recurso? Link to comment
Narutimmy Posted January 12, 2016 Author Share Posted January 12, 2016 ¿Idea de cuándo pasa? ¿Alguna relación entre las veces que pasa? (cada x segundos, siempre), addonGrup es el recurso? Pasa normalmente cuando el servidor tiene mas de 80 users aprox, aonque tamboen a pasado con 40. Comienza el bucle... mta lo detiene y comienza de nuevo pasa por lo menos por 30 mins o 1h.. hasta que los usuarios se desesperan y mejor se desconectan entonces baja el numero de usuarios y deja de pasar... Link to comment
starksZ Posted January 12, 2016 Share Posted January 12, 2016 Puede ser algun while mal usado Link to comment
Narutimmy Posted January 12, 2016 Author Share Posted January 12, 2016 Puede ser algun while mal usado arriba esta todo el codigo es un resouce libre de la comunidad Link to comment
starksZ Posted January 12, 2016 Share Posted January 12, 2016 no encontre ningun while Link to comment
Tomas Posted January 12, 2016 Share Posted January 12, 2016 Comprueba si lo del stackoverflow aparece en la consola Link to comment
Narutimmy Posted January 12, 2016 Author Share Posted January 12, 2016 Comprueba si lo del stackoverflow aparece en la consola ya lo revise y monitore por un buen tiempo y nada solo sale lo de aborting y network trouble Link to comment
Tomas Posted January 13, 2016 Share Posted January 13, 2016 Comprueba si lo del stackoverflow aparece en la consola ya lo revise y monitore por un buen tiempo y nada solo sale lo de aborting y network trouble Es algún loop que está tomando mucho tiempo en ejecutarse o simplemente es infinito, aquí tienes una forma de darte cuenta cuál es: debugging = {} function onFunctionCall(func) if ( #debugging > 5 ) then debugging = {} end debugging[#debugging+1] = {func, debug.getinfo(_G[func]).linedefined} end addEventHandler("onResourceStop", resourceRoot, function () outputDebugString("Resource stopped, listing last called functions...") for ind, data in ipairs(debugging) do outputDebugString(ind..": "..table.concat(data), ", ") end end) Y en cada función que haya algún loop (al inicio de la función) agrega: onFunctionCall(debug.getinfo(1).name) Link to comment
Narutimmy Posted January 13, 2016 Author Share Posted January 13, 2016 Comprueba si lo del stackoverflow aparece en la consola ya lo revise y monitore por un buen tiempo y nada solo sale lo de aborting y network trouble Es algún loop que está tomando mucho tiempo en ejecutarse o simplemente es infinito, aquí tienes una forma de darte cuenta cuál es: debugging = {} function onFunctionCall(func) if ( #debugging > 5 ) then debugging = {} end debugging[#debugging+1] = {func, debug.getinfo(_G[func]).linedefined} end addEventHandler("onResourceStop", resourceRoot, function () outputDebugString("Resource stopped, listing last called functions...") for ind, data in ipairs(debugging) do outputDebugString(ind..": "..table.concat(data), ", ") end end) Y en cada función que haya algún loop (al inicio de la función) agrega: onFunctionCall(debug.getinfo(1).name) no enterndi mucho, esto es para identificar el problema no? Lo Primero va al inicio o al final del script? y seria cliente o servidor? y lo segundo donde va? Link to comment
TheCrazy17 Posted January 13, 2016 Share Posted January 13, 2016 A mi me sucedía eso cuando se pulsaba el botón "Lista de grupos", chequea pulsando el mismo si sale ese error. Link to comment
Tomas Posted January 13, 2016 Share Posted January 13, 2016 Agrega esto al principio de cada función donde haya algún for-loop: onFunctionCall(debug.getinfo(1).name) Link to comment
Narutimmy Posted January 13, 2016 Author Share Posted January 13, 2016 A mi me sucedía eso cuando se pulsaba el botón "Lista de grupos", chequea pulsando el mismo si sale ese error. Joven... acaba de salvar mi trasero, realize la prueba y efewctivamente es eso... si le das 1 vez lagea poco... pero si le das 2...4..10 veces full lag 500% CPU, y suponeo que los users al darle click normal ok , pero como no sale nada es tipico darle muchos clicks. Link to comment
Tomas Posted January 13, 2016 Share Posted January 13, 2016 A mi me sucedía eso cuando se pulsaba el botón "Lista de grupos", chequea pulsando el mismo si sale ese error. Joven... acaba de salvar mi trasero, realize la prueba y efewctivamente es eso... si le das 1 vez lagea poco... pero si le das 2...4..10 veces full lag 500% CPU, y suponeo que los users al darle click normal ok , pero como no sale nada es tipico darle muchos clicks. Puedes hacer lo que hacemos en mi servidor, en vez de cada vez hacer un query a la base de datos cuando el resource carga guardas los grupos en una tabla, cuando un miembro se sale, entra, bla bla bla, actualizas la tabla y en vez de hacer un query tomas la información desde ahí y no lag Link to comment
Narutimmy Posted January 13, 2016 Author Share Posted January 13, 2016 A mi me sucedía eso cuando se pulsaba el botón "Lista de grupos", chequea pulsando el mismo si sale ese error. Joven... acaba de salvar mi trasero, realize la prueba y efewctivamente es eso... si le das 1 vez lagea poco... pero si le das 2...4..10 veces full lag 500% CPU, y suponeo que los users al darle click normal ok , pero como no sale nada es tipico darle muchos clicks. Puedes hacer lo que hacemos en mi servidor, en vez de cada vez hacer un query a la base de datos cuando el resource carga guardas los grupos en una tabla, cuando un miembro se sale, entra, bla bla bla, actualizas la tabla y en vez de hacer un query tomas la información desde ahí y no lag se me iso mas sencillo quitar el boton ya que es una funciona que no usamos osea es inecesaria. Link to comment
Recommended Posts