From 21273027fe075eb06d62ad7045ba53d6cf3c145d Mon Sep 17 00:00:00 2001 From: Ioannis Foukarakis Date: Tue, 8 Oct 2024 19:13:19 +0300 Subject: [PATCH] MM-60769: store package data to snowflake (#1622) * MM-60769: store package data to snowflake * Add support packet ingestion --- tests/utils/conftest.py | 9 +- .../support/valid_with_metadata/cpu.prof | Bin 0 -> 679 bytes .../support/valid_with_metadata/goroutines | 1493 +++++++++++++++++ .../support/valid_with_metadata/heap.prof | Bin 0 -> 31978 bytes .../support/valid_with_metadata/metadata.yaml | 7 + .../support/valid_with_metadata/plugins.json | 458 +++++ .../valid_with_metadata/sanitized_config.json | 718 ++++++++ .../valid_with_metadata/support_packet.yaml | 42 + .../support/valid_with_metadata/warning.txt | 3 + tests/utils/packets/__init__.py | 6 + tests/utils/packets/test_loaders.py | 12 +- tests/utils/packets/test_service.py | 204 +++ utils/db/helpers.py | 33 +- utils/packets/__main__.py | 60 +- utils/packets/loaders.py | 2 + utils/packets/models/support.py | 13 + utils/packets/service.py | 79 +- 17 files changed, 3120 insertions(+), 19 deletions(-) create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/cpu.prof create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/goroutines create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/heap.prof create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/metadata.yaml create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/plugins.json create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/sanitized_config.json create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/support_packet.yaml create mode 100644 tests/utils/fixtures/packets/support/valid_with_metadata/warning.txt create mode 100644 tests/utils/packets/test_service.py diff --git a/tests/utils/conftest.py b/tests/utils/conftest.py index 3dd62dcc9..37b7f949f 100644 --- a/tests/utils/conftest.py +++ b/tests/utils/conftest.py @@ -5,6 +5,7 @@ import pandas as pd import pytest from responses import Response +from sqlalchemy import create_engine @pytest.fixture(autouse=True) @@ -138,7 +139,6 @@ def post_data_error(responses): @pytest.fixture def config_data(monkeypatch, mocker): - # mocking loading k8 secrets to environment variables monkeypatch.setenv("NPS_WEBHOOK_URL", "https://mattermost.example.com/hooks/hookid") monkeypatch.setenv("DOCS_WEBHOOK_URL", "https://mattermost.example.com/hooks/hookid") @@ -148,3 +148,10 @@ def config_data(monkeypatch, mocker): monkeypatch.setenv("SNOWFLAKE_TRANSFORM_WAREHOUSE", "test warehouse") monkeypatch.setenv("SNOWFLAKE_TRANSFORM_DATABASE", "test database") monkeypatch.setenv("SNOWFLAKE_TRANSFORM_SCHEMA", "test schema") + + +@pytest.fixture +def sqlalchemy_memory_engine(): + engine = create_engine('sqlite:///:memory:') + yield engine + engine.dispose() diff --git a/tests/utils/fixtures/packets/support/valid_with_metadata/cpu.prof b/tests/utils/fixtures/packets/support/valid_with_metadata/cpu.prof new file mode 100644 index 0000000000000000000000000000000000000000..6d9af60c637b4618fdd682df353003dae95a27cb GIT binary patch literal 679 zcmV;Y0$BYYiwFP!00004|9p@=Z{$Q6$FaRHlTCnO3B+rPSWDwX%G!Qx&)OA;iZUG% z2$30kysWfquly3FoPq+0f`SqWwuuxWp%i?9EkPiJ_yDI>nkYHlN!MJFJ84g|7u{W& zRDb*Tf95wYpI`p?;Lo$Ozn<=N8c4xvr-3xwIQ-%CkN>-0uD_4O?-z|eMvA`p`zN*E zL<&CFu(H326x`ICX3IL)`WUJD_55eG-$W|DRT{@bgY6eCM7DA}HSp3toHbccQkc!3p>Sndt)y3l9XRFn& zDMZKGa^5z2NW)@rC7CXkS29guTJJdT8a>p&V*XGfT`V8TG{upHo%f6$YGSc?vRWI( zbD5_2)ap9#8#-!XvHV^LVd`Q&muZS6vbK$F)W%}@%jM1L6J3a3Wm+G=ThK1)bT;87 zG~>L^D$wFt4VxLw@{-4SmXxql)LAv2@`1HKEAsTSI^7!-oF>pM>P!~)tjJSVr-M-r zy;n@aft))m@^n1mugBwAy)H*Nd~|nQ;_-xkQH(2Iz=wBA`=xP|gJDl;RqXU;}R!bNU%6ve;B9RwHi5~_u8b)5icsTS@hf|0n zk2}CqN+U|W1orIvbhGMPc|j?4z~TgkQOHOb1VhT0&*C8PL&_)+--(levd9lpkAQXW z84F(KlVj-wu!dFAUt+4QNVTp9Yk<#DT#*&gAwHPC{}({97|| zc^XE9k|<)#je+|dJeT;ufV(6N8Kf>HE{AQqs586BOI}sfF7lFB6@}JU$4Qxg{UQJW N|Nk;$7F>b@005H@R9pZ6 literal 0 HcmV?d00001 diff --git a/tests/utils/fixtures/packets/support/valid_with_metadata/goroutines b/tests/utils/fixtures/packets/support/valid_with_metadata/goroutines new file mode 100644 index 000000000..67400b1a1 --- /dev/null +++ b/tests/utils/fixtures/packets/support/valid_with_metadata/goroutines @@ -0,0 +1,1493 @@ +goroutine 1241 [running]: +runtime/pprof.writeGoroutineStacks({0x46d0920, 0xc004ab0390}) + runtime/pprof/pprof.go:703 +0x6a +runtime/pprof.writeGoroutine({0x46d0920?, 0xc004ab0390?}, 0x41ad08?) + runtime/pprof/pprof.go:692 +0x25 +runtime/pprof.(*Profile).WriteTo(0x3c70a22?, {0x46d0920?, 0xc004ab0390?}, 0x3839cc0?) + runtime/pprof/pprof.go:329 +0x146 +github.com/mattermost/mattermost/server/v8/channels/app.(*App).createGoroutineProfile(0xc004ada6e8?, {0xc004ada330?, 0xc004ada690?}) + github.com/mattermost/mattermost/server/v8/channels/app/support_packet.go:405 +0x4a +github.com/mattermost/mattermost/server/v8/channels/app.(*App).GenerateSupportPacket(0xc007770e68, {0x4708fa0, 0xc004c01e60}, 0xc0090a5bc0) + github.com/mattermost/mattermost/server/v8/channels/app/support_packet.go:53 +0x6f2 +github.com/mattermost/mattermost/server/v8/channels/api4.generateSupportPacket(0xc0062439f0, {0x46e1c98, 0xc007b8a200}, 0xc00143c200) + github.com/mattermost/mattermost/server/v8/channels/api4/system.go:110 +0x2f1 +github.com/mattermost/mattermost/server/v8/channels/web.Handler.ServeHTTP({0xc0028b4000, 0x3e746b8, {0x4e20898, 0x15}, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, ...}, ...) + github.com/mattermost/mattermost/server/v8/channels/web/handlers.go:376 +0x35f6 +github.com/klauspost/compress/gzhttp.NewWrapper.func1.1({0x46e1e48, 0xc006929420}, 0xc004c06c00?) + github.com/klauspost/compress@v1.17.7/gzhttp/compress.go:495 +0x357 +net/http.HandlerFunc.ServeHTTP(0xc00143c100?, {0x46e1e48?, 0xc006929420?}, 0x411cbe?) + net/http/server.go:2136 +0x29 +github.com/gorilla/mux.(*Router).ServeHTTP(0xc000284300, {0x46e1e48, 0xc006929420}, 0xc00143c000) + github.com/gorilla/mux@v1.8.1/mux.go:212 +0x1c5 +github.com/mattermost/mattermost/server/v8/channels/app.(*Server).Start.(*Handler).Handle.(*Handler).handle.func5({0x46e1e48, 0xc006929420}, 0xc007cfbf00) + github.com/getsentry/sentry-go@v0.27.0/http/sentryhttp.go:118 +0x2f1 +net/http.HandlerFunc.ServeHTTP(0x67cc480?, {0x46e1e48?, 0xc006929420?}, 0xc004c11b50?) + net/http/server.go:2136 +0x29 +net/http.serverHandler.ServeHTTP({0xc005204cc0?}, {0x46e1e48?, 0xc006929420?}, 0x6?) + net/http/server.go:2938 +0x8e +net/http.(*conn).serve(0xc000a194d0, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2009 +0x5f4 +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 1 [chan receive, 1 minutes]: +github.com/mattermost/mattermost/server/v8/cmd/mattermost/commands.runServer(0xc00025e0e0, 0xb?) + github.com/mattermost/mattermost/server/v8/cmd/mattermost/commands/server.go:120 +0x1f7 +github.com/mattermost/mattermost/server/v8/cmd/mattermost/commands.serverCmdF(0xc00029e200?, {0x3c5f452?, 0x4?, 0x3c5f42a?}) + github.com/mattermost/mattermost/server/v8/cmd/mattermost/commands/server.go:58 +0x10f +github.com/spf13/cobra.(*Command).execute(0x6767b00, {0xc0001b4050, 0x0, 0x0}) + github.com/spf13/cobra@v1.8.0/command.go:983 +0xabc +github.com/spf13/cobra.(*Command).ExecuteC(0x6767b00) + github.com/spf13/cobra@v1.8.0/command.go:1115 +0x3ff +github.com/spf13/cobra.(*Command).Execute(...) + github.com/spf13/cobra@v1.8.0/command.go:1039 +github.com/mattermost/mattermost/server/v8/cmd/mattermost/commands.Run(...) + github.com/mattermost/mattermost/server/v8/cmd/mattermost/commands/root.go:17 +main.main() + github.com/mattermost/mattermost/server/v8/cmd/mattermost/main.go:20 +0x88 + +goroutine 5 [select, 1 minutes]: +github.com/blevesearch/bleve_index_api.AnalysisWorker({0xc0008af0e0?, 0xc0008af140?}) + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:46 +0x89 +created by github.com/blevesearch/bleve_index_api.NewAnalysisQueue in goroutine 1 + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:38 +0x9f + +goroutine 6 [select, 1 minutes]: +github.com/blevesearch/bleve_index_api.AnalysisWorker({0xc0008af0e0?, 0xc0008af140?}) + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:46 +0x89 +created by github.com/blevesearch/bleve_index_api.NewAnalysisQueue in goroutine 1 + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:38 +0x9f + +goroutine 7 [select, 1 minutes]: +github.com/blevesearch/bleve_index_api.AnalysisWorker({0xc0008af0e0?, 0xc0008af140?}) + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:46 +0x89 +created by github.com/blevesearch/bleve_index_api.NewAnalysisQueue in goroutine 1 + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:38 +0x9f + +goroutine 8 [select, 1 minutes]: +github.com/blevesearch/bleve_index_api.AnalysisWorker({0xc0008af0e0?, 0xc0008af140?}) + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:46 +0x89 +created by github.com/blevesearch/bleve_index_api.NewAnalysisQueue in goroutine 1 + github.com/blevesearch/bleve_index_api@v1.1.6/analysis.go:38 +0x9f + +goroutine 11 [select]: +github.com/mattermost/logr/v2.(*Logr).start(0xc000375ef0) + github.com/mattermost/logr/v2@v2.0.21/logr.go:428 +0xb3 +created by github.com/mattermost/logr/v2.New in goroutine 1 + github.com/mattermost/logr/v2@v2.0.21/logr.go:81 +0x3b8 + +goroutine 255 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 295 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 12 [select, 1 minutes]: +github.com/mattermost/logr/v2.(*TargetHost).start(0xc0006d8310) + github.com/mattermost/logr/v2@v2.0.21/target.go:233 +0xb7 +created by github.com/mattermost/logr/v2.newTargetHost in goroutine 1 + github.com/mattermost/logr/v2@v2.0.21/target.go:92 +0x306 + +goroutine 13 [select]: +github.com/mattermost/logr/v2.(*TargetHost).start(0xc0006d8380) + github.com/mattermost/logr/v2@v2.0.21/target.go:233 +0xb7 +created by github.com/mattermost/logr/v2.newTargetHost in goroutine 1 + github.com/mattermost/logr/v2@v2.0.21/target.go:92 +0x306 + +goroutine 14 [select, 1 minutes]: +github.com/mattermost/logr/v2.(*Logr).start(0xc0028cc000) + github.com/mattermost/logr/v2@v2.0.21/logr.go:428 +0xb3 +created by github.com/mattermost/logr/v2.New in goroutine 1 + github.com/mattermost/logr/v2@v2.0.21/logr.go:81 +0x3b8 + +goroutine 15 [select, 1 minutes]: +github.com/mattermost/logr/v2.(*TargetHost).start(0xc0006d8460) + github.com/mattermost/logr/v2@v2.0.21/target.go:233 +0xb7 +created by github.com/mattermost/logr/v2.newTargetHost in goroutine 1 + github.com/mattermost/logr/v2@v2.0.21/target.go:92 +0x306 + +goroutine 16 [select, 1 minutes]: +github.com/mattermost/logr/v2.(*TargetHost).start(0xc0006d84d0) + github.com/mattermost/logr/v2@v2.0.21/target.go:233 +0xb7 +created by github.com/mattermost/logr/v2.newTargetHost in goroutine 1 + github.com/mattermost/logr/v2@v2.0.21/target.go:92 +0x306 + +goroutine 169 [select, 1 minutes]: +database/sql.(*DB).connectionOpener(0xc0028c8c30, {0x46e63f0, 0xc0028ece60}) + database/sql/sql.go:1218 +0x87 +created by database/sql.OpenDB in goroutine 1 + database/sql/sql.go:791 +0x165 + +goroutine 98 [chan receive, 1 minutes]: +gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun(0xc0027078c0) + gopkg.in/natefinch/lumberjack.v2@v2.2.1/lumberjack.go:379 +0x3f +created by gopkg.in/natefinch/lumberjack%2ev2.(*Logger).mill.func1 in goroutine 12 + gopkg.in/natefinch/lumberjack.v2@v2.2.1/lumberjack.go:390 +0x96 + +goroutine 28 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 294 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 175 [select, 1 minutes]: +database/sql.(*DB).connectionCleaner(0xc0028c8c30, 0x0?) + database/sql/sql.go:1061 +0x9c +created by database/sql.(*DB).startCleanerLocked in goroutine 1 + database/sql/sql.go:1048 +0x105 + +goroutine 177 [select]: +github.com/mattermost/mattermost/server/v8/channels/store/sqlstore.(*SqlStore).monitorReplicas(0xc000201c00) + github.com/mattermost/mattermost/server/v8/channels/store/sqlstore/store.go:468 +0xfe +created by github.com/mattermost/mattermost/server/v8/channels/store/sqlstore.New in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/store/sqlstore/store.go:162 +0x236 + +goroutine 1059 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc00195d2b0, {0xc00152f000, 0x1000, 0x67cc480?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc002980360, {0xc002586077, 0x1, 0xc002575d68?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc002980360}, {0xc002586077, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc002980360}, {0xc002586077, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc001cbc300) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc001cbc300, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc001cbc300, {0x34c8c00?, 0xc005a69830?, 0x7fffb03133c8?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc001cbc300, {0x34c8c00?, 0xc005a69830?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobClientCodec).ReadResponseHeader(0x3736a80?, 0x34f9880?) + net/rpc/client.go:228 +0x25 +net/rpc.(*Client).input(0xc0029804e0) + net/rpc/client.go:109 +0x9f +created by net/rpc.NewClientWithCodec in goroutine 884 + net/rpc/client.go:206 +0xb6 + +goroutine 221 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 298 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 1060 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0019264e0, {0xc0033f4000, 0x8000, 0xb2a00000b1a?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +io.copyBuffer({0x46d1140, 0xc005470028}, {0x46d2ba0, 0xc0019264e0}, {0x0, 0x0, 0x0}) + io/io.go:430 +0x1a6 +io.Copy(...) + io/io.go:389 +github.com/hashicorp/go-plugin.copyStream({0x3c66066, 0x6}, {0x46d1140?, 0xc005470028?}, {0x46d2ba0?, 0xc0019264e0?}) + github.com/hashicorp/go-plugin@v1.6.0/stream.go:18 +0x7d +created by github.com/hashicorp/go-plugin.(*RPCClient).SyncStreams in goroutine 884 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:111 +0xc9 + +goroutine 878 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc00195dba0, {0xc0013db000, 0x1000, 0xc007b05c88?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc0061527e0, {0xc00245c0d4, 0x1, 0xc007b05d68?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc0061527e0}, {0xc00245c0d4, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc0061527e0}, {0xc00245c0d4, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc0022b5280) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc0022b5280, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc0022b5280, {0x34c8c00?, 0xc006682480?, 0x7fffb0134b48?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc0022b5280, {0x34c8c00?, 0xc006682480?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobClientCodec).ReadResponseHeader(0x3736a80?, 0x0?) + net/rpc/client.go:228 +0x25 +net/rpc.(*Client).input(0xc0061528a0) + net/rpc/client.go:109 +0x9f +created by net/rpc.NewClientWithCodec in goroutine 884 + net/rpc/client.go:206 +0xb6 + +goroutine 1053 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0022c4000, {0xc001772000, 0x1000, 0x0?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc0013f0ea0, {0xc005a654d4, 0x1, 0x3849d00?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc0013f0ea0}, {0xc005a654d4, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc0013f0ea0}, {0xc005a654d4, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc00510b780) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc00510b780, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc00510b780, {0x34c8bc0?, 0xc004e486e0?, 0xc00510b7f0?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc00510b780, {0x34c8bc0?, 0xc004e486e0?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobServerCodec).ReadRequestHeader(0xc001003ac0?, 0x4e2cbf?) + net/rpc/server.go:402 +0x25 +net/rpc.(*Server).readRequestHeader(0xc001003ac0, {0x46e7260, 0xc00142b560}) + net/rpc/server.go:588 +0x58 +net/rpc.(*Server).readRequest(0x94c0d38?, {0x46e7260, 0xc00142b560}) + net/rpc/server.go:548 +0x2f +net/rpc.(*Server).ServeCodec(0xc001003ac0, {0x46e7260?, 0xc00142b560}) + net/rpc/server.go:463 +0x7c +net/rpc.(*Server).ServeConn(0xc001003ac0?, {0x7fffb060c448?, 0xc0022c4000}) + net/rpc/server.go:454 +0x32c +github.com/hashicorp/go-plugin.serve({0x7fffb060c448, 0xc0022c4000}, {0x3c65cca, 0x6}, {0x3c26f80, 0xc00639a120}) + github.com/hashicorp/go-plugin@v1.6.0/rpc_server.go:208 +0x126 +github.com/hashicorp/go-plugin.(*MuxBroker).AcceptAndServe(0x18fc3c5?, 0x5e88000?, {0x3c26f80, 0xc00639a120}) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:90 +0xed +github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate.func1() + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:246 +0xbf +created by github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate in goroutine 884 + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:244 +0x9e + +goroutine 696 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Session).keepalive(0xc004fd6540) + github.com/hashicorp/yamux@v0.1.1/session.go:349 +0x85 +created by github.com/hashicorp/yamux.newSession in goroutine 639 + github.com/hashicorp/yamux@v0.1.1/session.go:121 +0x4af + +goroutine 1049 [select]: +github.com/hashicorp/yamux.(*Session).sendLoop(0xc001df2b40) + github.com/hashicorp/yamux@v0.1.1/session.go:467 +0x125 +github.com/hashicorp/yamux.(*Session).send(0xc0028acfb8?) + github.com/hashicorp/yamux@v0.1.1/session.go:456 +0x18 +created by github.com/hashicorp/yamux.newSession in goroutine 884 + github.com/hashicorp/yamux@v0.1.1/session.go:119 +0x465 + +goroutine 1061 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc001926820, {0xc004a14000, 0x8000, 0xcea00000cba?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +io.copyBuffer({0x46d1140, 0xc005470038}, {0x46d2ba0, 0xc001926820}, {0x0, 0x0, 0x0}) + io/io.go:430 +0x1a6 +io.Copy(...) + io/io.go:389 +github.com/hashicorp/go-plugin.copyStream({0x3c66060, 0x6}, {0x46d1140?, 0xc005470038?}, {0x46d2ba0?, 0xc001926820?}) + github.com/hashicorp/go-plugin@v1.6.0/stream.go:18 +0x7d +created by github.com/hashicorp/go-plugin.(*RPCClient).SyncStreams in goroutine 884 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:112 +0x165 + +goroutine 235 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 236 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 237 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 238 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 239 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 240 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 241 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 242 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 243 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 244 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:387 +0x507 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:580 +0x34 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*Hub).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/web_hub.go:597 +0x125 + +goroutine 245 [chan receive, 1 minutes]: +github.com/getsentry/sentry-go.(*HTTPTransport).worker(0xc0003f50a0) + github.com/getsentry/sentry-go@v0.27.0/transport.go:471 +0x12a +created by github.com/getsentry/sentry-go.(*HTTPTransport).Configure.func1 in goroutine 1 + github.com/getsentry/sentry-go@v0.27.0/transport.go:343 +0x56 + +goroutine 246 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app.(*PushNotificationsHub).start(0xc002a0ca80, {0x4708fa0?, 0xc001be3320}) + github.com/mattermost/mattermost/server/v8/channels/app/notification_push.go:402 +0x105 +created by github.com/mattermost/mattermost/server/v8/channels/app.(*Server).createPushNotificationsHub in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/notification_push.go:394 +0x25f + +goroutine 247 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb816e4b0, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc000dd6720?, 0xc00280feb0?, 0x1) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc000dd6720, {0xc00280feb0, 0x10000, 0x10000}) + internal/poll/fd_unix.go:164 +0x27a +os.(*File).read(...) + os/file_posix.go:29 +os.(*File).Read(0xc000d46610, {0xc00280feb0?, 0x1000001000001?, 0x100000100000100?}) + os/file.go:118 +0x52 +github.com/fsnotify/fsnotify.(*Watcher).readEvents(0xc0026f9f40) + github.com/fsnotify/fsnotify@v1.7.0/backend_inotify.go:483 +0xd2 +created by github.com/fsnotify/fsnotify.NewBufferedWatcher in goroutine 1 + github.com/fsnotify/fsnotify@v1.7.0/backend_inotify.go:270 +0x1c5 + +goroutine 248 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/platform/shared/templates.NewWithWatcher.func1() + github.com/mattermost/mattermost/server/v8/platform/shared/templates/templates.go:94 +0x1ac +created by github.com/mattermost/mattermost/server/v8/platform/shared/templates.NewWithWatcher in goroutine 1 + github.com/mattermost/mattermost/server/v8/platform/shared/templates/templates.go:88 +0x20c + +goroutine 249 [chan receive, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/app.NewServer.func3() + github.com/mattermost/mattermost/server/v8/channels/app/server.go:332 +0x94 +github.com/mattermost/mattermost/server/v8/channels/app/platform.(*PlatformService).Go.func1() + github.com/mattermost/mattermost/server/v8/channels/app/platform/goroutines.go:14 +0x23 +created by github.com/mattermost/mattermost/server/v8/channels/app/platform.(*PlatformService).Go in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/platform/goroutines.go:13 +0x73 + +goroutine 260 [select]: +github.com/rudderlabs/analytics-go.(*client).loop(0xc0017a8000) + github.com/rudderlabs/analytics-go@v3.3.3+incompatible/analytics.go:522 +0x229 +created by github.com/rudderlabs/analytics-go.NewWithConfig in goroutine 296 + github.com/rudderlabs/analytics-go@v3.3.3+incompatible/analytics.go:99 +0x6ef + +goroutine 251 [select, 1 minutes]: +github.com/mattermost/logr/v2.(*Logr).start(0xc002a342c0) + github.com/mattermost/logr/v2@v2.0.21/logr.go:428 +0xb3 +created by github.com/mattermost/logr/v2.New in goroutine 1 + github.com/mattermost/logr/v2@v2.0.21/logr.go:81 +0x3b8 + +goroutine 691 [semacquire, 1 minutes]: +sync.runtime_Semacquire(0x3?) + runtime/sema.go:62 +0x25 +sync.(*WaitGroup).Wait(0xc0018183c0?) + sync/waitgroup.go:116 +0x48 +github.com/hashicorp/go-plugin.(*Client).Start.func2() + github.com/hashicorp/go-plugin@v1.6.0/client.go:772 +0xa8 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 639 + github.com/hashicorp/go-plugin@v1.6.0/client.go:764 +0x1a6e + +goroutine 53 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 301 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 29 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 294 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 280 [chan receive, 1 minutes]: +github.com/rudderlabs/analytics-go.(*executor).loop(0xc0027123c0) + github.com/rudderlabs/analytics-go@v3.3.3+incompatible/executor.go:39 +0x49 +created by github.com/rudderlabs/analytics-go.newExecutor in goroutine 260 + github.com/rudderlabs/analytics-go@v3.3.3+incompatible/executor.go:17 +0xa5 + +goroutine 690 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb816db00, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc001d2e900?, 0xc006100000?, 0x1) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc001d2e900, {0xc006100000, 0x10000, 0x10000}) + internal/poll/fd_unix.go:164 +0x27a +os.(*File).read(...) + os/file_posix.go:29 +os.(*File).Read(0xc000b2c508, {0xc006100000?, 0x3c63a7a?, 0x367c700?}) + os/file.go:118 +0x52 +bufio.(*Reader).fill(0xc002a02f30) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).ReadSlice(0xc002a02f30, 0x1?) + bufio/bufio.go:379 +0x29 +bufio.(*Reader).ReadLine(0xc002a02f30) + bufio/bufio.go:408 +0x25 +github.com/hashicorp/go-plugin.(*Client).logStderr(0xc001ecf500, {0xc004ba47d0?, 0xc005ce76e0?}, {0x46d08e0?, 0xc000b2c508?}) + github.com/hashicorp/go-plugin@v1.6.0/client.go:1170 +0x2b5 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 639 + github.com/hashicorp/go-plugin@v1.6.0/client.go:761 +0x19e5 + +goroutine 1236 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb03771b0, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc00526b380?, 0xc001bd6000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc00526b380, {0xc001bd6000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc00526b380, {0xc001bd6000?, 0x4b0905?, 0x7fffb03772a0?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc000844268, {0xc001bd6000?, 0x0?, 0xc0020d9e68?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc0020d9e60, {0xc001bd6000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc005a538c0) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc005a538c0, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc000a18870, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 293 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 1 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 953 [select]: +github.com/hashicorp/yamux.(*Session).AcceptStream(0xc00664a000) + github.com/hashicorp/yamux@v0.1.1/session.go:242 +0x69 +github.com/hashicorp/go-plugin.(*MuxBroker).Run(0xc0062660c0) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:142 +0x2a +created by github.com/hashicorp/go-plugin.NewRPCClient in goroutine 882 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:91 +0x1e5 + +goroutine 1188 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb0377590, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc00526ad80?, 0x4?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Accept(0xc00526ad80) + internal/poll/fd_unix.go:611 +0x2ac +net.(*netFD).accept(0xc00526ad80) + net/fd_unix.go:172 +0x29 +net.(*TCPListener).accept(0xc0066813c0) + net/tcpsock_posix.go:152 +0x1e +net.(*TCPListener).Accept(0xc0066813c0) + net/tcpsock.go:315 +0x30 +net/http.(*Server).Serve(0xc004f100f0, {0x46e1a88, 0xc0066813c0}) + net/http/server.go:3056 +0x364 +github.com/mattermost/mattermost/server/v8/channels/app.(*Server).Start.func2() + github.com/mattermost/mattermost/server/v8/channels/app/server.go:1062 +0x26e +created by github.com/mattermost/mattermost/server/v8/channels/app.(*Server).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/server.go:999 +0x2086 + +goroutine 302 [sleep, 1 minutes]: +time.Sleep(0x34630b8a000) + runtime/time.go:195 +0x125 +github.com/mattermost/enterprise/compliance.(*ComplianceInterfaceImpl).StartComplianceDailyJob(0xc00218ce68) + github.com/mattermost/enterprise/compliance/compliance.go:300 +0x3b1 +created by github.com/mattermost/mattermost/server/v8/channels/app.(*Server).runJobs in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/app/server.go:534 +0x31f + +goroutine 303 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d6af0) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 304 [select, 1 minutes]: +github.com/mattermost/enterprise/data_retention.(*DataRetentionWorker).Run(0xc002980480) + github.com/mattermost/enterprise/data_retention/worker.go:76 +0x1f5 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 305 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d6910) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 306 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d6c80) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 307 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d7770) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 308 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d7860) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 309 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/platform/services/searchengine/bleveengine/indexer.(*BleveIndexerWorker).Run(0xc000897680) + github.com/mattermost/mattermost/server/v8/platform/services/searchengine/bleveengine/indexer/indexing_job.go:125 +0x1f5 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 310 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*BatchWorker).Run(0xc0008977a0) + github.com/mattermost/mattermost/server/v8/channels/jobs/batch_worker.go:76 +0x1f5 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 311 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs/resend_invitation_email.(*ResendInvitationEmailWorker).Run(0xc000999b90) + github.com/mattermost/mattermost/server/v8/channels/jobs/resend_invitation_email/worker.go:66 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 312 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs/plugins.(*Worker).Run(0xc0006d6730) + github.com/mattermost/mattermost/server/v8/channels/jobs/plugins/worker.go:50 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 693 [chan receive, 1 minutes]: +github.com/hashicorp/go-plugin.(*Client).Start.func4.1() + github.com/hashicorp/go-plugin@v1.6.0/client.go:816 +0x77 +created by github.com/hashicorp/go-plugin.(*Client).Start.func4 in goroutine 639 + github.com/hashicorp/go-plugin@v1.6.0/client.go:814 +0x6e + +goroutine 313 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d6a00) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 314 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d7590) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 315 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*BatchWorker).Run(0xc000897800) + github.com/mattermost/mattermost/server/v8/channels/jobs/batch_worker.go:76 +0x1f5 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 316 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d6ff0) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 317 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d74a0) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 318 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs/migrations.(*Worker).Run(0xc0008976e0) + github.com/mattermost/mattermost/server/v8/channels/jobs/migrations/worker.go:62 +0x171 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 319 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d7680) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 320 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*BatchWorker).Run(0xc000897860) + github.com/mattermost/mattermost/server/v8/channels/jobs/batch_worker.go:76 +0x1f5 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 695 [select]: +github.com/hashicorp/yamux.(*Session).sendLoop(0xc004fd6540) + github.com/hashicorp/yamux@v0.1.1/session.go:467 +0x125 +github.com/hashicorp/yamux.(*Session).send(0x0?) + github.com/hashicorp/yamux@v0.1.1/session.go:456 +0x18 +created by github.com/hashicorp/yamux.newSession in goroutine 639 + github.com/hashicorp/yamux@v0.1.1/session.go:119 +0x465 + +goroutine 533 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 297 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 321 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*SimpleWorker).Run(0xc0006d6d70) + github.com/mattermost/mattermost/server/v8/channels/jobs/base_workers.go:48 +0x131 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:52 +0x12b + +goroutine 370 [select]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*Watcher).Start(0xc002b31440) + github.com/mattermost/mattermost/server/v8/channels/jobs/jobs_watcher.go:51 +0x1b5 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Workers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/workers.go:56 +0x17f + +goroutine 948 [select]: +github.com/hashicorp/yamux.(*Session).sendLoop(0xc00664a000) + github.com/hashicorp/yamux@v0.1.1/session.go:467 +0x125 +github.com/hashicorp/yamux.(*Session).send(0x0?) + github.com/hashicorp/yamux@v0.1.1/session.go:456 +0x18 +created by github.com/hashicorp/yamux.newSession in goroutine 882 + github.com/hashicorp/yamux@v0.1.1/session.go:119 +0x465 + +goroutine 371 [select, 1 minutes]: +github.com/mattermost/mattermost/server/v8/channels/jobs.(*Schedulers).Start.func1() + github.com/mattermost/mattermost/server/v8/channels/jobs/schedulers.go:72 +0x369 +created by github.com/mattermost/mattermost/server/v8/channels/jobs.(*Schedulers).Start in goroutine 1 + github.com/mattermost/mattermost/server/v8/channels/jobs/schedulers.go:53 +0x136 + +goroutine 33 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 300 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 947 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb0377688, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc001862000?, 0xc00285b000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc001862000, {0xc00285b000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc001862000, {0xc00285b000?, 0x46d1960?, 0xc0061f8180?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc006246000, {0xc00285b000?, 0x7fffff53af18?, 0x18?}) + net/net.go:179 +0x45 +bufio.(*Reader).Read(0xc0061f8180, {0xc000f62110, 0xc, 0x2?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc0061f8180}, {0xc000f62110, 0xc, 0xc}, 0xc) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +github.com/hashicorp/yamux.(*Session).recvLoop(0xc00664a000) + github.com/hashicorp/yamux@v0.1.1/session.go:536 +0xb0 +github.com/hashicorp/yamux.(*Session).recv(0xc006255a10?) + github.com/hashicorp/yamux@v0.1.1/session.go:515 +0x18 +created by github.com/hashicorp/yamux.newSession in goroutine 882 + github.com/hashicorp/yamux@v0.1.1/session.go:118 +0x426 + +goroutine 348 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 299 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 949 [select]: +github.com/hashicorp/yamux.(*Session).keepalive(0xc00664a000) + github.com/hashicorp/yamux@v0.1.1/session.go:349 +0x85 +created by github.com/hashicorp/yamux.newSession in goroutine 882 + github.com/hashicorp/yamux@v0.1.1/session.go:121 +0x4af + +goroutine 895 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc001d56820, {0xc0028fd000, 0x1000, 0xc004dcbc88?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc005a52300, {0xc000f62140, 0x1, 0xc004dcbd68?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc005a52300}, {0xc000f62140, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc005a52300}, {0xc000f62140, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc005802180) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc005802180, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc005802180, {0x34c8c00?, 0xc0061de420?, 0x7fffb036a6b0?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc005802180, {0x34c8c00?, 0xc0061de420?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobClientCodec).ReadResponseHeader(0x3736a80?, 0x0?) + net/rpc/client.go:228 +0x25 +net/rpc.(*Client).input(0xc005a52420) + net/rpc/client.go:109 +0x9f +created by net/rpc.NewClientWithCodec in goroutine 882 + net/rpc/client.go:206 +0xb6 + +goroutine 955 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc001d80d00, {0xc001e6a000, 0x8000, 0xc0024cded0?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +io.copyBuffer({0x46d1140, 0xc000844d00}, {0x46d2ba0, 0xc001d80d00}, {0x0, 0x0, 0x0}) + io/io.go:430 +0x1a6 +io.Copy(...) + io/io.go:389 +github.com/hashicorp/go-plugin.copyStream({0x3c66066, 0x6}, {0x46d1140?, 0xc000844d00?}, {0x46d2ba0?, 0xc001d80d00?}) + github.com/hashicorp/go-plugin@v1.6.0/stream.go:18 +0x7d +created by github.com/hashicorp/go-plugin.(*RPCClient).SyncStreams in goroutine 882 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:111 +0xc9 + +goroutine 954 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc001d80820, {0xc006321000, 0x1000, 0x67cc480?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc0061f85a0, {0xc001c1a090, 0x1, 0xc005e3bd68?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc0061f85a0}, {0xc001c1a090, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc0061f85a0}, {0xc001c1a090, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc001862a80) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc001862a80, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc001862a80, {0x34c8c00?, 0xc005a68000?, 0x7fffb03133c8?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc001862a80, {0x34c8c00?, 0xc005a68000?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobClientCodec).ReadResponseHeader(0x3736a80?, 0x34f9880?) + net/rpc/client.go:228 +0x25 +net/rpc.(*Client).input(0xc0061f8660) + net/rpc/client.go:109 +0x9f +created by net/rpc.NewClientWithCodec in goroutine 882 + net/rpc/client.go:206 +0xb6 + +goroutine 638 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/plugin.(*PluginHealthCheckJob).run(0xc0057cacd0) + github.com/mattermost/mattermost/server/public/plugin/health_check.go:38 +0x112 +created by github.com/mattermost/mattermost/server/public/plugin.(*Environment).TogglePluginHealthCheckJob in goroutine 1 + github.com/mattermost/mattermost/server/public/plugin/environment.go:665 +0x23f + +goroutine 694 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb816da08, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc004f8c780?, 0xc0060df000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc004f8c780, {0xc0060df000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc004f8c780, {0xc0060df000?, 0x46d1960?, 0xc001d2eae0?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc000b2c518, {0xc0060df000?, 0x40b550?, 0xc002b65e60?}) + net/net.go:179 +0x45 +bufio.(*Reader).Read(0xc001d2eae0, {0xc000efb4d0, 0xc, 0x2?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc001d2eae0}, {0xc000efb4d0, 0xc, 0xc}, 0xc) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +github.com/hashicorp/yamux.(*Session).recvLoop(0xc004fd6540) + github.com/hashicorp/yamux@v0.1.1/session.go:536 +0xb0 +github.com/hashicorp/yamux.(*Session).recv(0xc004f8c480?) + github.com/hashicorp/yamux@v0.1.1/session.go:515 +0x18 +created by github.com/hashicorp/yamux.newSession in goroutine 639 + github.com/hashicorp/yamux@v0.1.1/session.go:118 +0x426 + +goroutine 692 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb816dcf0, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc001d2e840?, 0xc0060de026?, 0x1) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc001d2e840, {0xc0060de026, 0xfda, 0xfda}) + internal/poll/fd_unix.go:164 +0x27a +os.(*File).read(...) + os/file_posix.go:29 +os.(*File).Read(0xc000b2c4f8, {0xc0060de026?, 0x40b080?, 0xc000802d00?}) + os/file.go:118 +0x52 +bufio.(*Scanner).Scan(0xc002ecff40) + bufio/scan.go:214 +0x81b +github.com/hashicorp/go-plugin.(*Client).Start.func3() + github.com/hashicorp/go-plugin@v1.6.0/client.go:800 +0x165 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 639 + github.com/hashicorp/go-plugin@v1.6.0/client.go:795 +0x1b26 + +goroutine 700 [select]: +github.com/hashicorp/yamux.(*Session).AcceptStream(0xc004fd6540) + github.com/hashicorp/yamux@v0.1.1/session.go:242 +0x69 +github.com/hashicorp/go-plugin.(*MuxBroker).Run(0xc004bd2f60) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:142 +0x2a +created by github.com/hashicorp/go-plugin.NewRPCClient in goroutine 639 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:91 +0x1e5 + +goroutine 701 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc001439e10, {0xc0060e9000, 0x1000, 0x67cc480?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc001d2f020, {0xc000efb520, 0x1, 0xc001ae1d68?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc001d2f020}, {0xc000efb520, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc001d2f020}, {0xc000efb520, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc004f8c980) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc004f8c980, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc004f8c980, {0x34c8c00?, 0xc005ed71a0?, 0x7fffb0151888?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc004f8c980, {0x34c8c00?, 0xc005ed71a0?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobClientCodec).ReadResponseHeader(0x3736a80?, 0x34f9880?) + net/rpc/client.go:228 +0x25 +net/rpc.(*Client).input(0xc001d2f0e0) + net/rpc/client.go:109 +0x9f +created by net/rpc.NewClientWithCodec in goroutine 639 + net/rpc/client.go:206 +0xb6 + +goroutine 702 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0014661a0, {0xc005a48000, 0x8000, 0x0?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +io.copyBuffer({0x46d1140, 0xc000b2c4d0}, {0x46d2ba0, 0xc0014661a0}, {0x0, 0x0, 0x0}) + io/io.go:430 +0x1a6 +io.Copy(...) + io/io.go:389 +github.com/hashicorp/go-plugin.copyStream({0x3c66066, 0x6}, {0x46d1140?, 0xc000b2c4d0?}, {0x46d2ba0?, 0xc0014661a0?}) + github.com/hashicorp/go-plugin@v1.6.0/stream.go:18 +0x7d +created by github.com/hashicorp/go-plugin.(*RPCClient).SyncStreams in goroutine 639 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:111 +0xc9 + +goroutine 703 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0014664e0, {0xc006144000, 0x8000, 0x0?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +io.copyBuffer({0x46d1140, 0xc000b2c4d8}, {0x46d2ba0, 0xc0014664e0}, {0x0, 0x0, 0x0}) + io/io.go:430 +0x1a6 +io.Copy(...) + io/io.go:389 +github.com/hashicorp/go-plugin.copyStream({0x3c66060, 0x6}, {0x46d1140?, 0xc000b2c4d8?}, {0x46d2ba0?, 0xc0014664e0?}) + github.com/hashicorp/go-plugin@v1.6.0/stream.go:18 +0x7d +created by github.com/hashicorp/go-plugin.(*RPCClient).SyncStreams in goroutine 639 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:112 +0x165 + +goroutine 705 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0014671e0, {0xc0060ed000, 0x1000, 0xc001b49c88?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc001d2f5c0, {0xc000efb780, 0x1, 0xc001b49d68?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc001d2f5c0}, {0xc000efb780, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc001d2f5c0}, {0xc000efb780, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc004f8ca00) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc004f8ca00, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc004f8ca00, {0x34c8c00?, 0xc004ff0d80?, 0x7fffb0608470?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc004f8ca00, {0x34c8c00?, 0xc004ff0d80?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobClientCodec).ReadResponseHeader(0x3736a80?, 0x0?) + net/rpc/client.go:228 +0x25 +net/rpc.(*Client).input(0xc001d2f680) + net/rpc/client.go:109 +0x9f +created by net/rpc.NewClientWithCodec in goroutine 639 + net/rpc/client.go:206 +0xb6 + +goroutine 706 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0018956c0, {0xc0061cf000, 0x1000, 0x4?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc0061a9ce0, {0xc000efbd70, 0x1, 0x3849580?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc0061a9ce0}, {0xc000efbd70, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc0061a9ce0}, {0xc000efbd70, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc0061be500) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc0061be500, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc0061be500, {0x34c8bc0?, 0xc00180eee0?, 0xc0061be570?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc0061be500, {0x34c8bc0?, 0xc00180eee0?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobServerCodec).ReadRequestHeader(0xc000ee3e80?, 0xc001d05f60?) + net/rpc/server.go:402 +0x25 +net/rpc.(*Server).readRequestHeader(0xc000ee3e80, {0x46e7260, 0xc0061a3560}) + net/rpc/server.go:588 +0x58 +net/rpc.(*Server).readRequest(0x7fffff53aa68?, {0x46e7260, 0xc0061a3560}) + net/rpc/server.go:548 +0x2f +net/rpc.(*Server).ServeCodec(0xc000ee3e80, {0x46e7260?, 0xc0061a3560}) + net/rpc/server.go:463 +0x7c +net/rpc.(*Server).ServeConn(0xc000ee3e80?, {0x7fffb060c448?, 0xc0018956c0}) + net/rpc/server.go:454 +0x32c +github.com/hashicorp/go-plugin.serve({0x7fffb060c448, 0xc0018956c0}, {0x3c65cca, 0x6}, {0x3c26f80, 0xc004fee7c8}) + github.com/hashicorp/go-plugin@v1.6.0/rpc_server.go:208 +0x126 +github.com/hashicorp/go-plugin.(*MuxBroker).AcceptAndServe(0xc000cf3740?, 0xd06330?, {0x3c26f80, 0xc004fee7c8}) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:90 +0xed +github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate.func1() + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:246 +0xbf +created by github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate in goroutine 639 + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:244 +0x9e + +goroutine 707 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0014da270, {0xc0060f5000, 0x1000, 0x5?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc0060f20c0, {0xc000efb9e0, 0x1, 0xa9cd65?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc0060f20c0}, {0xc000efb9e0, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc0060f20c0}, {0xc000efb9e0, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc004f8d500) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc004f8d500, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc004f8d500, {0x34c8bc0?, 0xc004bd3300?, 0xc004f8d570?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc004f8d500, {0x34c8bc0?, 0xc004bd3300?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobServerCodec).ReadRequestHeader(0xc005e8f040?, 0xc001d052c0?) + net/rpc/server.go:402 +0x25 +net/rpc.(*Server).readRequestHeader(0xc005e8f040, {0x46e7260, 0xc004ff15c0}) + net/rpc/server.go:588 +0x58 +net/rpc.(*Server).readRequest(0x7fffff53aa68?, {0x46e7260, 0xc004ff15c0}) + net/rpc/server.go:548 +0x2f +net/rpc.(*Server).ServeCodec(0xc005e8f040, {0x46e7260?, 0xc004ff15c0}) + net/rpc/server.go:463 +0x7c +net/rpc.(*Server).ServeConn(0xc005e8f040?, {0x7fffb060c448?, 0xc0014da270}) + net/rpc/server.go:454 +0x32c +github.com/hashicorp/go-plugin.serve({0x7fffb060c448, 0xc0014da270}, {0x3c65cca, 0x6}, {0x3b1aac0, 0xc00141f250}) + github.com/hashicorp/go-plugin@v1.6.0/rpc_server.go:208 +0x126 +github.com/hashicorp/go-plugin.(*MuxBroker).AcceptAndServe(0xc0005e4528?, 0x5e4b58?, {0x3b1aac0, 0xc00141f250}) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:90 +0xed +github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate.func2() + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:256 +0xa6 +created by github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate in goroutine 639 + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:254 +0x118 + +goroutine 1058 [select]: +github.com/hashicorp/yamux.(*Session).AcceptStream(0xc001df2b40) + github.com/hashicorp/yamux@v0.1.1/session.go:242 +0x69 +github.com/hashicorp/go-plugin.(*MuxBroker).Run(0xc001798000) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:142 +0x2a +created by github.com/hashicorp/go-plugin.NewRPCClient in goroutine 884 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:91 +0x1e5 + +goroutine 1048 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb03773a0, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc001eead00?, 0xc0014b2000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc001eead00, {0xc0014b2000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc001eead00, {0xc0014b2000?, 0x46d1960?, 0xc005a2f2c0?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc0061dc390, {0xc0014b2000?, 0x40b550?, 0xc002b1fe60?}) + net/net.go:179 +0x45 +bufio.(*Reader).Read(0xc005a2f2c0, {0xc002586080, 0xc, 0x2?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc005a2f2c0}, {0xc002586080, 0xc, 0xc}, 0xc) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +github.com/hashicorp/yamux.(*Session).recvLoop(0xc001df2b40) + github.com/hashicorp/yamux@v0.1.1/session.go:536 +0xb0 +github.com/hashicorp/yamux.(*Session).recv(0xc002b1ffb8?) + github.com/hashicorp/yamux@v0.1.1/session.go:515 +0x18 +created by github.com/hashicorp/yamux.newSession in goroutine 884 + github.com/hashicorp/yamux@v0.1.1/session.go:118 +0x426 + +goroutine 1228 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb03770b8, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005314200?, 0xc001bf8000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005314200, {0xc001bf8000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc005314200, {0xc001bf8000?, 0x4b0905?, 0x7fffb03771a8?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc000d47800, {0xc001bf8000?, 0x0?, 0xc00211cc98?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc00211cc90, {0xc001bf8000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc005a53b60) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc005a53b60, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc001bca2d0, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 1054 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0022c5450, {0xc001786000, 0x1000, 0x5?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc0013f1800, {0xc005a65524, 0x1, 0xa9cd65?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc0013f1800}, {0xc005a65524, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc0013f1800}, {0xc005a65524, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc00516c200) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc00516c200, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc00516c200, {0x34c8bc0?, 0xc000f84920?, 0xc00516c270?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc00516c200, {0x34c8bc0?, 0xc000f84920?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobServerCodec).ReadRequestHeader(0xc001003c40?, 0xc007ca8400?) + net/rpc/server.go:402 +0x25 +net/rpc.(*Server).readRequestHeader(0xc001003c40, {0x46e7260, 0xc0013df4a0}) + net/rpc/server.go:588 +0x58 +net/rpc.(*Server).readRequest(0x411cbe?, {0x46e7260, 0xc0013df4a0}) + net/rpc/server.go:548 +0x2f +net/rpc.(*Server).ServeCodec(0xc001003c40, {0x46e7260?, 0xc0013df4a0}) + net/rpc/server.go:463 +0x7c +net/rpc.(*Server).ServeConn(0xc001003c40?, {0x7fffb060c448?, 0xc0022c5450}) + net/rpc/server.go:454 +0x32c +github.com/hashicorp/go-plugin.serve({0x7fffb060c448, 0xc0022c5450}, {0x3c65cca, 0x6}, {0x3b1aac0, 0xc001bd44a0}) + github.com/hashicorp/go-plugin@v1.6.0/rpc_server.go:208 +0x126 +github.com/hashicorp/go-plugin.(*MuxBroker).AcceptAndServe(0x18fc3c5?, 0x27b520?, {0x3b1aac0, 0xc001bd44a0}) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:90 +0xed +github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate.func2() + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:256 +0xa6 +created by github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate in goroutine 884 + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:254 +0x118 + +goroutine 1050 [select]: +github.com/hashicorp/yamux.(*Session).keepalive(0xc001df2b40) + github.com/hashicorp/yamux@v0.1.1/session.go:349 +0x85 +created by github.com/hashicorp/yamux.newSession in goroutine 884 + github.com/hashicorp/yamux@v0.1.1/session.go:121 +0x4af + +goroutine 894 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb816dbf8, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005a520c0?, 0xc001ec3027?, 0x1) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005a520c0, {0xc001ec3027, 0xfd9, 0xfd9}) + internal/poll/fd_unix.go:164 +0x27a +os.(*File).read(...) + os/file_posix.go:29 +os.(*File).Read(0xc000d460e8, {0xc001ec3027?, 0x40b080?, 0xc0017bc820?}) + os/file.go:118 +0x52 +bufio.(*Scanner).Scan(0xc000099f40) + bufio/scan.go:214 +0x81b +github.com/hashicorp/go-plugin.(*Client).Start.func3() + github.com/hashicorp/go-plugin@v1.6.0/client.go:800 +0x165 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 882 + github.com/hashicorp/go-plugin@v1.6.0/client.go:795 +0x1b26 + +goroutine 765 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc002a1a0d0, {0xc005ee1000, 0x1000, 0x5?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc005a53020, {0xc000f621f4, 0x1, 0xa9cd65?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc005a53020}, {0xc000f621f4, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc005a53020}, {0xc000f621f4, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc005802f00) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc005802f00, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc005802f00, {0x34c8bc0?, 0xc0009ee660?, 0xc005802f70?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc005802f00, {0x34c8bc0?, 0xc0009ee660?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobServerCodec).ReadRequestHeader(0xc0008f8840?, 0xc001175e20?) + net/rpc/server.go:402 +0x25 +net/rpc.(*Server).readRequestHeader(0xc0008f8840, {0x46e7260, 0xc0061dea80}) + net/rpc/server.go:588 +0x58 +net/rpc.(*Server).readRequest(0x7fffff53a5b8?, {0x46e7260, 0xc0061dea80}) + net/rpc/server.go:548 +0x2f +net/rpc.(*Server).ServeCodec(0xc0008f8840, {0x46e7260?, 0xc0061dea80}) + net/rpc/server.go:463 +0x7c +net/rpc.(*Server).ServeConn(0xc0008f8840?, {0x7fffb060c448?, 0xc002a1a0d0}) + net/rpc/server.go:454 +0x32c +github.com/hashicorp/go-plugin.serve({0x7fffb060c448, 0xc002a1a0d0}, {0x3c65cca, 0x6}, {0x3b1aac0, 0xc0063a61a0}) + github.com/hashicorp/go-plugin@v1.6.0/rpc_server.go:208 +0x126 +github.com/hashicorp/go-plugin.(*MuxBroker).AcceptAndServe(0xc0005e4528?, 0x5e4b58?, {0x3b1aac0, 0xc0063a61a0}) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:90 +0xed +github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate.func2() + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:256 +0xa6 +created by github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate in goroutine 882 + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:254 +0x118 + +goroutine 1047 [chan receive, 1 minutes]: +github.com/hashicorp/go-plugin.(*Client).Start.func4.1() + github.com/hashicorp/go-plugin@v1.6.0/client.go:816 +0x77 +created by github.com/hashicorp/go-plugin.(*Client).Start.func4 in goroutine 884 + github.com/hashicorp/go-plugin@v1.6.0/client.go:814 +0x6e + +goroutine 946 [chan receive, 1 minutes]: +github.com/hashicorp/go-plugin.(*Client).Start.func4.1() + github.com/hashicorp/go-plugin@v1.6.0/client.go:816 +0x77 +created by github.com/hashicorp/go-plugin.(*Client).Start.func4 in goroutine 882 + github.com/hashicorp/go-plugin@v1.6.0/client.go:814 +0x6e + +goroutine 942 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb0377498, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc001764960?, 0xc002880000?, 0x1) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc001764960, {0xc002880000, 0x10000, 0x10000}) + internal/poll/fd_unix.go:164 +0x27a +os.(*File).read(...) + os/file_posix.go:29 +os.(*File).Read(0xc005470070, {0xc002880000?, 0x3c63a7a?, 0x367c700?}) + os/file.go:118 +0x52 +bufio.(*Reader).fill(0xc002553f30) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).ReadSlice(0xc002553f30, 0x1?) + bufio/bufio.go:379 +0x29 +bufio.(*Reader).ReadLine(0xc002553f30) + bufio/bufio.go:408 +0x25 +github.com/hashicorp/go-plugin.(*Client).logStderr(0xc001ece000, {0xc005ef4090?, 0x24a0000021a?}, {0x46d08e0?, 0xc005470070?}) + github.com/hashicorp/go-plugin@v1.6.0/client.go:1170 +0x2b5 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 884 + github.com/hashicorp/go-plugin@v1.6.0/client.go:761 +0x19e5 + +goroutine 892 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb816d818, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005a52180?, 0xc002522000?, 0x1) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005a52180, {0xc002522000, 0x10000, 0x10000}) + internal/poll/fd_unix.go:164 +0x27a +os.(*File).read(...) + os/file_posix.go:29 +os.(*File).Read(0xc000d462f0, {0xc002522000?, 0x3c63a7a?, 0x367c700?}) + os/file.go:118 +0x52 +bufio.(*Reader).fill(0xc002b4af30) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).ReadSlice(0xc002b4af30, 0x1?) + bufio/bufio.go:379 +0x29 +bufio.(*Reader).ReadLine(0xc002b4af30) + bufio/bufio.go:408 +0x25 +github.com/hashicorp/go-plugin.(*Client).logStderr(0xc000dbca00, {0xc006e7d780?, 0xc005ecf0e0?}, {0x46d08e0?, 0xc000d462f0?}) + github.com/hashicorp/go-plugin@v1.6.0/client.go:1170 +0x2b5 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 882 + github.com/hashicorp/go-plugin@v1.6.0/client.go:761 +0x19e5 + +goroutine 764 [select]: +github.com/hashicorp/yamux.(*Stream).Read(0xc0018aa1a0, {0xc00084c000, 0x1000, 0x6?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +bufio.(*Reader).Read(0xc00581d260, {0xc0005c84c0, 0x1, 0x396d520?}) + bufio/bufio.go:244 +0x197 +io.ReadAtLeast({0x46d1960, 0xc00581d260}, {0xc0005c84c0, 0x1, 0x9}, 0x1) + io/io.go:335 +0x90 +io.ReadFull(...) + io/io.go:354 +encoding/gob.decodeUintReader({0x46d1960, 0xc00581d260}, {0xc0005c84c0, 0x9, 0x9}) + encoding/gob/decode.go:116 +0x51 +encoding/gob.(*Decoder).recvMessage(0xc00660df80) + encoding/gob/decoder.go:82 +0x33 +encoding/gob.(*Decoder).decodeTypeSequence(0xc00660df80, 0x0) + encoding/gob/decoder.go:148 +0x47 +encoding/gob.(*Decoder).DecodeValue(0xc00660df80, {0x34c8bc0?, 0xc0009ee040?, 0xc00660dff0?}) + encoding/gob/decoder.go:227 +0x16e +encoding/gob.(*Decoder).Decode(0xc00660df80, {0x34c8bc0?, 0xc0009ee040?}) + encoding/gob/decoder.go:204 +0x125 +net/rpc.(*gobServerCodec).ReadRequestHeader(0xc000f9c0c0?, 0xc007e60500?) + net/rpc/server.go:402 +0x25 +net/rpc.(*Server).readRequestHeader(0xc000f9c0c0, {0x46e7260, 0xc00631bb30}) + net/rpc/server.go:588 +0x58 +net/rpc.(*Server).readRequest(0x94c0d38?, {0x46e7260, 0xc00631bb30}) + net/rpc/server.go:548 +0x2f +net/rpc.(*Server).ServeCodec(0xc000f9c0c0, {0x46e7260?, 0xc00631bb30}) + net/rpc/server.go:463 +0x7c +net/rpc.(*Server).ServeConn(0xc000f9c0c0?, {0x7fffb060c448?, 0xc0018aa1a0}) + net/rpc/server.go:454 +0x32c +github.com/hashicorp/go-plugin.serve({0x7fffb060c448, 0xc0018aa1a0}, {0x3c65cca, 0x6}, {0x3c26f80, 0xc0017b4b70}) + github.com/hashicorp/go-plugin@v1.6.0/rpc_server.go:208 +0x126 +github.com/hashicorp/go-plugin.(*MuxBroker).AcceptAndServe(0x0?, 0x0?, {0x3c26f80, 0xc0017b4b70}) + github.com/hashicorp/go-plugin@v1.6.0/mux_broker.go:90 +0xed +github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate.func1() + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:246 +0xbf +created by github.com/mattermost/mattermost/server/public/plugin.(*hooksRPCClient).OnActivate in goroutine 882 + github.com/mattermost/mattermost/server/public/plugin/client_rpc.go:244 +0x9e + +goroutine 944 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb816d910, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc0017647e0?, 0xc00607c026?, 0x1) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc0017647e0, {0xc00607c026, 0xfda, 0xfda}) + internal/poll/fd_unix.go:164 +0x27a +os.(*File).read(...) + os/file_posix.go:29 +os.(*File).Read(0xc005470058, {0xc00607c026?, 0x40b080?, 0xc005005ba0?}) + os/file.go:118 +0x52 +bufio.(*Scanner).Scan(0xc002555f40) + bufio/scan.go:214 +0x81b +github.com/hashicorp/go-plugin.(*Client).Start.func3() + github.com/hashicorp/go-plugin@v1.6.0/client.go:800 +0x165 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 884 + github.com/hashicorp/go-plugin@v1.6.0/client.go:795 +0x1b26 + +goroutine 943 [semacquire, 1 minutes]: +sync.runtime_Semacquire(0x9ba000009aa?) + runtime/sema.go:62 +0x25 +sync.(*WaitGroup).Wait(0x9ba000009aa?) + sync/waitgroup.go:116 +0x48 +github.com/hashicorp/go-plugin.(*Client).Start.func2() + github.com/hashicorp/go-plugin@v1.6.0/client.go:772 +0xa8 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 884 + github.com/hashicorp/go-plugin@v1.6.0/client.go:764 +0x1a6e + +goroutine 941 [select, 1 minutes]: +github.com/mattermost/mattermost/server/public/model.createTask.func1() + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:69 +0x205 +created by github.com/mattermost/mattermost/server/public/model.createTask in goroutine 296 + github.com/mattermost/mattermost/server/public/model/scheduled_task.go:46 +0x165 + +goroutine 893 [semacquire, 1 minutes]: +sync.runtime_Semacquire(0xc002b8ff8c?) + runtime/sema.go:62 +0x25 +sync.(*WaitGroup).Wait(0xc0061b3aa0?) + sync/waitgroup.go:116 +0x48 +github.com/hashicorp/go-plugin.(*Client).Start.func2() + github.com/hashicorp/go-plugin@v1.6.0/client.go:772 +0xa8 +created by github.com/hashicorp/go-plugin.(*Client).Start in goroutine 882 + github.com/hashicorp/go-plugin@v1.6.0/client.go:764 +0x1a6e + +goroutine 956 [select, 1 minutes]: +github.com/hashicorp/yamux.(*Stream).Read(0xc001d81040, {0xc004b3c000, 0x8000, 0x7fffb05cb5e8?}) + github.com/hashicorp/yamux@v0.1.1/stream.go:145 +0x425 +io.copyBuffer({0x46d1140, 0xc000844d08}, {0x46d2ba0, 0xc001d81040}, {0x0, 0x0, 0x0}) + io/io.go:430 +0x1a6 +io.Copy(...) + io/io.go:389 +github.com/hashicorp/go-plugin.copyStream({0x3c66060, 0x6}, {0x46d1140?, 0xc000844d08?}, {0x46d2ba0?, 0xc001d81040?}) + github.com/hashicorp/go-plugin@v1.6.0/stream.go:18 +0x7d +created by github.com/hashicorp/go-plugin.(*RPCClient).SyncStreams in goroutine 882 + github.com/hashicorp/go-plugin@v1.6.0/rpc_client.go:112 +0x165 + +goroutine 1190 [syscall, 1 minutes]: +os/signal.signal_recv() + runtime/sigqueue.go:152 +0x29 +os/signal.loop() + os/signal/signal_unix.go:23 +0x13 +created by os/signal.Notify.func1.1 in goroutine 1 + os/signal/signal.go:151 +0x1f + +goroutine 1207 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb0376ec8, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005208a80?, 0xc001cef000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005208a80, {0xc001cef000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc005208a80, {0xc001cef000?, 0x4b0905?, 0x7fffb0376fb8?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc002849230, {0xc001cef000?, 0x0?, 0xc00208d8f8?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc00208d8f0, {0xc001cef000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc0017a4f60) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc0017a4f60, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc0016f3b00, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 1208 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb0376dd0, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005208b00?, 0xc001c9f000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005208b00, {0xc001c9f000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc005208b00, {0xc001c9f000?, 0x4b0905?, 0x7fffb0376ec0?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc002849238, {0xc001c9f000?, 0x0?, 0xc00208d6b8?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc00208d6b0, {0xc001c9f000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc0017a4e40) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc0017a4e40, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc0016f3b90, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 1209 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb0376cd8, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005208b80?, 0xc001cf9000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005208b80, {0xc001cf9000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc005208b80, {0xc001cf9000?, 0x4b0905?, 0x7fffb0376dc8?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc002849240, {0xc001cf9000?, 0x0?, 0xc00208dfb8?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc00208dfb0, {0xc001cf9000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc0017a4fc0) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc0017a4fc0, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc0016f3c20, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 1719 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb03768f8, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc00783cf80?, 0xc0021da000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc00783cf80, {0xc0021da000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc00783cf80, {0xc0021da000?, 0x4b0905?, 0x7fffb03769e8?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc0077704a8, {0xc0021da000?, 0x0?, 0xc00786d448?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc00786d440, {0xc0021da000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc0017a5aa0) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc0017a5aa0, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc007878870, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 1970 [IO wait, 1 minutes]: +internal/poll.runtime_pollWait(0x7fffb060e0a8, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005361b80?, 0xc007b0d000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005361b80, {0xc007b0d000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc005361b80, {0xc007b0d000?, 0x4b0905?, 0x7fffb060e198?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc001f92920, {0xc007b0d000?, 0x0?, 0xc00511b058?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc00511b050, {0xc007b0d000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc004d425a0) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc004d425a0, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc002652750, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 1945 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb060dfb0, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc007c94980?, 0xc005451000?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc007c94980, {0xc005451000, 0x1000, 0x1000}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc007c94980, {0xc005451000?, 0x4b0905?, 0x7fffb060e0a0?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc00194b510, {0xc005451000?, 0x0?, 0xc007ca7568?}) + net/net.go:179 +0x45 +net/http.(*connReader).Read(0xc007ca7560, {0xc005451000, 0x1000, 0x1000}) + net/http/server.go:791 +0x14b +bufio.(*Reader).fill(0xc0056b0cc0) + bufio/bufio.go:113 +0x103 +bufio.(*Reader).Peek(0xc0056b0cc0, 0x4) + bufio/bufio.go:151 +0x53 +net/http.(*conn).serve(0xc005c71320, {0x46e63b8, 0xc001cdad50}) + net/http/server.go:2044 +0x75c +created by net/http.(*Server).Serve in goroutine 1188 + net/http/server.go:3086 +0x5cb + +goroutine 2274 [IO wait]: +internal/poll.runtime_pollWait(0x7fffb0376fc0, 0x72) + runtime/netpoll.go:343 +0x85 +internal/poll.(*pollDesc).wait(0xc005360000?, 0xc005204cd1?, 0x0) + internal/poll/fd_poll_runtime.go:84 +0x27 +internal/poll.(*pollDesc).waitRead(...) + internal/poll/fd_poll_runtime.go:89 +internal/poll.(*FD).Read(0xc005360000, {0xc005204cd1, 0x1, 0x1}) + internal/poll/fd_unix.go:164 +0x27a +net.(*netFD).Read(0xc005360000, {0xc005204cd1?, 0x46f3a70?, 0xc0076768a8?}) + net/fd_posix.go:55 +0x25 +net.(*conn).Read(0xc001f92578, {0xc005204cd1?, 0x80?, 0x0?}) + net/net.go:179 +0x45 +net/http.(*connReader).backgroundRead(0xc005204cc0) + net/http/server.go:683 +0x37 +created by net/http.(*connReader).startBackgroundRead in goroutine 1241 + net/http/server.go:679 +0xba diff --git a/tests/utils/fixtures/packets/support/valid_with_metadata/heap.prof b/tests/utils/fixtures/packets/support/valid_with_metadata/heap.prof new file mode 100644 index 0000000000000000000000000000000000000000..c40d1d9bce290a33da570f9aec7e0a3088ee6cf5 GIT binary patch literal 31978 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 bool: + """ + Returns True if the table exists. + """ + return inspect(conn).has_table(target_table, schema=target_schema) + + +def upsert_dataframe_to_table( + conn: Connection, target_schema: str, target_table: str, df: pd.DataFrame, server_id: str, source_uri: str +): + """ + Upserts a dataframe into a table. If the table doesn't exist, it's automatically created. + """ + if table_exists(conn, target_schema, target_table): + conn.execute( + text( + f""" + DELETE FROM {target_schema}.{target_table} + WHERE + metadata_server_id = :server_id + AND source = :source_uri + """ + ), + server_id=server_id, + source_uri=source_uri, + ) + + df.to_sql(target_table, conn, schema=target_schema, if_exists="append", index=False) diff --git a/utils/packets/__main__.py b/utils/packets/__main__.py index aacf7cc0b..eb3941281 100644 --- a/utils/packets/__main__.py +++ b/utils/packets/__main__.py @@ -1,36 +1,87 @@ import logging +from contextlib import contextmanager import click +from utils.db.helpers import snowflake_engine from utils.helpers import initialize_cli_logging from utils.packets.service import ingest_support_packet, ingest_survey_packet initialize_cli_logging(logging.INFO, 'stderr') +@contextmanager +def snowflake_engine_context(conn_dict: dict): + try: + engine = snowflake_engine(conn_dict) + yield engine + finally: + engine.dispose() + + @click.group() -def packets() -> None: +@click.option('-a', '--account', envvar='SNOWFLAKE_ACCOUNT', required=True, help='the name of the snowflake account') +@click.option('-d', '--database', envvar='SNOWFLAKE_DATABASE', required=True, help='the name of the snowflake database') +@click.option('-s', '--schema', envvar='SNOWFLAKE_SCHEMA', required=True, help='the name of the snowflake schema') +@click.option( + '-u', '--user', envvar='SNOWFLAKE_USER', required=True, help='the name of the user for connecting to snowflake' +) +@click.option( + '-p', + '--password', + envvar='SNOWFLAKE_PASSWORD', + required=True, + prompt=True, + hide_input=True, + help='the password for connecting to snowflake', +) +@click.option( + '-w', '--warehouse', envvar='SNOWFLAKE_WAREHOUSE', help='the warehouse to use when connecting to snowflake' +) +@click.option('-r', '--role', envvar='SNOWFLAKE_ROLE', help='the role to use when connecting to snowflake') +@click.pass_context +def packets( + ctx: click.Context, account: str, database: str, schema: str, user: str, password: str, warehouse: str, role: str +) -> None: """ Packets helpers. Offers a variety of subcommands for ingesting different types of support packets. """ - pass + ctx.ensure_object(dict) + ctx.obj['engine'] = ctx.with_resource( + snowflake_engine_context( + { + "SNOWFLAKE_ACCOUNT": account, + "SNOWFLAKE_USER": user, + "SNOWFLAKE_PASSWORD": password, + "SNOWFLAKE_DATABASE": database, + "SNOWFLAKE_SCHEMA": schema, + "SNOWFLAKE_WAREHOUSE": warehouse, + "SNOWFLAKE_ROLE": role, + } + ) + ) @packets.command() @click.argument('input', type=click.Path(exists=True, dir_okay=False, readable=True, resolve_path=True)) +@click.pass_context def user_survey( + ctx: click.Context, input: click.Path, ) -> None: """ Ingest a user survey packet. :param input: The zip file with the user survey packet data. """ - ingest_survey_packet(input) + with ctx.obj['engine'].begin() as conn: + ingest_survey_packet(conn, ctx.parent.params['schema'], input, click.format_filename(input)) @packets.command() @click.argument('input', type=click.Path(exists=True, dir_okay=False, readable=True, resolve_path=True)) +@click.pass_context def support_v1( + ctx: click.Context, input: click.Path, ) -> None: """ @@ -38,4 +89,5 @@ def support_v1( :param input: The zip file with the support package. """ - ingest_support_packet(input) + with ctx.obj['engine'].begin() as conn: + ingest_support_packet(conn, ctx.parent.params['schema'], input, click.format_filename(input)) diff --git a/utils/packets/loaders.py b/utils/packets/loaders.py index 126691dd5..e9ec33368 100644 --- a/utils/packets/loaders.py +++ b/utils/packets/loaders.py @@ -50,6 +50,8 @@ def load_user_survey(survey_metadata_file: IO, survey_data_file: IO) -> pd.DataF # Unpivot dataframe so that a shared structure can be used df = df.melt(id_vars=[e.value for e in UserSurveyFixedColumns], var_name='Question', value_name='Answer') + # Be consistent on data type, using always string representation. + df['Answer'] = df['Answer'].astype(str) # Add survey data df['Survey ID'] = metadata.id diff --git a/utils/packets/models/support.py b/utils/packets/models/support.py index 83c5dff6e..7168bcd3a 100644 --- a/utils/packets/models/support.py +++ b/utils/packets/models/support.py @@ -115,3 +115,16 @@ class SupportPacketV1(BaseModel): ldap_sync_jobs: List[JobV1] | None = Field(None, description="LDAP sync jobs") migration_jobs: List[JobV1] | None = Field(None, description="Migration jobs") compliance_jobs: List[JobV1] | None = Field(None, description="Compliance jobs") + + def all_jobs(self): + all_jobs = [ + self.data_retention_jobs, + self.bleve_post_indexing_jobs, + self.message_export_jobs, + self.elastic_post_indexing_jobs, + self.elastic_post_aggregation_jobs, + self.ldap_sync_jobs, + self.migration_jobs, + self.compliance_jobs, + ] + return [job for job_list in all_jobs if job_list for job in job_list] diff --git a/utils/packets/service.py b/utils/packets/service.py index 7f6961207..86be38e75 100644 --- a/utils/packets/service.py +++ b/utils/packets/service.py @@ -1,18 +1,31 @@ import os +from enum import Enum from logging import getLogger +import pandas as pd from click import ClickException +from sqlalchemy.engine import Connection +from utils.db.helpers import upsert_dataframe_to_table from utils.packets.loaders import UserSurveyFixedColumns, load_support_packet_file, load_user_survey_package logger = getLogger(__name__) -def ingest_survey_packet(survey_packet: str | os.PathLike): +class TableNames(str, Enum): + USER_SURVEY = 'user_survey' + SUPPORT_PACKET_V1 = 'support_packet_v1' + SUPPORT_PACKET_JOBS_V1 = 'support_packet_jobs_v1' + + +def ingest_survey_packet(conn: Connection, target_schema: str, survey_packet: str | os.PathLike, source_uri: str): """ Load user survey data and metadata. + :conn: The SQLAlchemy connection to use for ingesting the data. + :target_schema: The schema to ingest the data into. :survey_packet: The path to the survey packet file. + :source_uri: The source URI of the survey packet. Used as a unique key. """ try: metadata, df = load_user_survey_package(survey_packet) @@ -22,16 +35,37 @@ def ingest_survey_packet(survey_packet: str | os.PathLike): logger.info('') logger.info(f' Total {df[UserSurveyFixedColumns.user_id.value].nunique()} unique users') - # TODO: ingest in database + # Enrich data with metadata and ingest in database + enriched_df = df.copy() + enriched_df.columns = enriched_df.columns.str.replace(' ', '_', regex=True).str.lower() + + enriched_df['metadata_version'] = metadata.version + enriched_df['metadata_generated_at'] = metadata.generated_at + enriched_df['metadata_server_version'] = metadata.server_version + enriched_df['metadata_server_id'] = metadata.server_id + enriched_df['metadata_license_id'] = metadata.license_id + enriched_df['metadata_customer_id'] = metadata.customer_id + enriched_df['metadata_extras_plugin_id'] = metadata.extras.plugin_id + enriched_df['metadata_extras_plugin_version'] = metadata.extras.plugin_version + enriched_df['source'] = source_uri + + # Upsert data + upsert_dataframe_to_table( + conn, target_schema, TableNames.USER_SURVEY.value, enriched_df, metadata.server_id, source_uri + ) + except ValueError as e: raise ClickException(f'Error loading survey packet: {e}') -def ingest_support_packet(support_packet: str | os.PathLike): +def ingest_support_packet(conn: Connection, target_schema: str, support_packet: str | os.PathLike, source_uri: str): """ Load support package data and metadata. + :conn: The SQLAlchemy connection to use for ingesting the data. + :target_schema: The schema to ingest the data into. :support_package: The path to the survey packet file. + :source_uri: The source URI of the survey packet. Used as a unique key. """ try: metadata, sp = load_support_packet_file(support_packet) @@ -45,6 +79,43 @@ def ingest_support_packet(support_packet: str | os.PathLike): logger.info(f' Server: {sp.server_version} ({sp.server_os} {sp.server_architecture})') logger.info(f' Database: {sp.database_type} {sp.database_version} (schema {sp.database_schema_version})') - # TODO: ingest in database + # Enrich data with metadata and ingest in database + sp_df = pd.DataFrame( + [ + sp.dict( + exclude={ + 'data_retention_jobs', + 'bleve_post_indexing_jobs', + 'message_export_jobs', + 'elastic_post_indexing_jobs', + 'elastic_post_aggregation_jobs', + 'ldap_sync_jobs', + 'migration_jobs', + 'compliance_jobs', + } + ) + ] + ) + + server_id = metadata.server_id if metadata else 'Unknown' + sp_df['metadata_version'] = metadata.version if metadata else None + sp_df['metadata_generated_at'] = metadata.generated_at if metadata else None + sp_df['metadata_server_version'] = metadata.server_version if metadata else None + sp_df['metadata_server_id'] = server_id + sp_df['metadata_license_id'] = metadata.license_id if metadata else None + sp_df['metadata_customer_id'] = metadata.customer_id if metadata else None + sp_df['source'] = source_uri + + job_df = pd.DataFrame([job.model_dump() for job in sp.all_jobs()]) + job_df['data'] = job_df['data'].astype(str) + job_df['metadata_server_id'] = server_id + job_df['source'] = source_uri + + # Upsert data + upsert_dataframe_to_table(conn, target_schema, TableNames.SUPPORT_PACKET_V1.value, sp_df, server_id, source_uri) + upsert_dataframe_to_table( + conn, target_schema, TableNames.SUPPORT_PACKET_JOBS_V1.value, job_df, server_id, source_uri + ) + except ValueError as e: raise ClickException(f'Error loading support package: {e}')