Skip to content

Commit 6243cc1

Browse files
committed
feat(share): Adding expiration on metadatas
Signed-off-by: Vincent Boutour <[email protected]>
1 parent 2dfaf58 commit 6243cc1

File tree

11 files changed

+223
-19
lines changed

11 files changed

+223
-19
lines changed

.fibr/.json

+7-3
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55
"rootName": "fibr",
66
"password": "",
77
"edit": true,
8-
"file": false
8+
"file": false,
9+
"creation": "2021-04-28T11:50:51.991262+02:00",
10+
"duration": 0
911
},
1012
{
1113
"id": "password",
1214
"path": "/infra/",
1315
"rootName": "infra",
1416
"password": "$2a$12$SVaRKEx6MrP2ZdUOrBoSg.s/hIT5VJTuimQEQGkReIyYRPX14sV12",
1517
"edit": false,
16-
"file": false
18+
"file": false,
19+
"creation": "2021-04-28T11:50:51.991262+02:00",
20+
"duration": 0
1721
}
18-
]
22+
]

cmd/fibr/fibr.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func main() {
8181
fibrApp := fibr.New(crudApp, rendererApp, middlewareApp)
8282

8383
go thumbnailApp.Start()
84-
go crudApp.Start()
84+
go crudApp.Start(appServer.Done())
8585

8686
go promServer.Start("prometheus", healthApp.End(), prometheusApp.Handler())
8787
go appServer.Start("http", healthApp.End(), httputils.Handler(fibrApp.Handler(), healthApp, prometheusApp.Middleware, owasp.New(owaspConfig).Middleware))

go.sum

+17
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc
4646
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
4747
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
4848
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
49+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4950
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5051
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
52+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
5153
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
5254
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
5355
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@@ -62,6 +64,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
6264
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
6365
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
6466
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
67+
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
6568
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
6669
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
6770
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -70,6 +73,7 @@ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgO
7073
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
7174
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
7275
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
76+
github.com/go-redis/redis/v8 v8.8.2 h1:O/NcHqobw7SEptA0yA6up6spZVFtwE06SXM8rgLtsP8=
7377
github.com/go-redis/redis/v8 v8.8.2/go.mod h1:F7resOH5Kdug49Otu24RjHWwgK7u9AmtqWMnCV1iP5Y=
7478
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
7579
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -189,17 +193,20 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE
189193
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
190194
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
191195
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
196+
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
192197
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
193198
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
194199
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
195200
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
196201
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
197202
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
198203
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
204+
github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4=
199205
github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
200206
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
201207
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
202208
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
209+
github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ=
203210
github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
204211
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
205212
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
@@ -220,6 +227,7 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
220227
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
221228
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
222229
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
230+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
223231
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
224232
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
225233
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@@ -275,6 +283,7 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
275283
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
276284
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
277285
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
286+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
278287
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
279288
github.com/tdewolff/minify/v2 v2.9.16 h1:2Pv8pFRX/ZfjTRYX2xzcuNrkEJqU5TfriNJJYOeN3rI=
280289
github.com/tdewolff/minify/v2 v2.9.16/go.mod h1:cjMkr4ZgFjqxXAQ1kR9Fm4l1046mmONd2g6yMzGuN/w=
@@ -292,9 +301,13 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI
292301
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
293302
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
294303
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
304+
go.opentelemetry.io/otel v0.19.0 h1:Lenfy7QHRXPZVsw/12CWpxX6d/JkrX8wrx2vO8G80Ng=
295305
go.opentelemetry.io/otel v0.19.0/go.mod h1:j9bF567N9EfomkSidSfmMwIwIBuP37AMAIzVW85OxSg=
306+
go.opentelemetry.io/otel/metric v0.19.0 h1:dtZ1Ju44gkJkYvo+3qGqVXmf88tc+a42edOywypengg=
296307
go.opentelemetry.io/otel/metric v0.19.0/go.mod h1:8f9fglJPRnXuskQmKpnad31lcLJ2VmNNqIsx/uIwBSc=
308+
go.opentelemetry.io/otel/oteltest v0.19.0 h1:YVfA0ByROYqTwOxqHVZYZExzEpfZor+MU1rU+ip2v9Q=
297309
go.opentelemetry.io/otel/oteltest v0.19.0/go.mod h1:tI4yxwh8U21v7JD6R3BcA/2+RBoTKFexE/PJ/nSO7IA=
310+
go.opentelemetry.io/otel/trace v0.19.0 h1:1ucYlenXIDA1OlHVLDZKX0ObXV5RLaq06DtUKz5e5zc=
298311
go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bjBWZQA5DXz/qg=
299312
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
300313
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -340,6 +353,7 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL
340353
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
341354
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
342355
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
356+
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U=
343357
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
344358
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
345359
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -447,14 +461,17 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
447461
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
448462
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
449463
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
464+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
450465
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
451466
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
452467
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
453468
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
454469
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
455470
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
456471
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
472+
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
457473
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
474+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
458475
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
459476
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
460477
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

pkg/crud/crud.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ import (
1111
"regexp"
1212
"strings"
1313
"sync"
14+
"syscall"
15+
"time"
1416

1517
"github.com/ViBiOh/fibr/pkg/provider"
1618
"github.com/ViBiOh/fibr/pkg/thumbnail"
19+
"github.com/ViBiOh/httputils/v4/pkg/cron"
1720
"github.com/ViBiOh/httputils/v4/pkg/flags"
1821
"github.com/ViBiOh/httputils/v4/pkg/logger"
1922
"github.com/ViBiOh/httputils/v4/pkg/renderer"
@@ -39,7 +42,7 @@ var filesystem embed.FS
3942

4043
// App of package
4144
type App interface {
42-
Start()
45+
Start(done <-chan struct{})
4346

4447
Browser(http.ResponseWriter, provider.Request, provider.StorageItem, renderer.Message)
4548
ServeStatic(http.ResponseWriter, *http.Request) bool
@@ -71,6 +74,7 @@ type app struct {
7174
thumbnail thumbnail.App
7275

7376
staticHandler http.Handler
77+
clock Clock
7478

7579
metadatas []*provider.Share
7680
metadataLock sync.Mutex
@@ -95,6 +99,8 @@ func New(config Config, storage provider.Storage, renderer provider.Renderer, th
9599
metadataLock: sync.Mutex{},
96100
sanitizeOnStart: *config.sanitizeOnStart,
97101

102+
clock: Clock{},
103+
98104
storage: storage,
99105
renderer: renderer,
100106
thumbnail: thumbnail,
@@ -108,7 +114,7 @@ func New(config Config, storage provider.Storage, renderer provider.Renderer, th
108114
app.staticHandler = http.FileServer(http.FS(staticFS))
109115

110116
if app.metadataEnabled {
111-
logger.Fatal(app.loadMetadata())
117+
logger.Fatal(app.refreshMetadatas())
112118
}
113119

114120
var ignorePattern *regexp.Regexp
@@ -138,7 +144,7 @@ func New(config Config, storage provider.Storage, renderer provider.Renderer, th
138144
return app, nil
139145
}
140146

141-
func (a *app) Start() {
147+
func (a *app) Start(done <-chan struct{}) {
142148
renameCount := prometheus.NewGaugeVec(prometheus.GaugeOpts{
143149
Namespace: "fibr",
144150
Subsystem: "renames",
@@ -175,6 +181,12 @@ func (a *app) Start() {
175181
if err != nil {
176182
logger.Error("%s", err)
177183
}
184+
185+
if a.metadataEnabled {
186+
cron.New().Each(time.Hour).OnError(func(e error) {
187+
logger.Error("unable to purge metadata: %s", err)
188+
}).OnSignal(syscall.SIGUSR1).Now().Start(a.cleanMetadatas, done)
189+
}
178190
}
179191

180192
func (a *app) rename(item provider.StorageItem, name string, guage *prometheus.GaugeVec) {

pkg/crud/crudtest/crudtest.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func New() App {
4242
}
4343

4444
// Start mocked implementation
45-
func (a App) Start() {
45+
func (a App) Start(<-chan struct{}) {
4646
// mock implementation
4747
}
4848

pkg/crud/metadata.go

+71-5
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,36 @@
11
package crud
22

33
import (
4+
"context"
45
"encoding/json"
56
"errors"
67
"fmt"
78
"io"
89
"path"
10+
"time"
911

1012
"github.com/ViBiOh/fibr/pkg/provider"
13+
"github.com/ViBiOh/httputils/v4/pkg/logger"
1114
)
1215

1316
var (
1417
metadataFilename = path.Join(provider.MetadataDirectoryName, ".json")
1518
)
1619

17-
func (a *app) loadMetadata() error {
20+
// Clock give time
21+
type Clock struct {
22+
now time.Time
23+
}
24+
25+
// Now return current time
26+
func (c *Clock) Now() time.Time {
27+
if c == nil {
28+
return time.Now()
29+
}
30+
return c.now
31+
}
32+
33+
func (a *app) refreshMetadatas() error {
1834
_, err := a.storage.Info(metadataFilename)
1935
if err != nil && !provider.IsNotExist(err) {
2036
return err
@@ -42,14 +58,64 @@ func (a *app) loadMetadata() error {
4258
return err
4359
}
4460

45-
rawMeta, err := io.ReadAll(file)
46-
if err != nil {
61+
decoder := json.NewDecoder(file)
62+
if err = decoder.Decode(&a.metadatas); err != nil {
4763
return err
64+
}
4865

66+
now := a.clock.Now()
67+
for _, metadata := range a.metadatas {
68+
if metadata.Creation.IsZero() {
69+
metadata.Creation = now
70+
}
4971
}
5072

51-
if err = json.Unmarshal(rawMeta, &a.metadatas); err != nil {
52-
return err
73+
return nil
74+
}
75+
76+
func (a *app) purgeExpiredMetadatas() {
77+
now := a.clock.Now()
78+
79+
count := 0
80+
for _, metadata := range a.metadatas {
81+
if metadata.Duration == 0 || metadata.Creation.Add(metadata.Duration).After(now) {
82+
a.metadatas[count] = metadata
83+
count++
84+
}
85+
}
86+
87+
a.metadatas = a.metadatas[:count]
88+
}
89+
90+
func (a *app) cleanMetadatas(_ context.Context) error {
91+
a.metadataLock.Lock()
92+
defer a.metadataLock.Unlock()
93+
94+
if err := a.refreshMetadatas(); err != nil {
95+
return fmt.Errorf("unable to refresh metadatas: %s", err)
96+
}
97+
98+
lockFilename := path.Join(provider.MetadataDirectoryName, ".lock")
99+
acquired, err := a.storage.Semaphore(lockFilename)
100+
if err != nil {
101+
return fmt.Errorf("unable to create lock file: %s", err)
102+
}
103+
104+
if !acquired {
105+
logger.Info("metadatas purge is already in progress: lock file creation failed")
106+
return nil
107+
}
108+
109+
defer func() {
110+
if err := a.storage.Remove(lockFilename); err != nil {
111+
logger.WithField("filename", lockFilename).Error("unable to remove lock file: %s", err)
112+
}
113+
}()
114+
115+
a.purgeExpiredMetadatas()
116+
117+
if err := a.saveMetadata(); err != nil {
118+
return fmt.Errorf("unable to save metadatas: %s", err)
53119
}
54120

55121
return nil

0 commit comments

Comments
 (0)