Making PersistentVector.pop required, removed support for it being optional
This commit is contained in:
parent
bfa115b7ff
commit
9dc370f838
7 changed files with 34 additions and 59 deletions
|
|
@ -253,9 +253,6 @@ private[akka] trait KVStorageBackend extends MapStorageBackend[Array[Byte], Arra
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
override def supportsRemoveVectorStorageEntry = true
|
||||
|
||||
def getVectorMetadata(name: String): VectorMetadata = {
|
||||
val keys = List(getKey(name, vectorHeadIndex), getKey(name, vectorTailIndex))
|
||||
val vdata = vectorAccess.getAll(keys)
|
||||
|
|
|
|||
|
|
@ -516,14 +516,10 @@ trait PersistentVector[T] extends IndexedSeq[T] with Transactional with Committa
|
|||
* Removes the <i>tail</i> element of this vector.
|
||||
*/
|
||||
def pop: T = {
|
||||
if(storage.supportsRemoveVectorStorageEntry){
|
||||
register
|
||||
val curr = replay
|
||||
appendOnlyTxLog + LogEntry(None, None, POP)
|
||||
curr.last
|
||||
} else {
|
||||
throw new UnsupportedOperationException("Vector pop is not supported by the current backend")
|
||||
}
|
||||
}
|
||||
|
||||
def update(index: Int, newElem: T) = {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ trait VectorStorageBackend[T] extends StorageBackend {
|
|||
//should remove the "tail" if supported
|
||||
throw new UnsupportedOperationException("VectorStorageBackend.removeVectorStorageEntry is not supported")
|
||||
}
|
||||
def supportsRemoveVectorStorageEntry:Boolean = false //Allows the Vector frontend to fail on calls to pop, instead of at commit time
|
||||
}
|
||||
|
||||
// for Ref
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ case class VADD_WITH_SLICE(vsToAdd: List[String], start: Int, cnt: Int)
|
|||
object StorageObj {
|
||||
var getMap: String => PersistentMap[Array[Byte], Array[Byte]] = _
|
||||
var getVector: String => PersistentVector[Array[Byte]] = _
|
||||
var supportsRemove:Boolean = false
|
||||
|
||||
class SampleMapStorage extends Actor {
|
||||
self.lifeCycle = Permanent
|
||||
|
|
@ -198,14 +197,11 @@ Spec with
|
|||
|
||||
def getVector: String => PersistentVector[Array[Byte]]
|
||||
|
||||
def supportsVectorRemove: Boolean
|
||||
|
||||
def dropMapsAndVectors: Unit
|
||||
|
||||
override def beforeEach {
|
||||
StorageObj.getMap = getMap
|
||||
StorageObj.getVector = getVector
|
||||
StorageObj.supportsRemove = supportsVectorRemove
|
||||
dropMapsAndVectors
|
||||
println("** dropMapsAndVectors")
|
||||
}
|
||||
|
|
@ -310,19 +306,13 @@ Spec with
|
|||
proc.start
|
||||
|
||||
// add 4 elements in separate transactions //also test add + pop of a 5th element
|
||||
if(StorageObj.supportsRemove){
|
||||
(proc !! VADD("ticktock")).getOrElse("VADD failed") should equal(1)
|
||||
(proc !! VADD("debasish")).getOrElse("VADD failed") should equal(2)
|
||||
(proc !! VADD("maulindu")).getOrElse("VADD failed") should equal(3)
|
||||
(proc !! VADD("ramanendu")).getOrElse("VADD failed") should equal(4)
|
||||
(proc !! VADD("nilanjan")).getOrElse("VADD failed") should equal(5)
|
||||
(proc !! VPOP).getOrElse("VPOP failed") should equal("ticktock".getBytes)
|
||||
} else {
|
||||
(proc !! VADD("debasish")).getOrElse("VADD failed") should equal(1)
|
||||
(proc !! VADD("maulindu")).getOrElse("VADD failed") should equal(2)
|
||||
(proc !! VADD("ramanendu")).getOrElse("VADD failed") should equal(3)
|
||||
(proc !! VADD("nilanjan")).getOrElse("VADD failed") should equal(4)
|
||||
}
|
||||
|
||||
(proc !! VADD("ticktock")).getOrElse("VADD failed") should equal(1)
|
||||
(proc !! VADD("debasish")).getOrElse("VADD failed") should equal(2)
|
||||
(proc !! VADD("maulindu")).getOrElse("VADD failed") should equal(3)
|
||||
(proc !! VADD("ramanendu")).getOrElse("VADD failed") should equal(4)
|
||||
(proc !! VADD("nilanjan")).getOrElse("VADD failed") should equal(5)
|
||||
(proc !! VPOP).getOrElse("VPOP failed") should equal("ticktock".getBytes)
|
||||
|
||||
new String((proc !! VGET(0)).get.asInstanceOf[Array[Byte]]) should equal("nilanjan")
|
||||
new String((proc !! VGET(1)).get.asInstanceOf[Array[Byte]]) should equal("ramanendu")
|
||||
|
|
|
|||
|
|
@ -120,38 +120,34 @@ trait VectorStorageBackendTest extends Spec with ShouldMatchers with BeforeAndAf
|
|||
|
||||
|
||||
it("should support remove properly") {
|
||||
if (storage.supportsRemoveVectorStorageEntry) {
|
||||
val vector = "removeTest"
|
||||
val rand = new Random(3).nextInt(100)
|
||||
val values = (0 to rand).toList.map{
|
||||
i: Int => vector + "value" + i
|
||||
}
|
||||
storage.insertVectorStorageEntriesFor(vector, values.map{
|
||||
s: String => s.getBytes
|
||||
})
|
||||
storage.getVectorStorageSizeFor(vector) should be(values.size)
|
||||
(1 to rand).foreach{
|
||||
i: Int => {
|
||||
storage.removeVectorStorageEntryFor(vector)
|
||||
values.reverse.dropRight(i) should be(storage.getVectorStorageRangeFor(vector, None, None, rand + 1 - i).map{
|
||||
b: Array[Byte] => new String(b)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
storage.removeVectorStorageEntryFor(vector)
|
||||
storage.getVectorStorageSizeFor(vector) should be(0)
|
||||
storage.insertVectorStorageEntriesFor(vector, values.map{
|
||||
s: String => s.getBytes
|
||||
})
|
||||
storage.getVectorStorageSizeFor(vector) should be(values.size)
|
||||
values.foreach{
|
||||
s => storage.removeVectorStorageEntryFor(vector)
|
||||
}
|
||||
storage.getVectorStorageSizeFor(vector) should be(0)
|
||||
} else {
|
||||
log.warn("The current backend being tested does not support removeVectorStorageEntryFor")
|
||||
val vector = "removeTest"
|
||||
val rand = new Random(3).nextInt(100)
|
||||
val values = (0 to rand).toList.map{
|
||||
i: Int => vector + "value" + i
|
||||
}
|
||||
storage.insertVectorStorageEntriesFor(vector, values.map{
|
||||
s: String => s.getBytes
|
||||
})
|
||||
storage.getVectorStorageSizeFor(vector) should be(values.size)
|
||||
(1 to rand).foreach{
|
||||
i: Int => {
|
||||
storage.removeVectorStorageEntryFor(vector)
|
||||
values.reverse.dropRight(i) should be(storage.getVectorStorageRangeFor(vector, None, None, rand + 1 - i).map{
|
||||
b: Array[Byte] => new String(b)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
storage.removeVectorStorageEntryFor(vector)
|
||||
storage.getVectorStorageSizeFor(vector) should be(0)
|
||||
storage.insertVectorStorageEntriesFor(vector, values.map{
|
||||
s: String => s.getBytes
|
||||
})
|
||||
storage.getVectorStorageSizeFor(vector) should be(values.size)
|
||||
values.foreach{
|
||||
s => storage.removeVectorStorageEntryFor(vector)
|
||||
}
|
||||
storage.getVectorStorageSizeFor(vector) should be(0)
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,5 +20,4 @@ class RiakTicket343TestIntegration extends Ticket343Test {
|
|||
|
||||
def getMap: (String) => PersistentMap[Array[Byte], Array[Byte]] = RiakStorage.getMap
|
||||
|
||||
def supportsVectorRemove = true
|
||||
}
|
||||
|
|
@ -20,6 +20,4 @@ class VoldemortTicket343Test extends Ticket343Test with EmbeddedVoldemort {
|
|||
|
||||
def getMap: (String) => PersistentMap[Array[Byte], Array[Byte]] = VoldemortStorage.getMap
|
||||
|
||||
def supportsVectorRemove = true
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue