mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2024-12-27 05:49:04 +01:00
commit
e3f195dad0
1
.gitignore
vendored
1
.gitignore
vendored
@ -16,3 +16,4 @@ var/job.db-shm
|
|||||||
var/job.db-wal
|
var/job.db-wal
|
||||||
|
|
||||||
dist/
|
dist/
|
||||||
|
*.db
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
# This is an example .goreleaser.yml file with some sensible defaults.
|
|
||||||
before:
|
before:
|
||||||
hooks:
|
hooks:
|
||||||
- go mod tidy
|
- go mod tidy
|
||||||
@ -12,7 +11,12 @@ builds:
|
|||||||
goamd64:
|
goamd64:
|
||||||
- v3
|
- v3
|
||||||
id: "cc-backend"
|
id: "cc-backend"
|
||||||
|
binary: cc-backend
|
||||||
main: ./cmd/cc-backend
|
main: ./cmd/cc-backend
|
||||||
|
ldflags:
|
||||||
|
- -s -w -X main.version={{.Version}}
|
||||||
|
- -X main.commit={{.Commit}} -X main.date={{.Date}}
|
||||||
|
- -linkmode external -extldflags -static
|
||||||
tags:
|
tags:
|
||||||
- static_build
|
- static_build
|
||||||
hooks:
|
hooks:
|
||||||
@ -26,6 +30,7 @@ builds:
|
|||||||
goamd64:
|
goamd64:
|
||||||
- v3
|
- v3
|
||||||
id: "archive-manager"
|
id: "archive-manager"
|
||||||
|
binary: archive-manager
|
||||||
main: ./tools/archive-manager
|
main: ./tools/archive-manager
|
||||||
tags:
|
tags:
|
||||||
- static_build
|
- static_build
|
||||||
@ -38,6 +43,7 @@ builds:
|
|||||||
goamd64:
|
goamd64:
|
||||||
- v3
|
- v3
|
||||||
id: "archive-migration"
|
id: "archive-migration"
|
||||||
|
binary: archive-migration
|
||||||
main: ./tools/archive-migration
|
main: ./tools/archive-migration
|
||||||
tags:
|
tags:
|
||||||
- static_build
|
- static_build
|
||||||
@ -50,6 +56,7 @@ builds:
|
|||||||
goamd64:
|
goamd64:
|
||||||
- v3
|
- v3
|
||||||
id: "gen-keypair"
|
id: "gen-keypair"
|
||||||
|
binary: gen-keypair
|
||||||
main: ./tools/gen-keypair
|
main: ./tools/gen-keypair
|
||||||
tags:
|
tags:
|
||||||
- static_build
|
- static_build
|
||||||
@ -97,6 +104,6 @@ changelog:
|
|||||||
release:
|
release:
|
||||||
draft: true
|
draft: true
|
||||||
footer: |
|
footer: |
|
||||||
Supports job archive version 1 and database version 4.
|
Supports job archive version 1 and database version 5.
|
||||||
|
|
||||||
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
|
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
|
||||||
|
@ -520,7 +520,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("Error while looking for retention jobs: %v", err)
|
log.Warnf("Error while looking for compression jobs: %v", err)
|
||||||
}
|
}
|
||||||
ar.Compress(jobs)
|
ar.Compress(jobs)
|
||||||
})
|
})
|
||||||
|
@ -801,9 +801,11 @@ func (r *JobRepository) FindJobsBetween(startTimeBegin int64, startTimeEnd int64
|
|||||||
}
|
}
|
||||||
|
|
||||||
if startTimeBegin == 0 {
|
if startTimeBegin == 0 {
|
||||||
|
log.Infof("Find jobs before %d", startTimeEnd)
|
||||||
query = sq.Select(jobColumns...).From("job").Where(fmt.Sprintf(
|
query = sq.Select(jobColumns...).From("job").Where(fmt.Sprintf(
|
||||||
"job.start_time < %d", startTimeEnd))
|
"job.start_time < %d", startTimeEnd))
|
||||||
} else {
|
} else {
|
||||||
|
log.Infof("Find jobs between %d and %d", startTimeBegin, startTimeEnd)
|
||||||
query = sq.Select(jobColumns...).From("job").Where(fmt.Sprintf(
|
query = sq.Select(jobColumns...).From("job").Where(fmt.Sprintf(
|
||||||
"job.start_time BETWEEN %d AND %d", startTimeBegin, startTimeEnd))
|
"job.start_time BETWEEN %d AND %d", startTimeBegin, startTimeEnd))
|
||||||
}
|
}
|
||||||
@ -825,6 +827,7 @@ func (r *JobRepository) FindJobsBetween(startTimeBegin int64, startTimeEnd int64
|
|||||||
jobs = append(jobs, job)
|
jobs = append(jobs, job)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Infof("Return job count %d", len(jobs))
|
||||||
return jobs, nil
|
return jobs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ func checkDBVersion(backend string, db *sql.DB) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if v < Version {
|
if v < Version {
|
||||||
return fmt.Errorf("unsupported database version %d, need %d.\nPlease backup your database file and run cc-backend --migrate-db", v, Version)
|
return fmt.Errorf("unsupported database version %d, need %d.\nPlease backup your database file and run cc-backend -migrate-db", v, Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
if v > Version {
|
if v > Version {
|
||||||
|
@ -30,6 +30,8 @@ file_bw_avg REAL NOT NULL DEFAULT 0.0,
|
|||||||
file_data_vol_total REAL NOT NULL DEFAULT 0.0,
|
file_data_vol_total REAL NOT NULL DEFAULT 0.0,
|
||||||
UNIQUE (job_id, cluster, start_time));
|
UNIQUE (job_id, cluster, start_time));
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE job SET job_state='cancelled' WHERE job_state='canceled';
|
||||||
INSERT INTO job_new SELECT * FROM job;
|
INSERT INTO job_new SELECT * FROM job;
|
||||||
DROP TABLE job;
|
DROP TABLE job;
|
||||||
ALTER TABLE job_new RENAME TO job;
|
ALTER TABLE job_new RENAME TO job;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg.
|
// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg.
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
// Use of this source code is governed by a MIT-style
|
// Use of this source code is governed by a MIT-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
@ -20,6 +20,7 @@ func GetFilesize(filePath string) int64 {
|
|||||||
fileInfo, err := os.Stat(filePath)
|
fileInfo, err := os.Stat(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Error on Stat %s: %v", filePath, err)
|
log.Errorf("Error on Stat %s: %v", filePath, err)
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
return fileInfo.Size()
|
return fileInfo.Size()
|
||||||
}
|
}
|
||||||
@ -28,6 +29,7 @@ func GetFilecount(path string) int {
|
|||||||
files, err := os.ReadDir(path)
|
files, err := os.ReadDir(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Error on ReadDir %s: %v", path, err)
|
log.Errorf("Error on ReadDir %s: %v", path, err)
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
return len(files)
|
return len(files)
|
||||||
|
71
internal/util/util_test.go
Normal file
71
internal/util/util_test.go
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg.
|
||||||
|
// All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
package util_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ClusterCockpit/cc-backend/internal/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCheckFileExists(t *testing.T) {
|
||||||
|
tmpdir := t.TempDir()
|
||||||
|
filePath := filepath.Join(tmpdir, "version.txt")
|
||||||
|
|
||||||
|
if err := os.WriteFile(filePath, []byte(fmt.Sprintf("%d", 1)), 0666); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !util.CheckFileExists(filePath) {
|
||||||
|
t.Fatal("expected true, got false")
|
||||||
|
}
|
||||||
|
|
||||||
|
filePath = filepath.Join(tmpdir, "version-test.txt")
|
||||||
|
if util.CheckFileExists(filePath) {
|
||||||
|
t.Fatal("expected false, got true")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetFileSize(t *testing.T) {
|
||||||
|
tmpdir := t.TempDir()
|
||||||
|
filePath := filepath.Join(tmpdir, "data.json")
|
||||||
|
|
||||||
|
if s := util.GetFilesize(filePath); s > 0 {
|
||||||
|
t.Fatalf("expected 0, got %d", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.WriteFile(filePath, []byte(fmt.Sprintf("%d", 1)), 0666); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if s := util.GetFilesize(filePath); s == 0 {
|
||||||
|
t.Fatal("expected not 0, got 0")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetFileCount(t *testing.T) {
|
||||||
|
tmpdir := t.TempDir()
|
||||||
|
|
||||||
|
if c := util.GetFilecount(tmpdir); c != 0 {
|
||||||
|
t.Fatalf("expected 0, got %d", c)
|
||||||
|
}
|
||||||
|
|
||||||
|
filePath := filepath.Join(tmpdir, "data-1.json")
|
||||||
|
if err := os.WriteFile(filePath, []byte(fmt.Sprintf("%d", 1)), 0666); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
filePath = filepath.Join(tmpdir, "data-2.json")
|
||||||
|
if err := os.WriteFile(filePath, []byte(fmt.Sprintf("%d", 1)), 0666); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if c := util.GetFilecount(tmpdir); c != 2 {
|
||||||
|
t.Fatalf("expected 2, got %d", c)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c := util.GetFilecount(filePath); c != 0 {
|
||||||
|
t.Fatalf("expected 0, got %d", c)
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg.
|
// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg.
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
// Use of this source code is governed by a MIT-style
|
// Use of this source code is governed by a MIT-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
@ -348,7 +348,7 @@ func (fsa *FsArchive) Compress(jobs []*schema.Job) {
|
|||||||
|
|
||||||
for _, job := range jobs {
|
for _, job := range jobs {
|
||||||
fileIn := getPath(job, fsa.path, "data.json")
|
fileIn := getPath(job, fsa.path, "data.json")
|
||||||
if !util.CheckFileExists(fileIn) && util.GetFilesize(fileIn) > 2000 {
|
if util.CheckFileExists(fileIn) && util.GetFilesize(fileIn) > 2000 {
|
||||||
util.CompressFile(fileIn, getPath(job, fsa.path, "data.json.gz"))
|
util.CompressFile(fileIn, getPath(job, fsa.path, "data.json.gz"))
|
||||||
cnt++
|
cnt++
|
||||||
}
|
}
|
||||||
@ -372,6 +372,7 @@ func (fsa *FsArchive) CompressLast(starttime int64) int64 {
|
|||||||
return starttime
|
return starttime
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Infof("fsBackend Compress - start %d last %d", starttime, last)
|
||||||
os.WriteFile(filename, []byte(fmt.Sprintf("%d", starttime)), 0644)
|
os.WriteFile(filename, []byte(fmt.Sprintf("%d", starttime)), 0644)
|
||||||
return last
|
return last
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"$schema": "http://json-schema.org/draft/2020-12/schema",
|
"$schema": "http://json-schema.org/draft/2020-12/schema",
|
||||||
"$id": "schemafs://job-metric-statistics.schema.json",
|
"$id": "embedfs://job-metric-statistics.schema.json",
|
||||||
"title": "Job statistics",
|
"title": "Job statistics",
|
||||||
"description": "Format specification for job metric statistics",
|
"description": "Format specification for job metric statistics",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
if [ -d './var' ]; then
|
if [ -d './var' ]; then
|
||||||
echo 'Directory ./var already exists! Skipping initialization.'
|
echo 'Directory ./var already exists! Skipping initialization.'
|
||||||
./cc-backend --server --dev
|
./cc-backend -server -dev
|
||||||
else
|
else
|
||||||
make
|
make
|
||||||
wget https://hpc-mover.rrze.uni-erlangen.de/HPC-Data/0x7b58aefb/eig7ahyo6fo2bais0ephuf2aitohv1ai/job-archive-demo.tar
|
wget https://hpc-mover.rrze.uni-erlangen.de/HPC-Data/0x7b58aefb/eig7ahyo6fo2bais0ephuf2aitohv1ai/job-archive-demo.tar
|
||||||
@ -12,6 +12,6 @@ else
|
|||||||
cp ./configs/env-template.txt .env
|
cp ./configs/env-template.txt .env
|
||||||
cp ./configs/config-demo.json config.json
|
cp ./configs/config-demo.json config.json
|
||||||
|
|
||||||
./cc-backend --migrate-db
|
./cc-backend -migrate-db
|
||||||
./cc-backend --server --dev --init-db --add-user demo:admin:demo
|
./cc-backend -server -dev -init-db -add-user demo:admin:demo
|
||||||
fi
|
fi
|
||||||
|
Loading…
Reference in New Issue
Block a user