Skip to content

Commit

Permalink
Pull request: improve anonymizer performance
Browse files Browse the repository at this point in the history
Merge in DNS/adguard-home from imp-anonymizer to master

Squashed commit of the following:

commit 340237d
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date:   Tue Dec 7 12:43:27 2021 +0300

    querylog: mv slow version

commit 96daf49
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date:   Mon Dec 6 21:21:13 2021 +0300

    querylog: imp anonymizer
  • Loading branch information
EugeneOne1 committed Dec 7, 2021
1 parent d2cf323 commit 2d328ea
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 24 deletions.
10 changes: 10 additions & 0 deletions internal/querylog/decode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,16 @@ func TestDecodeLogEntry_backwardCompatability(t *testing.T) {
}
}

// anonymizeIPSlow masks ip to anonymize the client if the ip is a valid one.
// It only exists in purposes of benchmark comparison, see BenchmarkAnonymizeIP.
func anonymizeIPSlow(ip net.IP) {
if ip4 := ip.To4(); ip4 != nil {
copy(ip4[net.IPv4len-2:net.IPv4len], []byte{0, 0})
} else if len(ip) == net.IPv6len {
copy(ip[net.IPv6len-10:net.IPv6len], []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
}
}

func BenchmarkAnonymizeIP(b *testing.B) {
benchCases := []struct {
name string
Expand Down
31 changes: 7 additions & 24 deletions internal/querylog/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,34 +90,17 @@ func (l *queryLog) handleQueryLogInfo(w http.ResponseWriter, r *http.Request) {
}
}

// anonymizeIPSlow masks ip to anonymize the client if the ip is a valid one.
// It only exists in purposes of benchmark demonstration.
func anonymizeIPSlow(ip net.IP) {
if ip4 := ip.To4(); ip4 != nil {
copy(ip4[net.IPv4len-2:], []byte{0, 0})
} else if len(ip) == net.IPv6len {
copy(ip[net.IPv6len-10:], []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
}
}

// AnonymizeIP masks ip to anonymize the client if the ip is a valid one.
func AnonymizeIP(ip net.IP) {
// We use an assignment operator here since it compiles into more efficient
// code than copy(). See BenchmarkAnonymizeIP.
// zeroes is a slice of zero bytes from which the IP address tail is copied.
// Using constant string as source of copying is more efficient than byte
// slice, see https://github.com/golang/go/issues/49997.
const zeroes = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

if ip4 := ip.To4(); ip4 != nil {
ip4[net.IPv4len-2], ip4[net.IPv4len-1] = 0, 0
copy(ip4[net.IPv4len-2:net.IPv4len], zeroes)
} else if len(ip) == net.IPv6len {
ip[net.IPv6len-10],
ip[net.IPv6len-9],
ip[net.IPv6len-8],
ip[net.IPv6len-7],
ip[net.IPv6len-6],
ip[net.IPv6len-5],
ip[net.IPv6len-4],
ip[net.IPv6len-3],
ip[net.IPv6len-2],
ip[net.IPv6len-1] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
copy(ip[net.IPv6len-10:net.IPv6len], zeroes)
}
}

Expand Down

0 comments on commit 2d328ea

Please sign in to comment.