Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
FinClip
ligase
提交
a3c66f7f
ligase
项目概览
FinClip
/
ligase
通知
33
Star
8
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
ligase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a3c66f7f
编写于
3月 30, 2017
作者:
K
Kegsay
提交者:
GitHub
3月 30, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Write OutputRoomEvents into the database and remember the arrival order (#54)
上级
2d2c7e71
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
94 addition
and
5 deletion
+94
-5
src/github.com/matrix-org/dendrite/clientapi/storage/output_room_events_table.go
...rg/dendrite/clientapi/storage/output_room_events_table.go
+48
-0
src/github.com/matrix-org/dendrite/clientapi/storage/syncserver.go
...b.com/matrix-org/dendrite/clientapi/storage/syncserver.go
+14
-3
src/github.com/matrix-org/dendrite/clientapi/sync/syncserver.go
...thub.com/matrix-org/dendrite/clientapi/sync/syncserver.go
+32
-2
未找到文件。
src/github.com/matrix-org/dendrite/clientapi/storage/output_room_events_table.go
0 → 100644
浏览文件 @
a3c66f7f
package
storage
import
(
"database/sql"
"github.com/lib/pq"
)
const
outputRoomEventsSchema
=
`
-- Stores output room events received from the roomserver.
CREATE TABLE IF NOT EXISTS output_room_events (
-- An incrementing ID which denotes the position in the log that this event resides at.
-- NB: 'serial' makes no guarantees to increment by 1 every time, only that it increments.
-- This isn't a problem for us since we just want to order by this field.
id BIGSERIAL PRIMARY KEY,
-- The 'room_id' key for the event.
room_id TEXT NOT NULL,
-- The JSON for the event. Stored as TEXT because this should be valid UTF-8.
event_json TEXT NOT NULL,
-- A list of event IDs which represent a delta of added/removed room state.
add_state_ids TEXT[] NOT NULL,
remove_state_ids TEXT[] NOT NULL
);
`
const
insertEventSQL
=
""
+
"INSERT INTO output_room_events (room_id, event_json, add_state_ids, remove_state_ids) VALUES ($1, $2, $3, $4)"
type
outputRoomEventsStatements
struct
{
insertEventStmt
*
sql
.
Stmt
}
func
(
s
*
outputRoomEventsStatements
)
prepare
(
db
*
sql
.
DB
)
(
err
error
)
{
_
,
err
=
db
.
Exec
(
outputRoomEventsSchema
)
if
err
!=
nil
{
return
}
if
s
.
insertEventStmt
,
err
=
db
.
Prepare
(
insertEventSQL
);
err
!=
nil
{
return
}
return
}
// InsertEvent into the output_room_events table. addState and removeState are an optional list of state event IDs.
func
(
s
*
outputRoomEventsStatements
)
InsertEvent
(
roomID
string
,
eventJSON
[]
byte
,
addState
,
removeState
[]
string
)
error
{
_
,
err
:=
s
.
insertEventStmt
.
Exec
(
roomID
,
eventJSON
,
pq
.
StringArray
(
addState
),
pq
.
StringArray
(
removeState
))
return
err
}
src/github.com/matrix-org/dendrite/clientapi/storage/syncserver.go
浏览文件 @
a3c66f7f
...
...
@@ -2,16 +2,17 @@ package storage
import
(
"database/sql"
"github.com/matrix-org/dendrite/common"
// Import the postgres database driver.
_
"github.com/lib/pq"
"github.com/matrix-org/dendrite/common"
"github.com/matrix-org/gomatrixserverlib"
)
// SyncServerDatabase represents a sync server database
type
SyncServerDatabase
struct
{
db
*
sql
.
DB
partitions
common
.
PartitionOffsetStatements
events
outputRoomEventsStatements
}
// NewSyncServerDatabase creates a new sync server database
...
...
@@ -25,7 +26,17 @@ func NewSyncServerDatabase(dataSourceName string) (*SyncServerDatabase, error) {
if
err
=
partitions
.
Prepare
(
db
);
err
!=
nil
{
return
nil
,
err
}
return
&
SyncServerDatabase
{
db
,
partitions
},
nil
events
:=
outputRoomEventsStatements
{}
if
err
=
events
.
prepare
(
db
);
err
!=
nil
{
return
nil
,
err
}
return
&
SyncServerDatabase
{
db
,
partitions
,
events
},
nil
}
// WriteEvent into the database. It is not safe to call this function from multiple goroutines, as it would create races
// when generating the stream position for this event. Returns an error if there was a problem inserting this event.
func
(
d
*
SyncServerDatabase
)
WriteEvent
(
ev
*
gomatrixserverlib
.
Event
,
addStateEventIDs
,
removeStateEventIDs
[]
string
)
error
{
return
d
.
events
.
InsertEvent
(
ev
.
RoomID
(),
ev
.
JSON
(),
addStateEventIDs
,
removeStateEventIDs
)
}
// PartitionOffsets implements common.PartitionStorer
...
...
src/github.com/matrix-org/dendrite/clientapi/sync/syncserver.go
浏览文件 @
a3c66f7f
package
sync
import
(
"encoding/json"
log
"github.com/Sirupsen/logrus"
"github.com/matrix-org/dendrite/clientapi/config"
"github.com/matrix-org/dendrite/clientapi/storage"
"github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/gomatrixserverlib"
sarama
"gopkg.in/Shopify/sarama.v1"
)
// Server contains all the logic for running a sync server
type
Server
struct
{
roomServerConsumer
*
common
.
ContinualConsumer
db
*
storage
.
SyncServerDatabase
}
// NewServer creates a new sync server. Call Start() to begin consuming from room servers.
func
NewServer
(
cfg
*
config
.
Sync
,
store
common
.
PartitionStorer
)
(
*
Server
,
error
)
{
func
NewServer
(
cfg
*
config
.
Sync
,
store
*
storage
.
SyncServerDatabase
)
(
*
Server
,
error
)
{
kafkaConsumer
,
err
:=
sarama
.
NewConsumer
(
cfg
.
KafkaConsumerURIs
,
nil
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -26,6 +32,7 @@ func NewServer(cfg *config.Sync, store common.PartitionStorer) (*Server, error)
}
s
:=
&
Server
{
roomServerConsumer
:
&
consumer
,
db
:
store
,
}
consumer
.
ProcessMessage
=
s
.
onMessage
...
...
@@ -38,6 +45,29 @@ func (s *Server) Start() error {
}
func
(
s
*
Server
)
onMessage
(
msg
*
sarama
.
ConsumerMessage
)
error
{
log
.
WithField
(
"key"
,
string
(
msg
.
Key
))
.
WithField
(
"val"
,
string
(
msg
.
Value
))
.
Info
(
"Recv"
)
// Parse out the event JSON
var
output
api
.
OutputRoomEvent
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
}
ev
,
err
:=
gomatrixserverlib
.
NewEventFromTrustedJSON
(
output
.
Event
,
false
)
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Errorf
(
"roomserver output log: event parse failure"
)
return
nil
}
log
.
WithFields
(
log
.
Fields
{
"event_id"
:
ev
.
EventID
(),
"room_id"
:
ev
.
RoomID
(),
})
.
Info
(
"received event from roomserver"
)
if
err
:=
s
.
db
.
WriteEvent
(
&
ev
,
output
.
AddsStateEventIDs
,
output
.
RemovesStateEventIDs
);
err
!=
nil
{
// panic rather than continue with an inconsistent database
log
.
WithError
(
err
)
.
WithField
(
"OutputRoomEvent"
,
output
)
.
Panicf
(
"roomserver output log: write event failure"
)
return
nil
}
return
nil
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录