Jump to content

Ayuda Bucle Infinito Gang System


Narutimmy

Recommended Posts

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
¿En dónde ocurre?

No lose por eso lo publique , ese es el resource completo de la nada comienza ese problema :/

1LfbzGk.png

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
  • 3 weeks later...
¿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
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
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? :S

Link to comment
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
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 :D

Link to comment
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 :D

se me iso mas sencillo quitar el boton ya que es una funciona que no usamos xD osea es inecesaria.

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...