Skip to content

Commit f3df52f

Browse files
author
Alexis Guerville
committed
adding libsql driver
1 parent 62fa77a commit f3df52f

File tree

7 files changed

+192
-14
lines changed

7 files changed

+192
-14
lines changed

go.mod

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ require (
1919
github.com/shengdoushi/base58 v1.0.0
2020
github.com/sirupsen/logrus v1.9.0
2121
github.com/tidwall/btree v1.6.0
22+
github.com/tursodatabase/libsql-client-go v0.0.0-20240327144008-dd14b387afb3
2223
github.com/urfave/cli v1.22.4
2324
go.etcd.io/etcd/api/v3 v3.5.9
2425
go.etcd.io/etcd/client/pkg/v3 v3.5.9
@@ -30,6 +31,7 @@ require (
3031
)
3132

3233
require (
34+
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
3335
github.com/beorn7/perks v1.0.1 // indirect
3436
github.com/cenkalti/backoff/v4 v4.1.1 // indirect
3537
github.com/cespare/xxhash/v2 v2.2.0 // indirect
@@ -52,6 +54,7 @@ require (
5254
github.com/jackc/puddle/v2 v2.2.1 // indirect
5355
github.com/jonboulle/clockwork v0.2.2 // indirect
5456
github.com/json-iterator/go v1.1.12 // indirect
57+
github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06 // indirect
5558
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
5659
github.com/minio/highwayhash v1.0.2 // indirect
5760
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
@@ -81,12 +84,12 @@ require (
8184
go.opentelemetry.io/otel/trace v1.0.1 // indirect
8285
go.opentelemetry.io/proto/otlp v0.9.0 // indirect
8386
go.uber.org/atomic v1.7.0 // indirect
84-
go.uber.org/automaxprocs v1.5.3 // indirect
8587
go.uber.org/multierr v1.6.0 // indirect
8688
go.uber.org/zap v1.17.0 // indirect
8789
golang.org/x/crypto v0.21.0 // indirect
90+
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
8891
golang.org/x/net v0.21.0 // indirect
89-
golang.org/x/sync v0.1.0 // indirect
92+
golang.org/x/sync v0.6.0 // indirect
9093
golang.org/x/sys v0.18.0 // indirect
9194
golang.org/x/text v0.14.0 // indirect
9295
golang.org/x/time v0.5.0 // indirect
@@ -96,5 +99,6 @@ require (
9699
gopkg.in/yaml.v2 v2.4.0 // indirect
97100
k8s.io/klog/v2 v2.70.1 // indirect
98101
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect
102+
nhooyr.io/websocket v1.8.10 // indirect
99103
sigs.k8s.io/yaml v1.3.0 // indirect
100104
)

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
4646
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
4747
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
4848
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
49+
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
50+
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
4951
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
5052
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
5153
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -222,6 +224,8 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
222224
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
223225
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
224226
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
227+
github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06 h1:JLvn7D+wXjH9g4Jsjo+VqmzTUpl/LX7vfr6VOfSWTdM=
228+
github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06/go.mod h1:FUkZ5OHjlGPjnM2UyGJz9TypXQFgYqw6AFNO1UiROTM=
225229
github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
226230
github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
227231
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -244,13 +248,9 @@ github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296/go.mod h1:0tqz9Hl
244248
github.com/nats-io/jwt/v2 v2.5.5 h1:ROfXb50elFq5c9+1ztaUbdlrArNFl2+fQWP6B8HGEq4=
245249
github.com/nats-io/jwt/v2 v2.5.5/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A=
246250
github.com/nats-io/nats-server/v2 v2.7.5-0.20220309212130-5c0d1999ff72/go.mod h1:1vZ2Nijh8tcyNe8BDVyTviCd9NYzRbubQYiEHsvOQWc=
247-
github.com/nats-io/nats-server/v2 v2.10.11 h1:yKUiLVincZISpo3A4YljJQ+HfLltGAgoNNJl99KL8I0=
248-
github.com/nats-io/nats-server/v2 v2.10.11/go.mod h1:dXtOqVWzbMTEj+tUyC/itXjJhW37xh0tUBrTAlqAfx8=
249251
github.com/nats-io/nats-server/v2 v2.10.12 h1:G6u+RDrHkw4bkwn7I911O5jqys7jJVRY6MwgndyUsnE=
250252
github.com/nats-io/nats-server/v2 v2.10.12/go.mod h1:H1n6zXtYLFCgXcf/SF8QNTSIFuS8tyZQMN9NguUHdEs=
251253
github.com/nats-io/nats.go v1.13.1-0.20220308171302-2f2f6968e98d/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w=
252-
github.com/nats-io/nats.go v1.33.1 h1:8TxLZZ/seeEfR97qV0/Bl939tpDnt2Z2fK3HkPypj70=
253-
github.com/nats-io/nats.go v1.33.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
254254
github.com/nats-io/nats.go v1.34.0 h1:fnxnPCNiwIG5w08rlMcEKTUw4AV/nKyGCOJE8TdhSPk=
255255
github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
256256
github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4=
@@ -326,6 +326,8 @@ github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg=
326326
github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
327327
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
328328
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
329+
github.com/tursodatabase/libsql-client-go v0.0.0-20240327144008-dd14b387afb3 h1:L2TGdqNA/1NwZxK98jUZk+lZP0fX8ydAcBpVRNufahg=
330+
github.com/tursodatabase/libsql-client-go v0.0.0-20240327144008-dd14b387afb3/go.mod h1:2Fu26tjM011BLeR5+jwTfs6DX/fNMEWV/3CBZvggrA4=
329331
github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA=
330332
github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
331333
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
@@ -373,8 +375,6 @@ go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSs
373375
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
374376
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
375377
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
376-
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
377-
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
378378
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
379379
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
380380
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
@@ -389,8 +389,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
389389
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
390390
golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
391391
golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
392-
golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
393-
golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
394392
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
395393
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
396394
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -403,6 +401,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
403401
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
404402
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
405403
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
404+
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
405+
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
406406
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
407407
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
408408
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -478,8 +478,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
478478
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
479479
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
480480
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
481-
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
482-
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
481+
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
482+
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
483483
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
484484
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
485485
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -523,8 +523,6 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
523523
golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
524524
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
525525
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
526-
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
527-
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
528526
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
529527
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
530528
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -716,6 +714,8 @@ k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=
716714
k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
717715
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4=
718716
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
717+
nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q=
718+
nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c=
719719
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
720720
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
721721
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

pkg/drivers/libsql/libsql.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
//go:build cgo
2+
// +build cgo
3+
4+
package libsql
5+
6+
import (
7+
"context"
8+
"database/sql"
9+
"os"
10+
"strings"
11+
"time"
12+
13+
"github.com/k3s-io/kine/pkg/drivers/generic"
14+
"github.com/k3s-io/kine/pkg/logstructured"
15+
"github.com/k3s-io/kine/pkg/logstructured/sqllog"
16+
"github.com/k3s-io/kine/pkg/server"
17+
"github.com/k3s-io/kine/pkg/util"
18+
"github.com/pkg/errors"
19+
"github.com/prometheus/client_golang/prometheus"
20+
"github.com/sirupsen/logrus"
21+
22+
// libsql driver
23+
_ "github.com/tursodatabase/libsql-client-go/libsql"
24+
)
25+
26+
var (
27+
schema = []string{
28+
`CREATE TABLE IF NOT EXISTS kine
29+
(
30+
id INTEGER PRIMARY KEY AUTOINCREMENT,
31+
name INTEGER,
32+
created INTEGER,
33+
deleted INTEGER,
34+
create_revision INTEGER,
35+
prev_revision INTEGER,
36+
lease INTEGER,
37+
value BLOB,
38+
old_value BLOB
39+
)`,
40+
`CREATE INDEX IF NOT EXISTS kine_name_index ON kine (name)`,
41+
`CREATE INDEX IF NOT EXISTS kine_name_id_index ON kine (name,id)`,
42+
`CREATE INDEX IF NOT EXISTS kine_id_deleted_index ON kine (id,deleted)`,
43+
`CREATE INDEX IF NOT EXISTS kine_prev_revision_index ON kine (prev_revision)`,
44+
`CREATE UNIQUE INDEX IF NOT EXISTS kine_name_prev_revision_uindex ON kine (name, prev_revision)`,
45+
`PRAGMA wal_checkpoint(TRUNCATE)`,
46+
}
47+
)
48+
49+
func New(ctx context.Context, dataSourceName string, connPoolConfig generic.ConnectionPoolConfig, metricsRegisterer prometheus.Registerer) (server.Backend, error) {
50+
backend, _, err := NewVariant(ctx, "libsql", dataSourceName, connPoolConfig, metricsRegisterer)
51+
return backend, err
52+
}
53+
54+
func NewVariant(ctx context.Context, driverName, dataSourceName string, connPoolConfig generic.ConnectionPoolConfig, metricsRegisterer prometheus.Registerer) (server.Backend, *generic.Generic, error) {
55+
if dataSourceName == "" {
56+
if err := os.MkdirAll("./db", 0700); err != nil {
57+
return nil, nil, err
58+
}
59+
dataSourceName = "./db/state.db?_journal=WAL&cache=shared&_busy_timeout=30000"
60+
}
61+
62+
dialect, err := generic.Open(ctx, driverName, dataSourceName, connPoolConfig, "?", false, metricsRegisterer)
63+
if err != nil {
64+
return nil, nil, err
65+
}
66+
67+
dialect.LastInsertID = true
68+
dialect.GetSizeSQL = `SELECT SUM(pgsize) FROM dbstat`
69+
dialect.CompactSQL = `
70+
DELETE FROM kine AS kv
71+
WHERE
72+
kv.id IN (
73+
SELECT kp.prev_revision AS id
74+
FROM kine AS kp
75+
WHERE
76+
kp.name != 'compact_rev_key' AND
77+
kp.prev_revision != 0 AND
78+
kp.id <= ?
79+
UNION
80+
SELECT kd.id AS id
81+
FROM kine AS kd
82+
WHERE
83+
kd.deleted != 0 AND
84+
kd.id <= ?
85+
)`
86+
dialect.PostCompactSQL = `PRAGMA wal_checkpoint(FULL)`
87+
dialect.TranslateErr = func(err error) error {
88+
if strings.Contains(err.Error(), "UNIQUE constraint") {
89+
return server.ErrKeyExists
90+
}
91+
return err
92+
}
93+
94+
// this is the first SQL that will be executed on a new DB conn so
95+
// loop on failure here because in the case of dqlite it could still be initializing
96+
for i := 0; i < 300; i++ {
97+
err = setup(dialect.DB)
98+
if err == nil {
99+
break
100+
}
101+
logrus.Errorf("failed to setup db: %v", err)
102+
select {
103+
case <-ctx.Done():
104+
return nil, nil, ctx.Err()
105+
case <-time.After(time.Second):
106+
}
107+
time.Sleep(time.Second)
108+
}
109+
if err != nil {
110+
return nil, nil, errors.Wrap(err, "setup db")
111+
}
112+
113+
dialect.Migrate(context.Background())
114+
return logstructured.New(sqllog.New(dialect)), dialect, nil
115+
}
116+
117+
func setup(db *sql.DB) error {
118+
logrus.Infof("Configuring database table schema and indexes, this may take a moment...")
119+
120+
for _, stmt := range schema {
121+
logrus.Tracef("SETUP EXEC : %v", util.Stripped(stmt))
122+
_, err := db.Exec(stmt)
123+
if err != nil {
124+
return err
125+
}
126+
}
127+
128+
logrus.Infof("Database tables and indexes are up to date")
129+
return nil
130+
}

pkg/drivers/libsql/libsql_nocgo.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//go:build !cgo
2+
// +build !cgo
3+
4+
package libsql
5+
6+
import (
7+
"context"
8+
"database/sql"
9+
"errors"
10+
11+
"github.com/k3s-io/kine/pkg/drivers/generic"
12+
"github.com/k3s-io/kine/pkg/server"
13+
"github.com/prometheus/client_golang/prometheus"
14+
)
15+
16+
var errNoCgo = errors.New("this binary is built without CGO, libsql is disabled")
17+
18+
func New(ctx context.Context, dataSourceName string, connPoolConfig generic.ConnectionPoolConfig, metricsRegisterer prometheus.Registerer) (server.Backend, error) {
19+
return nil, errNoCgo
20+
}
21+
22+
func NewVariant(driverName, dataSourceName string, connPoolConfig generic.ConnectionPoolConfig, metricsRegisterer prometheus.Registerer) (server.Backend, *generic.Generic, error) {
23+
return nil, nil, errNoCgo
24+
}
25+
26+
func setup(db *sql.DB) error {
27+
return errNoCgo
28+
}

pkg/endpoint/endpoint.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/k3s-io/kine/pkg/drivers/dqlite"
1212
"github.com/k3s-io/kine/pkg/drivers/generic"
13+
"github.com/k3s-io/kine/pkg/drivers/libsql"
1314
"github.com/k3s-io/kine/pkg/drivers/mysql"
1415
"github.com/k3s-io/kine/pkg/drivers/nats"
1516
"github.com/k3s-io/kine/pkg/drivers/pgsql"
@@ -35,6 +36,7 @@ const (
3536
NATSBackend = "nats"
3637
MySQLBackend = "mysql"
3738
PostgresBackend = "postgres"
39+
LibSQLBackend = "libsql"
3840
)
3941

4042
type Config struct {
@@ -224,6 +226,8 @@ func getKineStorageBackend(ctx context.Context, driver, dsn string, cfg Config)
224226
backend, err = nats.NewLegacy(ctx, dsn, cfg.BackendTLSConfig)
225227
case NATSBackend:
226228
backend, err = nats.New(ctx, dsn, cfg.BackendTLSConfig)
229+
case LibSQLBackend:
230+
backend, err = libsql.New(ctx, dsn, cfg.ConnectionPoolConfig, cfg.MetricsRegisterer)
227231
default:
228232
return false, nil, fmt.Errorf("storage backend is not defined")
229233
}

scripts/test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,7 @@ echo "did test-nats-embedded $?"
4343
. ./scripts/test-run-nats-socket
4444
echo "did test-nats-socket $?"
4545

46+
. ./scripts/test-run-libsql
47+
echo "did test-run-libsql $?"
48+
4649
exit 0

scripts/test-run-libsql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
start-test() {
3+
KINE_IMAGE=$IMAGE KINE_ENDPOINT="libsql" provision-kine
4+
local kine_url=$(cat $TEST_DIR/kine/*/metadata/url)
5+
K3S_DATASTORE_ENDPOINT=$kine_url provision-cluster
6+
}
7+
export -f start-test
8+
9+
LABEL=libsql run-test

0 commit comments

Comments
 (0)