From 91fd1457aa5cc500e804cf0ec727b4678f396346 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 23:50:02 +0100 Subject: [PATCH 01/30] Bump golang.org/x/crypto from 0.21.0 to 0.22.0 (#74) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.22.0. - [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.22.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 70590af1..50d0f9c1 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/ncruces/julianday v1.0.0 github.com/psanford/httpreadat v0.1.0 github.com/tetratelabs/wazero v1.7.0 - golang.org/x/crypto v0.21.0 + golang.org/x/crypto v0.22.0 golang.org/x/sync v0.6.0 - golang.org/x/sys v0.18.0 + golang.org/x/sys v0.19.0 golang.org/x/text v0.14.0 ) diff --git a/go.sum b/go.sum index 8c046809..0f61c051 100644 --- a/go.sum +++ b/go.sum @@ -4,11 +4,11 @@ github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIw github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= github.com/tetratelabs/wazero v1.7.0 h1:jg5qPydno59wqjpGrHph81lbtHzTrWzwwtD4cD88+hQ= github.com/tetratelabs/wazero v1.7.0/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= From f1c376cb49287bc6d6284b8df149dbad3c7b9cdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 23:52:16 +0100 Subject: [PATCH 02/30] Bump golang.org/x/sync from 0.6.0 to 0.7.0 (#72) Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.6.0 to 0.7.0. - [Commits](https://github.com/golang/sync/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 50d0f9c1..77c82292 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/psanford/httpreadat v0.1.0 github.com/tetratelabs/wazero v1.7.0 golang.org/x/crypto v0.22.0 - golang.org/x/sync v0.6.0 + golang.org/x/sync v0.7.0 golang.org/x/sys v0.19.0 golang.org/x/text v0.14.0 ) diff --git a/go.sum b/go.sum index 0f61c051..9d5d3130 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/tetratelabs/wazero v1.7.0 h1:jg5qPydno59wqjpGrHph81lbtHzTrWzwwtD4cD88 github.com/tetratelabs/wazero v1.7.0/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= From c49ed8c27db3476227ebf593796bfbc6ca067fcb Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Thu, 28 Mar 2024 00:06:05 +0000 Subject: [PATCH 03/30] Towards shared memory WAL. --- embed/sqlite3.wasm | Bin 1334513 -> 1334671 bytes go.mod | 2 ++ go.sum | 4 ++-- go.work.sum | 1 + sqlite.go | 2 +- sqlite3/vfs.c | 11 ++++++++++- tests/parallel/parallel_test.go | 12 ++++++++++++ vfs/const.go | 14 ++++++++++++++ vfs/shm.go | 19 +++++++++++++++++++ vfs/vfs.go | 31 +++++++++++++++++++++++++++++++ 10 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 vfs/shm.go diff --git a/embed/sqlite3.wasm b/embed/sqlite3.wasm index 0490c164702364f8a43358497a0d2bd45645c60a..97bf1cb4c84253f9208bcc8b683058e819c6c9fb 100755 GIT binary patch delta 135962 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 M9yzndyS?)N0a8(H4gdfE delta 135862 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

Onv*qp@Tt9QH(fxf3QHA;(9_;OCqQW)*v# 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 Ef0nz>Qvd(} diff --git a/go.mod b/go.mod index 77c82292..370cc872 100644 --- a/go.mod +++ b/go.mod @@ -13,3 +13,5 @@ require ( ) retract v0.4.0 // tagged from the wrong branch + +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240327075005-1e61961e4b45 diff --git a/go.sum b/go.sum index 9d5d3130..b70c08e2 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= +github.com/ncruces/wazero v0.0.0-20240327075005-1e61961e4b45 h1:S7fG4oq29CgXycris/pkmon/gbKFufnU8PTaRv5ewFs= +github.com/ncruces/wazero v0.0.0-20240327075005-1e61961e4b45/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= -github.com/tetratelabs/wazero v1.7.0 h1:jg5qPydno59wqjpGrHph81lbtHzTrWzwwtD4cD88+hQ= -github.com/tetratelabs/wazero v1.7.0/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= diff --git a/go.work.sum b/go.work.sum index 342066cb..41ed68b5 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,4 +1,5 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/sqlite.go b/sqlite.go index 56ea68b8..6059f15e 100644 --- a/sqlite.go +++ b/sqlite.go @@ -37,7 +37,7 @@ var instance struct { func compileSQLite() { if RuntimeConfig == nil { - RuntimeConfig = wazero.NewRuntimeConfig() + RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryCapacityFromMax(true) } ctx := context.Background() diff --git a/sqlite3/vfs.c b/sqlite3/vfs.c index 31558be6..967dca3e 100644 --- a/sqlite3/vfs.c +++ b/sqlite3/vfs.c @@ -32,10 +32,15 @@ int go_lock(sqlite3_file *, int eLock); int go_unlock(sqlite3_file *, int eLock); int go_check_reserved_lock(sqlite3_file *, int *pResOut); +int go_shm_map(sqlite3_file *, int iPg, int pgsz, int, void volatile **); +int go_shm_lock(sqlite3_file *, int offset, int n, int flags); +int go_shm_unmap(sqlite3_file *, int deleteFlag); +void go_shm_barrier(sqlite3_file *); + static int go_open_wrapper(sqlite3_vfs *vfs, sqlite3_filename zName, sqlite3_file *file, int flags, int *pOutFlags) { static const sqlite3_io_methods os_io = { - .iVersion = 1, + .iVersion = 2, .xClose = go_close, .xRead = go_read, .xWrite = go_write, @@ -48,6 +53,10 @@ static int go_open_wrapper(sqlite3_vfs *vfs, sqlite3_filename zName, .xFileControl = go_file_control, .xSectorSize = go_sector_size, .xDeviceCharacteristics = go_device_characteristics, + .xShmMap = go_shm_map, + .xShmLock = go_shm_lock, + .xShmBarrier = go_shm_barrier, + .xShmUnmap = go_shm_unmap, }; memset(file, 0, vfs->szOsFile); int rc = go_open(vfs, zName, file, flags, pOutFlags); diff --git a/tests/parallel/parallel_test.go b/tests/parallel/parallel_test.go index 7c2f6726..65804944 100644 --- a/tests/parallel/parallel_test.go +++ b/tests/parallel/parallel_test.go @@ -32,6 +32,16 @@ func TestParallel(t *testing.T) { testIntegrity(t, name) } +func TestWAL(t *testing.T) { + name := "file:" + + filepath.Join(t.TempDir(), "test.db") + + "?_pragma=busy_timeout(10000)" + + "&_pragma=journal_mode(wal)" + + "&_pragma=synchronous(off)" + testParallel(t, name, 1000) + testIntegrity(t, name) +} + func TestMemory(t *testing.T) { var iter int if testing.Short() { @@ -177,8 +187,10 @@ func testParallel(t testing.TB, name string, n int) { group.SetLimit(6) for i := 0; i < n; i++ { if i&7 != 7 { + t.Log("reader", i) group.Go(reader) } else { + t.Log("writer", i) group.Go(writer) } } diff --git a/vfs/const.go b/vfs/const.go index 0a3c3aba..1ec7ea91 100644 --- a/vfs/const.go +++ b/vfs/const.go @@ -37,6 +37,10 @@ const ( _IOERR_CHECKRESERVEDLOCK _ErrorCode = util.IOERR_CHECKRESERVEDLOCK _IOERR_LOCK _ErrorCode = util.IOERR_LOCK _IOERR_CLOSE _ErrorCode = util.IOERR_CLOSE + _IOERR_SHMOPEN _ErrorCode = util.IOERR_SHMOPEN + _IOERR_SHMSIZE _ErrorCode = util.IOERR_SHMSIZE + _IOERR_SHMLOCK _ErrorCode = util.IOERR_SHMLOCK + _IOERR_SHMMAP _ErrorCode = util.IOERR_SHMMAP _IOERR_SEEK _ErrorCode = util.IOERR_SEEK _IOERR_DELETE_NOENT _ErrorCode = util.IOERR_DELETE_NOENT _IOERR_BEGIN_ATOMIC _ErrorCode = util.IOERR_BEGIN_ATOMIC @@ -213,3 +217,13 @@ const ( _FCNTL_CKSM_FILE _FcntlOpcode = 41 _FCNTL_RESET_CACHE _FcntlOpcode = 42 ) + +// https://sqlite.org/c3ref/c_shm_exclusive.html +type _ShmFlag uint32 + +const ( + _SHM_UNLOCK _ShmFlag = 1 + _SHM_LOCK _ShmFlag = 2 + _SHM_SHARED _ShmFlag = 4 + _SHM_EXCLUSIVE _ShmFlag = 8 +) diff --git a/vfs/shm.go b/vfs/shm.go new file mode 100644 index 00000000..1a12c42a --- /dev/null +++ b/vfs/shm.go @@ -0,0 +1,19 @@ +package vfs + +import "github.com/ncruces/go-sqlite3/internal/util" + +type vfsShm interface { + ShmMap() error + ShmLock() error + ShmUnmap() +} + +func (f *vfsFile) ShmMap() error { + return util.ValueErr +} + +func (f *vfsFile) ShmLock() error { + return util.ValueErr +} + +func (f *vfsFile) ShmUnmap() {} diff --git a/vfs/vfs.go b/vfs/vfs.go index 1e8761b4..a9d00cca 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -6,6 +6,7 @@ import ( "io" "net/url" "reflect" + "sync" "time" "github.com/ncruces/go-sqlite3/internal/util" @@ -40,6 +41,10 @@ func ExportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder util.ExportFuncIII(env, "go_lock", vfsLock) util.ExportFuncIII(env, "go_unlock", vfsUnlock) util.ExportFuncIII(env, "go_check_reserved_lock", vfsCheckReservedLock) + util.ExportFuncIIIIII(env, "go_shm_map", vfsShmMap) + util.ExportFuncIIIII(env, "go_shm_lock", vfsShmLock) + util.ExportFuncIII(env, "go_shm_unmap", vfsShmUnmap) + util.ExportFuncVI(env, "go_shm_barrier", vfsShmBarrier) return env } @@ -348,6 +353,32 @@ func vfsDeviceCharacteristics(ctx context.Context, mod api.Module, pFile uint32) return file.DeviceCharacteristics() } +var shmBarrier sync.Mutex + +func vfsShmMap(ctx context.Context, mod api.Module, pFile, iRegion, szRegion, bExtend, pp uint32) _ErrorCode { + file := vfsFileGet(ctx, mod, pFile).(vfsShm) + err := file.ShmMap() + return vfsErrorCode(err, _IOERR_SHMMAP) +} + +func vfsShmLock(ctx context.Context, mod api.Module, pFile, offset, n uint32, flags _ShmFlag) _ErrorCode { + file := vfsFileGet(ctx, mod, pFile).(vfsShm) + err := file.ShmLock() + return vfsErrorCode(err, _IOERR_SHMLOCK) +} + +func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _ErrorCode { + file := vfsFileGet(ctx, mod, pFile).(vfsShm) + file.ShmUnmap() + return _OK +} + +func vfsShmBarrier(ctx context.Context, mod api.Module, pFile uint32) { + shmBarrier.Lock() + //lint:ignore SA2001 empty critical section implies a memory barrier. + shmBarrier.Unlock() +} + func vfsURIParameters(ctx context.Context, mod api.Module, zPath uint32, flags OpenFlag) url.Values { if flags&OPEN_URI == 0 { return nil From b8dc5fc25d13531c3d1f44544bf6851cd138afc3 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 29 Mar 2024 18:02:22 +0000 Subject: [PATCH 04/30] Map shared memory. --- embed/exports.txt | 1 + embed/sqlite3.wasm | Bin 1334671 -> 1335347 bytes vfs/shm.go | 56 +++++++++++++++++++++++++++++++++++++++++---- vfs/vfs.go | 8 +++++-- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/embed/exports.txt b/embed/exports.txt index 73c680fe..4af10dcc 100644 --- a/embed/exports.txt +++ b/embed/exports.txt @@ -1,6 +1,7 @@ free malloc malloc_destructor +aligned_alloc sqlite3_anycollseq_init sqlite3_backup_finish sqlite3_backup_init diff --git a/embed/sqlite3.wasm b/embed/sqlite3.wasm index 97bf1cb4c84253f9208bcc8b683058e819c6c9fb..2c9c33d0390866b3ba639cb7de6ebb1125eb3809 100755 GIT binary patch delta 137464 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 uD@%sb?4@_v^hEYX3hJj1t=b delta 135511 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

_FpQ3daUXNz54qla z+iHHffq6CI{f}b8v8J{QEY->7V)Z!nwl_{@V4=L=F3645 zE5gCyIct?xLXV=>#q^Sv8{QQ8v0ji~hWiwtPxADDf8{|ScX53V(juKIj@7wDkBjRq zoEHT^xy*DYxzxG@p!xldE1O!N$tKkyCJ!*up_$r zBkv#@KOe@+(#M?s-Y(&C*+dUY>z(om3Z{uo!fJZKNzSF-R`O4`P{qZ2{v|xv<27m)u z&~kr^SWf{%W~+&Ln{4H=LyM?Xd3_5I{#tpRWyGo#P+R3Zb*P}12g1*)fCUx^FC=1< zrvVR!O$9O{`))<7Ngmazh&|4u;T3_C*|e^r9)R$RgBA5cmY^%JteD){3SkwgX7G7d zbvDt9%6fNymVFT012G#Ai^YH->bgq9tAJcWT&<$_XG;<%QZVo1v~X-yJq`&MhE>%I z!ymGssvhnDz%y?Ch&v27;+z%hV}+{e^+7RuRKt#Ckx@;bf7Np z<5ikeL*EA^ZCq1Nlx7&e)zl3uZqBI--g?zIR2Nqf$kV=_eh(^ZO}t zioSUcvCr-Ws~xV%J}Lr{WGpj|(b)#NjpwMh;W}ZQY_9j@xTs34^h;8I@^7uDUpp^A;s{)a#---w`uDNX|}g z;0z(dG_Dh-cMFC7uwb|7Mkny%i}ZVUkb|0?^`bTqFFSSZqSvL&&iZOWPHapPK~B1K z(SHHfFYBrobTK{0>!vp{?^MD#u5<%qJV>G4-wd^h1Kl&^#dp_RnIkMF=W=~OpW!-kkj3gKZ&*V2 zRgYsK?jHk3MCPY=lrECS^w1ainT#;a%ABw?$N?~R0+r|q(9NSydJ1}VqbIoiEh^tj zG^2Y#47x@4d+8lt*p&={|ZPG|l^f z{amCTgD};leXtMW?}GHG55U&*x3izFQRBWK%P6qfSFd5a=ncoq@FBWCo#+cFefQWD zJTbo?(CHRE>Zfn!2Yt*3_w@(KyhYdg>%-7|JV0-ZCT#$g{}$aFpii;g0wtkU1N3lO zI8gtT-*lL7Mh_C3ff2R~x$P~Elv_-ihepsmc*Q{T#1w80(m&yMt>(MK2kYS&-kiaD zQ|w{RU_I#VV2403xJW~X=oRzd2cLjZbs&Si5I+pc8UnF8k1h?-gKZ2Lw4s7CfI62% zs*8}JpaDpFKNO@gn??@BI%U(Up_nw0{0V5#aw_wQJ`y-m_NhIX;yd`3rAMEDc4kx2 zVVHI{4I8Ep!oxYk^y0p6V!PPPAi*R!{8MWIiX9F~%M%%!Hc%-?XNCj(lj!Aey=sy5 zBH#nQD?j#B4qO`vgO;a?vFeGAQ6aE&{uC5*hOvYju-Tl?!1&jbV}!o0By(FJ2cw4| z-^>u0uz=KZ0SlY^ak4|ydK-t-&zDC4k`KNC(lHP7A)fhjNSt@+yU)?(Z*=N&ePKRf zZ}J$haf}mU)#xwu6$®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 s { + if !extend { + return 0, nil + } + err := osAllocate(m, n) + if err != nil { + return 0, _IOERR_SHMOPEN + } + } + + alloc := mod.ExportedFunction("aligned_alloc") + stack := [2]uint64{ + uint64(syscall.Getpagesize()), + uint64(size), + } + if err := alloc.CallWithStack(ctx, stack[:]); err != nil { + panic(err) + } + b := util.View(mod, uint32(stack[0]), uint64(size)) + _, err = mmap(uintptr(unsafe.Pointer(&b[0])), uintptr(size), + syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED, + int(m.Fd()), int64(id)*int64(size)) + if err != nil { + return 0, _IOERR_SHMMAP + } + return uint32(stack[0]), nil } func (f *vfsFile) ShmLock() error { - return util.ValueErr + return _IOERR_SHMLOCK } func (f *vfsFile) ShmUnmap() {} + +//go:uintptrescapes +//go:linkname mmap syscall.mmap +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) diff --git a/vfs/vfs.go b/vfs/vfs.go index a9d00cca..139eadb8 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -357,8 +357,12 @@ var shmBarrier sync.Mutex func vfsShmMap(ctx context.Context, mod api.Module, pFile, iRegion, szRegion, bExtend, pp uint32) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(vfsShm) - err := file.ShmMap() - return vfsErrorCode(err, _IOERR_SHMMAP) + p, err := file.ShmMap(ctx, mod, iRegion, szRegion, bExtend != 0) + if err != nil { + return vfsErrorCode(err, _IOERR_SHMMAP) + } + util.WriteUint32(mod, pp, p) + return _OK } func vfsShmLock(ctx context.Context, mod api.Module, pFile, offset, n uint32, flags _ShmFlag) _ErrorCode { From cd00074420aa2dd99ff534a4284b78c0bfc6110d Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 29 Mar 2024 18:41:14 +0000 Subject: [PATCH 05/30] Unmap shared memory. --- vfs/file.go | 1 + vfs/shm.go | 47 ++++++++++++++++++++++++++++++++++------------- vfs/vfs.go | 6 +++--- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/vfs/file.go b/vfs/file.go index d589d377..15222910 100644 --- a/vfs/file.go +++ b/vfs/file.go @@ -130,6 +130,7 @@ type vfsFile struct { keepWAL bool syncDir bool psow bool + shm vfsShm } var ( diff --git a/vfs/shm.go b/vfs/shm.go index bc23d067..48028e5d 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -4,24 +4,32 @@ import ( "context" "io" "os" - "syscall" "unsafe" "github.com/ncruces/go-sqlite3/internal/util" "github.com/tetratelabs/wazero/api" + "golang.org/x/sys/unix" ) -type vfsShm interface { - ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) - ShmLock() error - ShmUnmap() +type vfsShm []vfsShmRegion + +type vfsShmRegion struct { + addr uintptr + length uint32 } func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) { - m, err := os.OpenFile(f.Name()+"-shm", os.O_RDWR|os.O_CREATE|syscall.O_NOFOLLOW, 0666) + if unix.Getpagesize() > int(size) { + return 0, _IOERR_SHMMAP + } + + m, err := os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) if err != nil { return 0, _IOERR_SHMOPEN } + defer m.Close() + + // Check if file is big enough. s, err := m.Seek(0, io.SeekEnd) if err != nil { return 0, _IOERR_SHMSIZE @@ -36,21 +44,26 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e } } + // Allocate some page aligned memmory. alloc := mod.ExportedFunction("aligned_alloc") stack := [2]uint64{ - uint64(syscall.Getpagesize()), + uint64(unix.Getpagesize()), uint64(size), } if err := alloc.CallWithStack(ctx, stack[:]); err != nil { panic(err) } - b := util.View(mod, uint32(stack[0]), uint64(size)) - _, err = mmap(uintptr(unsafe.Pointer(&b[0])), uintptr(size), - syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED, + + // Map the file into the allocated pages. + p := util.View(mod, uint32(stack[0]), uint64(size)) + a, err := mmap(uintptr(unsafe.Pointer(&p[0])), uintptr(size), + unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED, int(m.Fd()), int64(id)*int64(size)) if err != nil { return 0, _IOERR_SHMMAP } + + f.shm = append(f.shm, vfsShmRegion{a, size}) return uint32(stack[0]), nil } @@ -58,8 +71,16 @@ func (f *vfsFile) ShmLock() error { return _IOERR_SHMLOCK } -func (f *vfsFile) ShmUnmap() {} +func (f *vfsFile) ShmUnmap() { + // TODO: recycle the malloc'd memory pages. + for _, r := range f.shm { + munmap(r.addr, uintptr(r.length)) + } + f.shm = f.shm[:0] +} -//go:uintptrescapes //go:linkname mmap syscall.mmap -func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +func mmap(addr, length uintptr, prot, flag, fd int, pos int64) (uintptr, error) + +//go:linkname munmap syscall.munmap +func munmap(addr, length uintptr) error diff --git a/vfs/vfs.go b/vfs/vfs.go index 139eadb8..ccc6fe99 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -356,7 +356,7 @@ func vfsDeviceCharacteristics(ctx context.Context, mod api.Module, pFile uint32) var shmBarrier sync.Mutex func vfsShmMap(ctx context.Context, mod api.Module, pFile, iRegion, szRegion, bExtend, pp uint32) _ErrorCode { - file := vfsFileGet(ctx, mod, pFile).(vfsShm) + file := vfsFileGet(ctx, mod, pFile).(*vfsFile) p, err := file.ShmMap(ctx, mod, iRegion, szRegion, bExtend != 0) if err != nil { return vfsErrorCode(err, _IOERR_SHMMAP) @@ -366,13 +366,13 @@ func vfsShmMap(ctx context.Context, mod api.Module, pFile, iRegion, szRegion, bE } func vfsShmLock(ctx context.Context, mod api.Module, pFile, offset, n uint32, flags _ShmFlag) _ErrorCode { - file := vfsFileGet(ctx, mod, pFile).(vfsShm) + file := vfsFileGet(ctx, mod, pFile).(*vfsFile) err := file.ShmLock() return vfsErrorCode(err, _IOERR_SHMLOCK) } func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _ErrorCode { - file := vfsFileGet(ctx, mod, pFile).(vfsShm) + file := vfsFileGet(ctx, mod, pFile).(*vfsFile) file.ShmUnmap() return _OK } From cc3bfd287a8628001a5322660e6acc9994e9d8e2 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sat, 30 Mar 2024 00:58:49 +0000 Subject: [PATCH 06/30] Lock shared memory. --- vfs/shm.go | 65 ++++++++++++++++++++++++++++++++++++++++-------------- vfs/vfs.go | 4 ++-- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/vfs/shm.go b/vfs/shm.go index 48028e5d..dc228825 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -11,26 +11,45 @@ import ( "golang.org/x/sys/unix" ) -type vfsShm []vfsShmRegion +type vfsShm struct { + *os.File + regions []shmRegion +} -type vfsShmRegion struct { +type shmRegion struct { addr uintptr length uint32 } -func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) { +const ( + _SHM_BASE = 120 + _SHM_DMS = 128 +) + +func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (_ uint32, err error) { if unix.Getpagesize() > int(size) { return 0, _IOERR_SHMMAP } - m, err := os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) - if err != nil { - return 0, _IOERR_SHMOPEN + if f.shm.File == nil { + f.shm.File, err = os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + if err != nil { + return 0, _IOERR_SHMOPEN + } + } + + if rc := osReadLock(f.shm.File, _SHM_DMS, 1, 0); rc != _OK { + return 0, rc + } + if rc := osWriteLock(f.shm.File, _SHM_DMS, 1, 0); rc == _OK { + if err := f.shm.File.Truncate(0); err != nil { + return 0, _IOERR_SHMOPEN + } + osReadLock(f.shm.File, _SHM_DMS, 1, 0) } - defer m.Close() // Check if file is big enough. - s, err := m.Seek(0, io.SeekEnd) + s, err := f.shm.Seek(0, io.SeekEnd) if err != nil { return 0, _IOERR_SHMSIZE } @@ -38,7 +57,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e if !extend { return 0, nil } - err := osAllocate(m, n) + err := osAllocate(f.shm.File, n) if err != nil { return 0, _IOERR_SHMOPEN } @@ -58,25 +77,39 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e p := util.View(mod, uint32(stack[0]), uint64(size)) a, err := mmap(uintptr(unsafe.Pointer(&p[0])), uintptr(size), unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED, - int(m.Fd()), int64(id)*int64(size)) + int(f.shm.Fd()), int64(id)*int64(size)) if err != nil { return 0, _IOERR_SHMMAP } - f.shm = append(f.shm, vfsShmRegion{a, size}) + f.shm.regions = append(f.shm.regions, shmRegion{a, size}) return uint32(stack[0]), nil } -func (f *vfsFile) ShmLock() error { - return _IOERR_SHMLOCK +func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { + switch { + case flags&_SHM_UNLOCK != 0: + return osUnlock(f.shm.File, _SHM_BASE+int64(offset), int64(n)) + case flags&_SHM_SHARED != 0: + return osReadLock(f.shm.File, _SHM_BASE+int64(offset), int64(n), 0) + case flags&_SHM_EXCLUSIVE != 0: + return osWriteLock(f.shm.File, _SHM_BASE+int64(offset), int64(n), 0) + default: + panic(util.AssertErr()) + } } -func (f *vfsFile) ShmUnmap() { +func (f *vfsFile) ShmUnmap(delete bool) { // TODO: recycle the malloc'd memory pages. - for _, r := range f.shm { + for _, r := range f.shm.regions { munmap(r.addr, uintptr(r.length)) } - f.shm = f.shm[:0] + f.shm.regions = f.shm.regions[:0] + if delete { + os.Remove(f.shm.Name()) + } + f.shm.Close() + f.shm.File = nil } //go:linkname mmap syscall.mmap diff --git a/vfs/vfs.go b/vfs/vfs.go index ccc6fe99..1682093f 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -367,13 +367,13 @@ func vfsShmMap(ctx context.Context, mod api.Module, pFile, iRegion, szRegion, bE func vfsShmLock(ctx context.Context, mod api.Module, pFile, offset, n uint32, flags _ShmFlag) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(*vfsFile) - err := file.ShmLock() + err := file.ShmLock(offset, n, flags) return vfsErrorCode(err, _IOERR_SHMLOCK) } func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(*vfsFile) - file.ShmUnmap() + file.ShmUnmap(bDelete != 0) return _OK } From 80d857d0ccf482af02b2b082c301bf2a31c0fef6 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sun, 31 Mar 2024 12:46:14 +0100 Subject: [PATCH 07/30] mptest (failing). --- vfs/tests/mptest/mptest_test.go | 69 ++++++++++++++++++++++- vfs/tests/mptest/testdata/build.sh | 3 +- vfs/tests/mptest/testdata/mptest.wasm.bz2 | 4 +- vfs/tests/speedtest1/testdata/build.sh | 3 +- 4 files changed, 74 insertions(+), 5 deletions(-) diff --git a/vfs/tests/mptest/mptest_test.go b/vfs/tests/mptest/mptest_test.go index f2e61280..32a4e0c8 100644 --- a/vfs/tests/mptest/mptest_test.go +++ b/vfs/tests/mptest/mptest_test.go @@ -39,7 +39,8 @@ var ( func TestMain(m *testing.M) { ctx := context.Background() - rt = wazero.NewRuntime(ctx) + rt = wazero.NewRuntimeWithConfig(ctx, + wazero.NewRuntimeConfig().WithMemoryCapacityFromMax(true)) wasi_snapshot_preview1.MustInstantiate(ctx, rt) env := vfs.ExportHostFunctions(rt.NewHostModuleBuilder("env")) @@ -187,6 +188,72 @@ func Test_multiwrite01_memory(t *testing.T) { mod.Close(ctx) } +func Test_config01_wal(t *testing.T) { + ctx := util.NewContext(newContext(t)) + name := filepath.Join(t.TempDir(), "test.db") + cfg := config(ctx).WithArgs("mptest", name, "config01.test", + "--journalmode", "wal") + mod, err := rt.InstantiateModule(ctx, module, cfg) + if err != nil { + t.Fatal(err) + } + mod.Close(ctx) +} + +func Test_config02_wal(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + if os.Getenv("CI") != "" { + t.Skip("skipping in CI") + } + + ctx := util.NewContext(newContext(t)) + name := filepath.Join(t.TempDir(), "test.db") + cfg := config(ctx).WithArgs("mptest", name, "config02.test", + "--journalmode", "wal") + mod, err := rt.InstantiateModule(ctx, module, cfg) + if err != nil { + t.Fatal(err) + } + mod.Close(ctx) +} + +func Test_crash01_wal(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + if os.Getenv("CI") != "" { + t.Skip("skipping in CI") + } + + ctx := util.NewContext(newContext(t)) + name := filepath.Join(t.TempDir(), "test.db") + cfg := config(ctx).WithArgs("mptest", name, "crash01.test", + "--journalmode", "wal") + mod, err := rt.InstantiateModule(ctx, module, cfg) + if err != nil { + t.Fatal(err) + } + mod.Close(ctx) +} + +func Test_multiwrite01_wal(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + + ctx := util.NewContext(newContext(t)) + name := filepath.Join(t.TempDir(), "test.db") + cfg := config(ctx).WithArgs("mptest", name, "multiwrite01.test", + "--journalmode", "wal") + mod, err := rt.InstantiateModule(ctx, module, cfg) + if err != nil { + t.Fatal(err) + } + mod.Close(ctx) +} + func newContext(t *testing.T) context.Context { return context.WithValue(context.Background(), logger{}, &testWriter{T: t}) } diff --git a/vfs/tests/mptest/testdata/build.sh b/vfs/tests/mptest/testdata/build.sh index 4b9ce887..64bf1a2a 100755 --- a/vfs/tests/mptest/testdata/build.sh +++ b/vfs/tests/mptest/testdata/build.sh @@ -21,7 +21,8 @@ WASI_SDK="$ROOT/tools/wasi-sdk-21.0/bin" -DSQLITE_DEFAULT_LOCKING_MODE=0 \ -DHAVE_USLEEP -DSQLITE_NO_SYNC \ -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ - -D_WASI_EMULATED_GETPID -lwasi-emulated-getpid + -D_WASI_EMULATED_GETPID -lwasi-emulated-getpid \ + -Wl,--export=aligned_alloc "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ mptest.wasm -o mptest.tmp \ diff --git a/vfs/tests/mptest/testdata/mptest.wasm.bz2 b/vfs/tests/mptest/testdata/mptest.wasm.bz2 index c233e589..0d302125 100644 --- a/vfs/tests/mptest/testdata/mptest.wasm.bz2 +++ b/vfs/tests/mptest/testdata/mptest.wasm.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5f4778b49a6b99a1be11db5cb07e3c5b52f91a932a97e33c895f52c6f54bf57 -size 469149 +oid sha256:fc62b6aa80be18321648b08391095164ea5ee986bcd0caef68d01c26d3c3be8d +size 468882 diff --git a/vfs/tests/speedtest1/testdata/build.sh b/vfs/tests/speedtest1/testdata/build.sh index 34f8ab87..ae163553 100755 --- a/vfs/tests/speedtest1/testdata/build.sh +++ b/vfs/tests/speedtest1/testdata/build.sh @@ -16,7 +16,8 @@ WASI_SDK="$ROOT/tools/wasi-sdk-21.0/bin" -fno-stack-protector -fno-stack-clash-protection \ -Wl,--stack-first \ -Wl,--import-undefined \ - -D_HAVE_SQLITE_CONFIG_H + -D_HAVE_SQLITE_CONFIG_H \ + -Wl,--export=aligned_alloc "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ speedtest1.wasm -o speedtest1.tmp \ From 0734daacafd51ff2d49d81406c853e9735761012 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Mon, 1 Apr 2024 00:01:32 +0100 Subject: [PATCH 08/30] Bug fixes. --- vfs/file.go | 5 +++++ vfs/shm.go | 21 ++++++++++++++++----- vfs/tests/mptest/mptest_test.go | 19 ------------------- vfs/tests/mptest/testdata/build.sh | 2 +- vfs/tests/speedtest1/testdata/build.sh | 2 +- 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/vfs/file.go b/vfs/file.go index 15222910..b544162d 100644 --- a/vfs/file.go +++ b/vfs/file.go @@ -142,6 +142,11 @@ var ( _ FilePowersafeOverwrite = &vfsFile{} ) +func (f *vfsFile) Close() error { + f.ShmUnmap(false) + return f.File.Close() +} + func (f *vfsFile) Sync(flags SyncFlag) error { dataonly := (flags & SYNC_DATAONLY) != 0 fullsync := (flags & 0x0f) == SYNC_FULL diff --git a/vfs/shm.go b/vfs/shm.go index dc228825..af033dd5 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -27,10 +27,13 @@ const ( ) func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (_ uint32, err error) { + // TODO: don't even support shared memory if this is the case. if unix.Getpagesize() > int(size) { return 0, _IOERR_SHMMAP } + // TODO: handle the read-only case. + // TODO: should we close the file on error? if f.shm.File == nil { f.shm.File, err = os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) if err != nil { @@ -38,6 +41,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e } } + // Dead man's switch. if rc := osReadLock(f.shm.File, _SHM_DMS, 1, 0); rc != _OK { return 0, rc } @@ -76,7 +80,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e // Map the file into the allocated pages. p := util.View(mod, uint32(stack[0]), uint64(size)) a, err := mmap(uintptr(unsafe.Pointer(&p[0])), uintptr(size), - unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED, + unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED|unix.MAP_FIXED, int(f.shm.Fd()), int64(id)*int64(size)) if err != nil { return 0, _IOERR_SHMMAP @@ -87,6 +91,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e } func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { + // TODO: assert invariants. switch { case flags&_SHM_UNLOCK != 0: return osUnlock(f.shm.File, _SHM_BASE+int64(offset), int64(n)) @@ -101,15 +106,21 @@ func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { func (f *vfsFile) ShmUnmap(delete bool) { // TODO: recycle the malloc'd memory pages. + + // Unmap pages. for _, r := range f.shm.regions { munmap(r.addr, uintptr(r.length)) } f.shm.regions = f.shm.regions[:0] - if delete { - os.Remove(f.shm.Name()) + + // Close the file. + if f.shm.File != nil { + if delete { + os.Remove(f.shm.Name()) + } + f.shm.Close() + f.shm.File = nil } - f.shm.Close() - f.shm.File = nil } //go:linkname mmap syscall.mmap diff --git a/vfs/tests/mptest/mptest_test.go b/vfs/tests/mptest/mptest_test.go index 32a4e0c8..38e2b0f4 100644 --- a/vfs/tests/mptest/mptest_test.go +++ b/vfs/tests/mptest/mptest_test.go @@ -200,25 +200,6 @@ func Test_config01_wal(t *testing.T) { mod.Close(ctx) } -func Test_config02_wal(t *testing.T) { - if testing.Short() { - t.Skip("skipping in short mode") - } - if os.Getenv("CI") != "" { - t.Skip("skipping in CI") - } - - ctx := util.NewContext(newContext(t)) - name := filepath.Join(t.TempDir(), "test.db") - cfg := config(ctx).WithArgs("mptest", name, "config02.test", - "--journalmode", "wal") - mod, err := rt.InstantiateModule(ctx, module, cfg) - if err != nil { - t.Fatal(err) - } - mod.Close(ctx) -} - func Test_crash01_wal(t *testing.T) { if testing.Short() { t.Skip("skipping in short mode") diff --git a/vfs/tests/mptest/testdata/build.sh b/vfs/tests/mptest/testdata/build.sh index 64bf1a2a..dc81aa02 100755 --- a/vfs/tests/mptest/testdata/build.sh +++ b/vfs/tests/mptest/testdata/build.sh @@ -22,7 +22,7 @@ WASI_SDK="$ROOT/tools/wasi-sdk-21.0/bin" -DHAVE_USLEEP -DSQLITE_NO_SYNC \ -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ -D_WASI_EMULATED_GETPID -lwasi-emulated-getpid \ - -Wl,--export=aligned_alloc + -Wl,--export=aligned_alloc "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ mptest.wasm -o mptest.tmp \ diff --git a/vfs/tests/speedtest1/testdata/build.sh b/vfs/tests/speedtest1/testdata/build.sh index ae163553..36727930 100755 --- a/vfs/tests/speedtest1/testdata/build.sh +++ b/vfs/tests/speedtest1/testdata/build.sh @@ -17,7 +17,7 @@ WASI_SDK="$ROOT/tools/wasi-sdk-21.0/bin" -Wl,--stack-first \ -Wl,--import-undefined \ -D_HAVE_SQLITE_CONFIG_H \ - -Wl,--export=aligned_alloc + -Wl,--export=aligned_alloc "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ speedtest1.wasm -o speedtest1.tmp \ From ebcb4b3cf0804c20a186f6dabfeed6ff5fa11373 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 2 Apr 2024 15:20:36 +0100 Subject: [PATCH 09/30] More. --- vfs/shm.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/vfs/shm.go b/vfs/shm.go index af033dd5..79390244 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -22,13 +22,15 @@ type shmRegion struct { } const ( - _SHM_BASE = 120 - _SHM_DMS = 128 + _SHM_NLOCK = 8 + _SHM_BASE = 120 + _SHM_DMS = _SHM_BASE + _SHM_NLOCK ) func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (_ uint32, err error) { - // TODO: don't even support shared memory if this is the case. - if unix.Getpagesize() > int(size) { + // Ensure size is a multiple of the OS page size. + // TODO: don't implement shared memory if this isn't the case. + if int(size)%unix.Getpagesize() != 0 { return 0, _IOERR_SHMMAP } @@ -42,6 +44,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e } // Dead man's switch. + // TODO: fix race condition. if rc := osReadLock(f.shm.File, _SHM_DMS, 1, 0); rc != _OK { return 0, rc } @@ -76,6 +79,9 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e if err := alloc.CallWithStack(ctx, stack[:]); err != nil { panic(err) } + if stack[0] == 0 { + panic(util.OOMErr) + } // Map the file into the allocated pages. p := util.View(mod, uint32(stack[0]), uint64(size)) @@ -91,7 +97,24 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e } func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { - // TODO: assert invariants. + // Argument check. + if n == 0 || offset+n > _SHM_NLOCK { + panic(util.AssertErr()) + } + switch flags { + case + _SHM_LOCK | _SHM_SHARED, + _SHM_LOCK | _SHM_EXCLUSIVE, + _SHM_UNLOCK | _SHM_SHARED, + _SHM_UNLOCK | _SHM_EXCLUSIVE: + // + default: + panic(util.AssertErr()) + } + if n != 1 && flags&_SHM_EXCLUSIVE == 0 { + panic(util.AssertErr()) + } + switch { case flags&_SHM_UNLOCK != 0: return osUnlock(f.shm.File, _SHM_BASE+int64(offset), int64(n)) @@ -109,6 +132,7 @@ func (f *vfsFile) ShmUnmap(delete bool) { // Unmap pages. for _, r := range f.shm.regions { + // mmap(r.addr, uintptr(r.length), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_FIXED, -1, 0) munmap(r.addr, uintptr(r.length)) } f.shm.regions = f.shm.regions[:0] From 3fea368e28a55c6fa971995ab74bd394753b713f Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 2 Apr 2024 20:33:55 +0100 Subject: [PATCH 10/30] More. --- tests/parallel/parallel_test.go | 2 -- vfs/vfs.go | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/parallel/parallel_test.go b/tests/parallel/parallel_test.go index 65804944..604261ba 100644 --- a/tests/parallel/parallel_test.go +++ b/tests/parallel/parallel_test.go @@ -187,10 +187,8 @@ func testParallel(t testing.TB, name string, n int) { group.SetLimit(6) for i := 0; i < n; i++ { if i&7 != 7 { - t.Log("reader", i) group.Go(reader) } else { - t.Log("writer", i) group.Go(writer) } } diff --git a/vfs/vfs.go b/vfs/vfs.go index 1682093f..af75b119 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -379,8 +379,7 @@ func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _Er func vfsShmBarrier(ctx context.Context, mod api.Module, pFile uint32) { shmBarrier.Lock() - //lint:ignore SA2001 empty critical section implies a memory barrier. - shmBarrier.Unlock() + defer shmBarrier.Unlock() } func vfsURIParameters(ctx context.Context, mod api.Module, zPath uint32, flags OpenFlag) url.Values { From 64a7a8823d72b241ae2039edec722a633913baa1 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 2 Apr 2024 23:29:47 +0100 Subject: [PATCH 11/30] Towards portability. --- vfs/shm.go | 2 ++ vfs/shm_other.go | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 vfs/shm_other.go diff --git a/vfs/shm.go b/vfs/shm.go index 79390244..ff417c3a 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -1,3 +1,5 @@ +//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_nosys + package vfs import ( diff --git a/vfs/shm_other.go b/vfs/shm_other.go new file mode 100644 index 00000000..8b7117af --- /dev/null +++ b/vfs/shm_other.go @@ -0,0 +1,21 @@ +//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_nosys + +package vfs + +import ( + "context" + + "github.com/tetratelabs/wazero/api" +) + +type vfsShm struct{} + +func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) { + return 0, _IOERR_SHMMAP +} + +func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { + return _IOERR_SHMLOCK +} + +func (f *vfsFile) ShmUnmap(delete bool) {} From eb9f300963dc22604f7fc7c29c22ab764aed73ab Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 3 Apr 2024 00:27:37 +0100 Subject: [PATCH 12/30] Limit memory. --- sqlite.go | 2 +- vfs/tests/mptest/mptest_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sqlite.go b/sqlite.go index 6059f15e..c69f3bb3 100644 --- a/sqlite.go +++ b/sqlite.go @@ -37,7 +37,7 @@ var instance struct { func compileSQLite() { if RuntimeConfig == nil { - RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryCapacityFromMax(true) + RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryLimitPages(1024).WithMemoryCapacityFromMax(true) } ctx := context.Background() diff --git a/vfs/tests/mptest/mptest_test.go b/vfs/tests/mptest/mptest_test.go index 38e2b0f4..127cec67 100644 --- a/vfs/tests/mptest/mptest_test.go +++ b/vfs/tests/mptest/mptest_test.go @@ -40,7 +40,7 @@ var ( func TestMain(m *testing.M) { ctx := context.Background() rt = wazero.NewRuntimeWithConfig(ctx, - wazero.NewRuntimeConfig().WithMemoryCapacityFromMax(true)) + wazero.NewRuntimeConfig().WithMemoryLimitPages(1024).WithMemoryCapacityFromMax(true)) wasi_snapshot_preview1.MustInstantiate(ctx, rt) env := vfs.ExportHostFunctions(rt.NewHostModuleBuilder("env")) From dbdccbe7d87688bda5428de65482f9802801213b Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 3 Apr 2024 12:11:03 +0100 Subject: [PATCH 13/30] More. --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 2 ++ sqlite.go | 2 +- tests/db_test.go | 6 +++++ tests/parallel/parallel_test.go | 15 ++++++++++++ vfs/lock.go | 10 ++++++++ vfs/lock_other.go | 23 ++++++++++++++++++ vfs/os_nolock.go | 41 --------------------------------- vfs/os_unix_lock.go | 8 ------- vfs/os_windows.go | 8 ------- vfs/shm.go | 12 +++++++++- vfs/shm_other.go | 12 +++++++++- vfs/tests/mptest/mptest_test.go | 22 ++++++++++++++++-- 14 files changed, 102 insertions(+), 65 deletions(-) create mode 100644 vfs/lock_other.go delete mode 100644 vfs/os_nolock.go diff --git a/go.mod b/go.mod index 370cc872..e2e09ed8 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240327075005-1e61961e4b45 +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413 diff --git a/go.sum b/go.sum index b70c08e2..35878aa4 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240327075005-1e61961e4b45 h1:S7fG4oq29CgXycris/pkmon/gbKFufnU8PTaRv5ewFs= -github.com/ncruces/wazero v0.0.0-20240327075005-1e61961e4b45/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413 h1:wUE8Bx0aoqNFkRu+GbC3/51kyq0hmE4txY8Z2EqEHhM= +github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index 41ed68b5..da8019f2 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,3 +1,5 @@ +github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413 h1:wUE8Bx0aoqNFkRu+GbC3/51kyq0hmE4txY8Z2EqEHhM= +github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= diff --git a/sqlite.go b/sqlite.go index c69f3bb3..56ea68b8 100644 --- a/sqlite.go +++ b/sqlite.go @@ -37,7 +37,7 @@ var instance struct { func compileSQLite() { if RuntimeConfig == nil { - RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryLimitPages(1024).WithMemoryCapacityFromMax(true) + RuntimeConfig = wazero.NewRuntimeConfig() } ctx := context.Background() diff --git a/tests/db_test.go b/tests/db_test.go index 168cae58..88d23a8d 100644 --- a/tests/db_test.go +++ b/tests/db_test.go @@ -9,6 +9,7 @@ import ( "github.com/ncruces/go-sqlite3" _ "github.com/ncruces/go-sqlite3/embed" + "github.com/ncruces/go-sqlite3/vfs" _ "github.com/ncruces/go-sqlite3/vfs/memdb" ) @@ -36,6 +37,11 @@ func TestDB_nolock(t *testing.T) { } func TestDB_wal(t *testing.T) { + // TODO: reconsider this. + if !vfs.SupportsSharedMemory { + t.Skip("skipping without shared memory") + } + t.Parallel() tmp := filepath.Join(t.TempDir(), "test.db") err := os.WriteFile(tmp, waldb, 0666) diff --git a/tests/parallel/parallel_test.go b/tests/parallel/parallel_test.go index 604261ba..e0740f00 100644 --- a/tests/parallel/parallel_test.go +++ b/tests/parallel/parallel_test.go @@ -12,9 +12,20 @@ import ( "github.com/ncruces/go-sqlite3" _ "github.com/ncruces/go-sqlite3/embed" + "github.com/ncruces/go-sqlite3/vfs" "github.com/ncruces/go-sqlite3/vfs/memdb" + "github.com/tetratelabs/wazero" ) +func TestMain(m *testing.M) { + if vfs.SupportsSharedMemory { + sqlite3.RuntimeConfig = wazero.NewRuntimeConfig(). + WithMemoryCapacityFromMax(true). + WithMemoryLimitPages(1024) + } + os.Exit(m.Run()) +} + func TestParallel(t *testing.T) { var iter int if testing.Short() { @@ -33,6 +44,10 @@ func TestParallel(t *testing.T) { } func TestWAL(t *testing.T) { + if !vfs.SupportsSharedMemory { + t.Skip("skipping without shared memory") + } + name := "file:" + filepath.Join(t.TempDir(), "test.db") + "?_pragma=busy_timeout(10000)" + diff --git a/vfs/lock.go b/vfs/lock.go index 1b705499..9332c9f5 100644 --- a/vfs/lock.go +++ b/vfs/lock.go @@ -1,7 +1,17 @@ +//go:build (linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) && !sqlite3_nosys + package vfs import "github.com/ncruces/go-sqlite3/internal/util" +// SupportsFileLocking is false on platforms that do not support file locking. +// To open a database file on those platforms, +// you need to use the [nolock] or [immutable] URI parameters. +// +// [nolock]: https://sqlite.org/uri.html#urinolock +// [immutable]: https://sqlite.org/uri.html#uriimmutable +const SupportsFileLocking = true + const ( _PENDING_BYTE = 0x40000000 _RESERVED_BYTE = (_PENDING_BYTE + 1) diff --git a/vfs/lock_other.go b/vfs/lock_other.go new file mode 100644 index 00000000..a4563af4 --- /dev/null +++ b/vfs/lock_other.go @@ -0,0 +1,23 @@ +//go:build !(linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) || sqlite3_nosys + +package vfs + +// SupportsFileLocking is false on platforms that do not support file locking. +// To open a database file on those platforms, +// you need to use the [nolock] or [immutable] URI parameters. +// +// [nolock]: https://sqlite.org/uri.html#urinolock +// [immutable]: https://sqlite.org/uri.html#uriimmutable +const SupportsFileLocking = false + +func (f *vfsFile) Lock(LockLevel) error { + return _IOERR_LOCK +} + +func (f *vfsFile) Unlock(LockLevel) error { + return _IOERR_UNLOCK +} + +func (f *vfsFile) CheckReservedLock() (bool, error) { + return false, _IOERR_CHECKRESERVEDLOCK +} diff --git a/vfs/os_nolock.go b/vfs/os_nolock.go deleted file mode 100644 index 4bceefed..00000000 --- a/vfs/os_nolock.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build !(linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) || sqlite3_nosys - -package vfs - -import "os" - -// SupportsFileLocking is false on platforms that do not support file locking. -// To open a database file in one such platform, -// you need to use the [nolock] or [immutable] URI parameters. -// -// [nolock]: https://sqlite.org/uri.html#urinolock -// [immutable]: https://sqlite.org/uri.html#uriimmutable -const SupportsFileLocking = false - -func osGetSharedLock(_ *os.File) _ErrorCode { - return _IOERR_RDLOCK -} - -func osGetReservedLock(_ *os.File) _ErrorCode { - return _IOERR_LOCK -} - -func osGetPendingLock(_ *os.File, _ bool) _ErrorCode { - return _IOERR_LOCK -} - -func osGetExclusiveLock(_ *os.File, _ bool) _ErrorCode { - return _IOERR_LOCK -} - -func osDowngradeLock(_ *os.File, _ LockLevel) _ErrorCode { - return _IOERR_RDLOCK -} - -func osReleaseLock(_ *os.File, _ LockLevel) _ErrorCode { - return _IOERR_UNLOCK -} - -func osCheckReservedLock(_ *os.File) (bool, _ErrorCode) { - return false, _IOERR_CHECKRESERVEDLOCK -} diff --git a/vfs/os_unix_lock.go b/vfs/os_unix_lock.go index 15db23f0..8f90e67e 100644 --- a/vfs/os_unix_lock.go +++ b/vfs/os_unix_lock.go @@ -9,14 +9,6 @@ import ( "golang.org/x/sys/unix" ) -// SupportsFileLocking is false on platforms that do not support file locking. -// To open a database file in one such platform, -// you need to use the [nolock] or [immutable] URI parameters. -// -// [nolock]: https://sqlite.org/uri.html#urinolock -// [immutable]: https://sqlite.org/uri.html#uriimmutable -const SupportsFileLocking = true - func osGetSharedLock(file *os.File) _ErrorCode { // Test the PENDING lock before acquiring a new SHARED lock. if pending, _ := osCheckLock(file, _PENDING_BYTE, 1); pending { diff --git a/vfs/os_windows.go b/vfs/os_windows.go index abc6c4b7..9e53e14b 100644 --- a/vfs/os_windows.go +++ b/vfs/os_windows.go @@ -9,14 +9,6 @@ import ( "golang.org/x/sys/windows" ) -// SupportsFileLocking is false on platforms that do not support file locking. -// To open a database file in one such platform, -// you need to use the [nolock] or [immutable] URI parameters. -// -// [nolock]: https://sqlite.org/uri.html#urinolock -// [immutable]: https://sqlite.org/uri.html#uriimmutable -const SupportsFileLocking = true - func osGetSharedLock(file *os.File) _ErrorCode { // Acquire the PENDING lock temporarily before acquiring a new SHARED lock. rc := osReadLock(file, _PENDING_BYTE, 1, 0) diff --git a/vfs/shm.go b/vfs/shm.go index ff417c3a..b852e3a0 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -1,4 +1,4 @@ -//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_nosys +//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_flock && !sqlite3_nosys package vfs @@ -13,6 +13,16 @@ import ( "golang.org/x/sys/unix" ) +// SupportsSharedMemory is true on platforms that support shared memory. +// To enable shared memory support on those platforms, +// you need to set the appropriate [wazero.RuntimeConfig]; +// otherwise, [EXCLUSIVE locking mode] is activated automatically +// to use [WAL without shared-memory]. +// +// [WAL without shared-memory]: https://sqlite.org/wal.html#noshm +// [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode +const SupportsSharedMemory = true + type vfsShm struct { *os.File regions []shmRegion diff --git a/vfs/shm_other.go b/vfs/shm_other.go index 8b7117af..5ce3518f 100644 --- a/vfs/shm_other.go +++ b/vfs/shm_other.go @@ -1,4 +1,4 @@ -//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_nosys +//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_flock || sqlite3_nosys package vfs @@ -8,6 +8,16 @@ import ( "github.com/tetratelabs/wazero/api" ) +// SupportsSharedMemory is true on platforms that support shared memory. +// To enable shared memory support on those platforms, +// you need to set the appropriate [wazero.RuntimeConfig]; +// otherwise, [EXCLUSIVE locking mode] is activated automatically +// to use [WAL without shared-memory]. +// +// [WAL without shared-memory]: https://sqlite.org/wal.html#noshm +// [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode +const SupportsSharedMemory = false + type vfsShm struct{} func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) { diff --git a/vfs/tests/mptest/mptest_test.go b/vfs/tests/mptest/mptest_test.go index 127cec67..fc3c2ca3 100644 --- a/vfs/tests/mptest/mptest_test.go +++ b/vfs/tests/mptest/mptest_test.go @@ -39,8 +39,11 @@ var ( func TestMain(m *testing.M) { ctx := context.Background() - rt = wazero.NewRuntimeWithConfig(ctx, - wazero.NewRuntimeConfig().WithMemoryLimitPages(1024).WithMemoryCapacityFromMax(true)) + cfg := wazero.NewRuntimeConfig() + if vfs.SupportsSharedMemory { + cfg = cfg.WithMemoryLimitPages(1024).WithMemoryCapacityFromMax(true) + } + rt = wazero.NewRuntimeWithConfig(ctx, cfg) wasi_snapshot_preview1.MustInstantiate(ctx, rt) env := vfs.ExportHostFunctions(rt.NewHostModuleBuilder("env")) @@ -189,6 +192,11 @@ func Test_multiwrite01_memory(t *testing.T) { } func Test_config01_wal(t *testing.T) { + // TODO: reconsider this. + if !vfs.SupportsSharedMemory { + t.Skip("skipping without shared memory") + } + ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "config01.test", @@ -201,6 +209,11 @@ func Test_config01_wal(t *testing.T) { } func Test_crash01_wal(t *testing.T) { + // TODO: reconsider this. + if !vfs.SupportsSharedMemory { + t.Skip("skipping without shared memory") + } + if testing.Short() { t.Skip("skipping in short mode") } @@ -220,6 +233,11 @@ func Test_crash01_wal(t *testing.T) { } func Test_multiwrite01_wal(t *testing.T) { + // TODO: reconsider this. + if !vfs.SupportsSharedMemory { + t.Skip("skipping without shared memory") + } + if testing.Short() { t.Skip("skipping in short mode") } From 1300c642a123624ef5d3099dbc75742cbd01bde5 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 3 Apr 2024 15:37:20 +0100 Subject: [PATCH 14/30] Portability. --- embed/sqlite3.wasm | Bin 1335347 -> 1335474 bytes sqlite3/vfs.c | 61 ++++++++++------- tests/db_test.go | 6 -- vfs/file.go | 2 +- vfs/shm.go | 77 +++++++++++++++------- vfs/shm_other.go | 18 ++--- vfs/tests/mptest/mptest_test.go | 21 ++---- vfs/tests/mptest/testdata/mptest.wasm.bz2 | 4 +- vfs/vfs.go | 25 ++++--- vfs/vfs_test.go | 4 +- 10 files changed, 125 insertions(+), 93 deletions(-) diff --git a/embed/sqlite3.wasm b/embed/sqlite3.wasm index 2c9c33d0390866b3ba639cb7de6ebb1125eb3809..c36b3c82be8a161594f8b0793ae63c580bda441c 100755 GIT binary patch delta 93124 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

yXPGIG~_&VeA&>pRLmEK6e06BI z&rb7kc@Z))Fm+}qt7qjJWk1(GJG`+h&Bp=SSv{`bgr<#*-_5f^)2*Q;8Zjr)I-4cm zTp@3i>LS)X?-56{2%Yzsc2WyF01G=P_1VEHW8JtY*X<9fd$byH50TzR71X}JIdrh4 zO$C17qqP+x+kuaDsenzRLR3IN#CJw8Dqs_c&Is_H>rz248&2jIWOJt)-Av!9M)wdV zBPImv(3&tshjfz)HH@=qjp!SXL$+P}W`5`srb^kf#nO$W|6B_~$J+<0@%%ykcCFD~ z37fMSGl+meDuGt(Ha#Ai#&F@{A!NEC9+ueJxNzwguu^(j1FutjBGkrWuoSWgp^_r- zw5o5UF49u@hXGYWE?dePfr9hq^ejp!`@(~eCV`iefmEF0;OF*Oz(EE8%$TfEN6A=P z*%*0T`xb@1lWkh10TF_c0hfAmGp3D<+WAXDO^-M#xpB~MOF}1RM&&TmZp``-VP=#v zaZXf{i%X$g-o?z!S!UcaxN^z2e`H(LqY&uar$b{ilPSAtJuE8qWFC+S%wsX3g16Wx z*xhmnGBp6V4BT`WGGPkUx1I@Im6=TcKR4-hNV=X>FI*ma*(MVwwa|=lVX;*<*JuLT z_43pTsNhLh?Z9iC9XJXSx$ndpTvORiVlFNMbg>>6b80B*hCDdk*r0bW({Cw`7Ie!I zjHG}G?vo^E34W@^R)*Th_&j!HsF_?^p^aD>N-#e<7aC}9RD{|wOPmV~Tbhvc@AJRM zf!1Dr79NisHFB*bBub>T`m71P*LjOxZbwxvmHHK}ZiMK6zG=g76E%65QF7f%SE$FY z4V_W1AFN*+S}AX+P^Yd7orj|Is¥s#{}|Q^}bttuTg4fzwOQC_M|Em|A0Fy%^SI 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 delta 92484 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 diff --git a/sqlite3/vfs.c b/sqlite3/vfs.c index 967dca3e..1ba94fff 100644 --- a/sqlite3/vfs.c +++ b/sqlite3/vfs.c @@ -13,7 +13,7 @@ int go_sleep(sqlite3_vfs *, int microseconds); int go_current_time_64(sqlite3_vfs *, sqlite3_int64 *); int go_open(sqlite3_vfs *, sqlite3_filename zName, sqlite3_file *, int flags, - int *pOutFlags); + int *pOutFlags, int *pOutVersion); int go_delete(sqlite3_vfs *, const char *zName, int syncDir); int go_access(sqlite3_vfs *, const char *zName, int flags, int *pResOut); int go_full_pathname(sqlite3_vfs *, const char *zName, int nOut, char *zOut); @@ -39,31 +39,48 @@ void go_shm_barrier(sqlite3_file *); static int go_open_wrapper(sqlite3_vfs *vfs, sqlite3_filename zName, sqlite3_file *file, int flags, int *pOutFlags) { - static const sqlite3_io_methods os_io = { - .iVersion = 2, - .xClose = go_close, - .xRead = go_read, - .xWrite = go_write, - .xTruncate = go_truncate, - .xSync = go_sync, - .xFileSize = go_file_size, - .xLock = go_lock, - .xUnlock = go_unlock, - .xCheckReservedLock = go_check_reserved_lock, - .xFileControl = go_file_control, - .xSectorSize = go_sector_size, - .xDeviceCharacteristics = go_device_characteristics, - .xShmMap = go_shm_map, - .xShmLock = go_shm_lock, - .xShmBarrier = go_shm_barrier, - .xShmUnmap = go_shm_unmap, - }; + static const sqlite3_io_methods go_io[2] = { + { + .iVersion = 1, + .xClose = go_close, + .xRead = go_read, + .xWrite = go_write, + .xTruncate = go_truncate, + .xSync = go_sync, + .xFileSize = go_file_size, + .xLock = go_lock, + .xUnlock = go_unlock, + .xCheckReservedLock = go_check_reserved_lock, + .xFileControl = go_file_control, + .xSectorSize = go_sector_size, + .xDeviceCharacteristics = go_device_characteristics, + }, + { + .iVersion = 2, + .xClose = go_close, + .xRead = go_read, + .xWrite = go_write, + .xTruncate = go_truncate, + .xSync = go_sync, + .xFileSize = go_file_size, + .xLock = go_lock, + .xUnlock = go_unlock, + .xCheckReservedLock = go_check_reserved_lock, + .xFileControl = go_file_control, + .xSectorSize = go_sector_size, + .xDeviceCharacteristics = go_device_characteristics, + .xShmMap = go_shm_map, + .xShmLock = go_shm_lock, + .xShmBarrier = go_shm_barrier, + .xShmUnmap = go_shm_unmap, + }}; + int version = 0; memset(file, 0, vfs->szOsFile); - int rc = go_open(vfs, zName, file, flags, pOutFlags); + int rc = go_open(vfs, zName, file, flags, pOutFlags, &version); if (rc) { return rc; } - file->pMethods = &os_io; + file->pMethods = &go_io[version]; return SQLITE_OK; } diff --git a/tests/db_test.go b/tests/db_test.go index 88d23a8d..168cae58 100644 --- a/tests/db_test.go +++ b/tests/db_test.go @@ -9,7 +9,6 @@ import ( "github.com/ncruces/go-sqlite3" _ "github.com/ncruces/go-sqlite3/embed" - "github.com/ncruces/go-sqlite3/vfs" _ "github.com/ncruces/go-sqlite3/vfs/memdb" ) @@ -37,11 +36,6 @@ func TestDB_nolock(t *testing.T) { } func TestDB_wal(t *testing.T) { - // TODO: reconsider this. - if !vfs.SupportsSharedMemory { - t.Skip("skipping without shared memory") - } - t.Parallel() tmp := filepath.Join(t.TempDir(), "test.db") err := os.WriteFile(tmp, waldb, 0666) diff --git a/vfs/file.go b/vfs/file.go index b544162d..c2fed5c7 100644 --- a/vfs/file.go +++ b/vfs/file.go @@ -143,7 +143,7 @@ var ( ) func (f *vfsFile) Close() error { - f.ShmUnmap(false) + f.shm.free() return f.File.Close() } diff --git a/vfs/shm.go b/vfs/shm.go index b852e3a0..42760a7f 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -23,11 +23,43 @@ import ( // [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode const SupportsSharedMemory = true +func vfsVersion(mod api.Module) uint32 { + pagesize := unix.Getpagesize() + + // 32KB pages must be a multiple of the system's page size. + if (32*1024)%pagesize != 0 { + return 0 + } + + // The module's memory must be page aligned. + b, ok := mod.Memory().Read(0, 1) + if ok && uintptr(unsafe.Pointer(&b[0]))%uintptr(pagesize) != 0 { + return 0 + } + + // TODO: feeling lucky. + return 1 +} + type vfsShm struct { - *os.File + file *os.File regions []shmRegion } +func (s *vfsShm) free() { + // Unmap pages. + for _, r := range s.regions { + munmap(r.addr, uintptr(r.length)) + } + + // Close the file. + if s.file != nil { + s.file.Close() + } + + *s = vfsShm{} +} + type shmRegion struct { addr uintptr length uint32 @@ -39,7 +71,7 @@ const ( _SHM_DMS = _SHM_BASE + _SHM_NLOCK ) -func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (_ uint32, err error) { +func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (_ uint32, err error) { // Ensure size is a multiple of the OS page size. // TODO: don't implement shared memory if this isn't the case. if int(size)%unix.Getpagesize() != 0 { @@ -48,8 +80,8 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e // TODO: handle the read-only case. // TODO: should we close the file on error? - if f.shm.File == nil { - f.shm.File, err = os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + if f.shm.file == nil { + f.shm.file, err = os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) if err != nil { return 0, _IOERR_SHMOPEN } @@ -57,18 +89,18 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e // Dead man's switch. // TODO: fix race condition. - if rc := osReadLock(f.shm.File, _SHM_DMS, 1, 0); rc != _OK { + if rc := osReadLock(f.shm.file, _SHM_DMS, 1, 0); rc != _OK { return 0, rc } - if rc := osWriteLock(f.shm.File, _SHM_DMS, 1, 0); rc == _OK { - if err := f.shm.File.Truncate(0); err != nil { + if rc := osWriteLock(f.shm.file, _SHM_DMS, 1, 0); rc == _OK { + if err := f.shm.file.Truncate(0); err != nil { return 0, _IOERR_SHMOPEN } - osReadLock(f.shm.File, _SHM_DMS, 1, 0) + osReadLock(f.shm.file, _SHM_DMS, 1, 0) } // Check if file is big enough. - s, err := f.shm.Seek(0, io.SeekEnd) + s, err := f.shm.file.Seek(0, io.SeekEnd) if err != nil { return 0, _IOERR_SHMSIZE } @@ -76,7 +108,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e if !extend { return 0, nil } - err := osAllocate(f.shm.File, n) + err := osAllocate(f.shm.file, n) if err != nil { return 0, _IOERR_SHMOPEN } @@ -99,7 +131,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e p := util.View(mod, uint32(stack[0]), uint64(size)) a, err := mmap(uintptr(unsafe.Pointer(&p[0])), uintptr(size), unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED|unix.MAP_FIXED, - int(f.shm.Fd()), int64(id)*int64(size)) + int(f.shm.file.Fd()), int64(id)*int64(size)) if err != nil { return 0, _IOERR_SHMMAP } @@ -108,7 +140,7 @@ func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, e return uint32(stack[0]), nil } -func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { +func (f *vfsFile) shmLock(offset, n uint32, flags _ShmFlag) error { // Argument check. if n == 0 || offset+n > _SHM_NLOCK { panic(util.AssertErr()) @@ -129,33 +161,32 @@ func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { switch { case flags&_SHM_UNLOCK != 0: - return osUnlock(f.shm.File, _SHM_BASE+int64(offset), int64(n)) + return osUnlock(f.shm.file, _SHM_BASE+int64(offset), int64(n)) case flags&_SHM_SHARED != 0: - return osReadLock(f.shm.File, _SHM_BASE+int64(offset), int64(n), 0) + return osReadLock(f.shm.file, _SHM_BASE+int64(offset), int64(n), 0) case flags&_SHM_EXCLUSIVE != 0: - return osWriteLock(f.shm.File, _SHM_BASE+int64(offset), int64(n), 0) + return osWriteLock(f.shm.file, _SHM_BASE+int64(offset), int64(n), 0) default: panic(util.AssertErr()) } } -func (f *vfsFile) ShmUnmap(delete bool) { +func (f *vfsFile) shmUnmap(delete bool) { // TODO: recycle the malloc'd memory pages. - // Unmap pages. + // Protect pages. for _, r := range f.shm.regions { - // mmap(r.addr, uintptr(r.length), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_FIXED, -1, 0) - munmap(r.addr, uintptr(r.length)) + mmap(r.addr, uintptr(r.length), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_FIXED, -1, 0) } f.shm.regions = f.shm.regions[:0] // Close the file. - if f.shm.File != nil { + if f.shm.file != nil { if delete { - os.Remove(f.shm.Name()) + os.Remove(f.shm.file.Name()) } - f.shm.Close() - f.shm.File = nil + f.shm.file.Close() + f.shm.file = nil } } diff --git a/vfs/shm_other.go b/vfs/shm_other.go index 5ce3518f..4ed9c91b 100644 --- a/vfs/shm_other.go +++ b/vfs/shm_other.go @@ -2,11 +2,7 @@ package vfs -import ( - "context" - - "github.com/tetratelabs/wazero/api" -) +import "github.com/tetratelabs/wazero/api" // SupportsSharedMemory is true on platforms that support shared memory. // To enable shared memory support on those platforms, @@ -18,14 +14,8 @@ import ( // [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode const SupportsSharedMemory = false -type vfsShm struct{} - -func (f *vfsFile) ShmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) { - return 0, _IOERR_SHMMAP -} +func vfsVersion(mod api.Module) uint32 { return 0 } -func (f *vfsFile) ShmLock(offset, n uint32, flags _ShmFlag) error { - return _IOERR_SHMLOCK -} +type vfsShm struct{} -func (f *vfsFile) ShmUnmap(delete bool) {} +func (vfsShm) free() {} diff --git a/vfs/tests/mptest/mptest_test.go b/vfs/tests/mptest/mptest_test.go index fc3c2ca3..8c25926b 100644 --- a/vfs/tests/mptest/mptest_test.go +++ b/vfs/tests/mptest/mptest_test.go @@ -192,11 +192,6 @@ func Test_multiwrite01_memory(t *testing.T) { } func Test_config01_wal(t *testing.T) { - // TODO: reconsider this. - if !vfs.SupportsSharedMemory { - t.Skip("skipping without shared memory") - } - ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "config01.test", @@ -209,17 +204,15 @@ func Test_config01_wal(t *testing.T) { } func Test_crash01_wal(t *testing.T) { - // TODO: reconsider this. - if !vfs.SupportsSharedMemory { - t.Skip("skipping without shared memory") - } - if testing.Short() { t.Skip("skipping in short mode") } if os.Getenv("CI") != "" { t.Skip("skipping in CI") } + if !vfs.SupportsSharedMemory { + t.Skip("skipping without shared memory") + } ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") @@ -233,14 +226,12 @@ func Test_crash01_wal(t *testing.T) { } func Test_multiwrite01_wal(t *testing.T) { - // TODO: reconsider this. - if !vfs.SupportsSharedMemory { - t.Skip("skipping without shared memory") - } - if testing.Short() { t.Skip("skipping in short mode") } + if !vfs.SupportsSharedMemory { + t.Skip("skipping without shared memory") + } ctx := util.NewContext(newContext(t)) name := filepath.Join(t.TempDir(), "test.db") diff --git a/vfs/tests/mptest/testdata/mptest.wasm.bz2 b/vfs/tests/mptest/testdata/mptest.wasm.bz2 index 0d302125..0b753efa 100644 --- a/vfs/tests/mptest/testdata/mptest.wasm.bz2 +++ b/vfs/tests/mptest/testdata/mptest.wasm.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc62b6aa80be18321648b08391095164ea5ee986bcd0caef68d01c26d3c3be8d -size 468882 +oid sha256:523b3640c6de9accf3f6b01e7da2098faba12eec0168b67a78c56fef0716c7ae +size 469261 diff --git a/vfs/vfs.go b/vfs/vfs.go index af75b119..67acfeec 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -28,7 +28,7 @@ func ExportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder util.ExportFuncIIIII(env, "go_full_pathname", vfsFullPathname) util.ExportFuncIIII(env, "go_delete", vfsDelete) util.ExportFuncIIIII(env, "go_access", vfsAccess) - util.ExportFuncIIIIII(env, "go_open", vfsOpen) + util.ExportFuncIIIIIII(env, "go_open", vfsOpen) util.ExportFuncII(env, "go_close", vfsClose) util.ExportFuncIIIIJ(env, "go_read", vfsRead) util.ExportFuncIIIIJ(env, "go_write", vfsWrite) @@ -134,7 +134,7 @@ func vfsAccess(ctx context.Context, mod api.Module, pVfs, zPath uint32, flags Ac return vfsErrorCode(err, _IOERR_ACCESS) } -func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, flags OpenFlag, pOutFlags uint32) _ErrorCode { +func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, flags OpenFlag, pOutFlags, pOutVersion uint32) _ErrorCode { vfs := vfsGet(mod, pVfs) var path string @@ -170,6 +170,9 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla if pOutFlags != 0 { util.WriteUint32(mod, pOutFlags, uint32(flags)) } + if pOutVersion != 0 { + util.WriteUint32(mod, pOutVersion, vfsVersion(mod)) + } vfsFileRegister(ctx, mod, pFile, file) return _OK } @@ -356,8 +359,8 @@ func vfsDeviceCharacteristics(ctx context.Context, mod api.Module, pFile uint32) var shmBarrier sync.Mutex func vfsShmMap(ctx context.Context, mod api.Module, pFile, iRegion, szRegion, bExtend, pp uint32) _ErrorCode { - file := vfsFileGet(ctx, mod, pFile).(*vfsFile) - p, err := file.ShmMap(ctx, mod, iRegion, szRegion, bExtend != 0) + file := vfsFileGet(ctx, mod, pFile).(fileShm) + p, err := file.shmMap(ctx, mod, iRegion, szRegion, bExtend != 0) if err != nil { return vfsErrorCode(err, _IOERR_SHMMAP) } @@ -366,14 +369,14 @@ func vfsShmMap(ctx context.Context, mod api.Module, pFile, iRegion, szRegion, bE } func vfsShmLock(ctx context.Context, mod api.Module, pFile, offset, n uint32, flags _ShmFlag) _ErrorCode { - file := vfsFileGet(ctx, mod, pFile).(*vfsFile) - err := file.ShmLock(offset, n, flags) + file := vfsFileGet(ctx, mod, pFile).(fileShm) + err := file.shmLock(offset, n, flags) return vfsErrorCode(err, _IOERR_SHMLOCK) } func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _ErrorCode { - file := vfsFileGet(ctx, mod, pFile).(*vfsFile) - file.ShmUnmap(bDelete != 0) + file := vfsFileGet(ctx, mod, pFile).(fileShm) + file.shmUnmap(bDelete != 0) return _OK } @@ -462,3 +465,9 @@ func vfsErrorCode(err error, def _ErrorCode) _ErrorCode { } return def } + +type fileShm interface { + shmMap(context.Context, api.Module, uint32, uint32, bool) (uint32, error) + shmLock(uint32, uint32, _ShmFlag) error + shmUnmap(bool) +} diff --git a/vfs/vfs_test.go b/vfs/vfs_test.go index 0729a62d..91d390f4 100644 --- a/vfs/vfs_test.go +++ b/vfs/vfs_test.go @@ -212,7 +212,7 @@ func Test_vfsFile(t *testing.T) { ctx := util.NewContext(context.TODO()) // Open a temporary file. - rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0) + rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0, 0) if rc != _OK { t.Fatal("returned", rc) } @@ -284,7 +284,7 @@ func Test_vfsFile_psow(t *testing.T) { ctx := util.NewContext(context.TODO()) // Open a temporary file. - rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0) + rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0, 0) if rc != _OK { t.Fatal("returned", rc) } From 1d64b1ecc020f4bc7487b1882000aa79650cb41d Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 3 Apr 2024 17:12:10 +0100 Subject: [PATCH 15/30] Fix. --- vfs/os_bsd.go | 8 ++++---- vfs/os_darwin.go | 8 ++++---- vfs/os_ofd.go | 8 ++++---- vfs/os_unix_lock.go | 5 +++-- vfs/os_windows.go | 22 +++++++++------------- vfs/shm.go | 21 ++++++++++++--------- vfs/shm_other.go | 2 +- 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/vfs/os_bsd.go b/vfs/os_bsd.go index 441d3e9b..3506ec9e 100644 --- a/vfs/os_bsd.go +++ b/vfs/os_bsd.go @@ -32,14 +32,14 @@ func osWriteLock(file *os.File, _ /*start*/, _ /*len*/ int64, _ /*timeout*/ time return osLock(file, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK) } -func osCheckLock(file *os.File, start, len int64) (bool, _ErrorCode) { +func osGetLock(file *os.File, start, len int64) (int16, _ErrorCode) { lock := unix.Flock_t{ - Type: unix.F_RDLCK, + Type: unix.F_WRLCK, Start: start, Len: len, } if unix.FcntlFlock(file.Fd(), unix.F_GETLK, &lock) != nil { - return false, _IOERR_CHECKRESERVEDLOCK + return 0, _IOERR_CHECKRESERVEDLOCK } - return lock.Type != unix.F_UNLCK, _OK + return lock.Type, _OK } diff --git a/vfs/os_darwin.go b/vfs/os_darwin.go index 7c1ed959..4269445e 100644 --- a/vfs/os_darwin.go +++ b/vfs/os_darwin.go @@ -95,14 +95,14 @@ func osWriteLock(file *os.File, start, len int64, timeout time.Duration) _ErrorC return osLock(file, unix.F_WRLCK, start, len, timeout, _IOERR_LOCK) } -func osCheckLock(file *os.File, start, len int64) (bool, _ErrorCode) { +func osGetLock(file *os.File, start, len int64) (int16, _ErrorCode) { lock := unix.Flock_t{ - Type: unix.F_RDLCK, + Type: unix.F_WRLCK, Start: start, Len: len, } if unix.FcntlFlock(file.Fd(), _F_OFD_GETLK, &lock) != nil { - return false, _IOERR_CHECKRESERVEDLOCK + return 0, _IOERR_CHECKRESERVEDLOCK } - return lock.Type != unix.F_UNLCK, _OK + return lock.Type, _OK } diff --git a/vfs/os_ofd.go b/vfs/os_ofd.go index ced941eb..f94ece47 100644 --- a/vfs/os_ofd.go +++ b/vfs/os_ofd.go @@ -57,14 +57,14 @@ func osWriteLock(file *os.File, start, len int64, timeout time.Duration) _ErrorC return osLock(file, unix.F_WRLCK, start, len, timeout, _IOERR_LOCK) } -func osCheckLock(file *os.File, start, len int64) (bool, _ErrorCode) { +func osGetLock(file *os.File, start, len int64) (int16, _ErrorCode) { lock := unix.Flock_t{ - Type: unix.F_RDLCK, + Type: unix.F_WRLCK, Start: start, Len: len, } if unix.FcntlFlock(file.Fd(), unix.F_OFD_GETLK, &lock) != nil { - return false, _IOERR_CHECKRESERVEDLOCK + return 0, _IOERR_CHECKRESERVEDLOCK } - return lock.Type != unix.F_UNLCK, _OK + return lock.Type, _OK } diff --git a/vfs/os_unix_lock.go b/vfs/os_unix_lock.go index 8f90e67e..fc4309d4 100644 --- a/vfs/os_unix_lock.go +++ b/vfs/os_unix_lock.go @@ -11,7 +11,7 @@ import ( func osGetSharedLock(file *os.File) _ErrorCode { // Test the PENDING lock before acquiring a new SHARED lock. - if pending, _ := osCheckLock(file, _PENDING_BYTE, 1); pending { + if lock, _ := osGetLock(file, _PENDING_BYTE, 1); lock == unix.F_WRLCK { return _BUSY } // Acquire the SHARED lock. @@ -64,7 +64,8 @@ func osReleaseLock(file *os.File, _ LockLevel) _ErrorCode { func osCheckReservedLock(file *os.File) (bool, _ErrorCode) { // Test the RESERVED lock. - return osCheckLock(file, _RESERVED_BYTE, 1) + lock, rc := osGetLock(file, _RESERVED_BYTE, 1) + return lock == unix.F_WRLCK, rc } func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { diff --git a/vfs/os_windows.go b/vfs/os_windows.go index 9e53e14b..0fee2f17 100644 --- a/vfs/os_windows.go +++ b/vfs/os_windows.go @@ -12,7 +12,6 @@ import ( func osGetSharedLock(file *os.File) _ErrorCode { // Acquire the PENDING lock temporarily before acquiring a new SHARED lock. rc := osReadLock(file, _PENDING_BYTE, 1, 0) - if rc == _OK { // Acquire the SHARED lock. rc = osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0) @@ -96,7 +95,15 @@ func osReleaseLock(file *os.File, state LockLevel) _ErrorCode { func osCheckReservedLock(file *os.File) (bool, _ErrorCode) { // Test the RESERVED lock. - return osCheckLock(file, _RESERVED_BYTE, 1) + rc := osLock(file, 0, _RESERVED_BYTE, 1, 0, _IOERR_CHECKRESERVEDLOCK) + if rc == _BUSY { + return true, _OK + } + if rc == _OK { + // Release the RESERVED lock. + osUnlock(file, _RESERVED_BYTE, 1) + } + return false, rc } func osUnlock(file *os.File, start, len uint32) _ErrorCode { @@ -147,17 +154,6 @@ func osWriteLock(file *os.File, start, len uint32, timeout time.Duration) _Error return osLock(file, windows.LOCKFILE_EXCLUSIVE_LOCK, start, len, timeout, _IOERR_LOCK) } -func osCheckLock(file *os.File, start, len uint32) (bool, _ErrorCode) { - rc := osLock(file, 0, start, len, 0, _IOERR_CHECKRESERVEDLOCK) - if rc == _BUSY { - return true, _OK - } - if rc == _OK { - osUnlock(file, start, len) - } - return false, rc -} - func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { if err == nil { return _OK diff --git a/vfs/shm.go b/vfs/shm.go index 42760a7f..34fa50a8 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -37,8 +37,7 @@ func vfsVersion(mod api.Module) uint32 { return 0 } - // TODO: feeling lucky. - return 1 + return 1 // TODO: feeling lucky? } type vfsShm struct { @@ -73,7 +72,6 @@ const ( func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (_ uint32, err error) { // Ensure size is a multiple of the OS page size. - // TODO: don't implement shared memory if this isn't the case. if int(size)%unix.Getpagesize() != 0 { return 0, _IOERR_SHMMAP } @@ -88,15 +86,20 @@ func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, e } // Dead man's switch. - // TODO: fix race condition. - if rc := osReadLock(f.shm.file, _SHM_DMS, 1, 0); rc != _OK { - return 0, rc - } - if rc := osWriteLock(f.shm.file, _SHM_DMS, 1, 0); rc == _OK { + if lock, rc := osGetLock(f.shm.file, _SHM_DMS, 1); rc != _OK { + return 0, _IOERR_LOCK + } else if lock == unix.F_WRLCK { + return 0, _BUSY + } else if lock == unix.F_UNLCK { + if rc := osWriteLock(f.shm.file, _SHM_DMS, 1, 0); rc != _OK { + return 0, rc + } if err := f.shm.file.Truncate(0); err != nil { return 0, _IOERR_SHMOPEN } - osReadLock(f.shm.file, _SHM_DMS, 1, 0) + } + if rc := osReadLock(f.shm.file, _SHM_DMS, 1, 0); rc != _OK { + return 0, rc } // Check if file is big enough. diff --git a/vfs/shm_other.go b/vfs/shm_other.go index 4ed9c91b..0015f3ad 100644 --- a/vfs/shm_other.go +++ b/vfs/shm_other.go @@ -14,7 +14,7 @@ import "github.com/tetratelabs/wazero/api" // [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode const SupportsSharedMemory = false -func vfsVersion(mod api.Module) uint32 { return 0 } +func vfsVersion(api.Module) uint32 { return 0 } type vfsShm struct{} From 1a9709805fb14e80fc1ba3156096b6d8732feed3 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Thu, 4 Apr 2024 01:24:33 +0100 Subject: [PATCH 16/30] Recycle memory. --- internal/util/handle.go | 28 +++------- internal/util/mmap.go | 106 ++++++++++++++++++++++++++++++++++++ internal/util/mmap_other.go | 7 +++ internal/util/module.go | 25 +++++++++ tests/wal_test.go | 33 +++++++++++ vfs/file.go | 2 +- vfs/shm.go | 89 ++++++++---------------------- vfs/shm_other.go | 2 +- 8 files changed, 206 insertions(+), 86 deletions(-) create mode 100644 internal/util/mmap.go create mode 100644 internal/util/mmap_other.go create mode 100644 internal/util/module.go create mode 100644 tests/wal_test.go diff --git a/internal/util/handle.go b/internal/util/handle.go index 2309ed47..fc274579 100644 --- a/internal/util/handle.go +++ b/internal/util/handle.go @@ -3,38 +3,28 @@ package util import ( "context" "io" - - "github.com/tetratelabs/wazero/experimental" ) -type handleKey struct{} type handleState struct { handles []any - empty int -} - -func NewContext(ctx context.Context) context.Context { - state := new(handleState) - ctx = experimental.WithCloseNotifier(ctx, state) - ctx = context.WithValue(ctx, handleKey{}, state) - return ctx + holes int } -func (s *handleState) CloseNotify(ctx context.Context, exitCode uint32) { +func (s *handleState) closeNotify() { for _, h := range s.handles { if c, ok := h.(io.Closer); ok { c.Close() } } s.handles = nil - s.empty = 0 + s.holes = 0 } func GetHandle(ctx context.Context, id uint32) any { if id == 0 { return nil } - s := ctx.Value(handleKey{}).(*handleState) + s := ctx.Value(moduleKey{}).(*moduleState) return s.handles[^id] } @@ -42,10 +32,10 @@ func DelHandle(ctx context.Context, id uint32) error { if id == 0 { return nil } - s := ctx.Value(handleKey{}).(*handleState) + s := ctx.Value(moduleKey{}).(*moduleState) a := s.handles[^id] s.handles[^id] = nil - s.empty++ + s.holes++ if c, ok := a.(io.Closer); ok { return c.Close() } @@ -56,13 +46,13 @@ func AddHandle(ctx context.Context, a any) (id uint32) { if a == nil { panic(NilErr) } - s := ctx.Value(handleKey{}).(*handleState) + s := ctx.Value(moduleKey{}).(*moduleState) // Find an empty slot. - if s.empty > cap(s.handles)-len(s.handles) { + if s.holes > cap(s.handles)-len(s.handles) { for id, h := range s.handles { if h == nil { - s.empty-- + s.holes-- s.handles[id] = a return ^uint32(id) } diff --git a/internal/util/mmap.go b/internal/util/mmap.go new file mode 100644 index 00000000..7cedafe5 --- /dev/null +++ b/internal/util/mmap.go @@ -0,0 +1,106 @@ +//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_flock && !sqlite3_nosys + +package util + +import ( + "context" + "os" + "unsafe" + + "github.com/tetratelabs/wazero/api" + "golang.org/x/sys/unix" +) + +type mmapState struct { + regions []*MappedRegion +} + +func (s *mmapState) closeNotify() { + for _, r := range s.regions { + r.Close() + } + s.regions = nil +} + +func (s *mmapState) new(ctx context.Context, mod api.Module, size uint32) *MappedRegion { + // Find unused region. + for _, r := range s.regions { + if !r.used && r.size == size { + return r + } + } + + // Allocate page aligned memmory. + alloc := mod.ExportedFunction("aligned_alloc") + stack := [2]uint64{ + uint64(unix.Getpagesize()), + uint64(size), + } + if err := alloc.CallWithStack(ctx, stack[:]); err != nil { + panic(err) + } + if stack[0] == 0 { + panic(OOMErr) + } + + // Save the newly allocated region. + ptr := uint32(stack[0]) + buf := View(mod, ptr, uint64(size)) + addr := uintptr(unsafe.Pointer(&buf[0])) + s.regions = append(s.regions, &MappedRegion{ + Ptr: ptr, + addr: addr, + size: size, + }) + return s.regions[len(s.regions)-1] +} + +type MappedRegion struct { + addr uintptr + Ptr uint32 + size uint32 + used bool +} + +func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, size uint32) (*MappedRegion, error) { + s := ctx.Value(moduleKey{}).(*moduleState) + r := s.new(ctx, mod, size) + err := r.mmap(f, offset) + if err != nil { + return nil, err + } + return r, nil +} + +func (r *MappedRegion) Close() error { + if addr := r.addr; addr != 0 { + r.addr = 0 + return munmap(addr, uintptr(r.size)) + } + return nil +} + +func (r *MappedRegion) Unmap() error { + // We can't munmap the region, otherwise it could be remaped. + // Instead, convert it to a protected, private, anonymous mapping. + // If successful, it can be reused for a subsequent mmap. + _, err := mmap(r.addr, uintptr(r.size), + unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_ANON|unix.MAP_FIXED, + -1, 0) + r.used = err != nil + return err +} + +func (r *MappedRegion) mmap(f *os.File, offset int64) error { + _, err := mmap(r.addr, uintptr(r.size), + unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED|unix.MAP_FIXED, + int(f.Fd()), offset) + r.used = err == nil + return err +} + +//go:linkname mmap syscall.mmap +func mmap(addr, length uintptr, prot, flag, fd int, pos int64) (uintptr, error) + +//go:linkname munmap syscall.munmap +func munmap(addr, length uintptr) error diff --git a/internal/util/mmap_other.go b/internal/util/mmap_other.go new file mode 100644 index 00000000..7b4bfa4f --- /dev/null +++ b/internal/util/mmap_other.go @@ -0,0 +1,7 @@ +//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_flock || sqlite3_nosys + +package util + +type mmapState struct{} + +func (s mmapState) closeNotify() {} diff --git a/internal/util/module.go b/internal/util/module.go new file mode 100644 index 00000000..edf9c60a --- /dev/null +++ b/internal/util/module.go @@ -0,0 +1,25 @@ +package util + +import ( + "context" + + "github.com/tetratelabs/wazero/experimental" +) + +type moduleKey struct{} +type moduleState struct { + handleState + mmapState +} + +func NewContext(ctx context.Context) context.Context { + state := new(moduleState) + ctx = experimental.WithCloseNotifier(ctx, state) + ctx = context.WithValue(ctx, moduleKey{}, state) + return ctx +} + +func (s *moduleState) CloseNotify(ctx context.Context, exitCode uint32) { + s.handleState.closeNotify() + s.mmapState.closeNotify() +} diff --git a/tests/wal_test.go b/tests/wal_test.go new file mode 100644 index 00000000..3076b64a --- /dev/null +++ b/tests/wal_test.go @@ -0,0 +1,33 @@ +package tests + +import ( + "path/filepath" + "testing" + + "github.com/ncruces/go-sqlite3" +) + +func TestWAL_enter_exit(t *testing.T) { + t.Parallel() + + file := filepath.Join(t.TempDir(), "test.db") + + db, err := sqlite3.Open(file) + if err != nil { + t.Fatal(err) + } + defer db.Close() + + err = db.Exec(` + CREATE TABLE test (col); + PRAGMA journal_mode=WAL; + SELECT * FROM test; + PRAGMA journal_mode=DELETE; + SELECT * FROM test; + PRAGMA journal_mode=WAL; + SELECT * FROM test; + `) + if err != nil { + t.Fatal(err) + } +} diff --git a/vfs/file.go b/vfs/file.go index c2fed5c7..42d03ed6 100644 --- a/vfs/file.go +++ b/vfs/file.go @@ -143,7 +143,7 @@ var ( ) func (f *vfsFile) Close() error { - f.shm.free() + f.shm.Close() return f.File.Close() } diff --git a/vfs/shm.go b/vfs/shm.go index 34fa50a8..5255c709 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -41,27 +41,8 @@ func vfsVersion(mod api.Module) uint32 { } type vfsShm struct { - file *os.File - regions []shmRegion -} - -func (s *vfsShm) free() { - // Unmap pages. - for _, r := range s.regions { - munmap(r.addr, uintptr(r.length)) - } - - // Close the file. - if s.file != nil { - s.file.Close() - } - - *s = vfsShm{} -} - -type shmRegion struct { - addr uintptr - length uint32 + *os.File + regions []*util.MappedRegion } const ( @@ -77,33 +58,32 @@ func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, e } // TODO: handle the read-only case. - // TODO: should we close the file on error? - if f.shm.file == nil { - f.shm.file, err = os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + if f.shm.File == nil { + f.shm.File, err = os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) if err != nil { return 0, _IOERR_SHMOPEN } } // Dead man's switch. - if lock, rc := osGetLock(f.shm.file, _SHM_DMS, 1); rc != _OK { + if lock, rc := osGetLock(f.shm.File, _SHM_DMS, 1); rc != _OK { return 0, _IOERR_LOCK } else if lock == unix.F_WRLCK { return 0, _BUSY } else if lock == unix.F_UNLCK { - if rc := osWriteLock(f.shm.file, _SHM_DMS, 1, 0); rc != _OK { + if rc := osWriteLock(f.shm.File, _SHM_DMS, 1, 0); rc != _OK { return 0, rc } - if err := f.shm.file.Truncate(0); err != nil { + if err := f.shm.Truncate(0); err != nil { return 0, _IOERR_SHMOPEN } } - if rc := osReadLock(f.shm.file, _SHM_DMS, 1, 0); rc != _OK { + if rc := osReadLock(f.shm.File, _SHM_DMS, 1, 0); rc != _OK { return 0, rc } // Check if file is big enough. - s, err := f.shm.file.Seek(0, io.SeekEnd) + s, err := f.shm.Seek(0, io.SeekEnd) if err != nil { return 0, _IOERR_SHMSIZE } @@ -111,36 +91,18 @@ func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, e if !extend { return 0, nil } - err := osAllocate(f.shm.file, n) + err := osAllocate(f.shm.File, n) if err != nil { return 0, _IOERR_SHMOPEN } } - // Allocate some page aligned memmory. - alloc := mod.ExportedFunction("aligned_alloc") - stack := [2]uint64{ - uint64(unix.Getpagesize()), - uint64(size), - } - if err := alloc.CallWithStack(ctx, stack[:]); err != nil { - panic(err) - } - if stack[0] == 0 { - panic(util.OOMErr) - } - - // Map the file into the allocated pages. - p := util.View(mod, uint32(stack[0]), uint64(size)) - a, err := mmap(uintptr(unsafe.Pointer(&p[0])), uintptr(size), - unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED|unix.MAP_FIXED, - int(f.shm.file.Fd()), int64(id)*int64(size)) + r, err := util.MapRegion(ctx, mod, f.shm.File, int64(id)*int64(size), size) if err != nil { - return 0, _IOERR_SHMMAP + return 0, err } - - f.shm.regions = append(f.shm.regions, shmRegion{a, size}) - return uint32(stack[0]), nil + f.shm.regions = append(f.shm.regions, r) + return r.Ptr, nil } func (f *vfsFile) shmLock(offset, n uint32, flags _ShmFlag) error { @@ -164,33 +126,30 @@ func (f *vfsFile) shmLock(offset, n uint32, flags _ShmFlag) error { switch { case flags&_SHM_UNLOCK != 0: - return osUnlock(f.shm.file, _SHM_BASE+int64(offset), int64(n)) + return osUnlock(f.shm.File, _SHM_BASE+int64(offset), int64(n)) case flags&_SHM_SHARED != 0: - return osReadLock(f.shm.file, _SHM_BASE+int64(offset), int64(n), 0) + return osReadLock(f.shm.File, _SHM_BASE+int64(offset), int64(n), 0) case flags&_SHM_EXCLUSIVE != 0: - return osWriteLock(f.shm.file, _SHM_BASE+int64(offset), int64(n), 0) + return osWriteLock(f.shm.File, _SHM_BASE+int64(offset), int64(n), 0) default: panic(util.AssertErr()) } } func (f *vfsFile) shmUnmap(delete bool) { - // TODO: recycle the malloc'd memory pages. - - // Protect pages. + // Unmap regions. for _, r := range f.shm.regions { - mmap(r.addr, uintptr(r.length), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_FIXED, -1, 0) + r.Unmap() } + clear(f.shm.regions) f.shm.regions = f.shm.regions[:0] // Close the file. - if f.shm.file != nil { - if delete { - os.Remove(f.shm.file.Name()) - } - f.shm.file.Close() - f.shm.file = nil + if delete && f.shm.File != nil { + os.Remove(f.shm.Name()) } + f.shm.Close() + f.shm.File = nil } //go:linkname mmap syscall.mmap diff --git a/vfs/shm_other.go b/vfs/shm_other.go index 0015f3ad..80520917 100644 --- a/vfs/shm_other.go +++ b/vfs/shm_other.go @@ -18,4 +18,4 @@ func vfsVersion(api.Module) uint32 { return 0 } type vfsShm struct{} -func (vfsShm) free() {} +func (vfsShm) Close() error { return nil } From a031df4d470ed3f6cece00e9665bcdaabe237c3b Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Thu, 4 Apr 2024 23:58:27 +0100 Subject: [PATCH 17/30] Update. --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 8 ++++++-- vfs/shm.go | 6 ------ 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index e2e09ed8..06c224d3 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413 +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda diff --git a/go.sum b/go.sum index 35878aa4..9b583974 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413 h1:wUE8Bx0aoqNFkRu+GbC3/51kyq0hmE4txY8Z2EqEHhM= -github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda h1:h5j5BA3or4zZrValD2w2iGTEMZakEjO6qLVHhGzv+uU= +github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index da8019f2..f1197dc0 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,7 +1,11 @@ -github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413 h1:wUE8Bx0aoqNFkRu+GbC3/51kyq0hmE4txY8Z2EqEHhM= -github.com/ncruces/wazero v0.0.0-20240401071028-c9d05f062413/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda h1:h5j5BA3or4zZrValD2w2iGTEMZakEjO6qLVHhGzv+uU= +github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/vfs/shm.go b/vfs/shm.go index 5255c709..6d50a2bd 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -151,9 +151,3 @@ func (f *vfsFile) shmUnmap(delete bool) { f.shm.Close() f.shm.File = nil } - -//go:linkname mmap syscall.mmap -func mmap(addr, length uintptr, prot, flag, fd int, pos int64) (uintptr, error) - -//go:linkname munmap syscall.munmap -func munmap(addr, length uintptr) error From 761b3b526e5e5dccc6a0bc237fa8a912c513f1d7 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 5 Apr 2024 00:40:29 +0100 Subject: [PATCH 18/30] Fix crashes. --- internal/util/mmap.go | 6 +----- tests/wal_test.go | 12 ++++++++++++ vfs/shm.go | 14 +++++--------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/internal/util/mmap.go b/internal/util/mmap.go index 7cedafe5..60b4ef12 100644 --- a/internal/util/mmap.go +++ b/internal/util/mmap.go @@ -73,11 +73,7 @@ func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, si } func (r *MappedRegion) Close() error { - if addr := r.addr; addr != 0 { - r.addr = 0 - return munmap(addr, uintptr(r.size)) - } - return nil + return munmap(r.addr, uintptr(r.size)) } func (r *MappedRegion) Unmap() error { diff --git a/tests/wal_test.go b/tests/wal_test.go index 3076b64a..db049a06 100644 --- a/tests/wal_test.go +++ b/tests/wal_test.go @@ -1,12 +1,24 @@ package tests import ( + "os" "path/filepath" "testing" "github.com/ncruces/go-sqlite3" + "github.com/ncruces/go-sqlite3/vfs" + "github.com/tetratelabs/wazero" ) +func TestMain(m *testing.M) { + if vfs.SupportsSharedMemory { + sqlite3.RuntimeConfig = wazero.NewRuntimeConfig(). + WithMemoryCapacityFromMax(true). + WithMemoryLimitPages(1024) + } + os.Exit(m.Run()) +} + func TestWAL_enter_exit(t *testing.T) { t.Parallel() diff --git a/vfs/shm.go b/vfs/shm.go index 6d50a2bd..29db5f1b 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -6,7 +6,7 @@ import ( "context" "io" "os" - "unsafe" + "reflect" "github.com/ncruces/go-sqlite3/internal/util" "github.com/tetratelabs/wazero/api" @@ -24,20 +24,16 @@ import ( const SupportsSharedMemory = true func vfsVersion(mod api.Module) uint32 { - pagesize := unix.Getpagesize() - // 32KB pages must be a multiple of the system's page size. - if (32*1024)%pagesize != 0 { + if (32*1024)%unix.Getpagesize() != 0 { return 0 } - // The module's memory must be page aligned. - b, ok := mod.Memory().Read(0, 1) - if ok && uintptr(unsafe.Pointer(&b[0]))%uintptr(pagesize) != 0 { + // Memory must have been mmaped. + if reflect.ValueOf(mod.Memory()).Elem().FieldByName("mmappedBuffer").IsNil() { return 0 } - - return 1 // TODO: feeling lucky? + return 1 } type vfsShm struct { From 7c71d1ddf100f29c042ff80fb71f6108a7081355 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sat, 6 Apr 2024 01:17:04 +0100 Subject: [PATCH 19/30] Experimental memory allocator. --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 6 +++--- internal/util/mmap.go | 28 ++++++++++++++++++++++++- internal/util/module.go | 6 ++++-- sqlite.go | 5 +++-- tests/parallel/parallel_test.go | 5 ++--- tests/wal_test.go | 5 ++--- vfs/lock_test.go | 2 +- vfs/shm.go | 14 ------------- vfs/tests/mptest/mptest_test.go | 26 ++++++++++------------- vfs/tests/speedtest1/speedtest1_test.go | 2 +- vfs/vfs.go | 4 ++-- vfs/vfs_test.go | 4 ++-- 14 files changed, 61 insertions(+), 52 deletions(-) diff --git a/go.mod b/go.mod index 06c224d3..347ebc96 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a diff --git a/go.sum b/go.sum index 9b583974..59bfd227 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda h1:h5j5BA3or4zZrValD2w2iGTEMZakEjO6qLVHhGzv+uU= -github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a h1:1DZabuydfBLCHWv691xyqATKM6xTJrURI11kg8dSdYQ= +github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index f1197dc0..1fd2775a 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,11 +1,11 @@ -github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda h1:h5j5BA3or4zZrValD2w2iGTEMZakEjO6qLVHhGzv+uU= -github.com/ncruces/wazero v0.0.0-20240404140250-1972d8f0bcda/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a h1:1DZabuydfBLCHWv691xyqATKM6xTJrURI11kg8dSdYQ= +github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/internal/util/mmap.go b/internal/util/mmap.go index 60b4ef12..b2a92052 100644 --- a/internal/util/mmap.go +++ b/internal/util/mmap.go @@ -13,6 +13,7 @@ import ( type mmapState struct { regions []*MappedRegion + enabled bool } func (s *mmapState) closeNotify() { @@ -22,6 +23,11 @@ func (s *mmapState) closeNotify() { s.regions = nil } +func CanMap(ctx context.Context) bool { + s := ctx.Value(moduleKey{}).(*moduleState) + return s.mmapState.enabled +} + func (s *mmapState) new(ctx context.Context, mod api.Module, size uint32) *MappedRegion { // Find unused region. for _, r := range s.regions { @@ -95,8 +101,28 @@ func (r *MappedRegion) mmap(f *os.File, offset int64) error { return err } +type mappableMemoryAllocator struct{} + +func (mappableMemoryAllocator) Make(min, cap, max uint64) []byte { + addr, err := mmap(0, uintptr(max), + unix.PROT_READ|unix.PROT_WRITE, unix.MAP_PRIVATE|unix.MAP_ANON, + -1, 0) + if err != nil { + panic(OOMErr) + } + return unsafe.Slice(addr, max)[:min] +} + +func (mappableMemoryAllocator) Grow(old []byte, more uint64) []byte { + panic(OOMErr) +} + +func (mappableMemoryAllocator) Free(buf []byte) { + munmap(uintptr(unsafe.Pointer(&buf[0])), uintptr(cap(buf))) +} + //go:linkname mmap syscall.mmap -func mmap(addr, length uintptr, prot, flag, fd int, pos int64) (uintptr, error) +func mmap(addr, length uintptr, prot, flag, fd int, pos int64) (*byte, error) //go:linkname munmap syscall.munmap func munmap(addr, length uintptr) error diff --git a/internal/util/module.go b/internal/util/module.go index edf9c60a..b0297a43 100644 --- a/internal/util/module.go +++ b/internal/util/module.go @@ -12,10 +12,12 @@ type moduleState struct { mmapState } -func NewContext(ctx context.Context) context.Context { +func NewContext(ctx context.Context, mappableMemory bool) context.Context { state := new(moduleState) - ctx = experimental.WithCloseNotifier(ctx, state) + state.mmapState.enabled = mappableMemory ctx = context.WithValue(ctx, moduleKey{}, state) + ctx = experimental.WithCloseNotifier(ctx, state) + ctx = experimental.WithMemoryAllocator(ctx, mappableMemoryAllocator{}) return ctx } diff --git a/sqlite.go b/sqlite.go index 56ea68b8..8aefd400 100644 --- a/sqlite.go +++ b/sqlite.go @@ -25,7 +25,8 @@ var ( Binary []byte // Wasm binary to load. Path string // Path to load the binary from. - RuntimeConfig wazero.RuntimeConfig + RuntimeConfig wazero.RuntimeConfig + MappableMemory bool ) var instance struct { @@ -85,7 +86,7 @@ func instantiateSQLite() (sqlt *sqlite, err error) { } sqlt = new(sqlite) - sqlt.ctx = util.NewContext(context.Background()) + sqlt.ctx = util.NewContext(context.Background(), MappableMemory) sqlt.mod, err = instance.runtime.InstantiateModule(sqlt.ctx, instance.compiled, wazero.NewModuleConfig()) diff --git a/tests/parallel/parallel_test.go b/tests/parallel/parallel_test.go index e0740f00..0be52a16 100644 --- a/tests/parallel/parallel_test.go +++ b/tests/parallel/parallel_test.go @@ -19,9 +19,8 @@ import ( func TestMain(m *testing.M) { if vfs.SupportsSharedMemory { - sqlite3.RuntimeConfig = wazero.NewRuntimeConfig(). - WithMemoryCapacityFromMax(true). - WithMemoryLimitPages(1024) + sqlite3.RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryLimitPages(1024) + sqlite3.MappableMemory = true } os.Exit(m.Run()) } diff --git a/tests/wal_test.go b/tests/wal_test.go index db049a06..874dd960 100644 --- a/tests/wal_test.go +++ b/tests/wal_test.go @@ -12,9 +12,8 @@ import ( func TestMain(m *testing.M) { if vfs.SupportsSharedMemory { - sqlite3.RuntimeConfig = wazero.NewRuntimeConfig(). - WithMemoryCapacityFromMax(true). - WithMemoryLimitPages(1024) + sqlite3.RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryLimitPages(1024) + sqlite3.MappableMemory = true } os.Exit(m.Run()) } diff --git a/vfs/lock_test.go b/vfs/lock_test.go index db1c4df8..6cf359c1 100644 --- a/vfs/lock_test.go +++ b/vfs/lock_test.go @@ -33,7 +33,7 @@ func Test_vfsLock(t *testing.T) { pOutput = 32 ) mod := wazerotest.NewModule(wazerotest.NewMemory(wazerotest.PageSize)) - ctx := util.NewContext(context.TODO()) + ctx := util.NewContext(context.TODO(), false) vfsFileRegister(ctx, mod, pFile1, &vfsFile{File: file1}) vfsFileRegister(ctx, mod, pFile2, &vfsFile{File: file2}) diff --git a/vfs/shm.go b/vfs/shm.go index 29db5f1b..e5b4d2d1 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -6,7 +6,6 @@ import ( "context" "io" "os" - "reflect" "github.com/ncruces/go-sqlite3/internal/util" "github.com/tetratelabs/wazero/api" @@ -23,19 +22,6 @@ import ( // [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode const SupportsSharedMemory = true -func vfsVersion(mod api.Module) uint32 { - // 32KB pages must be a multiple of the system's page size. - if (32*1024)%unix.Getpagesize() != 0 { - return 0 - } - - // Memory must have been mmaped. - if reflect.ValueOf(mod.Memory()).Elem().FieldByName("mmappedBuffer").IsNil() { - return 0 - } - return 1 -} - type vfsShm struct { *os.File regions []*util.MappedRegion diff --git a/vfs/tests/mptest/mptest_test.go b/vfs/tests/mptest/mptest_test.go index 8c25926b..6ef2af96 100644 --- a/vfs/tests/mptest/mptest_test.go +++ b/vfs/tests/mptest/mptest_test.go @@ -39,11 +39,7 @@ var ( func TestMain(m *testing.M) { ctx := context.Background() - cfg := wazero.NewRuntimeConfig() - if vfs.SupportsSharedMemory { - cfg = cfg.WithMemoryLimitPages(1024).WithMemoryCapacityFromMax(true) - } - rt = wazero.NewRuntimeWithConfig(ctx, cfg) + rt = wazero.NewRuntime(ctx) wasi_snapshot_preview1.MustInstantiate(ctx, rt) env := vfs.ExportHostFunctions(rt.NewHostModuleBuilder("env")) @@ -96,7 +92,7 @@ func system(ctx context.Context, mod api.Module, ptr uint32) uint32 { cfg := config(ctx).WithArgs(args...) go func() { - ctx := util.NewContext(ctx) + ctx := util.NewContext(ctx, true) mod, _ := rt.InstantiateModule(ctx, module, cfg) mod.Close(ctx) }() @@ -104,7 +100,7 @@ func system(ctx context.Context, mod api.Module, ptr uint32) uint32 { } func Test_config01(t *testing.T) { - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), false) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "config01.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -122,7 +118,7 @@ func Test_config02(t *testing.T) { t.Skip("skipping in CI") } - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), false) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "config02.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -140,7 +136,7 @@ func Test_crash01(t *testing.T) { t.Skip("skipping in CI") } - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), false) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "crash01.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -155,7 +151,7 @@ func Test_multiwrite01(t *testing.T) { t.Skip("skipping in short mode") } - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), false) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "multiwrite01.test") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -166,7 +162,7 @@ func Test_multiwrite01(t *testing.T) { } func Test_config01_memory(t *testing.T) { - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), false) cfg := config(ctx).WithArgs("mptest", "/test.db", "config01.test", "--vfs", "memdb") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -181,7 +177,7 @@ func Test_multiwrite01_memory(t *testing.T) { t.Skip("skipping in short mode") } - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), false) cfg := config(ctx).WithArgs("mptest", "/test.db", "multiwrite01.test", "--vfs", "memdb") mod, err := rt.InstantiateModule(ctx, module, cfg) @@ -192,7 +188,7 @@ func Test_multiwrite01_memory(t *testing.T) { } func Test_config01_wal(t *testing.T) { - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), true) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "config01.test", "--journalmode", "wal") @@ -214,7 +210,7 @@ func Test_crash01_wal(t *testing.T) { t.Skip("skipping without shared memory") } - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), true) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "crash01.test", "--journalmode", "wal") @@ -233,7 +229,7 @@ func Test_multiwrite01_wal(t *testing.T) { t.Skip("skipping without shared memory") } - ctx := util.NewContext(newContext(t)) + ctx := util.NewContext(newContext(t), true) name := filepath.Join(t.TempDir(), "test.db") cfg := config(ctx).WithArgs("mptest", name, "multiwrite01.test", "--journalmode", "wal") diff --git a/vfs/tests/speedtest1/speedtest1_test.go b/vfs/tests/speedtest1/speedtest1_test.go index a0e59af3..786d6b95 100644 --- a/vfs/tests/speedtest1/speedtest1_test.go +++ b/vfs/tests/speedtest1/speedtest1_test.go @@ -84,7 +84,7 @@ func initFlags() { func Benchmark_speedtest1(b *testing.B) { output.Reset() - ctx := util.NewContext(context.Background()) + ctx := util.NewContext(context.Background(), false) name := filepath.Join(b.TempDir(), "test.db") args := append(options, "--size", strconv.Itoa(b.N), name) cfg := wazero.NewModuleConfig(). diff --git a/vfs/vfs.go b/vfs/vfs.go index 67acfeec..9241a72e 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -170,8 +170,8 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla if pOutFlags != 0 { util.WriteUint32(mod, pOutFlags, uint32(flags)) } - if pOutVersion != 0 { - util.WriteUint32(mod, pOutVersion, vfsVersion(mod)) + if pOutVersion != 0 && util.CanMap(ctx) { + util.WriteUint32(mod, pOutVersion, 1) } vfsFileRegister(ctx, mod, pFile, file) return _OK diff --git a/vfs/vfs_test.go b/vfs/vfs_test.go index 91d390f4..872ca07e 100644 --- a/vfs/vfs_test.go +++ b/vfs/vfs_test.go @@ -209,7 +209,7 @@ func Test_vfsAccess(t *testing.T) { func Test_vfsFile(t *testing.T) { mod := wazerotest.NewModule(wazerotest.NewMemory(wazerotest.PageSize)) - ctx := util.NewContext(context.TODO()) + ctx := util.NewContext(context.TODO(), false) // Open a temporary file. rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0, 0) @@ -281,7 +281,7 @@ func Test_vfsFile(t *testing.T) { func Test_vfsFile_psow(t *testing.T) { mod := wazerotest.NewModule(wazerotest.NewMemory(wazerotest.PageSize)) - ctx := util.NewContext(context.TODO()) + ctx := util.NewContext(context.TODO(), false) // Open a temporary file. rc := vfsOpen(ctx, mod, 0, 0, 4, OPEN_CREATE|OPEN_EXCLUSIVE|OPEN_READWRITE|OPEN_DELETEONCLOSE, 0, 0) From 17c11c87773b3685ca27229be7dd585710981559 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sat, 6 Apr 2024 01:26:01 +0100 Subject: [PATCH 20/30] Portability. --- internal/util/mmap.go | 9 +++++++++ internal/util/mmap_other.go | 10 ++++++++++ internal/util/module.go | 3 +-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/internal/util/mmap.go b/internal/util/mmap.go index b2a92052..e38fb2d1 100644 --- a/internal/util/mmap.go +++ b/internal/util/mmap.go @@ -8,6 +8,7 @@ import ( "unsafe" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental" "golang.org/x/sys/unix" ) @@ -16,6 +17,14 @@ type mmapState struct { enabled bool } +func (s *mmapState) init(ctx context.Context, enabled bool) context.Context { + if enabled { + s.enabled = enabled + return experimental.WithMemoryAllocator(ctx, mappableMemoryAllocator{}) + } + return ctx +} + func (s *mmapState) closeNotify() { for _, r := range s.regions { r.Close() diff --git a/internal/util/mmap_other.go b/internal/util/mmap_other.go index 7b4bfa4f..d710f28e 100644 --- a/internal/util/mmap_other.go +++ b/internal/util/mmap_other.go @@ -2,6 +2,16 @@ package util +import "context" + type mmapState struct{} func (s mmapState) closeNotify() {} + +func (s *mmapState) init(ctx context.Context, _ bool) context.Context { + return ctx +} + +func CanMap(ctx context.Context) bool { + return false +} diff --git a/internal/util/module.go b/internal/util/module.go index b0297a43..a1b78428 100644 --- a/internal/util/module.go +++ b/internal/util/module.go @@ -14,10 +14,9 @@ type moduleState struct { func NewContext(ctx context.Context, mappableMemory bool) context.Context { state := new(moduleState) - state.mmapState.enabled = mappableMemory ctx = context.WithValue(ctx, moduleKey{}, state) ctx = experimental.WithCloseNotifier(ctx, state) - ctx = experimental.WithMemoryAllocator(ctx, mappableMemoryAllocator{}) + ctx = state.mmapState.init(ctx, mappableMemory) return ctx } From cd96f94357594155538841d286038596b0423d22 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sat, 6 Apr 2024 02:12:08 +0100 Subject: [PATCH 21/30] More. --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 347ebc96..1c602271 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814 diff --git a/go.sum b/go.sum index 59bfd227..5fb0a808 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a h1:1DZabuydfBLCHWv691xyqATKM6xTJrURI11kg8dSdYQ= -github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814 h1:7aA1oIiJoXdSLNRydI3Gy+ahyqrv3yg84YxBwWOTQxw= +github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index 1fd2775a..8863406e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,5 @@ -github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a h1:1DZabuydfBLCHWv691xyqATKM6xTJrURI11kg8dSdYQ= -github.com/ncruces/wazero v0.0.0-20240405233659-36d78839245a/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814 h1:7aA1oIiJoXdSLNRydI3Gy+ahyqrv3yg84YxBwWOTQxw= +github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= From 5ecaa16b59c4a040b63b18929641383535863db4 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sat, 6 Apr 2024 10:21:24 +0100 Subject: [PATCH 22/30] New allocator API. --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 4 ++-- internal/util/mmap.go | 23 ++++++++++++++--------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 1c602271..0f72268a 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814 +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534 diff --git a/go.sum b/go.sum index 5fb0a808..9f6b2e8a 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814 h1:7aA1oIiJoXdSLNRydI3Gy+ahyqrv3yg84YxBwWOTQxw= -github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534 h1:vwZhKUCXCqevZrU8HaSvT1HgXJxBW/JCfMUSj+Clsss= +github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index 8863406e..508feb92 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,5 @@ -github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814 h1:7aA1oIiJoXdSLNRydI3Gy+ahyqrv3yg84YxBwWOTQxw= -github.com/ncruces/wazero v0.0.0-20240406010626-a95924b60814/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534 h1:vwZhKUCXCqevZrU8HaSvT1HgXJxBW/JCfMUSj+Clsss= +github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= diff --git a/internal/util/mmap.go b/internal/util/mmap.go index e38fb2d1..e77a2a73 100644 --- a/internal/util/mmap.go +++ b/internal/util/mmap.go @@ -20,7 +20,7 @@ type mmapState struct { func (s *mmapState) init(ctx context.Context, enabled bool) context.Context { if enabled { s.enabled = enabled - return experimental.WithMemoryAllocator(ctx, mappableMemoryAllocator{}) + return experimental.WithMemoryAllocator(ctx, &mappableMemoryAllocator{}) } return ctx } @@ -110,24 +110,29 @@ func (r *MappedRegion) mmap(f *os.File, offset int64) error { return err } -type mappableMemoryAllocator struct{} +type mappableMemoryAllocator struct { + addr *byte + size uintptr +} -func (mappableMemoryAllocator) Make(min, cap, max uint64) []byte { - addr, err := mmap(0, uintptr(max), +func (m *mappableMemoryAllocator) Make(min, cap, max uint64) []byte { + var err error + m.size = uintptr(max) + m.addr, err = mmap(0, m.size, unix.PROT_READ|unix.PROT_WRITE, unix.MAP_PRIVATE|unix.MAP_ANON, -1, 0) if err != nil { panic(OOMErr) } - return unsafe.Slice(addr, max)[:min] + return unsafe.Slice(m.addr, max)[:min] } -func (mappableMemoryAllocator) Grow(old []byte, more uint64) []byte { - panic(OOMErr) +func (m *mappableMemoryAllocator) Free() { + munmap(uintptr(unsafe.Pointer(m.addr)), m.size) } -func (mappableMemoryAllocator) Free(buf []byte) { - munmap(uintptr(unsafe.Pointer(&buf[0])), uintptr(cap(buf))) +func (mappableMemoryAllocator) Grow(uint64) []byte { + panic(OOMErr) } //go:linkname mmap syscall.mmap From 6f5e71df3c0f01bdcae3481040dd217dfe2996ff Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sun, 7 Apr 2024 00:40:50 +0100 Subject: [PATCH 23/30] Readonly. --- vfs/const.go | 1 + vfs/shm.go | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/vfs/const.go b/vfs/const.go index 1ec7ea91..6405d618 100644 --- a/vfs/const.go +++ b/vfs/const.go @@ -48,6 +48,7 @@ const ( _IOERR_ROLLBACK_ATOMIC _ErrorCode = util.IOERR_ROLLBACK_ATOMIC _CANTOPEN_FULLPATH _ErrorCode = util.CANTOPEN_FULLPATH _CANTOPEN_ISDIR _ErrorCode = util.CANTOPEN_ISDIR + _READONLY_CANTINIT _ErrorCode = util.READONLY_CANTINIT _OK_SYMLINK _ErrorCode = util.OK_SYMLINK ) diff --git a/vfs/shm.go b/vfs/shm.go index e5b4d2d1..2cd5634d 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -33,18 +33,24 @@ const ( _SHM_DMS = _SHM_BASE + _SHM_NLOCK ) -func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (_ uint32, err error) { +func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) { // Ensure size is a multiple of the OS page size. if int(size)%unix.Getpagesize() != 0 { return 0, _IOERR_SHMMAP } - // TODO: handle the read-only case. if f.shm.File == nil { - f.shm.File, err = os.OpenFile(f.Name()+"-shm", unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + var flag int + if f.readOnly { + flag = unix.O_RDONLY | unix.O_NOFOLLOW + } else { + flag = unix.O_RDWR | unix.O_CREAT | unix.O_NOFOLLOW + } + s, err := os.OpenFile(f.Name()+"-shm", flag, 0666) if err != nil { - return 0, _IOERR_SHMOPEN + return 0, _CANTOPEN } + f.shm.File = s } // Dead man's switch. @@ -53,6 +59,9 @@ func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, e } else if lock == unix.F_WRLCK { return 0, _BUSY } else if lock == unix.F_UNLCK { + if f.readOnly { + return 0, _READONLY_CANTINIT + } if rc := osWriteLock(f.shm.File, _SHM_DMS, 1, 0); rc != _OK { return 0, rc } @@ -75,7 +84,7 @@ func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, e } err := osAllocate(f.shm.File, n) if err != nil { - return 0, _IOERR_SHMOPEN + return 0, _IOERR_SHMSIZE } } From 9d282de24f5e9070b1c9614812ad1c7f04379438 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Mon, 8 Apr 2024 11:42:44 +0100 Subject: [PATCH 24/30] Lazily commit mmaped memory. --- go.mod | 2 +- go.sum | 4 +-- go.work.sum | 4 +-- internal/util/alloc.go | 53 +++++++++++++++++++++++++++++++++ internal/util/handle.go | 4 +-- internal/util/mmap.go | 41 ++----------------------- internal/util/module.go | 4 +-- sqlite.go | 5 ++-- tests/parallel/parallel_test.go | 9 ------ tests/wal_test.go | 11 ------- 10 files changed, 65 insertions(+), 72 deletions(-) create mode 100644 internal/util/alloc.go diff --git a/go.mod b/go.mod index 0f72268a..7db26699 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534 +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8 diff --git a/go.sum b/go.sum index 9f6b2e8a..8a4222dc 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534 h1:vwZhKUCXCqevZrU8HaSvT1HgXJxBW/JCfMUSj+Clsss= -github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8 h1:Xix9dlK5BpStboVxuRS/DNdwE2YqGROwf7gfqHJn/Mk= +github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index 508feb92..44186537 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,5 @@ -github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534 h1:vwZhKUCXCqevZrU8HaSvT1HgXJxBW/JCfMUSj+Clsss= -github.com/ncruces/wazero v0.0.0-20240406091702-a83dba6f3534/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8 h1:Xix9dlK5BpStboVxuRS/DNdwE2YqGROwf7gfqHJn/Mk= +github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= diff --git a/internal/util/alloc.go b/internal/util/alloc.go new file mode 100644 index 00000000..eccfb6d5 --- /dev/null +++ b/internal/util/alloc.go @@ -0,0 +1,53 @@ +//go:build (linux || darwin) && (amd64 || arm64) + +package util + +import ( + "math" + "syscall" +) + +type MmapedMemoryAllocator []byte + +func (m *MmapedMemoryAllocator) Make(min, cap, max uint64) []byte { + if max > math.MaxInt { + // This ensures int(max) overflows to a negative value, + // and syscall.Mmap returns EINVAL. + max = math.MaxUint64 + } + // Reserve the full max bytes of address space, to ensure we don't need to move it. + // A protected, private, anonymous mapping should not commit memory. + b, err := syscall.Mmap(-1, 0, int(max), syscall.PROT_NONE, syscall.MAP_PRIVATE|syscall.MAP_ANON) + if err != nil { + panic(err) + } + // Commit the initial min bytes of memory. + err = syscall.Mprotect(b[:min], syscall.PROT_READ|syscall.PROT_WRITE) + if err != nil { + syscall.Munmap(b) + panic(err) + } + b = b[:min] + *m = b + return b +} + +func (m *MmapedMemoryAllocator) Grow(size uint64) []byte { + b := *m + // Commit additional memory up to size bytes. + err := syscall.Mprotect(b[len(b):size], syscall.PROT_READ|syscall.PROT_WRITE) + if err != nil { + panic(err) + } + b = b[:size] + *m = b + return b +} + +func (m *MmapedMemoryAllocator) Free() { + err := syscall.Munmap(*m) + if err != nil { + panic(err) + } + *m = nil +} diff --git a/internal/util/handle.go b/internal/util/handle.go index fc274579..cf4359c5 100644 --- a/internal/util/handle.go +++ b/internal/util/handle.go @@ -10,14 +10,12 @@ type handleState struct { holes int } -func (s *handleState) closeNotify() { +func (s *handleState) close() { for _, h := range s.handles { if c, ok := h.(io.Closer); ok { c.Close() } } - s.handles = nil - s.holes = 0 } func GetHandle(ctx context.Context, id uint32) any { diff --git a/internal/util/mmap.go b/internal/util/mmap.go index e77a2a73..17ab0d60 100644 --- a/internal/util/mmap.go +++ b/internal/util/mmap.go @@ -18,20 +18,12 @@ type mmapState struct { } func (s *mmapState) init(ctx context.Context, enabled bool) context.Context { - if enabled { - s.enabled = enabled - return experimental.WithMemoryAllocator(ctx, &mappableMemoryAllocator{}) + if s.enabled = enabled; enabled { + return experimental.WithMemoryAllocator(ctx, &MmapedMemoryAllocator{}) } return ctx } -func (s *mmapState) closeNotify() { - for _, r := range s.regions { - r.Close() - } - s.regions = nil -} - func CanMap(ctx context.Context) bool { s := ctx.Value(moduleKey{}).(*moduleState) return s.mmapState.enabled @@ -87,10 +79,6 @@ func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, si return r, nil } -func (r *MappedRegion) Close() error { - return munmap(r.addr, uintptr(r.size)) -} - func (r *MappedRegion) Unmap() error { // We can't munmap the region, otherwise it could be remaped. // Instead, convert it to a protected, private, anonymous mapping. @@ -110,31 +98,6 @@ func (r *MappedRegion) mmap(f *os.File, offset int64) error { return err } -type mappableMemoryAllocator struct { - addr *byte - size uintptr -} - -func (m *mappableMemoryAllocator) Make(min, cap, max uint64) []byte { - var err error - m.size = uintptr(max) - m.addr, err = mmap(0, m.size, - unix.PROT_READ|unix.PROT_WRITE, unix.MAP_PRIVATE|unix.MAP_ANON, - -1, 0) - if err != nil { - panic(OOMErr) - } - return unsafe.Slice(m.addr, max)[:min] -} - -func (m *mappableMemoryAllocator) Free() { - munmap(uintptr(unsafe.Pointer(m.addr)), m.size) -} - -func (mappableMemoryAllocator) Grow(uint64) []byte { - panic(OOMErr) -} - //go:linkname mmap syscall.mmap func mmap(addr, length uintptr, prot, flag, fd int, pos int64) (*byte, error) diff --git a/internal/util/module.go b/internal/util/module.go index a1b78428..9d5d153b 100644 --- a/internal/util/module.go +++ b/internal/util/module.go @@ -21,6 +21,6 @@ func NewContext(ctx context.Context, mappableMemory bool) context.Context { } func (s *moduleState) CloseNotify(ctx context.Context, exitCode uint32) { - s.handleState.closeNotify() - s.mmapState.closeNotify() + s.handleState.close() + *s = moduleState{} } diff --git a/sqlite.go b/sqlite.go index 8aefd400..a7f3f3b0 100644 --- a/sqlite.go +++ b/sqlite.go @@ -25,8 +25,7 @@ var ( Binary []byte // Wasm binary to load. Path string // Path to load the binary from. - RuntimeConfig wazero.RuntimeConfig - MappableMemory bool + RuntimeConfig wazero.RuntimeConfig ) var instance struct { @@ -86,7 +85,7 @@ func instantiateSQLite() (sqlt *sqlite, err error) { } sqlt = new(sqlite) - sqlt.ctx = util.NewContext(context.Background(), MappableMemory) + sqlt.ctx = util.NewContext(context.Background(), vfs.SupportsSharedMemory) sqlt.mod, err = instance.runtime.InstantiateModule(sqlt.ctx, instance.compiled, wazero.NewModuleConfig()) diff --git a/tests/parallel/parallel_test.go b/tests/parallel/parallel_test.go index 0be52a16..7c399843 100644 --- a/tests/parallel/parallel_test.go +++ b/tests/parallel/parallel_test.go @@ -14,17 +14,8 @@ import ( _ "github.com/ncruces/go-sqlite3/embed" "github.com/ncruces/go-sqlite3/vfs" "github.com/ncruces/go-sqlite3/vfs/memdb" - "github.com/tetratelabs/wazero" ) -func TestMain(m *testing.M) { - if vfs.SupportsSharedMemory { - sqlite3.RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryLimitPages(1024) - sqlite3.MappableMemory = true - } - os.Exit(m.Run()) -} - func TestParallel(t *testing.T) { var iter int if testing.Short() { diff --git a/tests/wal_test.go b/tests/wal_test.go index 874dd960..3076b64a 100644 --- a/tests/wal_test.go +++ b/tests/wal_test.go @@ -1,23 +1,12 @@ package tests import ( - "os" "path/filepath" "testing" "github.com/ncruces/go-sqlite3" - "github.com/ncruces/go-sqlite3/vfs" - "github.com/tetratelabs/wazero" ) -func TestMain(m *testing.M) { - if vfs.SupportsSharedMemory { - sqlite3.RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryLimitPages(1024) - sqlite3.MappableMemory = true - } - os.Exit(m.Run()) -} - func TestWAL_enter_exit(t *testing.T) { t.Parallel() From 241286a4eadf0b9c9df449644c50698bf22402ca Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Mon, 8 Apr 2024 12:10:50 +0100 Subject: [PATCH 25/30] Reduce memory usage. --- tests/parallel/parallel_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/parallel/parallel_test.go b/tests/parallel/parallel_test.go index 7c399843..b5bdb263 100644 --- a/tests/parallel/parallel_test.go +++ b/tests/parallel/parallel_test.go @@ -14,8 +14,14 @@ import ( _ "github.com/ncruces/go-sqlite3/embed" "github.com/ncruces/go-sqlite3/vfs" "github.com/ncruces/go-sqlite3/vfs/memdb" + "github.com/tetratelabs/wazero" ) +func TestMain(m *testing.M) { + sqlite3.RuntimeConfig = wazero.NewRuntimeConfig().WithMemoryLimitPages(1024) + os.Exit(m.Run()) +} + func TestParallel(t *testing.T) { var iter int if testing.Short() { From 12a69c64b9cc646d56cb22bb5f968d5e1d56adaf Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 9 Apr 2024 12:37:55 +0100 Subject: [PATCH 26/30] Update. --- go.mod | 2 +- go.sum | 4 +-- go.work.sum | 4 +-- internal/util/alloc.go | 59 ++++++++++++++++++++++++++--------------- internal/util/handle.go | 4 ++- internal/util/mmap.go | 2 +- internal/util/module.go | 5 ---- 7 files changed, 46 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 7db26699..bba9944c 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8 +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d diff --git a/go.sum b/go.sum index 8a4222dc..b7cf7d7c 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8 h1:Xix9dlK5BpStboVxuRS/DNdwE2YqGROwf7gfqHJn/Mk= -github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d h1:t3S5uhR50fDxrCgoMLcVDFo2jpYdKjq5VWbXFUMHv0w= +github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index 44186537..e1395588 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,5 @@ -github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8 h1:Xix9dlK5BpStboVxuRS/DNdwE2YqGROwf7gfqHJn/Mk= -github.com/ncruces/wazero v0.0.0-20240406121256-0283488c26c8/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d h1:t3S5uhR50fDxrCgoMLcVDFo2jpYdKjq5VWbXFUMHv0w= +github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= diff --git a/internal/util/alloc.go b/internal/util/alloc.go index eccfb6d5..9601dcf0 100644 --- a/internal/util/alloc.go +++ b/internal/util/alloc.go @@ -1,53 +1,68 @@ -//go:build (linux || darwin) && (amd64 || arm64) +//go:build unix package util import ( "math" - "syscall" -) -type MmapedMemoryAllocator []byte + "github.com/tetratelabs/wazero/experimental" + "golang.org/x/sys/unix" +) -func (m *MmapedMemoryAllocator) Make(min, cap, max uint64) []byte { +func mmappedAllocator(min, cap, max uint64) experimental.MemoryBuffer { if max > math.MaxInt { // This ensures int(max) overflows to a negative value, - // and syscall.Mmap returns EINVAL. + // and unix.Mmap returns EINVAL. max = math.MaxUint64 } // Reserve the full max bytes of address space, to ensure we don't need to move it. // A protected, private, anonymous mapping should not commit memory. - b, err := syscall.Mmap(-1, 0, int(max), syscall.PROT_NONE, syscall.MAP_PRIVATE|syscall.MAP_ANON) + b, err := unix.Mmap(-1, 0, int(max), unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_ANON) if err != nil { panic(err) } - // Commit the initial min bytes of memory. - err = syscall.Mprotect(b[:min], syscall.PROT_READ|syscall.PROT_WRITE) + // Commit the initial cap bytes of memory. + err = unix.Mprotect(b[:cap], unix.PROT_READ|unix.PROT_WRITE) if err != nil { - syscall.Munmap(b) + unix.Munmap(b) panic(err) } - b = b[:min] - *m = b - return b + return &mmappedBuffer{ + buf: b[:cap], + cur: min, + } +} + +// The slice covers the entire mmapped memory: +// - len(buf) is the already committed memory, +// - cap(buf) is the reserved address space, +// - cur is the already requested size. +type mmappedBuffer struct { + buf []byte + cur uint64 +} + +func (m *mmappedBuffer) Buffer() []byte { + // Limit capacity because bytes beyond len(m.buf) + // have not yet been committed. + return m.buf[:m.cur:len(m.buf)] } -func (m *MmapedMemoryAllocator) Grow(size uint64) []byte { - b := *m +func (m *mmappedBuffer) Grow(size uint64) []byte { // Commit additional memory up to size bytes. - err := syscall.Mprotect(b[len(b):size], syscall.PROT_READ|syscall.PROT_WRITE) + err := unix.Mprotect(m.buf[len(m.buf):size], unix.PROT_READ|unix.PROT_WRITE) if err != nil { panic(err) } - b = b[:size] - *m = b - return b + m.buf = m.buf[:size] + m.cur = size + return m.Buffer() } -func (m *MmapedMemoryAllocator) Free() { - err := syscall.Munmap(*m) +func (m *mmappedBuffer) Free() { + err := unix.Munmap(m.buf) if err != nil { panic(err) } - *m = nil + m.buf = nil } diff --git a/internal/util/handle.go b/internal/util/handle.go index cf4359c5..4584324c 100644 --- a/internal/util/handle.go +++ b/internal/util/handle.go @@ -10,12 +10,14 @@ type handleState struct { holes int } -func (s *handleState) close() { +func (s *handleState) CloseNotify(ctx context.Context, exitCode uint32) { for _, h := range s.handles { if c, ok := h.(io.Closer); ok { c.Close() } } + s.handles = nil + s.holes = 0 } func GetHandle(ctx context.Context, id uint32) any { diff --git a/internal/util/mmap.go b/internal/util/mmap.go index 17ab0d60..c2216940 100644 --- a/internal/util/mmap.go +++ b/internal/util/mmap.go @@ -19,7 +19,7 @@ type mmapState struct { func (s *mmapState) init(ctx context.Context, enabled bool) context.Context { if s.enabled = enabled; enabled { - return experimental.WithMemoryAllocator(ctx, &MmapedMemoryAllocator{}) + return experimental.WithMemoryAllocator(ctx, mmappedAllocator) } return ctx } diff --git a/internal/util/module.go b/internal/util/module.go index 9d5d153b..0db93bbb 100644 --- a/internal/util/module.go +++ b/internal/util/module.go @@ -19,8 +19,3 @@ func NewContext(ctx context.Context, mappableMemory bool) context.Context { ctx = state.mmapState.init(ctx, mappableMemory) return ctx } - -func (s *moduleState) CloseNotify(ctx context.Context, exitCode uint32) { - s.handleState.close() - *s = moduleState{} -} From 38543975882ad4ccaac7598760583c15d99a9bfa Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 9 Apr 2024 12:48:40 +0100 Subject: [PATCH 27/30] Add shared memory build tag. --- .github/workflows/cross.sh | 2 ++ .github/workflows/test.yml | 4 ++++ internal/util/mmap.go | 2 +- internal/util/mmap_other.go | 4 +--- vfs/shm.go | 2 +- vfs/shm_other.go | 6 +----- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/cross.sh b/.github/workflows/cross.sh index 883663bb..264c0f1b 100755 --- a/.github/workflows/cross.sh +++ b/.github/workflows/cross.sh @@ -17,7 +17,9 @@ 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 darwin-flock ; GOOS=darwin GOARCH=amd64 go build -tags sqlite3_flock . +echo darwin-noshm ; GOOS=darwin GOARCH=amd64 go build -tags sqlite3_noshm . echo darwin-nosys ; GOOS=darwin GOARCH=amd64 go build -tags sqlite3_nosys . +echo linux-noshm ; GOOS=linux GOARCH=amd64 go build -tags sqlite3_noshm . echo linux-nosys ; GOOS=linux GOARCH=amd64 go build -tags sqlite3_nosys . echo windows-nosys ; GOOS=windows GOARCH=amd64 go build -tags sqlite3_nosys . echo freebsd-nosys ; GOOS=freebsd GOARCH=amd64 go build -tags sqlite3_nosys . \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 39128f8e..1238661a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,6 +47,10 @@ jobs: run: go test -v -tags sqlite3_flock ./... if: matrix.os == 'macos-latest' + - name: Test no shared memory + run: go test -v -tags sqlite3_noshm ./... + if: matrix.os == 'ubuntu-latest' + - name: Test no locks run: go test -v -tags sqlite3_nosys ./tests -run TestDB_nolock diff --git a/internal/util/mmap.go b/internal/util/mmap.go index c2216940..a2067b94 100644 --- a/internal/util/mmap.go +++ b/internal/util/mmap.go @@ -1,4 +1,4 @@ -//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_flock && !sqlite3_nosys +//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_flock && !sqlite3_noshm && !sqlite3_nosys package util diff --git a/internal/util/mmap_other.go b/internal/util/mmap_other.go index d710f28e..d585340f 100644 --- a/internal/util/mmap_other.go +++ b/internal/util/mmap_other.go @@ -1,4 +1,4 @@ -//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_flock || sqlite3_nosys +//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_flock || sqlite3_noshm || sqlite3_nosys package util @@ -6,8 +6,6 @@ import "context" type mmapState struct{} -func (s mmapState) closeNotify() {} - func (s *mmapState) init(ctx context.Context, _ bool) context.Context { return ctx } diff --git a/vfs/shm.go b/vfs/shm.go index 2cd5634d..1bfbb711 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -1,4 +1,4 @@ -//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_flock && !sqlite3_nosys +//go:build (linux || darwin) && (amd64 || arm64) && !sqlite3_flock && !sqlite3_noshm && !sqlite3_nosys package vfs diff --git a/vfs/shm_other.go b/vfs/shm_other.go index 80520917..922e1475 100644 --- a/vfs/shm_other.go +++ b/vfs/shm_other.go @@ -1,9 +1,7 @@ -//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_flock || sqlite3_nosys +//go:build !(linux || darwin) || !(amd64 || arm64) || sqlite3_flock || sqlite3_noshm || sqlite3_nosys package vfs -import "github.com/tetratelabs/wazero/api" - // SupportsSharedMemory is true on platforms that support shared memory. // To enable shared memory support on those platforms, // you need to set the appropriate [wazero.RuntimeConfig]; @@ -14,8 +12,6 @@ import "github.com/tetratelabs/wazero/api" // [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode const SupportsSharedMemory = false -func vfsVersion(api.Module) uint32 { return 0 } - type vfsShm struct{} func (vfsShm) Close() error { return nil } From 9775518da17154f47a931cc5fb67c456593dd5db Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 9 Apr 2024 15:14:24 +0100 Subject: [PATCH 28/30] Consider large page size systems. --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 4 ++-- internal/util/alloc.go | 27 ++++++++++++++++++++------- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index bba9944c..7eeeddb7 100644 --- a/go.mod +++ b/go.mod @@ -14,4 +14,4 @@ require ( retract v0.4.0 // tagged from the wrong branch -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d +replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060 diff --git a/go.sum b/go.sum index b7cf7d7c..50de3d00 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d h1:t3S5uhR50fDxrCgoMLcVDFo2jpYdKjq5VWbXFUMHv0w= -github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060 h1:dkYSDM1fMCDttJ6sCdlUHP/BiBzG3hJxDnA+k6zUdyY= +github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= diff --git a/go.work.sum b/go.work.sum index e1395588..58245f21 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,5 @@ -github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d h1:t3S5uhR50fDxrCgoMLcVDFo2jpYdKjq5VWbXFUMHv0w= -github.com/ncruces/wazero v0.0.0-20240409112346-f2be6da37a3d/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060 h1:dkYSDM1fMCDttJ6sCdlUHP/BiBzG3hJxDnA+k6zUdyY= +github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= diff --git a/internal/util/alloc.go b/internal/util/alloc.go index 9601dcf0..8e3e83f9 100644 --- a/internal/util/alloc.go +++ b/internal/util/alloc.go @@ -10,12 +10,17 @@ import ( ) func mmappedAllocator(min, cap, max uint64) experimental.MemoryBuffer { + // Round up to the page size. + rnd := uint64(unix.Getpagesize() - 1) + max = (max + rnd) &^ rnd + cap = (cap + rnd) &^ rnd + if max > math.MaxInt { // This ensures int(max) overflows to a negative value, // and unix.Mmap returns EINVAL. max = math.MaxUint64 } - // Reserve the full max bytes of address space, to ensure we don't need to move it. + // Reserve max bytes of address space, to ensure we won't need to move it. // A protected, private, anonymous mapping should not commit memory. b, err := unix.Mmap(-1, 0, int(max), unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_ANON) if err != nil { @@ -49,18 +54,26 @@ func (m *mmappedBuffer) Buffer() []byte { } func (m *mmappedBuffer) Grow(size uint64) []byte { - // Commit additional memory up to size bytes. - err := unix.Mprotect(m.buf[len(m.buf):size], unix.PROT_READ|unix.PROT_WRITE) - if err != nil { - panic(err) + if com := uint64(len(m.buf)); com < size { + // Round up to the page size. + rnd := uint64(unix.Getpagesize() - 1) + new := (size + rnd) &^ rnd + + // Commit additional memory up to new bytes. + err := unix.Mprotect(m.buf[com:new], unix.PROT_READ|unix.PROT_WRITE) + if err != nil { + panic(err) + } + + // Update commited memory. + m.buf = m.buf[:new] } - m.buf = m.buf[:size] m.cur = size return m.Buffer() } func (m *mmappedBuffer) Free() { - err := unix.Munmap(m.buf) + err := unix.Munmap(m.buf[:cap(m.buf)]) if err != nil { panic(err) } From 3d3ccc8c4ae79a5456cca12f07f965de16fdca2c Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 10 Apr 2024 12:43:37 +0100 Subject: [PATCH 29/30] Update dependencies. --- go.mod | 4 +--- go.sum | 4 ++-- go.work.sum | 5 ----- gormlite/go.mod | 4 ++-- gormlite/go.sum | 8 ++++---- gormlite/test.sh | 2 +- vfs/shm.go | 2 +- 7 files changed, 11 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 7eeeddb7..e05ce31c 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( github.com/ncruces/julianday v1.0.0 github.com/psanford/httpreadat v0.1.0 - github.com/tetratelabs/wazero v1.7.0 + github.com/tetratelabs/wazero v1.7.1-0.20240410111357-a0fbb185447f golang.org/x/crypto v0.22.0 golang.org/x/sync v0.7.0 golang.org/x/sys v0.19.0 @@ -13,5 +13,3 @@ require ( ) retract v0.4.0 // tagged from the wrong branch - -replace github.com/tetratelabs/wazero => github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060 diff --git a/go.sum b/go.sum index 50de3d00..596c223d 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060 h1:dkYSDM1fMCDttJ6sCdlUHP/BiBzG3hJxDnA+k6zUdyY= -github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= +github.com/tetratelabs/wazero v1.7.1-0.20240410111357-a0fbb185447f h1:xJ6F/f7fM1OvnPFSn7Ggf9icswSXoYOYLZbu7aJVQbA= +github.com/tetratelabs/wazero v1.7.1-0.20240410111357-a0fbb185447f/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= diff --git a/go.work.sum b/go.work.sum index 58245f21..df07039e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,11 +1,6 @@ -github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060 h1:dkYSDM1fMCDttJ6sCdlUHP/BiBzG3hJxDnA+k6zUdyY= -github.com/ncruces/wazero v0.0.0-20240409122832-a4dd11a09060/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/gormlite/go.mod b/gormlite/go.mod index 13e1a4d3..6c7e94c1 100644 --- a/gormlite/go.mod +++ b/gormlite/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( github.com/ncruces/go-sqlite3 v0.13.0 - gorm.io/gorm v1.25.8 + gorm.io/gorm v1.25.9 ) require ( @@ -12,5 +12,5 @@ require ( github.com/jinzhu/now v1.1.5 // indirect github.com/ncruces/julianday v1.0.0 // indirect github.com/tetratelabs/wazero v1.7.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.19.0 // indirect ) diff --git a/gormlite/go.sum b/gormlite/go.sum index bcf1a320..9fe5f3b3 100644 --- a/gormlite/go.sum +++ b/gormlite/go.sum @@ -8,9 +8,9 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/tetratelabs/wazero v1.7.0 h1:jg5qPydno59wqjpGrHph81lbtHzTrWzwwtD4cD88+hQ= github.com/tetratelabs/wazero v1.7.0/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -gorm.io/gorm v1.25.8 h1:WAGEZ/aEcznN4D03laj8DKnehe1e9gYQAjW8xyPRdeo= -gorm.io/gorm v1.25.8/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8= +gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= diff --git a/gormlite/test.sh b/gormlite/test.sh index 68594ce4..f5ab285f 100755 --- a/gormlite/test.sh +++ b/gormlite/test.sh @@ -7,7 +7,7 @@ rm -rf gorm/ tests/ go work use -r . go test -git clone --branch v1.25.8 --filter=blob:none https://github.com/go-gorm/gorm.git +git clone --branch v1.25.9 --filter=blob:none https://github.com/go-gorm/gorm.git mv gorm/tests tests rm -rf gorm/ diff --git a/vfs/shm.go b/vfs/shm.go index 1bfbb711..1dda1b5c 100644 --- a/vfs/shm.go +++ b/vfs/shm.go @@ -35,7 +35,7 @@ const ( func (f *vfsFile) shmMap(ctx context.Context, mod api.Module, id, size uint32, extend bool) (uint32, error) { // Ensure size is a multiple of the OS page size. - if int(size)%unix.Getpagesize() != 0 { + if int(size)&(unix.Getpagesize()-1) != 0 { return 0, _IOERR_SHMMAP } From eaacdc3eaa33fd9c2e07bf9269eb233a48729c21 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 10 Apr 2024 13:08:12 +0100 Subject: [PATCH 30/30] Final tweaks. --- go.work.sum | 2 ++ sqlite3/vfs.c | 8 ++++---- vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 | 4 ++-- vfs/vfs.go | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/go.work.sum b/go.work.sum index df07039e..5a6f9035 100644 --- a/go.work.sum +++ b/go.work.sum @@ -2,5 +2,7 @@ golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/sqlite3/vfs.c b/sqlite3/vfs.c index 1ba94fff..d2e79fb6 100644 --- a/sqlite3/vfs.c +++ b/sqlite3/vfs.c @@ -13,7 +13,7 @@ int go_sleep(sqlite3_vfs *, int microseconds); int go_current_time_64(sqlite3_vfs *, sqlite3_int64 *); int go_open(sqlite3_vfs *, sqlite3_filename zName, sqlite3_file *, int flags, - int *pOutFlags, int *pOutVersion); + int *pOutFlags, int *pOutVFS); int go_delete(sqlite3_vfs *, const char *zName, int syncDir); int go_access(sqlite3_vfs *, const char *zName, int flags, int *pResOut); int go_full_pathname(sqlite3_vfs *, const char *zName, int nOut, char *zOut); @@ -74,13 +74,13 @@ static int go_open_wrapper(sqlite3_vfs *vfs, sqlite3_filename zName, .xShmBarrier = go_shm_barrier, .xShmUnmap = go_shm_unmap, }}; - int version = 0; + int vfsID = 0; memset(file, 0, vfs->szOsFile); - int rc = go_open(vfs, zName, file, flags, pOutFlags, &version); + int rc = go_open(vfs, zName, file, flags, pOutFlags, &vfsID); if (rc) { return rc; } - file->pMethods = &go_io[version]; + file->pMethods = &go_io[vfsID]; return SQLITE_OK; } diff --git a/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 b/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 index 154992b2..e178f88b 100644 --- a/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 +++ b/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06882576fdea2c8e164dd2d97dce394dc825dca3cee30c9efc9601b84de92865 -size 483191 +oid sha256:855720cce2881c98d09c15eddf9cab0d5974a2a82f7f67987a28b97414629345 +size 483463 diff --git a/vfs/vfs.go b/vfs/vfs.go index 9241a72e..d7577ed9 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -134,7 +134,7 @@ func vfsAccess(ctx context.Context, mod api.Module, pVfs, zPath uint32, flags Ac return vfsErrorCode(err, _IOERR_ACCESS) } -func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, flags OpenFlag, pOutFlags, pOutVersion uint32) _ErrorCode { +func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, flags OpenFlag, pOutFlags, pOutVFS uint32) _ErrorCode { vfs := vfsGet(mod, pVfs) var path string @@ -170,8 +170,8 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla if pOutFlags != 0 { util.WriteUint32(mod, pOutFlags, uint32(flags)) } - if pOutVersion != 0 && util.CanMap(ctx) { - util.WriteUint32(mod, pOutVersion, 1) + if pOutVFS != 0 && util.CanMap(ctx) { + util.WriteUint32(mod, pOutVFS, 1) } vfsFileRegister(ctx, mod, pFile, file) return _OK