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.
This commit is contained in:
Sascha L. Teichmann 2014-09-17 10:16:51 +02:00
parent 400a65f563
commit f4c188a87a

View File

@ -1,23 +1,27 @@
package main package main
import ( import (
"encoding/json"
"log" "log"
"sync" "sync"
"bitbucket.org/s_l_teichmann/mtredisalize/common" "bitbucket.org/s_l_teichmann/mtredisalize/common"
) )
type quantizedXZ struct {
X, Z int16
}
type ChangeTracker struct { type ChangeTracker struct {
changes map[quantizedXZ]bool
mutex sync.Mutex mutex sync.Mutex
} }
func NewChangeTracker() *ChangeTracker { func NewChangeTracker() *ChangeTracker {
return &ChangeTracker{} return &ChangeTracker{changes: make(map[quantizedXZ]bool)}
} }
func (ct *ChangeTracker) BlockChanged(key []byte) { func (ct *ChangeTracker) BlockChanged(key []byte) {
ct.mutex.Lock()
defer ct.mutex.Unlock()
var err error var err error
var coord common.Coord var coord common.Coord
if coord, err = common.DecodeStringBytesToCoord(key); err != nil { if coord, err = common.DecodeStringBytesToCoord(key); err != nil {
@ -25,9 +29,33 @@ func (ct *ChangeTracker) BlockChanged(key []byte) {
return return
} }
log.Printf("changed block: %v", coord) 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) { func (ct *ChangeTracker) FlushChanges(url string) (err error) {
log.Println("change flush triggered") 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 return
} }