From b7822498b15841303008911eb694b95bcbe88f6a Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 11 Oct 2023 15:59:04 -0600 Subject: [PATCH] implement dumb non-truncating oplog for cache-service --- render-2023-10-11/cmd/cache-service/oplog.go | 47 +++++++++++++++++++ .../cmd/cache-service/oplog_test.go | 25 ++++++++++ 2 files changed, 72 insertions(+) create mode 100644 render-2023-10-11/cmd/cache-service/oplog.go create mode 100644 render-2023-10-11/cmd/cache-service/oplog_test.go diff --git a/render-2023-10-11/cmd/cache-service/oplog.go b/render-2023-10-11/cmd/cache-service/oplog.go new file mode 100644 index 0000000..7a61406 --- /dev/null +++ b/render-2023-10-11/cmd/cache-service/oplog.go @@ -0,0 +1,47 @@ +package main + +import ( + "render231011/internal/thestore" + "slices" + "time" +) + +type Oplog struct { + events []timestampedEvent +} + +type timestampedEvent struct { + t time.Time + e thestore.Event +} + +// gotcha duration? bigger N? whatever +func NewOplog() Oplog { + return Oplog{ + events: make([]timestampedEvent, 0, 1024), + } +} + +// todo circular queue if we got time +func (oplog *Oplog) Push(event thestore.Event) { + oplog.push(time.Now(), event) +} + +func (oplog *Oplog) push(t time.Time, event thestore.Event) { + oplog.events = append(oplog.events, timestampedEvent{ + t: t, + e: event, + }) +} + +func (oplog *Oplog) Since(t time.Time) []thestore.Event { + result := make([]thestore.Event, 0, 5) + for i := len(oplog.events) - 1; i >= 0; i-- { + if !oplog.events[i].t.After(t) { + break + } + result = append(result, oplog.events[i].e) + } + slices.Reverse(result) + return result +} diff --git a/render-2023-10-11/cmd/cache-service/oplog_test.go b/render-2023-10-11/cmd/cache-service/oplog_test.go new file mode 100644 index 0000000..a6fce70 --- /dev/null +++ b/render-2023-10-11/cmd/cache-service/oplog_test.go @@ -0,0 +1,25 @@ +package main + +import ( + "render231011/internal/thestore" + "testing" + "time" +) + +func TestOplog(t *testing.T) { + oplog := NewOplog() + oplog.push(time.Unix(1, 0), thestore.Event{ID: "1"}) + oplog.push(time.Unix(2, 0), thestore.Event{ID: "2"}) + 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)) + if len(got) != 2 { + t.Error(got) + } else if got[0].ID != "3" { + t.Error(got[0]) + } else if got[1].ID != "4" { + t.Error(got[1]) + } + t.Logf("%+v", got) +}