Commit 8d11a5e0 by Mikhail Sharkov

WIP: reverting to timeouts from buckets

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