@@ -478,8 +478,8 @@ func (w *busWriter) AppendOne(ctx context.Context, event *ce.Event, opts ...api.
478478 return encoded , nil
479479}
480480
481- func (w * busWriter ) AppendOneStream (ctx context.Context , event * ce.Event , cb api. Callback , opts ... api.WriteOption ) {
482- _ctx , span := w .tracer .Start (ctx , "AppendOneStream " )
481+ func (w * busWriter ) SyncAppendOneStream (ctx context.Context , event * ce.Event , opts ... api.WriteOption ) ( eid string , err error ) {
482+ _ctx , span := w .tracer .Start (ctx , "SyncAppendOneStream " )
483483 defer span .End ()
484484
485485 var writeOpts * api.WriteOptions = w .opts
@@ -493,12 +493,22 @@ func (w *busWriter) AppendOneStream(ctx context.Context, event *ce.Event, cb api
493493 // 1. pick a writer of eventlog
494494 lw , err := w .pickWritableLog (_ctx , writeOpts )
495495 if err != nil {
496- cb (err )
497- return
496+ return "" , err
498497 }
499498
500499 // 2. append the event to the eventlog
501- lw .AppendStream (_ctx , event , cb )
500+ off , err := lw .SyncAppendStream (_ctx , event )
501+ if err != nil {
502+ return "" , err
503+ }
504+
505+ // 3. generate event ID
506+ var buf [16 ]byte
507+ binary .BigEndian .PutUint64 (buf [0 :8 ], lw .Log ().ID ())
508+ binary .BigEndian .PutUint64 (buf [8 :16 ], uint64 (off ))
509+ encoded := base64 .StdEncoding .EncodeToString (buf [:])
510+
511+ return encoded , nil
502512}
503513
504514func (w * busWriter ) AppendMany (ctx context.Context , events []* ce.Event , opts ... api.WriteOption ) (eid string , err error ) {
@@ -567,6 +577,38 @@ func (r *busReader) Read(ctx context.Context, opts ...api.ReadOption) ([]*ce.Eve
567577 return events , off , lr .Log ().ID (), nil
568578}
569579
580+ func (r * busReader ) SyncReadStream (ctx context.Context , opts ... api.ReadOption ) ([]* ce.Event , int64 , uint64 , error ) {
581+ _ctx , span := r .tracer .Start (ctx , "Read" )
582+ defer span .End ()
583+
584+ var readOpts * api.ReadOptions = r .opts
585+ if len (opts ) > 0 {
586+ readOpts = r .opts .Copy ()
587+ for _ , opt := range opts {
588+ opt (readOpts )
589+ }
590+ }
591+
592+ // 1. pick a reader of eventlog
593+ lr , err := r .pickReadableLog (_ctx , readOpts )
594+ if err != nil {
595+ return []* ce.Event {}, 0 , 0 , err
596+ }
597+
598+ // TODO(jiangkai): refactor eventlog interface to avoid seek every time, by jiangkai, 2022.10.24
599+ off , err := lr .Seek (_ctx , readOpts .Policy .Offset (), io .SeekStart )
600+ if err != nil {
601+ return []* ce.Event {}, 0 , 0 , err
602+ }
603+
604+ // 2. read the event to the eventlog
605+ events , err := lr .SyncReadStream (_ctx , int16 (readOpts .BatchSize ))
606+ if err != nil {
607+ return []* ce.Event {}, 0 , 0 , err
608+ }
609+ return events , off , lr .Log ().ID (), nil
610+ }
611+
570612func (r * busReader ) Bus () api.Eventbus {
571613 return r .ebus
572614}
0 commit comments