@@ -137,6 +137,61 @@ func TestRewriteSnapshotBackground(t *testing.T) {
137137 stopped = true
138138}
139139
140+ // helper to commit one change to bump height
141+ func RequireCommitWithNoError (t * testing.T , db * DB , key , val string ) int64 {
142+ pairs := []* iavl.KVPair {{Key : []byte (key ), Value : []byte (val )}}
143+ cs := []* proto.NamedChangeSet {
144+ {Name : "test" , Changeset : iavl.ChangeSet {Pairs : pairs }},
145+ }
146+ require .NoError (t , db .ApplyChangeSets (cs ))
147+ v , err := db .Commit ()
148+ require .NoError (t , err )
149+ return v
150+ }
151+
152+ // Ensures snapshot rewrite is triggered when current height minus last snapshot height
153+ // exceeds the configured snapshot interval (strictly greater).
154+ func TestSnapshotTriggerOnIntervalDiff (t * testing.T ) {
155+ dir := t .TempDir ()
156+ db , err := OpenDB (logger .NewNopLogger (), 0 , Options {
157+ Dir : dir ,
158+ CreateIfMissing : true ,
159+ InitialStores : []string {"test" },
160+ SnapshotInterval : 5 ,
161+ SnapshotKeepRecent : 0 ,
162+ })
163+ require .NoError (t , err )
164+
165+ // Heights 1..4 should NOT trigger because diff<=interval
166+ for i := 1 ; i < 5 ; i ++ {
167+ v := RequireCommitWithNoError (t , db , "k" + strconv .Itoa (i ), "v" )
168+ require .EqualValues (t , i , v )
169+ // allow any background processing
170+ time .Sleep (10 * time .Millisecond )
171+ require .Nil (t , db .snapshotRewriteChan , "rewrite should not start at height %d" , i )
172+ // snapshot version should remain 0 until rewrite
173+ require .EqualValues (t , 0 , db .MultiTree .SnapshotVersion ())
174+ }
175+
176+ // Height 5 should trigger rewrite
177+ v := RequireCommitWithNoError (t , db , "k6" , "v" )
178+ require .Equal (t , int64 (5 ), v )
179+
180+ // wait briefly for background rewrite to start
181+ require .Eventually (t , func () bool {
182+ return db .snapshotRewriteChan != nil
183+ }, 3 * time .Second , 100 * time .Millisecond )
184+ require .Eventually (t , func () bool {
185+ require .NoError (t , db .checkAsyncTasks ())
186+ return db .snapshotRewriteChan == nil
187+ }, 5 * time .Second , 100 * time .Millisecond )
188+
189+ // After completion, snapshot version should be 6
190+ require .EqualValues (t , 5 , db .MultiTree .SnapshotVersion ())
191+
192+ require .NoError (t , db .Close ())
193+ }
194+
140195func TestRlog (t * testing.T ) {
141196 dir := t .TempDir ()
142197 db , err := OpenDB (logger .NewNopLogger (), 0 , Options {
0 commit comments