@@ -74,9 +74,8 @@ class StateStoreSuite extends SparkFunSuite with BeforeAndAfter with PrivateMeth
7474 assert(store.commit() === 1 )
7575
7676 assert(store.hasCommitted)
77- assert(store.iterator() === Set (" b" -> 2 ))
78- assert(store.updates() === Set (" b" -> 2 ))
79- assert(provider.latestIterator() === Set (" b" -> 2 ))
77+ assert(unwrapToSet(store.iterator()) === Set (" b" -> 2 ))
78+ assert(unwrapToSet(provider.latestIterator()) === Set (" b" -> 2 ))
8079 assert(fileExists(provider, version = 1 , isSnapshot = false ))
8180 assert(getDataFromFiles(provider) === Set (" b" -> 2 ))
8281
@@ -92,8 +91,7 @@ class StateStoreSuite extends SparkFunSuite with BeforeAndAfter with PrivateMeth
9291 val reloadedStore = new HDFSBackedStateStoreProvider (store.id, provider.directory).getStore(1 )
9392 update(reloadedStore, " c" , 4 )
9493 assert(reloadedStore.commit() === 2 )
95- assert(reloadedStore.iterator() === Set (" b" -> 2 , " c" -> 4 ))
96- assert(reloadedStore.updates() === Set (" c" -> 4 ))
94+ assert(unwrapToSet(reloadedStore.iterator()) === Set (" b" -> 2 , " c" -> 4 ))
9795 assert(getDataFromFiles(provider) === Set (" b" -> 2 , " c" -> 4 ))
9896 assert(getDataFromFiles(provider, version = 1 ) === Set (" b" -> 2 ))
9997 assert(getDataFromFiles(provider, version = 2 ) === Set (" b" -> 2 , " c" -> 4 ))
@@ -104,7 +102,7 @@ class StateStoreSuite extends SparkFunSuite with BeforeAndAfter with PrivateMeth
104102 val store = provider.getStore(0 )
105103 update(store, " a" , 1 )
106104 store.commit()
107- assert(store.iterator() === Set (" a" -> 1 ))
105+ assert(unwrapToSet( store.iterator() ) === Set (" a" -> 1 ))
108106
109107 // cancelUpdates should not change the data in the files
110108 val store1 = provider.getStore(1 )
@@ -124,87 +122,92 @@ class StateStoreSuite extends SparkFunSuite with BeforeAndAfter with PrivateMeth
124122 val store = provider.getStore(0 )
125123 update(store, " a" , 1 )
126124 assert(store.commit() === 1 )
127- assert(store.iterator() === Set (" a" -> 1 ))
125+ assert(unwrapToSet( store.iterator() ) === Set (" a" -> 1 ))
128126
129127 intercept[IllegalStateException ] {
130128 provider.getStore(2 )
131129 }
132130
133131 // Update store version with some data
134- provider.getStore(1 )
135- update(store , " b" , 1 )
136- assert(store .commit() === 2 )
137- assert(store .iterator() === Set (" a" -> 1 , " b" -> 1 ))
132+ val store1 = provider.getStore(1 )
133+ update(store1 , " b" , 1 )
134+ assert(store1 .commit() === 2 )
135+ assert(unwrapToSet(store1 .iterator() ) === Set (" a" -> 1 , " b" -> 1 ))
138136 assert(getDataFromFiles(provider) === Set (" a" -> 1 , " b" -> 1 ))
139137
140138 // Overwrite the version with other data
141- provider.getStore(1 )
142- update(store , " c" , 1 )
143- assert(store .commit() === 2 )
144- assert(store .iterator() === Set (" a" -> 1 , " c" -> 1 ))
139+ val store2 = provider.getStore(1 )
140+ update(store2 , " c" , 1 )
141+ assert(store2 .commit() === 2 )
142+ assert(unwrapToSet(store2 .iterator() ) === Set (" a" -> 1 , " c" -> 1 ))
145143 assert(getDataFromFiles(provider) === Set (" a" -> 1 , " c" -> 1 ))
146144 }
147145
148146 test(" snapshotting" ) {
149147 val provider = newStoreProvider(maxDeltaChainForSnapshots = 5 )
150148
151- var currentVersion = - 1
149+ var currentVersion = 0
152150 def updateVersionTo (targetVersion : Int ): Unit = {
153151 for (i <- currentVersion + 1 to targetVersion) {
154- val store = provider.getStore(i - 1 )
152+ val store = provider.getStore(currentVersion )
155153 update(store, " a" , i)
156154 store.commit()
157-
155+ currentVersion += 1
158156 }
159- currentVersion = targetVersion
157+ require( currentVersion === targetVersion)
160158 }
161159
160+
162161 updateVersionTo(2 )
163162 require(getDataFromFiles(provider) === Set (" a" -> 2 ))
164163 provider.manage() // should not generate snapshot files
165164 assert(getDataFromFiles(provider) === Set (" a" -> 2 ))
166- for (i <- 0 to 2 ) {
165+
166+ for (i <- 1 to currentVersion) {
167167 assert(fileExists(provider, i, isSnapshot = false )) // all delta files present
168168 assert(! fileExists(provider, i, isSnapshot = true )) // no snapshot files present
169169 }
170170
171171 // After version 6, snapshotting should generate one snapshot file
172172 updateVersionTo(6 )
173- require(getDataFromFiles(provider) === Set (" a" -> 6 ), " Store not updated correctly" )
173+ require(getDataFromFiles(provider) === Set (" a" -> 6 ), " store not updated correctly" )
174174 provider.manage() // should generate snapshot files
175175 assert(getDataFromFiles(provider) === Set (" a" -> 6 ), " snapshotting messed up the data" )
176176 assert(getDataFromFiles(provider) === Set (" a" -> 6 ))
177177
178178 val snapshotVersion = (0 to 6 ).find(version => fileExists(provider, version, isSnapshot = true ))
179- assert(snapshotVersion.nonEmpty, " Snapshot file not generated" )
180-
179+ assert(snapshotVersion.nonEmpty, " snapshot file not generated" )
181180
182181 // After version 20, snapshotting should generate newer snapshot files
183182 updateVersionTo(20 )
184- require(getDataFromFiles(provider) === Set (" a" -> 20 ), " Store not updated correctly" )
183+ require(getDataFromFiles(provider) === Set (" a" -> 20 ), " store not updated correctly" )
185184 provider.manage() // do snapshot
186185 assert(getDataFromFiles(provider) === Set (" a" -> 20 ), " snapshotting messed up the data" )
187186 assert(getDataFromFiles(provider) === Set (" a" -> 20 ))
188187
189188 val latestSnapshotVersion = (0 to 20 ).filter(version =>
190189 fileExists(provider, version, isSnapshot = true )).lastOption
191- assert(latestSnapshotVersion.nonEmpty, " No snapshot file found" )
192- assert(latestSnapshotVersion.get > snapshotVersion.get, " Newer snapshot not generated" )
190+ assert(latestSnapshotVersion.nonEmpty, " no snapshot file found" )
191+ assert(latestSnapshotVersion.get > snapshotVersion.get, " newer snapshot not generated" )
193192
194193 }
195194
196195 test(" cleaning" ) {
197196 val provider = newStoreProvider(maxDeltaChainForSnapshots = 5 )
198197
199- for (i <- 0 to 20 ) {
200- val store = provider.getStore(i)
198+ for (i <- 1 to 20 ) {
199+ val store = provider.getStore(i - 1 )
201200 update(store, " a" , i)
202201 store.commit()
202+ provider.manage() // do cleanup
203203 }
204- require(provider.latestIterator() === Set (" a" -> 20 ), " Store not updated correctly" )
205- provider.manage() // do cleanup
206- assert(fileExists(provider, 0 , isSnapshot = false ))
204+ require(
205+ unwrapToSet(provider.latestIterator()) === Set (" a" -> 20 ),
206+ " store not updated correctly" )
207+
208+ assert(! fileExists(provider, version = 1 , isSnapshot = false )) // first file should be deleted
207209
210+ // last couple of versions should be retrievable
208211 assert(getDataFromFiles(provider, 20 ) === Set (" a" -> 20 ))
209212 assert(getDataFromFiles(provider, 19 ) === Set (" a" -> 19 ))
210213 }
@@ -214,7 +217,7 @@ class StateStoreSuite extends SparkFunSuite with BeforeAndAfter with PrivateMeth
214217 version : Int = - 1 ): Set [(String , Int )] = {
215218 val reloadedProvider = new HDFSBackedStateStoreProvider (provider.id, provider.directory)
216219 if (version < 0 ) {
217- reloadedProvider.latestIterator.map(unwrapKeyValue).toSet
220+ reloadedProvider.latestIterator() .map(unwrapKeyValue).toSet
218221 } else {
219222 reloadedProvider.iterator(version).map(unwrapKeyValue).toSet
220223 }
@@ -295,4 +298,8 @@ private[state] object StateStoreSuite {
295298 def unwrapKeyValue (row : InternalRow ): (String , Int ) = {
296299 (row.getString(0 ), row.getInt(1 ))
297300 }
301+
302+ def unwrapToSet (iterator : Iterator [InternalRow ]): Set [(String , Int )] = {
303+ iterator.map(unwrapKeyValue).toSet
304+ }
298305}
0 commit comments