@@ -151,6 +151,72 @@ func (c *CasTestSuite) testCasGcUmountByAPI(t *testing.T, enablePrefetch bool) {
151151 }
152152}
153153
154+ func (c * CasTestSuite ) TestCasGcUmount () test.Generator {
155+ scenarios := tool.DescartesIterator {}
156+ scenarios .Dimension (paramEnablePrefetch , []interface {}{false , true })
157+
158+ return func () (name string , testCase test.Case ) {
159+ if ! scenarios .HasNext () {
160+ return
161+ }
162+ scenario := scenarios .Next ()
163+
164+ return scenario .Str (), func (t * testing.T ) {
165+ c .testCasGcUmount (t , scenario .GetBool (paramEnablePrefetch ))
166+ }
167+ }
168+ }
169+
170+ func (c * CasTestSuite ) testCasGcUmount (t * testing.T , enablePrefetch bool ) {
171+ ctx , layer := texture .PrepareLayerWithContext (t )
172+ defer ctx .Destroy (t )
173+
174+ file , err := os .CreateTemp ("" , "cas-*.db" )
175+ require .NoError (t , err )
176+ defer os .Remove (file .Name ())
177+
178+ ctx .Runtime .EnablePrefetch = enablePrefetch
179+ ctx .Runtime .ChunkDedupDb = file .Name ()
180+
181+ nydusd , err := tool .NewNydusdWithContext (* ctx )
182+ require .NoError (t , err )
183+ err = nydusd .Mount ()
184+ require .NoError (t , err )
185+ nydusd .Verify (t , layer .FileTree )
186+
187+ db , err := sql .Open ("sqlite3" , file .Name ())
188+ require .NoError (t , err )
189+ defer db .Close ()
190+
191+ for _ , expectedTable := range []string {"Blobs" , "Chunks" } {
192+ _ , err = db .Exec ("PRAGMA wal_checkpoint(FULL)" )
193+ require .NoError (t , err )
194+ var count int
195+ query := fmt .Sprintf ("SELECT COUNT(*) FROM %s;" , expectedTable )
196+ err := db .QueryRow (query ).Scan (& count )
197+ require .NoError (t , err )
198+ require .NotZero (t , count )
199+ }
200+
201+ // Mock nydus snapshotter clear cache
202+ os .RemoveAll (filepath .Join (ctx .Env .WorkDir , "cache" ))
203+ time .Sleep (1 * time .Second )
204+
205+ err = nydusd .Umount ()
206+ require .NoError (t , err )
207+
208+ for _ , expectedTable := range []string {"Chunks" , "Blobs" } {
209+ // Manual execution WAL Checkpoint
210+ _ , err = db .Exec ("PRAGMA wal_checkpoint(FULL)" )
211+ require .NoError (t , err )
212+ var count int
213+ query := fmt .Sprintf ("SELECT COUNT(*) FROM %s;" , expectedTable )
214+ err := db .QueryRow (query ).Scan (& count )
215+ require .NoError (t , err )
216+ require .Zero (t , count )
217+ }
218+ }
219+
154220func TestCas (t * testing.T ) {
155221 test .Run (t , & CasTestSuite {})
156222}
0 commit comments