ingard
May 03, 2017Nimbostratus
LB_SELECTED is processed twice when doing LB::RESELECT
I've got the following code to reselect which backend gets hit based on what response code we get from the initial request:
when CLIENT_ACCEPTED {
set retries 0
set debug 5
set default_pool pool_media_transcoding
}
when HTTP_REQUEST {
pool $default_pool
if { $retries == 0 } {
set request [HTTP::request]
}
if { $debug > 4 } { log local0. "HTTP_REQUEST - Retries : $retries - Request: $request" }
}
when LB_SELECTED {
if { $debug > 0 } { log local0. "when LB_SELECTED : Retries : $retries - Server Selected : [LB::server pool] [LB::server addr]:[LB::server port]" }
if { $retries == 0 } {
Log LB pool/server selection
if { $debug > 0 } { log local0. "Retries : $retries - Server Selected : [LB::server pool] [LB::server addr]:[LB::server port]" }
} else {
Reselect LB node if retries > 0
if { $debug > 0 } { log local0. "Retries : $retries. wanted host/port = $wantedhost:$wantedport" }
LB::reselect pool dev-pool_media_transcoding member $wantedhost $wantedport
LB::reselect pool dev-pool_media_transcoding
LB::reselect node $wantedhost $wantedport
Log LB pool/server selection
if { $debug > 0 } { log local0. "Retries : $retries - Server Selected : [LB::server pool] [LB::server addr]:[LB::server port]" }
}
}
when SERVER_CONNECTED {
if {$debug > 0}{log local0. "[IP::client_addr]:[TCP::client_port]: Server IP:port: [IP::server_addr]:[TCP::server_port]"}
}
when HTTP_RESPONSE {
if { [HTTP::status] eq 302 && $retries == 0 } {
if {[HTTP::header X-TRANSCODE-REDIRECT-HOST] eq ""}{
if { $debug > 0 } { log local0. "We got 302 from backend, but no X-TRANSCODE-REDIRECT-HOST header set" }
} else {
set wantedhost [lindex [split [HTTP::header X-TRANSCODE-REDIRECT-HOST] ":"] 0]
set wantedport [lindex [split [HTTP::header X-TRANSCODE-REDIRECT-HOST] ":"] 1]
if { $debug > 0 } { log local0. "We got 302 from backend. It wants us to redirect to $wantedhost : $wantedport" }
incr retries
HTTP::retry "$request"
}
} else {
set retries 0
}
}
The "problem" is that LB_SELECTED gets processed twice when retries=1. Why is that? When the HTTP::Retry happens I expected the request to go through to the reselected backend when it is set, but it seems it runs through LB_SELECTED again?