aboutsummaryrefslogtreecommitdiff
path: root/appservice
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-06-16 17:39:56 +0100
committerGitHub <noreply@github.com>2020-06-16 17:39:56 +0100
commite15a8042a19b270060beef1358f90cda075ddd38 (patch)
treefaa2334c37ec7b0753541bbe000a16b4ac13548d /appservice
parent83391da0e04dda7a52589ee7ec6df2b615571894 (diff)
BREAKING: Make eduserver/appservice use userapi (#1138)
* BREAKING: Make eduserver/appservice use userapi This is a breaking change because this PR restructures how the AS API tracks its position in Kafka streams. Previously, it used the account DB to store partition offsets. However, this is also being used by `clientapi` for the same purpose, which is bad (each component needs to store offsets independently or else you might lose messages across restarts). This PR changes this behaviour to now store partition offsets in the `appservice` database. This means that: - Upon restart, the `appservice` component will attempt to replay all room events from the beginning of time. - An additional table will be created in the appservice database, which in and of itself is backwards compatible. * Return ErrorConflict
Diffstat (limited to 'appservice')
-rw-r--r--appservice/appservice.go38
-rw-r--r--appservice/consumers/roomserver.go6
-rw-r--r--appservice/storage/interface.go2
-rw-r--r--appservice/storage/postgres/storage.go4
-rw-r--r--appservice/storage/sqlite3/storage.go4
5 files changed, 29 insertions, 25 deletions
diff --git a/appservice/appservice.go b/appservice/appservice.go
index bd261ff9..84a6a9b1 100644
--- a/appservice/appservice.go
+++ b/appservice/appservice.go
@@ -16,7 +16,6 @@ package appservice
import (
"context"
- "errors"
"net/http"
"sync"
"time"
@@ -29,12 +28,10 @@ import (
"github.com/matrix-org/dendrite/appservice/storage"
"github.com/matrix-org/dendrite/appservice/types"
"github.com/matrix-org/dendrite/appservice/workers"
- "github.com/matrix-org/dendrite/clientapi/auth/storage/accounts"
- "github.com/matrix-org/dendrite/clientapi/auth/storage/devices"
"github.com/matrix-org/dendrite/internal/config"
"github.com/matrix-org/dendrite/internal/setup"
- "github.com/matrix-org/dendrite/internal/sqlutil"
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
+ userapi "github.com/matrix-org/dendrite/userapi/api"
"github.com/sirupsen/logrus"
)
@@ -47,8 +44,7 @@ func AddInternalRoutes(router *mux.Router, queryAPI appserviceAPI.AppServiceQuer
// can call functions directly on the returned API or via an HTTP interface using AddInternalRoutes.
func NewInternalAPI(
base *setup.BaseDendrite,
- accountsDB accounts.Database,
- deviceDB devices.Database,
+ userAPI userapi.UserInternalAPI,
rsAPI roomserverAPI.RoomserverInternalAPI,
) appserviceAPI.AppServiceQueryAPI {
// Create a connection to the appservice postgres DB
@@ -70,7 +66,7 @@ func NewInternalAPI(
workerStates[i] = ws
// Create bot account for this AS if it doesn't already exist
- if err = generateAppServiceAccount(accountsDB, deviceDB, appservice); err != nil {
+ if err = generateAppServiceAccount(userAPI, appservice); err != nil {
logrus.WithFields(logrus.Fields{
"appservice": appservice.ID,
}).WithError(err).Panicf("failed to generate bot account for appservice")
@@ -90,7 +86,7 @@ func NewInternalAPI(
// We can't add ASes at runtime so this is safe to do.
if len(workerStates) > 0 {
consumer := consumers.NewOutputRoomEventConsumer(
- base.Cfg, base.KafkaConsumer, accountsDB, appserviceDB,
+ base.Cfg, base.KafkaConsumer, appserviceDB,
rsAPI, workerStates,
)
if err := consumer.Start(); err != nil {
@@ -109,22 +105,24 @@ func NewInternalAPI(
// `sender_localpart` field of each application service if it doesn't
// exist already
func generateAppServiceAccount(
- accountsDB accounts.Database,
- deviceDB devices.Database,
+ userAPI userapi.UserInternalAPI,
as config.ApplicationService,
) error {
- ctx := context.Background()
-
- // Create an account for the application service
- _, err := accountsDB.CreateAccount(ctx, as.SenderLocalpart, "", as.ID)
+ var accRes userapi.PerformAccountCreationResponse
+ err := userAPI.PerformAccountCreation(context.Background(), &userapi.PerformAccountCreationRequest{
+ Localpart: as.SenderLocalpart,
+ AppServiceID: as.ID,
+ OnConflict: userapi.ConflictUpdate,
+ }, &accRes)
if err != nil {
- if errors.Is(err, sqlutil.ErrUserExists) { // This account already exists
- return nil
- }
return err
}
-
- // Create a dummy device with a dummy token for the application service
- _, err = deviceDB.CreateDevice(ctx, as.SenderLocalpart, nil, as.ASToken, &as.SenderLocalpart)
+ var devRes userapi.PerformDeviceCreationResponse
+ err = userAPI.PerformDeviceCreation(context.Background(), &userapi.PerformDeviceCreationRequest{
+ Localpart: as.SenderLocalpart,
+ AccessToken: as.ASToken,
+ DeviceID: &as.SenderLocalpart,
+ DeviceDisplayName: &as.SenderLocalpart,
+ }, &devRes)
return err
}
diff --git a/appservice/consumers/roomserver.go b/appservice/consumers/roomserver.go
index 1657fe54..4c0156b2 100644
--- a/appservice/consumers/roomserver.go
+++ b/appservice/consumers/roomserver.go
@@ -20,7 +20,6 @@ import (
"github.com/matrix-org/dendrite/appservice/storage"
"github.com/matrix-org/dendrite/appservice/types"
- "github.com/matrix-org/dendrite/clientapi/auth/storage/accounts"
"github.com/matrix-org/dendrite/internal"
"github.com/matrix-org/dendrite/internal/config"
"github.com/matrix-org/dendrite/roomserver/api"
@@ -33,7 +32,6 @@ import (
// OutputRoomEventConsumer consumes events that originated in the room server.
type OutputRoomEventConsumer struct {
roomServerConsumer *internal.ContinualConsumer
- db accounts.Database
asDB storage.Database
rsAPI api.RoomserverInternalAPI
serverName string
@@ -45,7 +43,6 @@ type OutputRoomEventConsumer struct {
func NewOutputRoomEventConsumer(
cfg *config.Dendrite,
kafkaConsumer sarama.Consumer,
- store accounts.Database,
appserviceDB storage.Database,
rsAPI api.RoomserverInternalAPI,
workerStates []types.ApplicationServiceWorkerState,
@@ -53,11 +50,10 @@ func NewOutputRoomEventConsumer(
consumer := internal.ContinualConsumer{
Topic: string(cfg.Kafka.Topics.OutputRoomEvent),
Consumer: kafkaConsumer,
- PartitionStore: store,
+ PartitionStore: appserviceDB,
}
s := &OutputRoomEventConsumer{
roomServerConsumer: &consumer,
- db: store,
asDB: appserviceDB,
rsAPI: rsAPI,
serverName: string(cfg.Matrix.ServerName),
diff --git a/appservice/storage/interface.go b/appservice/storage/interface.go
index 25d35af6..735e2f90 100644
--- a/appservice/storage/interface.go
+++ b/appservice/storage/interface.go
@@ -17,10 +17,12 @@ package storage
import (
"context"
+ "github.com/matrix-org/dendrite/internal"
"github.com/matrix-org/gomatrixserverlib"
)
type Database interface {
+ internal.PartitionStorer
StoreEvent(ctx context.Context, appServiceID string, event *gomatrixserverlib.HeaderedEvent) error
GetEventsWithAppServiceID(ctx context.Context, appServiceID string, limit int) (int, int, []gomatrixserverlib.HeaderedEvent, bool, error)
CountEventsWithAppServiceID(ctx context.Context, appServiceID string) (int, error)
diff --git a/appservice/storage/postgres/storage.go b/appservice/storage/postgres/storage.go
index 3e12f3a0..03f331d6 100644
--- a/appservice/storage/postgres/storage.go
+++ b/appservice/storage/postgres/storage.go
@@ -27,6 +27,7 @@ import (
// Database stores events intended to be later sent to application services
type Database struct {
+ sqlutil.PartitionOffsetStatements
events eventsStatements
txnID txnStatements
db *sql.DB
@@ -42,6 +43,9 @@ func NewDatabase(dataSourceName string, dbProperties sqlutil.DbProperties) (*Dat
if err = result.prepare(); err != nil {
return nil, err
}
+ if err = result.PartitionOffsetStatements.Prepare(result.db, "appservice"); err != nil {
+ return nil, err
+ }
return &result, nil
}
diff --git a/appservice/storage/sqlite3/storage.go b/appservice/storage/sqlite3/storage.go
index 44dcba4e..cb55c8d9 100644
--- a/appservice/storage/sqlite3/storage.go
+++ b/appservice/storage/sqlite3/storage.go
@@ -27,6 +27,7 @@ import (
// Database stores events intended to be later sent to application services
type Database struct {
+ sqlutil.PartitionOffsetStatements
events eventsStatements
txnID txnStatements
db *sql.DB
@@ -46,6 +47,9 @@ func NewDatabase(dataSourceName string) (*Database, error) {
if err = result.prepare(); err != nil {
return nil, err
}
+ if err = result.PartitionOffsetStatements.Prepare(result.db, "appservice"); err != nil {
+ return nil, err
+ }
return &result, nil
}