kmlebedev / txmlconnector

grpc wrapper for transaq connector written on GO
33 stars 19 forks source link

Initialize error: Insufficient buffer. #6

Open roman-4erkasov opened 2 years ago

roman-4erkasov commented 2 years ago

Здравствуйте! Спасибо больше за реализацию коннектора. Пытаюсь его поднять сервер по инструкции, но возникает ошибка. Я раньше не пользовался ни wine, ни golang, ни коннектором от финам.

Подскажите пожалуйста куда примерно копать, чтобы найти причину ошибки?

root@ubuntu-cpu8-ram16-ssd50:/home/ubuntu/txmlconnector# docker run kmlebedev/txmlconnector server
wine: created the configuration directory '/root/.wine'
0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}
0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}
0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002
0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002
0012:err:ole:get_local_server_stream Failed: 80004002
0014:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0014:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 183
0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 0
0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}
0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 14007
0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x800736b7
0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 800736b7
0014:err:ole:get_local_server_stream Failed: 800736b7
000b:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
000b:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0010:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0010:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
Could not find Wine Gecko. HTML rendering will be disabled.
wine: configuration in L"/root/.wine" has been updated.
0009:fixme:process:SetProcessPriorityBoost (FFFFFFFFFFFFFFFF,1): stub
time="2022-04-24T17:56:10Z" level=info msg="Initialize module: /usr/bin/txmlconnector64-6.19.2.21.8.dll"
InitCrashHandler: Z:\usr\bin\txmlconnector-server-220424-175611.mdmp
time="2022-04-24T17:56:11Z" level=panic msg="Initialize error: Insufficient buffer."
panic: (*logrus.Entry) 0xc00019c2a0
root@ubuntu-cpu8-ram16-ssd50:/home/ubuntu/txmlconnector#
nableru commented 2 years ago

docker run kmlebedev/txmlconnector server

В качестве быстрого решения попробуйте не использовать последнюю версию, а запустить сервер таким образом: docker run kmlebedev/txmlconnector:6.19.2.21.8 server

По самой проблеме, к сожалению, не подскажу. Сам только разбираюсь и kmlebedev/txmlconnector:latest у меня не стартует с аналогичными ошибками

kmlebedev commented 2 years ago

Там просто старый образ, сейчас попробую обновить

nableru commented 2 years ago

Большое спасибо за обновление. Но, к сожалению, возникает уже другая ошибка: Application could not be started, or no application associated with the specified file. ShellExecuteEx failed: File not found она же у меня возникала при попытке самостоятельно сборки образа. Насколько успел разобраться - неправильно собирается образ под win.

Даже успел нагуглить про gonative (https://habr.com/ru/post/249449/), но дальше этого пока не продвинулся

P.S. Большое спасибо за проект P.P.S Извините, что issue превращается в чат )

kmlebedev commented 2 years ago

Пофиксил сборку выложил свежий рабочий doсker image

falkolab commented 2 years ago
time="2022-06-08T12:37:48Z" level=error msg="txmlSendCommand() Insufficient buffer."
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x1405ddd42]

goroutine 11 [running]:
github.com/kmlebedev/txmlconnector/server.(*server).SendCommand(0x1406fc660?, {0xc0000fa240?, 0xc000109800?}, 0xc0000fa240)
    /go/src/github.com/kmlebedev/txmlconnector/server/main.go:144 +0xa2
github.com/kmlebedev/txmlconnector/proto._ConnectService_SendCommand_Handler({0x1406d6180?, 0x140b69b78}, {0x14086e618, 0xc0001b6450}, 0xc0000547e0, 0x0)
    /go/src/github.com/kmlebedev/txmlconnector/proto/connect.pb.go:460 +0x258
google.golang.org/grpc.(*Server).processUnaryRPC(0xc00013b180, {0x1408702a8, 0xc0000b2000}, 0xc000060000, 0xc00019b470, 0x140661d30, 0x0)
    /go/pkg/mod/google.golang.org/grpc@v1.40.0/server.go:1297 +0x13a3
google.golang.org/grpc.(*Server).handleStream(0xc00013b180, {0x1408702a8, 0xc0000b2000}, 0xc000060000, 0x0)
    /go/pkg/mod/google.golang.org/grpc@v1.40.0/server.go:1626 +0xfd4
google.golang.org/grpc.(*Server).serveStreams.func1.2()
    /go/pkg/mod/google.golang.org/grpc@v1.40.0/server.go:941 +0xed
created by google.golang.org/grpc.(*Server).serveStreams.func1
    /go/pkg/mod/google.golang.org/grpc@v1.40.0/server.go:939 +0x4be

Image version 6.19.2.21.16

Часто выбивает. Отдает структуры Security при конекте и вылетает.

kmlebedev commented 2 years ago

txmlSendCommand

Магия тут

resp, _, err := procSendCommand.Call(uintptr(unsafe.Pointer(reqData)))

