From 0c09dd89c2842eebe23bf2dc14fbb1e371faff0d Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 7 Jan 2025 16:31:12 +0000 Subject: [PATCH] Add wasmtime to CI. (#212) --- .github/workflows/cross.sh | 25 --------------- .github/workflows/cross.yml | 16 ---------- .github/workflows/repro.sh | 4 +-- .github/workflows/repro.yml | 2 +- .github/workflows/test.yml | 29 +++++++++++++++--- conn.go | 10 ++++-- go.work.sum | 1 + tests/conn_test.go | 3 -- util/sql3util/parse.go | 2 +- util/sql3util/{parse => wasm}/.gitignore | 0 util/sql3util/{parse => wasm}/build.sh | 0 util/sql3util/{parse => wasm}/download.sh | 0 util/sql3util/{parse => wasm}/main.c | 0 .../{parse => wasm}/sql3parse_table.wasm | Bin vfs/file.go | 11 +++---- vfs/os_std.go | 5 ++- vfs/os_unix.go | 5 ++- vfs/vfs_test.go | 5 +++ 18 files changed, 55 insertions(+), 63 deletions(-) delete mode 100755 .github/workflows/cross.sh delete mode 100644 .github/workflows/cross.yml rename util/sql3util/{parse => wasm}/.gitignore (100%) rename util/sql3util/{parse => wasm}/build.sh (100%) rename util/sql3util/{parse => wasm}/download.sh (100%) rename util/sql3util/{parse => wasm}/main.c (100%) rename util/sql3util/{parse => wasm}/sql3parse_table.wasm (100%) diff --git a/.github/workflows/cross.sh b/.github/workflows/cross.sh deleted file mode 100755 index 2c138b8..0000000 --- a/.github/workflows/cross.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -echo android ; GOOS=android GOARCH=amd64 go build . -echo darwin ; GOOS=darwin GOARCH=amd64 go build . -echo dragonfly ; GOOS=dragonfly GOARCH=amd64 go build . -echo freebsd ; GOOS=freebsd GOARCH=amd64 go build . -echo illumos ; GOOS=illumos GOARCH=amd64 go build . -echo ios ; GOOS=ios GOARCH=amd64 go build . -echo linux ; GOOS=linux GOARCH=amd64 go build . -echo netbsd ; GOOS=netbsd GOARCH=amd64 go build . -echo openbsd ; GOOS=openbsd GOARCH=amd64 go build . -echo plan9 ; GOOS=plan9 GOARCH=amd64 go build . -echo solaris ; GOOS=solaris GOARCH=amd64 go build . -echo windows ; GOOS=windows GOARCH=amd64 go build . -echo aix ; GOOS=aix GOARCH=ppc64 go build . -echo js ; GOOS=js GOARCH=wasm go build . -echo wasip1 ; GOOS=wasip1 GOARCH=wasm go build . -echo linux-flock ; GOOS=linux GOARCH=amd64 go build -tags sqlite3_flock . -echo linux-dotlk ; GOOS=linux GOARCH=amd64 go build -tags sqlite3_dotlk . -echo darwin-flock ; GOOS=darwin GOARCH=amd64 go build -tags sqlite3_flock . -echo darwin-dotlk ; GOOS=darwin GOARCH=amd64 go build -tags sqlite3_dotlk . -echo windows-dotlk ; GOOS=windows GOARCH=amd64 go build -tags sqlite3_dotlk . -echo freebsd-dotlk ; GOOS=freebsd GOARCH=amd64 go build -tags sqlite3_dotlk . -echo solaris-dotlk ; GOOS=solaris GOARCH=amd64 go build -tags sqlite3_dotlk . \ No newline at end of file diff --git a/.github/workflows/cross.yml b/.github/workflows/cross.yml deleted file mode 100644 index 682a69f..0000000 --- a/.github/workflows/cross.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Cross compile - -on: - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: { go-version: stable } - - - name: Build - run: .github/workflows/cross.sh \ No newline at end of file diff --git a/.github/workflows/repro.sh b/.github/workflows/repro.sh index 8045aee..2b12b7f 100755 --- a/.github/workflows/repro.sh +++ b/.github/workflows/repro.sh @@ -27,8 +27,8 @@ embed/build.sh embed/bcw2/build.sh # Download and build sqlite-createtable-parser -util/sql3util/parse/download.sh -util/sql3util/parse/build.sh +util/sql3util/wasm/download.sh +util/sql3util/wasm/build.sh # Check diffs git diff --exit-code \ No newline at end of file diff --git a/.github/workflows/repro.yml b/.github/workflows/repro.yml index 0936166..952f2cd 100644 --- a/.github/workflows/repro.yml +++ b/.github/workflows/repro.yml @@ -29,4 +29,4 @@ jobs: subject-path: | embed/sqlite3.wasm embed/bcw2/bcw2.wasm - util/sql3util/parse/sql3parse_table.wasm \ No newline at end of file + util/sql3util/wasm/sql3parse_table.wasm \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fb04cae..d8fb781 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,19 +2,17 @@ name: Test on: push: - branches: [ "main" ] + branches: [ 'main' ] paths: - '**.go' - '**.mod' - '**.wasm' - - '**.wasm.bz2' pull_request: - branches: [ "main" ] + branches: [ 'main' ] paths: - '**.go' - '**.mod' - '**.wasm' - - '**.wasm.bz2' workflow_dispatch: jobs: @@ -161,6 +159,27 @@ jobs: copyback: false run: . ./test.sh + test-wasip1: + runs-on: ubuntu-latest + needs: test + + steps: + - uses: bytecodealliance/actions/wasmtime/setup@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: { go-version: stable } + + - name: Set path + run: echo "$(go env GOROOT)/misc/wasm" >> "$GITHUB_PATH" + + - name: Test wasmtime + env: + GOOS: wasip1 + GOARCH: wasm + GOWASIRUNTIME: wasmtime + GOWASIRUNTIMEARGS: '--env CI=true' + run: go test -v -short -tags sqlite3_dotlk -skip Example ./... + test-qemu: runs-on: ubuntu-latest needs: test @@ -196,4 +215,4 @@ jobs: with: { go-version: stable } - name: Test - run: go test -v ./... + run: go test -v ./... \ No newline at end of file diff --git a/conn.go b/conn.go index d1ce305..1222bd5 100644 --- a/conn.go +++ b/conn.go @@ -6,6 +6,7 @@ import ( "math" "math/rand" "net/url" + "runtime" "strings" "time" @@ -375,8 +376,13 @@ func (c *Conn) checkInterrupt(handle uint32) { } func progressCallback(ctx context.Context, mod api.Module, _ uint32) (interrupt uint32) { - if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.interrupt.Err() != nil { - interrupt = 1 + if c, ok := ctx.Value(connKey{}).(*Conn); ok { + if c.interrupt.Done() != nil { + runtime.Gosched() + } + if c.interrupt.Err() != nil { + interrupt = 1 + } } return interrupt } diff --git a/go.work.sum b/go.work.sum index ded9bda..224b043 100644 --- a/go.work.sum +++ b/go.work.sum @@ -12,5 +12,6 @@ golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= diff --git a/tests/conn_test.go b/tests/conn_test.go index f1b06fd..2c017c0 100644 --- a/tests/conn_test.go +++ b/tests/conn_test.go @@ -130,8 +130,6 @@ func TestConn_SetInterrupt(t *testing.T) { t.Fatal(err) } - db.SetInterrupt(context.Background()) - stmt, _, err := db.Prepare(` WITH RECURSIVE fibonacci (curr, next) @@ -148,7 +146,6 @@ func TestConn_SetInterrupt(t *testing.T) { } defer stmt.Close() - db.SetInterrupt(ctx) go func() { time.Sleep(time.Millisecond) cancel() diff --git a/util/sql3util/parse.go b/util/sql3util/parse.go index 7326f7d..f84fc4d 100644 --- a/util/sql3util/parse.go +++ b/util/sql3util/parse.go @@ -17,7 +17,7 @@ const ( ) var ( - //go:embed parse/sql3parse_table.wasm + //go:embed wasm/sql3parse_table.wasm binary []byte once sync.Once runtime wazero.Runtime diff --git a/util/sql3util/parse/.gitignore b/util/sql3util/wasm/.gitignore similarity index 100% rename from util/sql3util/parse/.gitignore rename to util/sql3util/wasm/.gitignore diff --git a/util/sql3util/parse/build.sh b/util/sql3util/wasm/build.sh similarity index 100% rename from util/sql3util/parse/build.sh rename to util/sql3util/wasm/build.sh diff --git a/util/sql3util/parse/download.sh b/util/sql3util/wasm/download.sh similarity index 100% rename from util/sql3util/parse/download.sh rename to util/sql3util/wasm/download.sh diff --git a/util/sql3util/parse/main.c b/util/sql3util/wasm/main.c similarity index 100% rename from util/sql3util/parse/main.c rename to util/sql3util/wasm/main.c diff --git a/util/sql3util/parse/sql3parse_table.wasm b/util/sql3util/wasm/sql3parse_table.wasm similarity index 100% rename from util/sql3util/parse/sql3parse_table.wasm rename to util/sql3util/wasm/sql3parse_table.wasm diff --git a/vfs/file.go b/vfs/file.go index b5d2853..1d19fcb 100644 --- a/vfs/file.go +++ b/vfs/file.go @@ -6,7 +6,6 @@ import ( "io/fs" "os" "path/filepath" - "runtime" "syscall" "github.com/ncruces/go-sqlite3/util/osutil" @@ -41,7 +40,7 @@ func (vfsOS) Delete(path string, syncDir bool) error { if err != nil { return err } - if runtime.GOOS != "windows" && syncDir { + if canSyncDirs && syncDir { f, err := os.Open(filepath.Dir(path)) if err != nil { return _OK @@ -120,9 +119,9 @@ func (vfsOS) OpenFilename(name *Filename, flags OpenFlag) (File, OpenFlag, error File: f, psow: true, readOnly: flags&OPEN_READONLY != 0, - syncDir: runtime.GOOS != "windows" && - flags&(OPEN_CREATE) != 0 && - flags&(OPEN_MAIN_JOURNAL|OPEN_SUPER_JOURNAL|OPEN_WAL) != 0, + syncDir: canSyncDirs && + flags&(OPEN_MAIN_JOURNAL|OPEN_SUPER_JOURNAL|OPEN_WAL) != 0 && + flags&(OPEN_CREATE) != 0, shm: NewSharedMemory(name.String()+"-shm", flags), } return &file, flags, nil @@ -163,7 +162,7 @@ func (f *vfsFile) Sync(flags SyncFlag) error { if err != nil { return err } - if runtime.GOOS != "windows" && f.syncDir { + if canSyncDirs && f.syncDir { f.syncDir = false d, err := os.Open(filepath.Dir(f.File.Name())) if err != nil { diff --git a/vfs/os_std.go b/vfs/os_std.go index a17893d..0d0ca24 100644 --- a/vfs/os_std.go +++ b/vfs/os_std.go @@ -7,7 +7,10 @@ import ( "os" ) -const _O_NOFOLLOW = 0 +const ( + _O_NOFOLLOW = 0 + canSyncDirs = false +) func osAccess(path string, flags AccessFlag) error { fi, err := os.Stat(path) diff --git a/vfs/os_unix.go b/vfs/os_unix.go index 6637c29..c4f9ba8 100644 --- a/vfs/os_unix.go +++ b/vfs/os_unix.go @@ -9,7 +9,10 @@ import ( "golang.org/x/sys/unix" ) -const _O_NOFOLLOW = unix.O_NOFOLLOW +const ( + _O_NOFOLLOW = unix.O_NOFOLLOW + canSyncDirs = true +) func osAccess(path string, flags AccessFlag) error { var access uint32 // unix.F_OK diff --git a/vfs/vfs_test.go b/vfs/vfs_test.go index c10a19e..79c8c3e 100644 --- a/vfs/vfs_test.go +++ b/vfs/vfs_test.go @@ -194,6 +194,11 @@ func Test_vfsAccess(t *testing.T) { t.Error("can't access file") } + if fi, err := os.Stat(file); err != nil { + t.Fatal(err) + } else if fi.Mode().Perm()&0700 != syscall.S_IRUSR { + t.Skip("skipping due to permissions") + } if usr, err := user.Current(); err == nil && usr.Uid == "0" { t.Skip("skipping as root") }