
Александр
23.03.2018
14:48:55
выключить дебаг? ?

Человек
23.03.2018
14:49:32
А как его выключить? ?

Александр
23.03.2018
14:50:32
если не ошибаюсь
go build -ldflags "-s -w"

Google

Человек
23.03.2018
14:54:48
Спасибо. Можно ещё вопрос? [С чем это связанно] У меня не находит дебаггер gdb (когда стояла windows 8.1 у меня находило дебагер и дебажил код, а сейчас стоит windows 8.1 и дебагер не найден "'gdb' is not recognized as an internal or external command,
operable program or batch file.") go version go1.10 windows/amd64
Причем в переменную среды я ничего тогда и сейчас не вписывал

Александр
23.03.2018
14:55:26
под винду не знаю, увы

Человек
23.03.2018
14:57:00
ладно, спасибо

Andrew
23.03.2018
14:57:41
анмаршалю xml, как проверить на отсутствие элемента(который `omitempty`), что бы не обращаться к его свойствам, что вызовет ошибку?

hamper ?
23.03.2018
14:58:13
А есть какой-нибудь способ сделать что-то типа мягкого RLock к мьютексу? Типа попытаться сделать RLock, если мьютекс залочен то вернуть какой-то результат.

Daniel
23.03.2018
15:01:00
нет, нельзя
но можно написать свой такой мьютекс на атомиках
ну или найти такой готовый

hamper ?
23.03.2018
15:01:59
Ага, погуглил уже, хотя пока гуглил, понял что оно мне и не особо то надо. )

Alexey
23.03.2018
15:11:32
коллективный самоответ :)

Dmitry
23.03.2018
15:12:21
Если nil - нет объекта

Google

Andrew
23.03.2018
15:18:26

hamper ?
23.03.2018
16:53:53
А нормально, что гошный race detector пишет, ворнинги на код внутри atomic.SwapUint64?
WARNING: DATA RACE
Write at 0x00c42040d810 by goroutine 114:
sync/atomic.SwapInt64()
/usr/lib/go/src/runtime/race_amd64.s:254 +0xb

xPushkin
23.03.2018
17:15:08

hamper ?
23.03.2018
17:19:19
Не могу к сожалению, там много рабочего кода, но в readat он выдает функцию, внутри которой вызывается 2 раза другая функция, внутри которой atomic.AddInt64 на эту переменную (и вообще это приватное поле структуры, которое не читается нигде, кроме одного метода, где она только через atomic читается).

xPushkin
23.03.2018
17:25:41

hamper ?
23.03.2018
17:27:29
Вот строчка в которой read at (первая строка) https://pastebin.com/BjJHC1gc
А в write строчка reqs = atomic.SwapUint64(&r.reqcnt, 0)

xPushkin
23.03.2018
17:29:37

hamper ?
23.03.2018
17:30:27
_, err = redis.CounterIncr("key1."+key, 14*24*time.Hour) в read at

xPushkin
23.03.2018
17:30:40
Конечно у вас будет race condition

hamper ?
23.03.2018
17:31:57
Ну там внутри CounterIncr вызывается функция в которой инкремент через atomic для r.reqcnt на своп которого ругается write

Daniel
23.03.2018
17:32:26
чтобы не ругалось - все чтения и все записи должны быть через атомик

xPushkin
23.03.2018
17:32:38

hamper ?
23.03.2018
17:33:59
Читается оно тут https://pastebin.com/bUi01yqD
reqs = atomic.SwapUint64(&r.reqcnt, 0)
И это единственное место, где оно читается.
И вот именно на это место и ругается во write

xPushkin
23.03.2018
17:35:52
Выложите полный Warning Data Race

Google

hamper ?
23.03.2018
17:40:51
https://pastebin.com/HmFFss67 я пути только на *** заменил частично
/counters/counters.go:61 это как раз _, err = redis.CounterIncr("key1."+key, 14*24*time.Hour)
а **/db/redis_main.go:24 это reqs = atomic.SwapUint64(&r.reqcnt, 0)
А содержимое CounterIncr я раньше присылал.
Вообще больше на false positive похоже, только непонятно почему, наверное забью пока на это. Я несколько раз код перечитал r.reqcnt снаружи читаться точно нигде не может, потому что приватное, а инкрементится оно только через atomic.AddUint64, просто странно.
Собственно вот весь модуль, внутри которого оно ругается, не знаю, где тут можно ошибиться https://pastebin.com/1vajH9S4
reqcnt и errcnt там больше нигде не используются

Roman
23.03.2018
17:54:44
ребят, как реализовать подобный барьер:
типа "дамбы" которая блокирует всех "читающих" до того, как не дёрнут шлюз..
дёрнули шлюз - все горутины которые ждали - проходят, после чего шлюз снова закрывается и снова блокирует

