diff --git a/common/consistenthash/consistenthash.go b/common/consistenthash/consistenthash.go index dde99a9..f00df3e 100644 --- a/common/consistenthash/consistenthash.go +++ b/common/consistenthash/consistenthash.go @@ -22,6 +22,14 @@ func (r *Ring) search(key string) int { // YOUR CODE GOES HERE // ///////////////////////// + j := hashId(key) + + for i := range r.Nodes { + if(r.Nodes[i].HashId > j) { + return i + } + } + return 0 } diff --git a/dynamo/cache.go b/dynamo/cache.go index 0483a39..76c3ec3 100644 --- a/dynamo/cache.go +++ b/dynamo/cache.go @@ -12,6 +12,7 @@ import ( // Cache is the struct that handle all the data storage for the dynamo server. type Cache struct { data map[string]string + timestamp map[string]int64 sync.Mutex } @@ -20,6 +21,7 @@ func NewCache() *Cache { var s Cache s.data = make(map[string]string) + s.timestamp = make(map[string]int64) return &s } @@ -29,9 +31,9 @@ func NewCache() *Cache { func (cache *Cache) Get(key string) (value string, timestamp int64) { cache.Lock() value = cache.data[key] - timestamp = 0 + timestamp = cache.timestamp[key] cache.Unlock() - + log.Printf("[CACHE] Getting Key '%v' with Value '%v' @ timestamp '%v'\n", key, value, timestamp) return } @@ -43,6 +45,7 @@ func (cache *Cache) Put(key string, value string, timestamp int64) { cache.Lock() cache.data[key] = value + cache.timestamp[key] = timestamp cache.Unlock() return @@ -52,6 +55,6 @@ func (cache *Cache) Put(key string, value string, timestamp int64) { // except for testing purposes. func (cache *Cache) getAll() (data map[string]string, timestamps map[string]int64) { data = cache.data - timestamps = make(map[string]int64) + timestamps = cache.timestamp return data, timestamps } diff --git a/dynamo/coordinator.go b/dynamo/coordinator.go index 408cc9e..1dc3244 100644 --- a/dynamo/coordinator.go +++ b/dynamo/coordinator.go @@ -193,6 +193,15 @@ func aggregateVotes(votes []*vote) (result string) { ///////////////////////// // YOUR CODE GOES HERE // ///////////////////////// - result = votes[0].value + var bestts int64 + bestts = 0 + for _, vote := range votes { + if (bestts < vote.timestamp) { + result = vote.value + bestts = vote.timestamp + } + } + + //result = votes[0].value return }