mirror of
https://github.com/gravitl/netmaker.git
synced 2025-09-07 05:34:38 +08:00
cache ext clients
This commit is contained in:
parent
0c06e2b972
commit
50e093b456
3 changed files with 54 additions and 37 deletions
|
@ -10,7 +10,6 @@ import (
|
|||
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/gravitl/netmaker/database"
|
||||
"github.com/gravitl/netmaker/functions"
|
||||
"github.com/gravitl/netmaker/logger"
|
||||
"github.com/gravitl/netmaker/logic"
|
||||
"github.com/gravitl/netmaker/logic/pro"
|
||||
|
@ -102,7 +101,7 @@ func getAllExtClients(w http.ResponseWriter, r *http.Request) {
|
|||
clients := []models.ExtClient{}
|
||||
var err error
|
||||
if len(networksSlice) > 0 && networksSlice[0] == logic.ALL_NETWORK_ACCESS {
|
||||
clients, err = functions.GetAllExtClients()
|
||||
clients, err = logic.GetAllExtClients()
|
||||
if err != nil && !database.IsEmptyRecord(err) {
|
||||
logger.Log(0, "failed to get all extclients: ", err.Error())
|
||||
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
|
||||
|
|
|
@ -3,43 +3,44 @@ package logic
|
|||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/gravitl/netmaker/database"
|
||||
"github.com/gravitl/netmaker/logger"
|
||||
"github.com/gravitl/netmaker/models"
|
||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||
)
|
||||
|
||||
// GetExtPeersList - gets the ext peers lists
|
||||
func GetExtPeersList(node *models.Node) ([]models.ExtPeersResponse, error) {
|
||||
var (
|
||||
extClientCacheMutex = &sync.RWMutex{}
|
||||
extClientCacheMap = make(map[string]models.ExtClient)
|
||||
)
|
||||
|
||||
var peers []models.ExtPeersResponse
|
||||
records, err := database.FetchRecords(database.EXT_CLIENT_TABLE_NAME)
|
||||
|
||||
if err != nil {
|
||||
return peers, err
|
||||
func getAllExtClientsFromCache() (extClients []models.ExtClient) {
|
||||
extClientCacheMutex.RLock()
|
||||
for _, extclient := range extClientCacheMap {
|
||||
extClients = append(extClients, extclient)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
for _, value := range records {
|
||||
var peer models.ExtPeersResponse
|
||||
var extClient models.ExtClient
|
||||
err = json.Unmarshal([]byte(value), &peer)
|
||||
if err != nil {
|
||||
logger.Log(2, "failed to unmarshal peer when getting ext peer list")
|
||||
continue
|
||||
}
|
||||
err = json.Unmarshal([]byte(value), &extClient)
|
||||
if err != nil {
|
||||
logger.Log(2, "failed to unmarshal ext client")
|
||||
continue
|
||||
}
|
||||
func deleteExtClientFromCache(key string) {
|
||||
extClientCacheMutex.Lock()
|
||||
delete(extClientCacheMap, key)
|
||||
extClientCacheMutex.Unlock()
|
||||
}
|
||||
|
||||
if extClient.Enabled && extClient.Network == node.Network && extClient.IngressGatewayID == node.ID.String() {
|
||||
peers = append(peers, peer)
|
||||
}
|
||||
}
|
||||
return peers, err
|
||||
func getExtClientFromCache(key string) (extclient models.ExtClient, ok bool) {
|
||||
extClientCacheMutex.RLock()
|
||||
extclient, ok = extClientCacheMap[key]
|
||||
extClientCacheMutex.RUnlock()
|
||||
return
|
||||
}
|
||||
|
||||
func storeExtClientInCache(key string, extclient models.ExtClient) {
|
||||
extClientCacheMutex.Lock()
|
||||
extClientCacheMap[key] = extclient
|
||||
extClientCacheMutex.Unlock()
|
||||
}
|
||||
|
||||
// ExtClient.GetEgressRangesOnNetwork - returns the egress ranges on network of ext client
|
||||
|
@ -71,13 +72,25 @@ func DeleteExtClient(network string, clientid string) error {
|
|||
return err
|
||||
}
|
||||
err = database.DeleteRecord(database.EXT_CLIENT_TABLE_NAME, key)
|
||||
return err
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
deleteExtClientFromCache(key)
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetNetworkExtClients - gets the ext clients of given network
|
||||
func GetNetworkExtClients(network string) ([]models.ExtClient, error) {
|
||||
var extclients []models.ExtClient
|
||||
|
||||
allextclients := getAllExtClientsFromCache()
|
||||
if len(allextclients) != 0 {
|
||||
for _, extclient := range allextclients {
|
||||
if extclient.Network == network {
|
||||
extclients = append(extclients, extclient)
|
||||
}
|
||||
}
|
||||
return extclients, nil
|
||||
}
|
||||
records, err := database.FetchRecords(database.EXT_CLIENT_TABLE_NAME)
|
||||
if err != nil {
|
||||
return extclients, err
|
||||
|
@ -88,6 +101,10 @@ func GetNetworkExtClients(network string) ([]models.ExtClient, error) {
|
|||
if err != nil {
|
||||
continue
|
||||
}
|
||||
key, err := GetRecordKey(extclient.ClientID, network)
|
||||
if err == nil {
|
||||
storeExtClientInCache(key, extclient)
|
||||
}
|
||||
if extclient.Network == network {
|
||||
extclients = append(extclients, extclient)
|
||||
}
|
||||
|
@ -102,12 +119,15 @@ func GetExtClient(clientid string, network string) (models.ExtClient, error) {
|
|||
if err != nil {
|
||||
return extclient, err
|
||||
}
|
||||
if extclient, ok := getExtClientFromCache(key); ok {
|
||||
return extclient, nil
|
||||
}
|
||||
data, err := database.FetchRecord(database.EXT_CLIENT_TABLE_NAME, key)
|
||||
if err != nil {
|
||||
return extclient, err
|
||||
}
|
||||
err = json.Unmarshal([]byte(data), &extclient)
|
||||
|
||||
storeExtClientInCache(key, extclient)
|
||||
return extclient, err
|
||||
}
|
||||
|
||||
|
@ -186,6 +206,7 @@ func SaveExtClient(extclient *models.ExtClient) error {
|
|||
if err = database.Insert(key, string(data), database.EXT_CLIENT_TABLE_NAME); err != nil {
|
||||
return err
|
||||
}
|
||||
storeExtClientInCache(key, *extclient)
|
||||
return SetNetworkNodesLastModified(extclient.Network)
|
||||
}
|
||||
|
||||
|
|
|
@ -212,15 +212,12 @@ func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
|
|||
}
|
||||
|
||||
} else if tableName == database.EXT_CLIENT_TABLE_NAME {
|
||||
collection, err := database.FetchRecords(tableName)
|
||||
|
||||
extClients, err := GetNetworkExtClients(network)
|
||||
if err != nil {
|
||||
return isunique
|
||||
}
|
||||
var extClient models.ExtClient
|
||||
for _, value := range collection { // filter
|
||||
if err = json.Unmarshal([]byte(value), &extClient); err != nil {
|
||||
continue
|
||||
}
|
||||
for _, extClient := range extClients { // filter
|
||||
if isIpv6 {
|
||||
if (extClient.Address6 == ip) && extClient.Network == network {
|
||||
return false
|
||||
|
|
Loading…
Add table
Reference in a new issue