Кажется ответ не влез в буфер, но как этим управлять не понятно. Могу пока сделать, так что бы не вылетало. можно пробовать

docker pull kmlebedev/txmlconnector:6.19.2.21.16-1
falkolab commented 2 years ago

Да, теперь не падает, спасибо, хотелось бы понять, но не мой профиль, это похоже внутри dll вылетает судя по коду

falkolab commented 2 years ago

После некоторых экспериментов с локальным билдом проблемка вообще ушла локально, при этом последний собранный вами контейнер что я запустил на сервере продолжает выбивать ошибку, не вылетает конечно.

Отличия в версиях пакетов, вот мой файл: go.mod

module github.com/kmlebedev/txmlconnector

go 1.18

require (
    github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.0
    github.com/ClickHouse/clickhouse-go v1.4.5
    github.com/PuerkitoBio/goquery v1.7.1
    github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
    github.com/gocolly/colly/v2 v2.1.0
    github.com/golang/glog v1.0.0
    github.com/golang/protobuf v1.5.2
    github.com/shakinm/xlsReader v0.9.10
    github.com/sirupsen/logrus v1.8.1
    github.com/streadway/amqp v1.0.0
    gocloud.dev v0.24.0
    gocloud.dev/pubsub/rabbitpubsub v0.24.0
    google.golang.org/grpc v1.40.0
    google.golang.org/protobuf v1.27.1
)

require (
    cloud.google.com/go/pubsub v1.17.1 // indirect
    github.com/andybalholm/cascadia v1.2.0 // indirect
    github.com/antchfx/htmlquery v1.2.3 // indirect
    github.com/antchfx/xmlquery v1.2.4 // indirect
    github.com/antchfx/xpath v1.1.8 // indirect
    github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect
    github.com/gobwas/glob v0.2.3 // indirect
    github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
    github.com/googleapis/gax-go/v2 v2.1.1 // indirect
    github.com/kennygrant/sanitize v1.2.4 // indirect
    github.com/metakeule/fmtdate v1.1.2 // indirect
    github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
    github.com/richardlehane/mscfb v1.0.3 // indirect
    github.com/richardlehane/msoleps v1.0.1 // indirect
    github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
    github.com/technoweenie/multipartstreamer v1.0.1 // indirect
    github.com/temoto/robotstxt v1.1.1 // indirect
    github.com/xuri/efp v0.0.0-20210322160811-ab561f5b45e3 // indirect
    go.opencensus.io v0.23.0 // indirect
    golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
    golang.org/x/net v0.0.0-20210825183410-e898025ed96a // indirect
    golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
    golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 // indirect
    golang.org/x/text v0.3.7 // indirect
    golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
    google.golang.org/api v0.58.0 // indirect
    google.golang.org/appengine v1.6.7 // indirect
    google.golang.org/genproto v0.0.0-20211019152133-63b7e35f4404 // indirect
)
kmlebedev commented 2 years ago

Может проблема в контейнере

falkolab commented 2 years ago

Рано радовался, ловится во время дебага клиентского приложение, вернусь с более точной информацией

kmlebedev commented 2 years ago

Может быть проблема в том что dll модуль выделяет буфер для чтение и ваш клиент не успевает считывать ? Так как я часто использую и такой проблемы не ловил Так же рекомендую посмотреть логи от dll в папке logs

falkolab commented 2 years ago

Проблема оказалась в логике клиентского приложения в режиме отладки.

Смысл такой: если допустить повторную отправку команды connect пока еще не обработан весь тот поток начальных данных, что был выкинут сервером в ответ на первый connect, то вылетит эта ошибка.

Тоесть, моя точка останова и неспешная отладка поступающих сообщений вызвала в другом потоке клиента повторную попытку подключения по retry таймауту и эта вторая попытка выбивает ошибку на сервере. По смыслу в принципе так и есть, на стороне сервера в dll библиотеке первый буфер еще не выгружен целиком, и допускается попытка писать туда еще раз.

Официальная документация: В случае успешного выполнения команды connect повторная посылка команды возможна только после отключения от сервера с помощью команды disconnect.

Надеюсь кому поможет.

falkolab commented 2 years ago

Этот Insufficient buffer выносит мозг... Какое-то навождение с этой ошибкой, отлаживаю недоступность сервера при подключении. Вот что заметил:

  1. Иногда server_status с ошибкой "Сервер не доступен" приходит сразу, иногда надо ждать минуты полторы
  2. Если прервать соединение с txmlconnector пока ожидаешь статус после конекта и попытаться подключиться сразу же, то на команду connect вылетит следующее:
    
    time="2022-06-11T09:48:34Z" level=info msg="txmlSendCommand() Call: <command id=\"connect\"><login>***</login><password>****</password><host>tr1-demo5.finam.ru</h
    ost><port>3939</port><micex_registers>true</micex_registers><rqdelay>100</rqdelay><push_u_limits>10</push_u_limits><push_pos_equity>10</push_pos_equity></command>"
    time="2022-06-11T09:48:34Z" level=error msg="txmlSendCommand() Insufficient buffer."
    panic: runtime error: invalid memory address or nil pointer dereference
    [signal 0xc0000005 code=0x0 addr=0x0 pc=0x1405e0dc2]

