55 "context"
66 "errors"
77 "fmt"
8+ "regexp"
89 "time"
910
1011 "github.com/anyproto/any-sync/app"
@@ -89,17 +90,18 @@ func (s *service) Run(ctx context.Context) (err error) {
8990 }
9091 s .logColl = s .client .Database (s .conf .Database ).Collection (s .conf .LogCollection )
9192 s .running = true
93+ s .settingsColl = s .client .Database (s .conf .Database ).Collection (settingsColl )
94+ s .payloadColl = s .client .Database (s .conf .Database ).Collection (payloadColl )
95+
96+ if err = s .runMigrations (ctx ); err != nil {
97+ return err
98+ }
9299 if s .changeReceiver != nil {
93100 if err = s .runStreamListener (ctx ); err != nil {
94101 return err
95102 }
96103 }
97- s .settingsColl = s .client .Database (s .conf .Database ).Collection (settingsColl )
98- s .payloadColl = s .client .Database (s .conf .Database ).Collection (payloadColl )
99- if _ , err = s .payloadColl .Indexes ().CreateOne (ctx , mongo.IndexModel {Keys : bson.D {{Key : "logId" , Value : 1 }}}); err != nil {
100- return err
101- }
102- return s .runMigrations (ctx )
104+ return nil
103105}
104106
105107func (s * service ) tx (ctx context.Context , f func (txCtx mongo.SessionContext ) error ) (err error ) {
@@ -121,11 +123,7 @@ func (s *service) tx(ctx context.Context, f func(txCtx mongo.SessionContext) err
121123func (s * service ) AddLog (ctx context.Context , l consensus.Log ) (err error ) {
122124 return s .tx (ctx , func (txCtx mongo.SessionContext ) error {
123125 for i , record := range l .Records {
124- if err := s .savePayload (txCtx , consensus.Payload {
125- Id : record .Id ,
126- LogId : l .Id ,
127- Payload : record .Payload ,
128- }); err != nil {
126+ if err := s .savePayload (txCtx , consensus .NewPayload (l .Id , record .Id , record .Payload )); err != nil {
129127 return err
130128 }
131129 l .Records [i ].Payload = nil
@@ -181,11 +179,7 @@ type updateOp struct {
181179func (s * service ) AddRecord (ctx context.Context , logId string , record consensus.Record ) error {
182180 return s .tx (ctx , func (txCtx mongo.SessionContext ) (err error ) {
183181 // save payload in a separate collection to avoid the one doc size limit
184- if err = s .savePayload (txCtx , consensus.Payload {
185- Id : record .Id ,
186- LogId : logId ,
187- Payload : record .Payload ,
188- }); err != nil {
182+ if err = s .savePayload (txCtx , consensus .NewPayload (logId , record .Id , record .Payload )); err != nil {
189183 return err
190184 }
191185
@@ -214,10 +208,12 @@ func (s *service) savePayload(ctx context.Context, payload consensus.Payload) (e
214208 if payload .Payload == nil {
215209 return fmt .Errorf ("payload is nil" )
216210 }
217- _ , err = s .payloadColl .InsertOne (ctx , payload )
218- if mongo .IsDuplicateKeyError (err ) {
219- return nil
220- }
211+ _ , err = s .payloadColl .UpdateOne (
212+ ctx ,
213+ bson.D {{"_id" , payload .Id }},
214+ bson.D {{"$setOnInsert" , payload }},
215+ options .Update ().SetUpsert (true ),
216+ )
221217 return
222218}
223219
@@ -245,7 +241,8 @@ func (s *service) injectPayloads(ctx context.Context, l consensus.Log, afterReco
245241 }
246242 }
247243
248- cur , err := s .payloadColl .Find (ctx , bson.D {{"logId" , l .Id }})
244+ regExpStr := "^" + regexp .QuoteMeta (l .Id ) + "/+"
245+ cur , err := s .payloadColl .Find (ctx , bson.D {{"_id" , bson.D {{"$regex" , regExpStr }}}})
249246 if err != nil {
250247 return
251248 }
@@ -258,7 +255,7 @@ func (s *service) injectPayloads(ctx context.Context, l consensus.Log, afterReco
258255 if err = cur .Decode (& curRecord ); err != nil {
259256 return
260257 }
261- if idx , ok := payloads [curRecord .Id ]; ok {
258+ if idx , ok := payloads [curRecord .RecordId () ]; ok {
262259 res .Records [idx ].Payload = curRecord .Payload
263260 }
264261 }
0 commit comments