Commit 523febbd by Mikhail Sharkov

WIP: revetring to expiration dates

parent 8d11a5e0
package vault package vault
import (
"time"
)
// control - управление хранилищем // control - управление хранилищем
func (store *Store) control() { func (store *Store) control() {
tick := time.Tick(time.Second) // Каждую секунду
// ставим в очередь разделитель "вёдер" и убираем устаревшее // ставим в очередь разделитель "вёдер" и убираем устаревшее
for { for {
select { select {
case <-tick:
store.addNode("", "", false)
for {
err := store.popNode()
if err != nil {
break
}
}
case request, ok := <-store.exchange: case request, ok := <-store.exchange:
if !ok { if !ok {
break break
......
...@@ -17,15 +17,15 @@ type node struct { ...@@ -17,15 +17,15 @@ type node struct {
expire time.Time // Окончание срока жизни expire time.Time // Окончание срока жизни
Key string // Ключ Key string // Ключ
Value interface{} // Хранимое значение Value interface{} // Хранимое значение
Prev *node // Ближе к голове, извлекается раньше Prev *node // Предыдущий узел
Next *node // Ближе к хвосту, выйдёт позже Next *node // Следующий узел
} }
// Store - корневая структура для хранения данных // Store - корневая структура для хранения данных
type Store struct { type Store struct {
TTL uint64 // Публично доступный TTL по умолчанию для инициализации TTL int // Публично доступный TTL по умолчанию для инициализации, сек
exchange chan Message // Небуферизованный канал для синхронизации доступа exchange chan Message // Небуферизованный канал для синхронизации доступа
ttl uint64 // Время жизни узла по умолчанию, сек ttl int // Время жизни узла по умолчанию, сек
head *node // Голова, выходит первым head *node // Голова, выходит первым
tail *node // Добавлен последним tail *node // Добавлен последним
flat map[string]*node // Карта для быстрого доступа к значениям flat map[string]*node // Карта для быстрого доступа к значениям
......
...@@ -18,13 +18,6 @@ func (store *Store) init() { ...@@ -18,13 +18,6 @@ func (store *Store) init() {
store.exchange = make(chan Message) store.exchange = make(chan Message)
store.flat = make(map[string]*node) store.flat = make(map[string]*node)
// Создаём достаточное количество узлов-филлеров, чтобы механизм
// устаревания не начал уничтожать записи преждевременно.
var i uint64
for i = 0; i < store.ttl; i++ {
store.addNode("", "", false)
}
go store.control() // запускаем управление хранилищем go store.control() // запускаем управление хранилищем
} }
...@@ -49,12 +42,13 @@ func (store *Store) addNode(key string, value interface{}, expire time.Time) err ...@@ -49,12 +42,13 @@ func (store *Store) addNode(key string, value interface{}, expire time.Time) err
// Если ключа ещё нет - просто добавляем в хвост. // Если ключа ещё нет - просто добавляем в хвост.
// Если ключ есть - переносим в хвост. // Если ключ есть - переносим в хвост.
func (store *Store) setNode(key string, value interface{}) error { func (store *Store) setNode(key string, value interface{}) error {
now := time.Now()
if _, ok := store.flat[key]; ok == false { if _, ok := store.flat[key]; ok == false {
store.addNode(key, value, true) store.addNode(key, value, now.Add(time.Second*(time.Duration)(store.ttl)))
return nil return nil
} }
store.delNode(key) // Сильно нерационально, удаление/создание объекта store.delNode(key) // Сильно нерационально, удаление/создание объекта
store.addNode(key, value, true) // Зато резко упрощает код store.addNode(key, value, now.Add(time.Second*(time.Duration)(store.ttl))) // Зато резко упрощает код
return nil return nil
} }
...@@ -66,9 +60,6 @@ func (store *Store) popNode() error { ...@@ -66,9 +60,6 @@ func (store *Store) popNode() error {
if store.head == nil { if store.head == nil {
return errors.New("No nodes") return errors.New("No nodes")
} }
if store.head.kind == false {
err = errors.New("Decay timeout")
}
if store.head.Key != "" { if store.head.Key != "" {
delete(store.flat, store.head.Key) delete(store.flat, store.head.Key)
} }
......
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