From f4c188a87aa148639116a9c96309c3ae721cd46b Mon Sep 17 00:00:00 2001 From: "Sascha L. Teichmann" Date: Wed, 17 Sep 2014 10:16:51 +0200 Subject: [PATCH] mtredisalize: Do the actual change tracking, store them in a map and serialize them to JSON when flushing is triggered. TODO: Implement the POST request to the remote host with this JSON document. --- cmd/mtredisalize/changetracker.go | 36 +++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/cmd/mtredisalize/changetracker.go b/cmd/mtredisalize/changetracker.go index 0b9973c..adf5c2c 100644 --- a/cmd/mtredisalize/changetracker.go +++ b/cmd/mtredisalize/changetracker.go @@ -1,23 +1,27 @@ package main import ( + "encoding/json" "log" "sync" "bitbucket.org/s_l_teichmann/mtredisalize/common" ) +type quantizedXZ struct { + X, Z int16 +} + type ChangeTracker struct { - mutex sync.Mutex + changes map[quantizedXZ]bool + mutex sync.Mutex } func NewChangeTracker() *ChangeTracker { - return &ChangeTracker{} + return &ChangeTracker{changes: make(map[quantizedXZ]bool)} } func (ct *ChangeTracker) BlockChanged(key []byte) { - ct.mutex.Lock() - defer ct.mutex.Unlock() var err error var coord common.Coord if coord, err = common.DecodeStringBytesToCoord(key); err != nil { @@ -25,9 +29,33 @@ func (ct *ChangeTracker) BlockChanged(key []byte) { return } log.Printf("changed block: %v", coord) + ct.mutex.Lock() + ct.changes[quantizedXZ{X: coord.X / 16, Z: coord.Z / 16}] = true + ct.mutex.Unlock() } func (ct *ChangeTracker) FlushChanges(url string) (err error) { log.Println("change flush triggered") + var oldChanges map[quantizedXZ]bool + ct.mutex.Lock() + oldChanges = ct.changes + ct.changes = make(map[quantizedXZ]bool) + ct.mutex.Unlock() + go func() { + changes := make([]quantizedXZ, len(oldChanges)) + i := 0 + for change, _ := range oldChanges { + changes[i] = change + i++ + } + var err error + var encoded []byte + if encoded, err = json.Marshal(changes); err != nil { + log.Printf("WARN: encode changes to JSON failed: %s", err) + return + } + // TODO: implement http POST + _ = encoded + }() return }