README.md

Решение тестовой задачи по Го

Код

Решение находится в файле src/w4.go.

В чем подвох?

Если

  1. запустить w4.go с помощью go run -race src/w4.go и
  2. отправить несколько запросов PUT и GET (./curl-put.sh; ./curl-get.sh),

то в консоли отобразится следующая ошибка.

==================
WARNING: DATA RACE
Write at 0x00c0001089c0 by goroutine 10:
  runtime.mapaccess2_faststr()
      /usr/local/go/src/runtime/map_faststr.go:108 +0x42c
  main.putRoutine()
      /Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:52 +0x5b4
  main.dbHandler()
      /Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:99 +0x98
  net/http.HandlerFunc.ServeHTTP()
      /usr/local/go/src/net/http/server.go:2166 +0x48
  net/http.(*ServeMux).ServeHTTP()
      /usr/local/go/src/net/http/server.go:2683 +0x17c
  net/http.serverHandler.ServeHTTP()
      /usr/local/go/src/net/http/server.go:3137 +0x298
  net/http.(*conn).serve()
      /usr/local/go/src/net/http/server.go:2039 +0xf28
  net/http.(*Server).Serve.gowrap3()
      /usr/local/go/src/net/http/server.go:3285 +0x4c

Previous read at 0x00c0001089c0 by goroutine 7:
  runtime.mapdelete()
      /usr/local/go/src/runtime/map.go:696 +0x43c
  main.evictEligibleKeys()
      /Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:126 +0xd8
  main.evictLogic()
      /Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:116 +0x4c
  main.startEviction.gowrap1()
      /Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:150 +0x20

Это означает, что куски кода

et[curKey.(string)] = expirationTime

в w4.go:52 (putRoutine()) и

for key, expirationTime := range et {

в w4.go:126 (main.evictEligibleKeys()) одновременно пишут и читают словарь et.

Как решить эту проблему?

Использовать мютекс при записи и чтении из и в словарь et.

etMutex.Lock()
defer etMutex.Unlock()

См. src/w5.go.

Конвейеры
0 успешных
0 с ошибкой