goroutine 25 [running]: github.com/kmlebedev/txmlconnector/server.(*server).SendCommand(0x1406ffde0?, {0xc00002cc40?, 0xc00006d818?}, 0xc00002cc40) /go/src/github.com/kmlebedev/txmlconnector/server/main.go:145 +0xa2


Если выждать и подключиться через минутку, то все будет нормально.

3. Словил вот такой кейс:

time="2022-06-11T09:37:21Z" level=info msg="Press CRTL+C to stop the server..." time="2022-06-11T09:37:40Z" level=info msg="txmlSendCommand() Call: <command id=\"connect\">tr1-demo5.finam.ru</h ost>3939true1001010" time="2022-06-11T09:37:41Z" level=info msg="SendCommand Data: <result success=\"true\"/>" time="2022-06-11T09:37:45Z" level=info msg="no message received, Tick at 2022-06-11 09:37:45.448695 +0000 GMT m=+23.859898901" ...................... time="2022-06-11T09:38:50Z" level=info msg="no message received, Tick at 2022-06-11 09:38:50.345447 +0000 GMT m=+88.859638601" time="2022-06-11T09:38:55Z" level=info msg="no message received, Tick at 2022-06-11 09:38:55.345447 +0000 GMT m=+93.859083101" time="2022-06-11T09:38:56Z" level=info msg="txmlSendCommand() Call: <command id=\"disconnect\"/>" time="2022-06-11T09:38:56Z" level=error msg="txmlSendCommand() Insufficient buffer." panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x0 pc=0x1405e0dc2]

goroutine 12 [running]: github.com/kmlebedev/txmlconnector/server.(server).SendCommand(0x1406ffde0?, {0xc00002cec0?, 0xc000231818?}, 0xc00002cec0) /go/src/github.com/kmlebedev/txmlconnector/server/main.go:145 +0xa2 github.com/kmlebedev/txmlconnector/proto._ConnectService_SendCommand_Handler({0x1406d9300?, 0x140b80d40}, {0x140883ad0, 0xc0001b0cc0}, 0xc000062ba0, 0x0) /go/src/github.com/kmlebedev/txmlconnector/proto/connect.pb.go:460 +0x258 google.golang.org/grpc.(Server).processUnaryRPC(0xc000139180, {0x140885768, 0xc000182d00}, 0xc0001558c0, 0xc0001b0030, 0x140664660, 0x0) /go/pkg/mod/google.golang.org/grpc@v1.47.0/server.go:1283 +0x13b6 google.golang.org/grpc.(Server).handleStream(0xc000139180, {0x140885768, 0xc000182d00}, 0xc0001558c0, 0x0) /go/pkg/mod/google.golang.org/grpc@v1.47.0/server.go:1620 +0xfd4 google.golang.org/grpc.(Server).serveStreams.func1.2() /go/pkg/mod/google.golang.org/grpc@v1.47.0/server.go:922 +0xed created by google.golang.org/grpc.(*Server).serveStreams.func1 /go/pkg/mod/google.golang.org/grpc@v1.47.0/server.go:920 +0x4be

falkolab commented 2 years ago

Замечены такие кейсы:

  1. После конекта и при получении статуса с ошибкой нельзя дисконектить
  2. Нельзя отправлять коннект не отключившись послу удачного подключения
  3. Нельзя вообще коненктитьповторно не дождавшись статуса с предыдущей команды
  4. Не требуется дисконект если произошло отключение, тоесть пришел статус conneceted=false recover=false

Всвязи с чем обработку этих кейсов надо реализовавать либо на стороне txmlconnector, но как я понимаю это не его задача обрабатывать логику клиента, а значит вот эта строчка https://github.com/kmlebedev/txmlconnector/blob/main/server/main.go#L168 неприемлима тк при ее наличии нельзя обработать перечисленные выше кейсы на стороне клиента.

kmlebedev commented 1 year ago

То же словил level=error msg="txmlSendCommand() Insufficient buffer." Кажется это из-за некорректного закрытия клиента, в следствии чего не возникает закрития коннекта в стороны транзакта и освобождение памяти буферов и на следующий коннект не хвататет.

nableru commented 1 year ago

Я тоже на это же наступил. Гугление привело на похожее: https://github.com/ClickHouse/clickhouse-go/issues/209 В моем случае тоже падало после получения securities Решил перевести на нативный clickhouse модуль https://clickhouse.com/docs/en/integrations/go после перевода securities сохранились успешно. перевожу остальное, проблем пока больше не наблюдается