Commit 8d11a5e0 by Mikhail Sharkov

WIP: reverting to timeouts from buckets

parent 9a69a28d
package vault package vault
import "time"
// Message - структура данных для двустороннего обмена с хранилищем, // Message - структура данных для двустороннего обмена с хранилищем,
// запрос/ответ // запрос/ответ
type Message struct { type Message struct {
...@@ -12,19 +14,18 @@ type Message struct { ...@@ -12,19 +14,18 @@ type Message struct {
// node - узел данных для очереди устаревания // node - узел данных для очереди устаревания
type node struct { type node struct {
kind bool // 0 - таймаут, 1 - данные 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 uint64 // Публично доступный TTL по умолчанию для инициализации
isInit bool // Признак выполненной инициализации
exchange chan Message // Небуферизованный канал для синхронизации доступа exchange chan Message // Небуферизованный канал для синхронизации доступа
ttl uint64 // Время жизни узла, сек ttl uint64 // Время жизни узла по умолчанию, сек
head *node // Голова, выходит первым head *node // Голова, выходит первым
tail *node // Добавлен последним tail *node // Добавлен последним
flat map[string]*node // Карта для быстрого доступа к значениям flat map[string]*node // Карта для быстрого доступа к значениям
......
...@@ -8,7 +8,7 @@ import ( ...@@ -8,7 +8,7 @@ import (
// GetValue - получить значение ключа из хранилища // GetValue - получить значение ключа из хранилища
func (store *Store) GetValue(key string) (interface{}, error) { func (store *Store) GetValue(key string) (interface{}, error) {
if store.isInit == false { if store.ttl == 0 {
store.init() store.init()
} }
reply := make(chan Message) reply := make(chan Message)
...@@ -23,7 +23,7 @@ func (store *Store) GetValue(key string) (interface{}, error) { ...@@ -23,7 +23,7 @@ func (store *Store) GetValue(key string) (interface{}, error) {
// SetValue - установить/обновить значение ключа // SetValue - установить/обновить значение ключа
func (store *Store) SetValue(key string, value interface{}) error { func (store *Store) SetValue(key string, value interface{}) error {
if store.isInit == false { if store.ttl == 0 {
store.init() store.init()
} }
reply := make(chan Message) reply := make(chan Message)
...@@ -38,7 +38,7 @@ func (store *Store) SetValue(key string, value interface{}) error { ...@@ -38,7 +38,7 @@ func (store *Store) SetValue(key string, value interface{}) error {
// DelValue - удалить ключ из хранилища // DelValue - удалить ключ из хранилища
func (store *Store) DelValue(key string) error { func (store *Store) DelValue(key string) error {
if store.isInit == false { if store.ttl == 0 {
store.init() store.init()
} }
reply := make(chan Message) reply := make(chan Message)
......
...@@ -2,11 +2,12 @@ package vault ...@@ -2,11 +2,12 @@ package vault
import ( import (
"errors" "errors"
"time"
) )
// init - инициализация хранилища с заданным TTL // init - инициализация хранилища с заданным TTL
func (store *Store) init() { func (store *Store) init() {
if store.isInit == true { if store.ttl != 0 {
return return
} }
if store.TTL < 1 { if store.TTL < 1 {
...@@ -16,7 +17,6 @@ func (store *Store) init() { ...@@ -16,7 +17,6 @@ func (store *Store) init() {
store.ttl = store.TTL store.ttl = store.TTL
store.exchange = make(chan Message) store.exchange = make(chan Message)
store.flat = make(map[string]*node) store.flat = make(map[string]*node)
store.isInit = true
// Создаём достаточное количество узлов-филлеров, чтобы механизм // Создаём достаточное количество узлов-филлеров, чтобы механизм
// устаревания не начал уничтожать записи преждевременно. // устаревания не начал уничтожать записи преждевременно.
...@@ -29,21 +29,19 @@ func (store *Store) init() { ...@@ -29,21 +29,19 @@ func (store *Store) init() {
} }
// addNode - добавляем новый узел в хвост очереди. // addNode - добавляем новый узел в хвост очереди.
func (store *Store) addNode(key string, value interface{}, kind bool) error { func (store *Store) addNode(key string, value interface{}, expire time.Time) error {
var prev *node var prev *node
if store.tail != nil { if store.tail != nil {
prev = store.tail prev = store.tail
} }
store.tail = &node{Key: key, Value: value, Prev: prev, kind: kind} store.tail = &node{Key: key, Value: value, Prev: prev, expire: expire}
if store.head == nil { if store.head == nil {
store.head = store.tail store.head = store.tail
} }
if prev != nil { if prev != nil {
prev.Next = store.tail prev.Next = store.tail
} }
if kind == true {
store.flat[key] = store.tail
}
return nil return nil
} }
......
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