From 59b852110ad186153128aa27f14ded59cec49310 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 11 Oct 2023 17:43:31 -0600 Subject: [PATCH] pdf of design --- .../LaPointe Bree interview 2023-10-11.pdf | Bin 0 -> 34441 bytes render-2023-10-11/cmd/cache-service/oplog.go | 32 +++++++++++++++--- .../cmd/cache-service/oplog_test.go | 2 ++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 render-2023-10-11/LaPointe Bree interview 2023-10-11.pdf diff --git a/render-2023-10-11/LaPointe Bree interview 2023-10-11.pdf b/render-2023-10-11/LaPointe Bree interview 2023-10-11.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6e0d269b30b8ec540ab62d832c3b0e7f671e3282 GIT binary patch literal 34441 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 literal 0 HcmV?d00001 diff --git a/render-2023-10-11/cmd/cache-service/oplog.go b/render-2023-10-11/cmd/cache-service/oplog.go index 5ed4e49..8837af9 100644 --- a/render-2023-10-11/cmd/cache-service/oplog.go +++ b/render-2023-10-11/cmd/cache-service/oplog.go @@ -1,12 +1,15 @@ package main import ( + "fmt" "render231011/internal/thestore" "slices" + "sync" "time" ) type Oplog struct { + mutex *sync.RWMutex events []timestampedEvent idx int // todo lastTruncated time.Time @@ -17,10 +20,15 @@ type timestampedEvent struct { e thestore.Event } +func (timestampedEvent timestampedEvent) String() string { + return fmt.Sprintf("@%v: %+v", timestampedEvent.t.Unix(), timestampedEvent.e) +} + // gotcha duration? bigger N? whatever func NewOplog() *Oplog { return &Oplog{ - events: make([]timestampedEvent, 0, 1024), + events: make([]timestampedEvent, 2), + mutex: &sync.RWMutex{}, } } @@ -30,23 +38,39 @@ func (oplog *Oplog) Push(event thestore.Event) { } func (oplog *Oplog) push(t time.Time, event thestore.Event) { - oplog.events = append(oplog.events, timestampedEvent{ + oplog.mutex.Lock() + defer oplog.mutex.Unlock() + oplog.lastTruncated = oplog.events[oplog.idx].t + oplog.events[oplog.idx] = timestampedEvent{ t: t, e: event, - }) + } + oplog.idx++ + if oplog.idx >= len(oplog.events) { + oplog.idx = 0 + } } func (oplog *Oplog) Since(t time.Time) ([]thestore.Event, bool) { + oplog.mutex.RLock() + defer oplog.mutex.RUnlock() + if !t.After(oplog.lastTruncated) { return nil, false } result := make([]thestore.Event, 0, 5) - for i := len(oplog.events) - 1; i >= 0; i-- { + i := (oplog.idx + len(oplog.events) - 1) % len(oplog.events) + for i != oplog.idx { if !oplog.events[i].t.After(t) { break } result = append(result, oplog.events[i].e) + + i-- + if i < 0 { + i = len(oplog.events) + } } slices.Reverse(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 24999ed..948690a 100644 --- a/render-2023-10-11/cmd/cache-service/oplog_test.go +++ b/render-2023-10-11/cmd/cache-service/oplog_test.go @@ -13,6 +13,8 @@ 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"}) + t.Logf("%+v, %s", oplog, oplog.lastTruncated.UTC()) + got, _ := oplog.Since(time.Unix(2, 0)) if len(got) != 2 { t.Error(got)