
Combot
15.08.2018
09:34:16
Виктор Титов (0) увеличил репутацию Olzhas Akhmetkhan (5)

Vladimir
15.08.2018
09:35:30
В json заверни и Алга, сейчас кругом spa

Artem
15.08.2018
09:37:47
а на каком месте он отстой?
буквально на днях мигрировал со стандартного на Cloudy/jet потому что писать f(a, b, c) намного читабельнее, чем f a b c

Daniel
15.08.2018
09:39:48
это не аргумент, вообще-то...

Google

Artem
15.08.2018
09:42:27
всего лишь выработанная привычка миллионов людей за многие годы

Pawel
15.08.2018
09:43:44
а на каком месте он отстой?
В танцах с бубеном где идёт шаблонное наследование и передача аргументов. Язык шаблонов сам по себе дурацкий, в нём нет функции в частности.

Sergey
15.08.2018
10:13:05
Все хвалят да и сам использую net/http. Захотелось больше стоит ли пробовать echo?

Dmitri
15.08.2018
11:10:59
заодно chi потрогайте
а beego не трогайте, не нужно оно вам

Olzhas
15.08.2018
11:11:27
какие отзывы о gin?

Dmitri
15.08.2018
11:11:46
не трогал

undiabler
15.08.2018
11:11:53
гибко, удобно
для большой нагрузки (больше 10к rps) лучше fasthttp
юзаю для несложных апишек

Google

Dmitri
15.08.2018
11:13:22
посмотрел в gin-квикстарт... Собственно, отличий от echo, пока что, не заметил

Zarif
15.08.2018
11:13:42
gin вчера релизнулся до 1.3

Olzhas
15.08.2018
11:13:55
релизнулся?
наконец-то
а то мне dep качал версию июля 2017 года
а доку я читал под нынешнюю
бомбило

Zarif
15.08.2018
11:14:54

Dmitri
15.08.2018
11:15:08
почитал про gin чуть дальше... до сих пор не вижу отличий от echo
итого, родился вопрос: у кого-то опыт сравнения имеется?

Zarif
15.08.2018
11:15:51
а я наоборот думаю с gin уйти на echo. мне в echo подкупила хорошая документация и судя по последним бенмаркам быстрее чуть чуть


Daniel
15.08.2018
11:18:39
коллеги, у меня тут странное, и никогда мной доселе невиданное
у меня есть код:
func (s *Forwarder) listenTCP(addr string) error {
listener, err := net.Listen("tcp4", addr)
if err != nil {
return errors.Wrapf(err, "failed to listen tcp: %s", addr)
}
for {
conn, err := listener.Accept()
if err != nil {
errorsMetric.WithLabelValues("Accept", "tcp").Add(1)
return errors.Wrap(err, "failed to accept connection")
}
acceptedMetric.WithLabelValues("tcp").Add(1)
go checkAndForward(
conn.(*net.TCPConn),
s.Target,
s.Timeout,
s.HeaderLen,
s.ProxyHosts,
)
}
}
и время от времени он выдает мне ошибку в строке conn, err := listener.Accept()
accept tcp4 0.0.0.0:443: bad file descriptor
failed to accept connection
main.(*Forwarder).listenTCP
forwarder.go:73
main.(*Forwarder).ListenAndServe
forwarder.go:28
main.MustRunService
main.go:42
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:2361
дело происходит на ubuntu 16.04
куда копать?


undiabler
15.08.2018
11:21:02
хмм, я бы посмотрел в сторону ulimit и подобному


Olzhas
15.08.2018
11:22:52
коллеги, у меня тут странное, и никогда мной доселе невиданное
у меня есть код:
func (s *Forwarder) listenTCP(addr string) error {
listener, err := net.Listen("tcp4", addr)
if err != nil {
return errors.Wrapf(err, "failed to listen tcp: %s", addr)
}
for {
conn, err := listener.Accept()
if err != nil {
errorsMetric.WithLabelValues("Accept", "tcp").Add(1)
return errors.Wrap(err, "failed to accept connection")
}
acceptedMetric.WithLabelValues("tcp").Add(1)
go checkAndForward(
conn.(*net.TCPConn),
s.Target,
s.Timeout,
s.HeaderLen,
s.ProxyHosts,
)
}
}
и время от времени он выдает мне ошибку в строке conn, err := listener.Accept()
accept tcp4 0.0.0.0:443: bad file descriptor
failed to accept connection
main.(*Forwarder).listenTCP
forwarder.go:73
main.(*Forwarder).ListenAndServe
forwarder.go:28
main.MustRunService
main.go:42
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:2361
дело происходит на ubuntu 16.04
куда копать?
может ты ассептишь соединение, которое уже закрыл


