Commit 648258de by lancet

basc funcs

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