Commit 648258de by lancet

basc funcs

parent d901e489
No preview for this file type
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"net/http" "net/http"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"gitlab.tq-nest.lan/lancet/kvcache/vault"
) )
type Route struct { type Route struct {
...@@ -45,6 +46,8 @@ func initRouter(router *mux.Router, routes []Route) { ...@@ -45,6 +46,8 @@ func initRouter(router *mux.Router, routes []Route) {
func main() { func main() {
router := mux.NewRouter() router := mux.NewRouter()
storage := new(vault.Store)
storage.Init(30)
routing := []Route{ routing := []Route{
{"/storage/{id}", []string{"GET"}, getValue}, {"/storage/{id}", []string{"GET"}, getValue},
{"/storage/{id}", []string{"PUT", "POST"}, setValue}, {"/storage/{id}", []string{"PUT", "POST"}, setValue},
......
...@@ -2,12 +2,11 @@ package vault ...@@ -2,12 +2,11 @@ package vault
import ( import (
"errors" "errors"
"fmt"
"time" "time"
) )
// Init - инициализация хранилища // Init - инициализация хранилища
func (store *store) Init(ttl uint64) error { func (store *Store) Init(ttl uint64) error {
if store.ttl != 0 { if store.ttl != 0 {
return errors.New("Already up") return errors.New("Already up")
} }
...@@ -28,30 +27,30 @@ func (store *store) Init(ttl uint64) error { ...@@ -28,30 +27,30 @@ func (store *store) Init(ttl uint64) error {
return nil return nil
} }
func (store *store) cleaner() { func (store *Store) cleaner() {
reply := make(chan Message) reply := make(chan Message)
msg := Message{Action: "POP", Reply: reply}
for { for {
msg := Message{Action: "POP", Reply: reply}
store.Exchange <- msg store.Exchange <- msg
got := <-reply got := <-reply
if got.Error == true { if got.Error == true {
fmt.Print("Cleaner sleeps.\n") //fmt.Print("Cleaner sleeps.\n")
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
} }
} }
} }
// control - управление хранилищем // control - управление хранилищем
func (store *store) control() { func (store *Store) control() {
tick := time.Tick(time.Second) // Каждую секунду ставим в очередь разделитель "вёдер" tick := time.Tick(time.Second) // Каждую секунду ставим в очередь разделитель "вёдер"
for { for {
select { select {
case <-tick: case <-tick:
fmt.Print("Got time tick\n") //fmt.Print("Got time tick\n")
store.addNode("", "", false) store.addNode("", "", false)
case request := <-store.Exchange: case request := <-store.Exchange:
fmt.Print("Got request", request, "\n") //fmt.Print("Got request: ", request.Action, "\n")
reply := new(Message) reply := Message{}
switch request.Action { switch request.Action {
case "POP": // внутренний метод, часть механизма устаревания. Недоступен клиентам. case "POP": // внутренний метод, часть механизма устаревания. Недоступен клиентам.
err := store.popNode() err := store.popNode()
...@@ -79,6 +78,7 @@ func (store *store) control() { ...@@ -79,6 +78,7 @@ func (store *store) control() {
reply.Error = true reply.Error = true
} }
} }
request.Reply <- reply
} }
} }
} }
...@@ -20,7 +20,7 @@ type node struct { ...@@ -20,7 +20,7 @@ type node struct {
} }
// Store - корневая структура для хранения данных // Store - корневая структура для хранения данных
type store struct { type Store struct {
Exchange chan Message // Небуферизованный канал для синхронизации доступа Exchange chan Message // Небуферизованный канал для синхронизации доступа
ttl uint64 // Время жизни узла, сек ttl uint64 // Время жизни узла, сек
head *node // Голова, выходит первым head *node // Голова, выходит первым
......
...@@ -3,10 +3,15 @@ package vault ...@@ -3,10 +3,15 @@ package vault
import "errors" import "errors"
// addNode - добавляем новый узел в хвост очереди. // addNode - добавляем новый узел в хвост очереди.
func (store *store) addNode(key, value string, kind bool) { func (store *Store) addNode(key, value string, kind bool) {
prev := store.tail 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, Kind: kind}
prev.Next = store.tail if prev != nil {
prev.Next = store.tail
}
if kind == true { if kind == true {
store.flat[key] = store.tail store.flat[key] = store.tail
} }
...@@ -15,7 +20,7 @@ func (store *store) addNode(key, value string, kind bool) { ...@@ -15,7 +20,7 @@ func (store *store) addNode(key, value string, kind bool) {
// setNode - собираемся добавить новый узел. // setNode - собираемся добавить новый узел.
// Если ключа ещё нет - просто добавляем в хвост. // Если ключа ещё нет - просто добавляем в хвост.
// Если ключ есть - переносим в хвост. // Если ключ есть - переносим в хвост.
func (store *store) setNode(key, value string) error { func (store *Store) setNode(key, value string) error {
if _, ok := store.flat[key]; ok == false { if _, ok := store.flat[key]; ok == false {
store.addNode(key, value, true) store.addNode(key, value, true)
return nil return nil
...@@ -46,7 +51,7 @@ func (store *store) setNode(key, value string) error { ...@@ -46,7 +51,7 @@ func (store *store) setNode(key, value string) error {
// popNode - извлекаем узел из гловы очереди и уничтожаем его. // popNode - извлекаем узел из гловы очереди и уничтожаем его.
// Если Kind == 0 - то возвращаем ошибку. // Если Kind == 0 - то возвращаем ошибку.
// При ошибке устаревание приостанавливается на секунду. // При ошибке устаревание приостанавливается на секунду.
func (store *store) popNode() error { func (store *Store) popNode() error {
if store.head == nil { if store.head == nil {
return errors.New("No nodes") return errors.New("No nodes")
} }
...@@ -60,7 +65,7 @@ func (store *store) popNode() error { ...@@ -60,7 +65,7 @@ func (store *store) popNode() error {
} }
// getNode - получить значение ключа, или ошибку, если такого нет. // getNode - получить значение ключа, или ошибку, если такого нет.
func (store *store) getNode(key string) (string, error) { func (store *Store) getNode(key string) (string, error) {
if v, ok := store.flat[key]; ok != false { if v, ok := store.flat[key]; ok != false {
return v.Value, nil return v.Value, nil
} }
...@@ -69,7 +74,7 @@ func (store *store) getNode(key string) (string, error) { ...@@ -69,7 +74,7 @@ func (store *store) getNode(key string) (string, error) {
// delNode - удалить узел с указанным ключом. // delNode - удалить узел с указанным ключом.
// Если такого ключа не было - вернуть ошибку. // Если такого ключа не было - вернуть ошибку.
func (store *store) delNode(key string) error { func (store *Store) delNode(key string) error {
if _, ok := store.flat[key]; ok == false { if _, ok := store.flat[key]; ok == false {
return errors.New("No such key") return errors.New("No such 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