Daniel
15.08.2018
11:25:19

Olzhas
15.08.2018
11:25:30
а какая версия го?

Daniel
15.08.2018
11:26:12
на этот вопрос трудно ответить точно - его собрал мне CI
по косвенным признакам - 1.10

Olzhas
15.08.2018
11:28:16
мб gc грешит

Dmitri
15.08.2018
11:32:28
а в этой части
go checkAndForward(
conn.(*net.TCPConn),
s.Target,
s.Timeout,
s.HeaderLen,
s.ProxyHosts,
)
что происходит
возможно, в какой-то комбинации звезд на небе оно conn закрывает?

Google

Daniel
15.08.2018
11:34:25
у меня проблемы с listener, а не с conn


Dmitri
15.08.2018
11:34:26
коллеги, у меня тут странное, и никогда мной доселе невиданное
у меня есть код:
func (s *Forwarder) listenTCP(addr string) error {
listener, err := net.Listen("tcp4", addr)
if err != nil {
return errors.Wrapf(err, "failed to listen tcp: %s", addr)
}
for {
conn, err := listener.Accept()
if err != nil {
errorsMetric.WithLabelValues("Accept", "tcp").Add(1)
return errors.Wrap(err, "failed to accept connection")
}
acceptedMetric.WithLabelValues("tcp").Add(1)
go checkAndForward(
conn.(*net.TCPConn),
s.Target,
s.Timeout,
s.HeaderLen,
s.ProxyHosts,
)
}
}
и время от времени он выдает мне ошибку в строке conn, err := listener.Accept()
accept tcp4 0.0.0.0:443: bad file descriptor
failed to accept connection
main.(*Forwarder).listenTCP
forwarder.go:73
main.(*Forwarder).ListenAndServe
forwarder.go:28
main.MustRunService
main.go:42
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:2361
дело происходит на ubuntu 16.04
куда копать?
checkAndForward дашь посмотреть?


Olzhas
15.08.2018
11:34:33

Daniel
15.08.2018
11:34:41
коллеги, нет

Dmitri
15.08.2018
11:35:00

undiabler
15.08.2018
11:35:46
мне кажется закрывается fd сокета извне, другой вопрос - почему. Может быть чисто системный косяк с лимитами сокетов и т.д. надо конкретно ручками смотреть. Может быть просто соединение обрывается приходящие, такое в принципе тоже возможно.

Daniel
15.08.2018
11:37:14
приходящие соединения - это не listen

Olzhas
15.08.2018
11:38:00
https://golang.org/src/net/fd_unix.go

Sergey
15.08.2018
11:38:15

Daniel
15.08.2018
11:38:58

Nikolay
15.08.2018
11:52:30
поцоны, а подскажите годную статью про graceful отмену горутин? это через контекст делается обычно или уже есть что покрасивее?


m
15.08.2018
11:53:00
коллеги, у меня тут странное, и никогда мной доселе невиданное
у меня есть код:
func (s *Forwarder) listenTCP(addr string) error {
listener, err := net.Listen("tcp4", addr)
if err != nil {
return errors.Wrapf(err, "failed to listen tcp: %s", addr)
}
for {
conn, err := listener.Accept()
if err != nil {
errorsMetric.WithLabelValues("Accept", "tcp").Add(1)
return errors.Wrap(err, "failed to accept connection")
}
acceptedMetric.WithLabelValues("tcp").Add(1)
go checkAndForward(
conn.(*net.TCPConn),
s.Target,
s.Timeout,
s.HeaderLen,
s.ProxyHosts,
)
}
}
и время от времени он выдает мне ошибку в строке conn, err := listener.Accept()
accept tcp4 0.0.0.0:443: bad file descriptor
failed to accept connection
main.(*Forwarder).listenTCP
forwarder.go:73
main.(*Forwarder).ListenAndServe
forwarder.go:28
main.MustRunService
main.go:42
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:2361
дело происходит на ubuntu 16.04
куда копать?
проблема в настройках OS ИМХО. А много там соединений новых образуется и сколько открытых соединений?
Там была какая-то проверка, что ошибка временная и можно дальше крутить цикл после слипа в несколько милисекунд. Возможно это твой случай.


