2017-07-27 2 views
-1

Ich möchte das mysql-proxy lua Skript, um Interleaving Zugriffe auf eine Website (z. B. zwei verschiedene Browser-Fenster/Benutzer) zu behandeln, aber in der Lage, eine der beiden zu pausieren/zu verzögern, ohne die anderen zu beeinflussen.Handling Sessions Interleavingly ist möglich in mysql-proyx lua (so scheint es in Bezug auf die später aufgeführten Ausgabe), aber sobald ich beginne zu verzögern das Skript blockiert es alles und die andere Sitzung kann auch nicht weiter.pause eine einzelne Sitzung, aber weiterverarbeitung

-- the query which indicates the session/connection that shall be delayed at that execution 
local qoi = "SELECT loginattempts,uid FROM mybb_users WHERE username='user1' LIMIT 1" 

function read_query(packet) 
     if string.byte(packet) == proxy.COM_QUERY then 
       query = packet:sub(2) 
       start_time = os.time() 
       if query == qoi then 
         print("busy wait") 
         while os.time() < start_time + 20 do 
           --nothing 
         end 
         print("busy wait end") 
       end 
       print("Connection id: " .. proxy.connection.server.thread_id) 
     end 
end 

Allerdings endet dieses Skript mit Ausgang auf:

Connection id: 36 
busy wait 
busy wait end 
Connection id: 36 
Connection id: 36 
Connection id: 36 
Connection id: 37 
Connection id: 37 
Connection id: 36 
Connection id: 36 
Connection id: 36 
Connection id: 37 

und nicht die erwarteten

Connection id: 36 
busy wait 
connection id: 37 
connection id: 37 
busy wait end 
Connection id: 36 

ist meine Absicht, noch erreichbar, und wenn ja, wie?

+0

@ i486 Ich würde einen längeren Kommentar/eine Antwort schätzen. Wenn mein Denken ernsthaft fehlerhaft ist und meine Absicht nicht erreichbar ist, wäre eine Antwort, die genau dies erklärt, genauso gut wie alles andere. Es gibt nichts da draußen, das diesen (potentiellen) Anwendungsfall abdeckt, und eine definitive Antwort würde die nächste arme Seele retten, die versucht, dies irgendwann zu erreichen. – Sim

+0

Ihr Programm nicht schlafen, es ist wirklich sehr beschäftigt, das leere während Schleife laufen, – Piglet

+0

@Piglet Ich bin mir dessen bewusst, obwohl gegeben, dass Lua keinen Schlaf ein "beschäftigt warten" ist alles, was ich soweit ich weiß. Die allgemeine Absicht besteht darin, diese Sitzung/Ausführung ausreichend zu verzögern, um andere parallele Ausführungen verschachteln zu lassen. Ich habe den beleidigenden Abschnitt meiner Frage bearbeitet. – Sim

Antwort

0

Es scheint unmöglich zu sein, die Sitzung innerhalb von Lua zu verzögern, aber es funktioniert genauso gut, wenn ich die Verzögerung auf mysql Server auslagere, da dies auch das Interleaving erzwingt.

local DEBUG = true 

local qoi = "SELECT loginattempts,uid FROM mybb_users WHERE username='user1' LIMIT 1" 


function read_query(packet) 
     ret = nil 
     comp_query = qoi 
     if string.byte(packet) == proxy.COM_QUERY then 
       query = packet:sub(2) 
       if query == comp_query then 
         if DEBUG then 
           print("found matching query " .. packet:sub(2)) 
           print("insert sleep") 
         end 
         inj_query = "SELECT sleep(30);" 
         new_packet = string.char(proxy.COM_QUERY) .. inj_query 
         proxy.queries:append(1, new_packet, { resultset_is_needed = true }) 
         proxy.queries:append(2, packet, { resultset_is_needed = true }) 
         ret = proxy.PROXY_SEND_QUERY 
       end 
     end 
     return ret 
end 


function read_query_result(inj) 
     if inj.id == 1 then 
       if DEBUG then 
         print("sleep query returns") 
       end 
       return proxy.PROXY_IGNORE_RESULT 
     end 
     if inj.id == 2 then 
       if DEBUG then 
         print("regular query returns") 
       end 
       return 
     end 
     return 
end 
Verwandte Themen