Commit 66c1a037 by Mikhail Sharkov

got working

parent 523febbd
package vault
import (
"time"
)
// control - управление хранилищем
func (store *Store) control() {
// ставим в очередь разделитель "вёдер" и убираем устаревшее
tick := time.NewTimer(store.ttl)
for {
select {
case <-tick.C: // запускаем устаревание элементов
now := time.Now()
step := store.ttl
for {
if store.head != nil {
diff := store.head.expire.Sub(now)
if diff < 1*time.Second {
// узел протух, убираем его
//fmt.Printf("pop! @%s\n", now)
err := store.popNode()
if err != nil || store.head == nil {
//fmt.Print("nothing more to pop\n")
step = store.ttl
break
}
continue
} else {
step = store.head.expire.Sub(now)
break
}
} else {
break
}
}
tick = time.NewTimer(step)
case request, ok := <-store.exchange:
if !ok {
break
......@@ -12,12 +41,14 @@ func (store *Store) control() {
reply := Message{}
switch request.Action {
case "SET":
//fmt.Printf("SET: %s\n", request.Key)
err := store.setNode(request.Key, request.Value)
reply.Key = request.Key
if err != nil {
reply.Error = true
}
case "GET":
//fmt.Printf("GET: %s\n", request.Key)
v, err := store.getNode(request.Key)
if err != nil {
reply.Error = true
......@@ -26,6 +57,7 @@ func (store *Store) control() {
reply.Value = v
}
case "DEL":
//fmt.Printf("DEL: %s\n", request.Key)
err := store.delNode(request.Key)
if err != nil {
reply.Key = request.Key
......
......@@ -23,9 +23,9 @@ type node struct {
// Store - корневая структура для хранения данных
type Store struct {
TTL int // Публично доступный TTL по умолчанию для инициализации, сек
TTL uint64 // Публично доступный TTL по умолчанию для инициализации, сек
exchange chan Message // Небуферизованный канал для синхронизации доступа
ttl int // Время жизни узла по умолчанию, сек
ttl time.Duration // Время жизни узла по умолчанию, сек
head *node // Голова, выходит первым
tail *node // Добавлен последним
flat map[string]*node // Карта для быстрого доступа к значениям
......
......@@ -14,7 +14,7 @@ func (store *Store) init() {
store.TTL = 30
}
store.ttl = store.TTL
store.ttl = time.Second * (time.Duration)(store.TTL)
store.exchange = make(chan Message)
store.flat = make(map[string]*node)
......@@ -34,6 +34,7 @@ func (store *Store) addNode(key string, value interface{}, expire time.Time) err
if prev != nil {
prev.Next = store.tail
}
store.flat[key] = store.tail
return nil
}
......@@ -44,11 +45,11 @@ func (store *Store) addNode(key string, value interface{}, expire time.Time) err
func (store *Store) setNode(key string, value interface{}) error {
now := time.Now()
if _, ok := store.flat[key]; ok == false {
store.addNode(key, value, now.Add(time.Second*(time.Duration)(store.ttl)))
store.addNode(key, value, now.Add(store.ttl))
return nil
}
store.delNode(key) // Сильно нерационально, удаление/создание объекта
store.addNode(key, value, now.Add(time.Second*(time.Duration)(store.ttl))) // Зато резко упрощает код
store.delNode(key) // Сильно нерационально, удаление/создание объекта
store.addNode(key, value, now.Add(store.ttl)) // Зато резко упрощает код
return nil
}
......@@ -61,11 +62,16 @@ func (store *Store) popNode() error {
return errors.New("No nodes")
}
if store.head.Key != "" {
delete(store.flat, store.head.Key)
if _, ok := store.flat[store.head.Key]; ok == true {
delete(store.flat, store.head.Key)
}
}
if store.head.Next != nil {
store.head = store.head.Next
store.head.Prev = nil
} else {
store.head = nil
store.tail = nil
}
return err
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment