Skip to content

Commit 63a99c7

Browse files
committed
Optimize server selection with lazy evaluation
Implement lazy server selection to avoid unnecessary lock acquisition when queries are dropped or rejected by plugins. Instead of calling serversInfo.getOne(), we now pass a callback function that retrieves server info only when needed.
1 parent 21bb5ed commit 63a99c7

2 files changed

Lines changed: 59 additions & 33 deletions

File tree

dnscrypt-proxy/plugins.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ func NewPluginsState(
273273
func (pluginsState *PluginsState) ApplyQueryPlugins(
274274
pluginsGlobals *PluginsGlobals,
275275
packet []byte,
276-
needsEDNS0Padding bool,
276+
getServerInfo func() (*ServerInfo, bool),
277277
) ([]byte, error) {
278278
msg := dns.Msg{}
279279
if err := msg.Unpack(packet); err != nil {
@@ -318,12 +318,18 @@ func (pluginsState *PluginsState) ApplyQueryPlugins(
318318
if err != nil {
319319
return packet, err
320320
}
321-
if needsEDNS0Padding && pluginsState.action == PluginsActionContinue {
322-
padLen := 63 - ((len(packet2) + 63) & 63)
323-
if paddedPacket2, _ := addEDNS0PaddingIfNoneFound(&msg, packet2, padLen); paddedPacket2 != nil {
324-
return paddedPacket2, nil
321+
322+
// Only get server info if we're continuing and need padding
323+
if pluginsState.action == PluginsActionContinue && getServerInfo != nil {
324+
_, needsEDNS0Padding := getServerInfo()
325+
if needsEDNS0Padding {
326+
padLen := 63 - ((len(packet2) + 63) & 63)
327+
if paddedPacket2, _ := addEDNS0PaddingIfNoneFound(&msg, packet2, padLen); paddedPacket2 != nil {
328+
return paddedPacket2, nil
329+
}
325330
}
326331
}
332+
327333
return packet2, nil
328334
}
329335

dnscrypt-proxy/proxy.go

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -713,17 +713,29 @@ func (proxy *Proxy) processIncomingQuery(
713713
// Initialize plugin state
714714
pluginsState := NewPluginsState(proxy, clientProto, clientAddr, serverProto, start)
715715

716-
// Get server info and initialize parameters
717-
serverName := "-"
718-
needsEDNS0Padding := false
719-
serverInfo := proxy.serversInfo.getOne()
720-
if serverInfo != nil {
721-
serverName = serverInfo.Name
722-
needsEDNS0Padding = (serverInfo.Proto == stamps.StampProtoTypeDoH || serverInfo.Proto == stamps.StampProtoTypeTLS)
723-
}
724-
725-
// Apply query plugins
726-
query, _ = pluginsState.ApplyQueryPlugins(&proxy.pluginsGlobals, query, needsEDNS0Padding)
716+
var serverInfo *ServerInfo
717+
var serverName string = "-"
718+
719+
// Apply query plugins with lazy server selection
720+
query, _ = pluginsState.ApplyQueryPlugins(
721+
&proxy.pluginsGlobals,
722+
query,
723+
func() (*ServerInfo, bool) {
724+
// Only get server info once when actually needed
725+
if serverInfo == nil {
726+
serverInfo = proxy.serversInfo.getOne()
727+
if serverInfo != nil {
728+
serverName = serverInfo.Name
729+
}
730+
}
731+
if serverInfo == nil {
732+
return nil, false
733+
}
734+
needsPadding := (serverInfo.Proto == stamps.StampProtoTypeDoH ||
735+
serverInfo.Proto == stamps.StampProtoTypeTLS)
736+
return serverInfo, needsPadding
737+
},
738+
)
727739
if !validateQuery(query) {
728740
return response
729741
}
@@ -753,29 +765,37 @@ func (proxy *Proxy) processIncomingQuery(
753765
}
754766

755767
// Process query with a DNS server if there's no cached response
756-
if len(response) == 0 && serverInfo != nil {
757-
pluginsState.serverName = serverName
768+
// Note: if serverInfo is still nil here, we need to get it
769+
if len(response) == 0 {
770+
if serverInfo == nil {
771+
serverInfo = proxy.serversInfo.getOne()
772+
if serverInfo != nil {
773+
serverName = serverInfo.Name
774+
}
775+
}
776+
if serverInfo != nil {
777+
pluginsState.serverName = serverName
758778

759-
// Exchange DNS request with the server
760-
exchangeResponse, err := handleDNSExchange(proxy, serverInfo, &pluginsState, query, serverProto)
779+
exchangeResponse, err := handleDNSExchange(proxy, serverInfo, &pluginsState, query, serverProto)
761780

762-
// Update server statistics for WP2 strategy
763-
success := (err == nil && exchangeResponse != nil)
764-
proxy.serversInfo.updateServerStats(serverName, success)
781+
// Update server statistics for WP2 strategy
782+
success := (err == nil && exchangeResponse != nil)
783+
proxy.serversInfo.updateServerStats(serverName, success)
765784

766-
if err != nil || exchangeResponse == nil {
767-
return response
768-
}
785+
if err != nil || exchangeResponse == nil {
786+
return response
787+
}
769788

770-
response = exchangeResponse
789+
response = exchangeResponse
771790

772-
// Process the response through plugins
773-
processedResponse, err := processPlugins(proxy, &pluginsState, query, serverInfo, response)
774-
if err != nil {
775-
return response
776-
}
791+
// Process the response through plugins
792+
processedResponse, err := processPlugins(proxy, &pluginsState, query, serverInfo, response)
793+
if err != nil {
794+
return response
795+
}
777796

778-
response = processedResponse
797+
response = processedResponse
798+
}
779799
}
780800

781801
// Validate the response before sending

0 commit comments

Comments
 (0)