Try lmdb
This commit is contained in:
parent
f23f7226f6
commit
c6cb8f0c52
7 changed files with 84 additions and 3 deletions
|
@ -10,9 +10,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
Database string
|
||||||
|
UnixSocket string
|
||||||
Service []scanner.ServiceConfig
|
Service []scanner.ServiceConfig
|
||||||
Matrix MatrixConfig
|
Matrix MatrixConfig
|
||||||
UnixSocket string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type MatrixConfig struct {
|
type MatrixConfig struct {
|
||||||
|
|
|
@ -1,3 +1,63 @@
|
||||||
package core
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.exozy.me/exozyme/status/scanner"
|
||||||
|
"github.com/PowerDNS/lmdb-go/lmdb"
|
||||||
|
)
|
||||||
|
|
||||||
// todo
|
// todo
|
||||||
|
|
||||||
|
type Row struct {
|
||||||
|
time time.Time
|
||||||
|
data scanner.ServiceStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
type Database = struct {
|
||||||
|
env *lmdb.Env
|
||||||
|
dbi lmdb.DBI
|
||||||
|
}
|
||||||
|
|
||||||
|
// type Database interface {
|
||||||
|
// QueryAfter(url string, cutoff time.Time) []Row
|
||||||
|
// RememberNow(scanner.ServiceStatusBatch) error
|
||||||
|
// }
|
||||||
|
|
||||||
|
func OpenDatabase(path string) (*Database, error) {
|
||||||
|
if path == "" {
|
||||||
|
return nil, fmt.Errorf("database path is empty. did you set it in config file?")
|
||||||
|
}
|
||||||
|
err := os.MkdirAll(path, 0755)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
env, err := lmdb.NewEnv() // will auto close
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
err = env.SetMaxDBs(1)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
err = env.Open(path, lmdb.FixedMap, 0644)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
txn, err := env.BeginTxn(nil, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dbi, err := txn.CreateDBI("default")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Database{env, dbi}, nil
|
||||||
|
// status := dbm.Open(path, true, nil)
|
||||||
|
// if !status.IsOK() {
|
||||||
|
// return nil, status
|
||||||
|
// }
|
||||||
|
// return dbm, nil
|
||||||
|
}
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -3,6 +3,7 @@ module git.exozy.me/exozyme/status
|
||||||
go 1.21.1
|
go 1.21.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/PowerDNS/lmdb-go v1.9.1
|
||||||
github.com/cbroglie/mustache v1.4.0
|
github.com/cbroglie/mustache v1.4.0
|
||||||
github.com/pelletier/go-toml/v2 v2.1.0
|
github.com/pelletier/go-toml/v2 v2.1.0
|
||||||
github.com/prometheus-community/pro-bing v0.3.0
|
github.com/prometheus-community/pro-bing v0.3.0
|
||||||
|
|
8
go.sum
8
go.sum
|
@ -1,3 +1,5 @@
|
||||||
|
github.com/PowerDNS/lmdb-go v1.9.1 h1:5alOCXD5rjiOi0B0YfyPb2uWr8oAXF6LFiaPZ/d7KVY=
|
||||||
|
github.com/PowerDNS/lmdb-go v1.9.1/go.mod h1:5beHlX2aYqXfMBI0+BBX3LDhV3YGHU5JgoDsirAFPlA=
|
||||||
github.com/cbroglie/mustache v1.4.0 h1:Azg0dVhxTml5me+7PsZ7WPrQq1Gkf3WApcHMjMprYoU=
|
github.com/cbroglie/mustache v1.4.0 h1:Azg0dVhxTml5me+7PsZ7WPrQq1Gkf3WApcHMjMprYoU=
|
||||||
github.com/cbroglie/mustache v1.4.0/go.mod h1:SS1FTIghy0sjse4DUVGV1k/40B1qE1XkD9DtDsHo9iM=
|
github.com/cbroglie/mustache v1.4.0/go.mod h1:SS1FTIghy0sjse4DUVGV1k/40B1qE1XkD9DtDsHo9iM=
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
|
@ -43,14 +45,20 @@ golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
|
||||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
|
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
|
||||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
|
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
|
||||||
|
golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
|
||||||
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
|
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
|
||||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
|
8
main.go
8
main.go
|
@ -57,7 +57,7 @@ func rootPage(w http.ResponseWriter, r *http.Request) {
|
||||||
// get service status'
|
// get service status'
|
||||||
timeout := time.Second
|
timeout := time.Second
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
||||||
data := scanner.TestMultipleServices(ctx, config.Service)
|
data := scanner.TestServiceBatch(ctx, config.Service)
|
||||||
cancel()
|
cancel()
|
||||||
|
|
||||||
// don't uncomment this in production. verbose
|
// don't uncomment this in production. verbose
|
||||||
|
@ -79,6 +79,7 @@ func removeFile(path string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var config *core.Config
|
var config *core.Config
|
||||||
|
var dbm *core.Database
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var err error
|
var err error
|
||||||
|
@ -87,6 +88,11 @@ func main() {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dbm, err = core.OpenDatabase(config.Database)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
http.HandleFunc("/", rootPage)
|
http.HandleFunc("/", rootPage)
|
||||||
|
|
||||||
// serve public folder from embedfs
|
// serve public folder from embedfs
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
# unixSocket = "/srv/http/pages/status"
|
# unixSocket = "/srv/http/pages/status"
|
||||||
|
# database = "/opt/status-config/db"
|
||||||
|
database = "/tmp/exozyme-status-test-db"
|
||||||
|
|
||||||
service = [
|
service = [
|
||||||
{ description = "exozy.me", url = "https://exozy.me" },
|
{ description = "exozy.me", url = "https://exozy.me" },
|
||||||
{ description = "drgns.space", url = "https://drgns.space" },
|
{ description = "drgns.space", url = "https://drgns.space" },
|
||||||
|
|
|
@ -68,7 +68,9 @@ func TestService(service ServiceConfig, ctx context.Context) ServiceStatus {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMultipleServices(ctx Context, services []ServiceConfig) []ServiceStatus {
|
type ServiceStatusBatch []ServiceStatus
|
||||||
|
|
||||||
|
func TestServiceBatch(ctx Context, services []ServiceConfig) ServiceStatusBatch {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
var data []ServiceStatus = make([]ServiceStatus, len(services))
|
var data []ServiceStatus = make([]ServiceStatus, len(services))
|
||||||
|
|
Loading…
Reference in a new issue