m
23.03.2018
17:54:46
Вечер добрый.
Я верно понимаю, что для того, чтобы отловить панику, нужно её ловить через defer в каждой запущенной горутине? Или достаточно в main.go прописать defer ?

Daniel
23.03.2018
17:55:32
вот тут, кстати, можно применить канал каналов :)

Roman
23.03.2018
17:55:50

m
23.03.2018
17:56:19

Roman
23.03.2018
17:56:26
ну - на каналах
да понятно.. но я голову уже второй час ломаю не могу никак на ноги поставить эту долбану дамбу

Daniel
23.03.2018
17:57:01
в горутины передаем канал каналов

Roman
23.03.2018
17:57:19

Daniel
23.03.2018
17:57:31
:)

m
23.03.2018
17:57:52
создаёшь канал, по которому отправляешь не , скажем строки, а другие каналы.
chan chan struct{}

Roman
23.03.2018
18:00:03
я не понимать ?

Google

Roman
23.03.2018
18:00:10
как из этого дамбу сделать
// block until background reconnection routine succeeds
select {
case err := <-clt.backgroundReconnection:
// connected abort wait
return err
case <-time.After(timeout):
// timeout, leave queue
return webwire.ReqTimeoutErr{}
}
вот тут все горутины ожидают пока шлюз (backgroundReconnection) откроется, либо пока им надоест и они сами выйдут с таймаутом
здесь я следственно закрываю канал close(backgroundReconnection) но проблема в том, что теперь то его переоткрывать надо...

m
23.03.2018
18:04:58
его переоткрывать надо где-то в другом месте. там где шлюзом управляют.

Daniel
23.03.2018
18:05:09
переоткрыть канал нельзя
можно только новый подсунуть

Roman
23.03.2018
18:05:20
и тут начинается геморой... это считай его нужно мьютексом защитить, но если рутины в очереди на него обретают shared lock то задедлочит горутина которая переоткрывает канал...

Admin
ERROR: S client not available

m
23.03.2018
18:05:22
всё верно

Daniel
23.03.2018
18:05:27
вот что

m
23.03.2018
18:05:32
не надо защищать

Daniel
23.03.2018
18:05:38
нам нужен атомик :)
ща, я набросаю экзампл

Roman
23.03.2018
18:06:22
не надо защищать
как не надо?! это читать и писать в канал - thread safe, а вот мутировать reference канала то надо синхронизировано

m
23.03.2018
18:06:26
вообще да, ещё один канал считать не выйдет. его же все считать придётся...
я думал, что не надо защищать, ибо прочто считается новый из канала.

Roman
23.03.2018
18:07:22

m
23.03.2018
18:07:25
с атомиком ждать не получится нормально
нужен ред-райт лок. Пока Lock() - все ждут. как сделали Unlock() , так все ждущие смогли взять Rlock() и потом соотвественно Runlock() по завершению делают.

Google

m
23.03.2018
18:09:54
потом как все сделали Runlock() , так дамба может закрыться , сделав Lock()

Roman
23.03.2018
18:10:21

m
23.03.2018
18:12:10
так тебе из дамбы надо выпустить всю воду или как?

Roman
23.03.2018
18:13:01
т.е. шлюз не закрывается (exclusive lock нужен) когда в него вода бьёт, ибо у воды shared lock

m
23.03.2018
18:15:21
т.е. ты видимо в цикле берёшь Rlock(), а тебе надо взять его один раз и потом ждать, что все его взяли и отпустили, что делается через WaitingGroup

Roman
23.03.2018
18:15:59
постой, это как?
waitgroup то тут чем полезен?

m
23.03.2018
18:21:15
в горутинах:
wg.Add(1), mu.Rlock() , делаем что-то, mu.Runlock() , wg.Done(), wg.Wait() .
в управляющей дамбой:
for{
mu.Lock(), накапливаем, mu.Unlock()
}
когда сработает последний mu.Runlock(), то найдётся ждущий mu.Lock() и он выполнится. Хотя я не даю 100% гарантии, что будет именно так всегда.
надо смотреть код Runlock. Он или передаёт управление горуитине ждущей лок или просто флажок снимает, что лок можно поставить. Но мне помнится, что передавал.
@onokonem , как считаешь?
wg и mu - в дамбе и горутинах одни и те же, если чё.

Daniel
23.03.2018
18:27:55
только зачем нужен лок?

m
23.03.2018
18:28:21
у меня после еды наоборот башка отключается ?

Daniel
23.03.2018
18:28:23
wg сама справится

m
23.03.2018
18:29:10
лок - чтобы все вместе стартовали.
в горутинах
for{
wg.Add(1)
// делаем что-то
wg.Done()
wg.Wait()
}
в дамбе:
wg.Add(1)
for{
wg.Done() // открываем дамбу
wg.Wait()
wg.Add(1) // закрываем дамбу
// наполняем дамбу
}
wg.Done()
ты прав, лок не нужен.