Try to process sarama message type from headers

This commit is contained in:
Neil Alexander 2020-03-12 10:23:59 +00:00
parent 1babe2b7ae
commit 67f6f74876
8 changed files with 83 additions and 87 deletions

View file

@ -15,7 +15,6 @@
package consumers
import (
"bytes"
"context"
"encoding/json"
"errors"
@ -83,29 +82,23 @@ func (s *OutputRoomEventConsumer) Start() error {
func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
// Parse out the event JSON
var output api.OutputEvent
headers := common.SaramaHeaders(msg.Headers)
if err := json.Unmarshal(msg.Value, &output); err != nil {
// If the message was invalid, log it and move on to the next message in the stream
log.WithError(err).Errorf("roomserver output log: message parse failure")
return nil
}
if output.Type != api.OutputTypeNewRoomEvent {
log.WithField("type", output.Type).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
if msgtype, ok := headers["type"]; ok {
if api.OutputType(msgtype) != api.OutputTypeNewRoomEvent {
log.WithField("type", msgtype).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
}
}
// See if the room version is present in the headers. If it isn't
// then we can't process the event as we don't know what the format
// will be
var roomVersion gomatrixserverlib.RoomVersion
for _, header := range msg.Headers {
if bytes.Equal(header.Key, []byte("room_version")) {
roomVersion = gomatrixserverlib.RoomVersion(header.Value)
break
}
if rv, ok := headers["room_version"]; ok {
roomVersion = gomatrixserverlib.RoomVersion(rv)
}
if roomVersion == "" {
return errors.New("room version was not in sarama headers")

View file

@ -15,7 +15,6 @@
package consumers
import (
"bytes"
"context"
"encoding/json"
"errors"
@ -73,28 +72,23 @@ func (s *OutputRoomEventConsumer) Start() error {
func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
// Parse out the event JSON
var output api.OutputEvent
if err := json.Unmarshal(msg.Value, &output); err != nil {
// If the message was invalid, log it and move on to the next message in the stream
log.WithError(err).Errorf("roomserver output log: message parse failure")
return nil
}
headers := common.SaramaHeaders(msg.Headers)
if output.Type != api.OutputTypeNewRoomEvent {
log.WithField("type", output.Type).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
if msgtype, ok := headers["type"]; ok {
if api.OutputType(msgtype) != api.OutputTypeNewRoomEvent {
log.WithField("type", msgtype).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
}
}
// See if the room version is present in the headers. If it isn't
// then we can't process the event as we don't know what the format
// will be
var roomVersion gomatrixserverlib.RoomVersion
for _, header := range msg.Headers {
if bytes.Equal(header.Key, []byte("room_version")) {
roomVersion = gomatrixserverlib.RoomVersion(header.Value)
break
}
if rv, ok := headers["room_version"]; ok {
roomVersion = gomatrixserverlib.RoomVersion(rv)
}
if roomVersion == "" {
return errors.New("room version was not in sarama headers")
@ -102,27 +96,27 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
// Prepare the room event so that it has the correct field types
// for the room version
ev := gomatrixserverlib.Event{}
if err := ev.PrepareAs(roomVersion); err != nil {
output.NewRoomEvent.Event = gomatrixserverlib.Event{}
if err := output.NewRoomEvent.Event.PrepareAs(roomVersion); err != nil {
log.WithFields(log.Fields{
"room_version": roomVersion,
}).WithError(err).Errorf("can't prepare event to version")
return err
}
if err := json.Unmarshal(msg.Value, &ev); err != nil {
if err := json.Unmarshal(msg.Value, &output); err != nil {
// If the message was invalid, log it and move on to the next message in the stream
log.WithError(err).Errorf("roomserver output log: message parse failure")
return nil
}
log.WithFields(log.Fields{
"event_id": ev.EventID(),
"room_id": ev.RoomID(),
"type": ev.Type(),
"event_id": output.NewRoomEvent.Event.EventID(),
"room_id": output.NewRoomEvent.Event.RoomID(),
"type": output.NewRoomEvent.Event.Type(),
}).Info("received event from roomserver")
events, err := s.lookupStateEvents(output.NewRoomEvent.AddsStateEventIDs, ev)
events, err := s.lookupStateEvents(output.NewRoomEvent.AddsStateEventIDs, output.NewRoomEvent.Event)
if err != nil {
return err
}

14
common/sarama.go Normal file
View file

@ -0,0 +1,14 @@
package common
import "gopkg.in/Shopify/sarama.v1"
func SaramaHeaders(headers []*sarama.RecordHeader) map[string][]byte {
result := make(map[string][]byte)
for _, header := range headers {
if header == nil {
continue
}
result[string(header.Key)] = header.Value
}
return result
}

View file

@ -15,7 +15,6 @@
package consumers
import (
"bytes"
"context"
"encoding/json"
"errors"
@ -76,29 +75,23 @@ func (s *OutputRoomEventConsumer) Start() error {
func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
// Parse out the event JSON
var output api.OutputEvent
headers := common.SaramaHeaders(msg.Headers)
if err := json.Unmarshal(msg.Value, &output); err != nil {
// If the message was invalid, log it and move on to the next message in the stream
log.WithError(err).Errorf("roomserver output log: message parse failure")
return nil
}
if output.Type != api.OutputTypeNewRoomEvent {
log.WithField("type", output.Type).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
if msgtype, ok := headers["type"]; ok {
if api.OutputType(msgtype) != api.OutputTypeNewRoomEvent {
log.WithField("type", msgtype).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
}
}
// See if the room version is present in the headers. If it isn't
// then we can't process the event as we don't know what the format
// will be
var roomVersion gomatrixserverlib.RoomVersion
for _, header := range msg.Headers {
if bytes.Equal(header.Key, []byte("room_version")) {
roomVersion = gomatrixserverlib.RoomVersion(header.Value)
break
}
if rv, ok := headers["room_version"]; ok {
roomVersion = gomatrixserverlib.RoomVersion(rv)
}
if roomVersion == "" {
return errors.New("room version was not in sarama headers")

View file

@ -15,7 +15,6 @@
package consumers
import (
"bytes"
"context"
"encoding/json"
"errors"
@ -66,30 +65,23 @@ func (s *OutputRoomEventConsumer) Start() error {
// onMessage is called when the sync server receives a new event from the room server output log.
func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
var output api.OutputEvent
headers := common.SaramaHeaders(msg.Headers)
if err := json.Unmarshal(msg.Value, &output); err != nil {
// If the message was invalid, log it and move on to the next message in the stream
log.WithError(err).Errorf("roomserver output log: message parse failure")
return nil
}
// Filter out any messages that aren't new room events
if output.Type != api.OutputTypeNewRoomEvent {
log.WithField("type", output.Type).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
if msgtype, ok := headers["type"]; ok {
if api.OutputType(msgtype) != api.OutputTypeNewRoomEvent {
log.WithField("type", msgtype).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
}
}
// See if the room version is present in the headers. If it isn't
// then we can't process the event as we don't know what the format
// will be
var roomVersion gomatrixserverlib.RoomVersion
for _, header := range msg.Headers {
if bytes.Equal(header.Key, []byte("room_version")) {
roomVersion = gomatrixserverlib.RoomVersion(header.Value)
break
}
if rv, ok := headers["room_version"]; ok {
roomVersion = gomatrixserverlib.RoomVersion(rv)
}
if roomVersion == "" {
return errors.New("room version was not in sarama headers")

View file

@ -44,16 +44,21 @@ func (r *RoomserverInputAPI) WriteOutputEvents(
roomID string, roomVersion gomatrixserverlib.RoomVersion, updates []api.OutputEvent,
) error {
messages := make([]*sarama.ProducerMessage, len(updates))
for i := range updates {
value, err := json.Marshal(updates[i])
for i, update := range updates {
value, err := json.Marshal(update)
if err != nil {
return err
}
messages[i] = &sarama.ProducerMessage{
Topic: r.OutputRoomEventTopic,
Key: sarama.StringEncoder(roomID),
Value: sarama.ByteEncoder(value),
Headers: []sarama.RecordHeader{
sarama.RecordHeader{
Key: []byte("type"),
Value: []byte(update.Type),
},
sarama.RecordHeader{
Key: []byte("room_version"),
Value: []byte(roomVersion),

View file

@ -19,6 +19,7 @@ package input
import (
"bytes"
"context"
"fmt"
"github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/api"
@ -266,9 +267,13 @@ func (u *latestEventsUpdater) makeOutputNewRoomEvent() (*api.OutputEvent, error)
roomVersion, err := u.db.GetRoomVersionForRoomNID(context.Background(), u.roomNID)
if err != nil {
fmt.Println("FAILED TO GET ROOM VERSION:", err)
return nil, err
}
fmt.Println("GOT ROOM VERSION", roomVersion)
fmt.Println("EVENT IS", u.event)
ore := api.OutputNewRoomEvent{
Event: u.event,
RoomVersion: roomVersion,

View file

@ -15,7 +15,6 @@
package consumers
import (
"bytes"
"context"
"encoding/json"
"errors"
@ -76,22 +75,23 @@ func (s *OutputRoomEventConsumer) Start() error {
func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
// Parse out the event JSON
var output api.OutputEvent
headers := common.SaramaHeaders(msg.Headers)
if err := json.Unmarshal(msg.Value, &output); err != nil {
// If the message was invalid, log it and move on to the next message in the stream
log.WithError(err).Errorf("roomserver output log: message parse failure")
return nil
if msgtype, ok := headers["type"]; ok {
if api.OutputType(msgtype) != api.OutputTypeNewRoomEvent {
log.WithField("type", msgtype).Debug(
"roomserver output log: ignoring unknown output type",
)
return nil
}
}
// See if the room version is present in the headers. If it isn't
// then we can't process the event as we don't know what the format
// will be
var roomVersion gomatrixserverlib.RoomVersion
for _, header := range msg.Headers {
if bytes.Equal(header.Key, []byte("room_version")) {
roomVersion = gomatrixserverlib.RoomVersion(header.Value)
break
}
if rv, ok := headers["room_version"]; ok {
roomVersion = gomatrixserverlib.RoomVersion(rv)
}
if roomVersion == "" {
return errors.New("room version was not in sarama headers")