Daniel
15.08.2018
11:54:16
ошибка не временная, это я проверил

undiabler
15.08.2018
11:54:51
а есть возможность быстро проверить на другой машине?

Daniel
15.08.2018
11:55:12
не воспроизводится
на синтетичоском трафике, я имею в виду

m
15.08.2018
11:56:22
а в сорцах про bad file descriptor что пишут? Когда оно такое пишет?
если найти это место, можно понять причину ошибки.

Daniel
15.08.2018
12:01:11
по сорцам лазаю, да

Google

undiabler
15.08.2018
12:01:19
тогда конкретно тюнить os
- версия kernel
- cat /proc/<PID>/limits
- всякие fs.file-max и nr-open проверить
- net.ipv4.* там куча настроек так тоже с ходу не вспомню
по мне так это входящие fd которые принимается listner-ом просто бьются или обрубаются еще до передачи приложению

Daniel
15.08.2018
12:02:15
входящие fd - это совсем другая история

m
15.08.2018
12:13:44

Artem
15.08.2018
12:13:50

Nikolay
15.08.2018
12:14:33

m
15.08.2018
12:15:25

Crypt
15.08.2018
12:15:40
Кто подскажет https://golang.org/src/net/tcpsock.go?s=6376:6414#L246 где l.accept() описан?

Artem
15.08.2018
12:16:44

m
15.08.2018
12:16:58

Crypt
15.08.2018
12:17:57

m
15.08.2018
12:18:41

Nikolay
15.08.2018
12:18:50

Daniel
15.08.2018
12:19:41

Crypt
15.08.2018
12:19:59

m
15.08.2018
12:20:07

Daniel
15.08.2018
12:23:14
отдельно только plan9
винда - она же posix

Pawel
15.08.2018
12:27:00

Вячеслав
15.08.2018
12:51:10
Помогите разобраться плз с локализацией.
Планирую использовать go-i18n но не пойму одной вещи.
Если у меня в шаблоне есть просто слова, а есть переменные, которые берутся из go и вставляются в шаблон..
Мне что, передавать словарь всех переведеных слов? и отдельно для тех значений, которые нужно вставить из бэка? В шаблоне же они выглядят одинаково (синтаксис) вообщем немного запутался - подскажите как быть

Crypt
15.08.2018
12:58:36

Google

Вячеслав
15.08.2018
13:00:07
LoadTranslationFile и еще вопрос по этой функции.
Написано она принимает на вход json файл.
А какую функцию использовать чтобы она принимала обычный текстовый файл с метками и переводом? MustLoadMessageFile ?
i18n.MustLoadTranslationFile("en-us.all.json")
T, _ := i18n.Tfunc("en-US")
t, _ := template.ParseFiles("template/index.html", "template/header.html", "template/footer.html")
t.Funcs(map[string]interface{}{
"T": T,})
t.Execute(w, map[string]interface{}{"Title": "New cat"})
вот так правильно?

Crypt
15.08.2018
13:55:30

Вячеслав
15.08.2018
13:55:58
ее не нужно переводить
я просто хочу в шаблоне перевести слова..

Crypt
15.08.2018
13:56:51
тогда по идее правильно

Вячеслав
15.08.2018
13:57:22
а в шаблоне писать <h1>{{T "home_button" .}}</h1> или без точки в конце?

Crypt
15.08.2018
13:57:47

Вячеслав
15.08.2018
14:01:56
panic serving [::1]:56413: runtime error: invalid memory address or nil pointer dereference
goroutine 6 [running]:
template: index.html:16: function "T" not defined

Crypt
15.08.2018
14:04:45
ошибка пустая...
Funcs adds the elements of the argument map to the template's function map. It must be called before the template is parsed.
перед парсингом нужно вызывать Funcs

Вячеслав
15.08.2018
14:06:59
t.Funcs(map[string]interface{}{
"T": T,
})
t, err := template.ParseFiles("template/index.html", "template/header.html", "template/footer.html")
но получается t not defined..
замкнутый круг)

Crypt
15.08.2018
14:07:40

Вячеслав
15.08.2018
14:18:49
no new variables on left side of := вот такая тепреь засада(
переменная же в первый раз объявляется и испльузется
http://joxi.ru/bmo97YGsxXO0jA