From 819e5e3c48157c60beaa3d7b4a853fc44d02aa59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caner=20Arifo=C4=9Flu?= Date: Mon, 27 Sep 2021 10:05:22 +0300 Subject: [PATCH 1/4] counter thread safe fix --- 103-http/proxy/limit.go | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/103-http/proxy/limit.go b/103-http/proxy/limit.go index df5cc56..f1b414f 100644 --- a/103-http/proxy/limit.go +++ b/103-http/proxy/limit.go @@ -2,16 +2,18 @@ package main import ( "fmt" + "sync" "time" "github.com/gofiber/fiber/v2" ) -// TODO: Burada ki mapi thread safe hale getirebilirsiniz. +// DONE: Burada ki mapi thread safe hale getirebilirsiniz. // 102-concurrency egitimindeki mutex orneklerine bakabilirsiniz. // Ref: https://pmihaylov.com/thread-safety-concerns-go/ // Ref: https://medium.com/@deckarep/the-new-kid-in-town-gos-sync-map-de24a6bf7c2c var counter = map[string]*Limit{} +var mutex sync.Mutex type Limit struct { count int @@ -55,21 +57,30 @@ func (p LimitProxy) Proxy(c *fiber.Ctx) error { } else { fmt.Printf("resetting counter values \n") - counter[path] = &Limit{ - count: 0, - ttl: time.Now().Add(p.ttl), - } + incrementCounter(path, p.ttl) } } else if !ok { - counter[path] = &Limit{ - count: 0, - ttl: time.Now().Add(p.ttl), - } + incrementCounter(path, p.ttl) } c.SendString("Go Turkiye - 103 Http Package") - counter[path].count++ + getCounter(path).count++ return nil } + +func incrementCounter(path string, ttl time.Duration) { + mutex.Lock() + counter[path] = &Limit{ + count: 0, + ttl: time.Now().Add(ttl), + } + mutex.Unlock() +} + +func getCounter(path string) *Limit { + defer mutex.Unlock() + mutex.Lock() + return counter[path] +} From e18f961e136230f646466c1b493065b44cc1a635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caner=20Arifo=C4=9Flu?= Date: Mon, 27 Sep 2021 10:09:17 +0300 Subject: [PATCH 2/4] Counter Thread Safe --- 103-http/proxy/go.mod | 13 ++----------- 103-http/proxy/go.sum | 4 ++-- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/103-http/proxy/go.mod b/103-http/proxy/go.mod index 750e441..9b957cf 100644 --- a/103-http/proxy/go.mod +++ b/103-http/proxy/go.mod @@ -1,14 +1,5 @@ module proxy -go 1.17 +go 1.14 -require github.com/gofiber/fiber/v2 v2.18.0 - -require ( - github.com/andybalholm/brotli v1.0.2 // indirect - github.com/klauspost/compress v1.13.4 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.29.0 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 // indirect -) +require github.com/gofiber/fiber/v2 v2.19.0 diff --git a/103-http/proxy/go.sum b/103-http/proxy/go.sum index 43393e8..5cd204f 100644 --- a/103-http/proxy/go.sum +++ b/103-http/proxy/go.sum @@ -1,7 +1,7 @@ github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/gofiber/fiber/v2 v2.18.0 h1:xCWYSVoTNibHpzfciPwUSZGiTyTpTXYchCwynuJU09s= -github.com/gofiber/fiber/v2 v2.18.0/go.mod h1:/LdZHMUXZvTTo7gU4+b1hclqCAdoQphNQ9bi9gutPyI= +github.com/gofiber/fiber/v2 v2.19.0 h1:wBN88VUHT1RSC2ptwsRUl38DVWYkwnwUQY24s0keZVE= +github.com/gofiber/fiber/v2 v2.19.0/go.mod h1:/LdZHMUXZvTTo7gU4+b1hclqCAdoQphNQ9bi9gutPyI= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/klauspost/compress v1.13.4 h1:0zhec2I8zGnjWcKyLl6i3gPqKANCCn5e9xmviEEeX6s= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= From 557ad2a162dccb3c84fbeed5a63d7c6ee6dd835d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caner=20Arifo=C4=9Flu?= Date: Mon, 27 Sep 2021 10:11:33 +0300 Subject: [PATCH 3/4] Revert "Counter Thread Safe" This reverts commit e18f961e136230f646466c1b493065b44cc1a635. --- 103-http/proxy/go.mod | 13 +++++++++++-- 103-http/proxy/go.sum | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/103-http/proxy/go.mod b/103-http/proxy/go.mod index 9b957cf..750e441 100644 --- a/103-http/proxy/go.mod +++ b/103-http/proxy/go.mod @@ -1,5 +1,14 @@ module proxy -go 1.14 +go 1.17 -require github.com/gofiber/fiber/v2 v2.19.0 +require github.com/gofiber/fiber/v2 v2.18.0 + +require ( + github.com/andybalholm/brotli v1.0.2 // indirect + github.com/klauspost/compress v1.13.4 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.29.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 // indirect +) diff --git a/103-http/proxy/go.sum b/103-http/proxy/go.sum index 5cd204f..43393e8 100644 --- a/103-http/proxy/go.sum +++ b/103-http/proxy/go.sum @@ -1,7 +1,7 @@ github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/gofiber/fiber/v2 v2.19.0 h1:wBN88VUHT1RSC2ptwsRUl38DVWYkwnwUQY24s0keZVE= -github.com/gofiber/fiber/v2 v2.19.0/go.mod h1:/LdZHMUXZvTTo7gU4+b1hclqCAdoQphNQ9bi9gutPyI= +github.com/gofiber/fiber/v2 v2.18.0 h1:xCWYSVoTNibHpzfciPwUSZGiTyTpTXYchCwynuJU09s= +github.com/gofiber/fiber/v2 v2.18.0/go.mod h1:/LdZHMUXZvTTo7gU4+b1hclqCAdoQphNQ9bi9gutPyI= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/klauspost/compress v1.13.4 h1:0zhec2I8zGnjWcKyLl6i3gPqKANCCn5e9xmviEEeX6s= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= From 913ebf534f96e3150e8465b736ccc84110f6d690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caner=20Arifo=C4=9Flu?= Date: Mon, 27 Sep 2021 10:48:21 +0300 Subject: [PATCH 4/4] modify func names --- 103-http/proxy/limit.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/103-http/proxy/limit.go b/103-http/proxy/limit.go index f1b414f..b7b2980 100644 --- a/103-http/proxy/limit.go +++ b/103-http/proxy/limit.go @@ -57,20 +57,20 @@ func (p LimitProxy) Proxy(c *fiber.Ctx) error { } else { fmt.Printf("resetting counter values \n") - incrementCounter(path, p.ttl) + setDefaultCounter(path, p.ttl) } } else if !ok { - incrementCounter(path, p.ttl) + setDefaultCounter(path, p.ttl) } c.SendString("Go Turkiye - 103 Http Package") - getCounter(path).count++ + incrementCounter(path) return nil } -func incrementCounter(path string, ttl time.Duration) { +func setDefaultCounter(path string, ttl time.Duration) { mutex.Lock() counter[path] = &Limit{ count: 0, @@ -79,8 +79,8 @@ func incrementCounter(path string, ttl time.Duration) { mutex.Unlock() } -func getCounter(path string) *Limit { - defer mutex.Unlock() +func incrementCounter(path string) { mutex.Lock() - return counter[path] + counter[path].count++ + mutex.Unlock() }