diff --git a/render-2023-10-11/cmd/cache-service/oplog.go b/render-2023-10-11/cmd/cache-service/oplog.go index eefb5a7..5ed4e49 100644 --- a/render-2023-10-11/cmd/cache-service/oplog.go +++ b/render-2023-10-11/cmd/cache-service/oplog.go @@ -7,7 +7,9 @@ import ( ) type Oplog struct { - events []timestampedEvent + events []timestampedEvent + idx int // todo + lastTruncated time.Time } type timestampedEvent struct { @@ -34,7 +36,11 @@ func (oplog *Oplog) push(t time.Time, event thestore.Event) { }) } -func (oplog *Oplog) Since(t time.Time) []thestore.Event { +func (oplog *Oplog) Since(t time.Time) ([]thestore.Event, bool) { + if !t.After(oplog.lastTruncated) { + return nil, false + } + result := make([]thestore.Event, 0, 5) for i := len(oplog.events) - 1; i >= 0; i-- { if !oplog.events[i].t.After(t) { @@ -43,5 +49,5 @@ func (oplog *Oplog) Since(t time.Time) []thestore.Event { result = append(result, oplog.events[i].e) } slices.Reverse(result) - return result + return result, len(result) > 0 } diff --git a/render-2023-10-11/cmd/cache-service/oplog_test.go b/render-2023-10-11/cmd/cache-service/oplog_test.go index a6fce70..24999ed 100644 --- a/render-2023-10-11/cmd/cache-service/oplog_test.go +++ b/render-2023-10-11/cmd/cache-service/oplog_test.go @@ -13,7 +13,7 @@ func TestOplog(t *testing.T) { oplog.push(time.Unix(3, 0), thestore.Event{ID: "3"}) oplog.push(time.Unix(4, 0), thestore.Event{ID: "4"}) - got := oplog.Since(time.Unix(2, 0)) + got, _ := oplog.Since(time.Unix(2, 0)) if len(got) != 2 { t.Error(got) } else if got[0].ID != "3" { diff --git a/render-2023-10-11/cmd/cache-service/server.go b/render-2023-10-11/cmd/cache-service/server.go index d8cf3df..f4b7760 100644 --- a/render-2023-10-11/cmd/cache-service/server.go +++ b/render-2023-10-11/cmd/cache-service/server.go @@ -56,10 +56,13 @@ func (server Server) serveGetEvents(w http.ResponseWriter, r *http.Request) { if err != nil { // todo emit helpful err message w.WriteHeader(http.StatusBadRequest) - return nil + return } since := time.Unix(sinceInt, 0) - result := server.oplog.Since(since) + result, ok := server.oplog.Since(since) + if !ok { + result = server.store.Dump() + } json.NewEncoder(w).Encode(result) } diff --git a/render-2023-10-11/internal/thestore/store.go b/render-2023-10-11/internal/thestore/store.go index 8cd9476..85a1547 100644 --- a/render-2023-10-11/internal/thestore/store.go +++ b/render-2023-10-11/internal/thestore/store.go @@ -10,6 +10,16 @@ func NewStore() *Store { return &store } +// todo pass context.context and failfast +func (store *Store) Dump() []Event { + result := make([]Event, 0) + (*sync.Map)(store).Range(func(_, v any) bool { + result = append(result, v.(Event)) + return true + }) + return result +} + func (store *Store) Push(op Event) { k := op.ID event, ok := store.Get(k)