From b2f2f36804327b62f49b5da3782ec15a5e364112 Mon Sep 17 00:00:00 2001 From: Jason Hall Date: Wed, 17 Apr 2024 21:03:31 -0400 Subject: [PATCH] it works Signed-off-by: Jason Hall --- litestream/main.go | 37 +++++++++++++++++++++++++++++-------- litestream/main.tf | 11 +++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/litestream/main.go b/litestream/main.go index b6de2b2..df2f32c 100644 --- a/litestream/main.go +++ b/litestream/main.go @@ -1,9 +1,13 @@ package main import ( + "context" "database/sql" "fmt" "net/http" + "os" + "os/exec" + "os/signal" "github.com/chainguard-dev/clog" _ "github.com/chainguard-dev/clog/gcp/init" @@ -11,16 +15,33 @@ import ( ) func main() { + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) + defer cancel() + + // Before serving requests, restore the database from the latest replica. + cmd := exec.CommandContext(ctx, + "litestream", "restore", + "-o", "/data/db.sqlite", + fmt.Sprintf("gcs://%s/litestream", os.Getenv("BUCKET"))) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + clog.Fatalf("failed to restore database: %v", err) + } + db, err := sql.Open("sqlite", "/data/db.sqlite") if err != nil { clog.Fatalf("failed to open database: %v", err) } defer db.Close() - if _, err := db.Exec("create table if not exists test (time text primary key)"); err != nil { + if _, err := db.Exec("create table if not exists test3 (time integer primary key)"); err != nil { clog.Fatalf("failed to create table: %v", err) } + http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) { + http.Error(w, "no favicon", http.StatusNotFound) + }) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { row := db.QueryRow("select sqlite_version()") var version string @@ -28,23 +49,23 @@ func main() { clog.Fatalf("failed to query database version: %v", err) } clog.Infof("sqlite version: %s", version) - fmt.Fprintf(w, "sqlite version: %s", version) + fmt.Fprintf(w, "sqlite version: %s\n", version) - if _, err := db.Exec("insert into test (time) values (datetime('now'))"); err != nil { + if _, err := db.Exec("insert into test3 (time) values (unixepoch('now','subsec'))"); err != nil { clog.Fatalf("failed to insert row: %v", err) } - rows, err := db.Query("select * from test") + rows, err := db.Query("select count(*) from test3") if err != nil { clog.Fatalf("failed to query rows: %v", err) } defer rows.Close() for rows.Next() { - var time string - if err := rows.Scan(&time); err != nil { + var count int64 + if err := rows.Scan(&count); err != nil { clog.Fatalf("failed to scan row: %v", err) } - clog.Infof("time: %s", time) - fmt.Fprintf(w, "time: %s\n", time) + clog.Infof("count: %d", count) + fmt.Fprintf(w, "count: %d\n", count) } }) http.ListenAndServe(":8080", nil) diff --git a/litestream/main.tf b/litestream/main.tf index 4bea8c6..b11c7d2 100644 --- a/litestream/main.tf +++ b/litestream/main.tf @@ -37,6 +37,7 @@ resource "google_storage_bucket_iam_binding" "binding" { resource "ko_build" "build" { importpath = "./" working_dir = path.module + base_image = "litestream/litestream" } resource "google_cloud_run_v2_service" "service" { @@ -47,13 +48,23 @@ resource "google_cloud_run_v2_service" "service" { launch_stage = "BETA" ingress = "INGRESS_TRAFFIC_ALL" + template { + scaling { + max_instance_count = 1 + } + max_instance_request_concurrency = 1000 + containers { image = ko_build.build.image_ref volume_mounts { name = "data" mount_path = "/data" } + env { + name = "BUCKET" + value = google_storage_bucket.bucket.name + } } containers {