Making PersistentVector.pop required, removed support for it being optional

This commit is contained in:
ticktock 2010-10-25 17:26:42 -04:00
parent bfa115b7ff
commit 9dc370f838
7 changed files with 34 additions and 59 deletions

View file

@ -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)

View file

@ -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) = {

View file

@ -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

View file

@ -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")

View file

@ -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)
}

View file

@ -20,5 +20,4 @@ class RiakTicket343TestIntegration extends Ticket343Test {
def getMap: (String) => PersistentMap[Array[Byte], Array[Byte]] = RiakStorage.getMap
def supportsVectorRemove = true
}

View file

@ -20,6 +20,4 @@ class VoldemortTicket343Test extends Ticket343Test with EmbeddedVoldemort {
def getMap: (String) => PersistentMap[Array[Byte], Array[Byte]] = VoldemortStorage.getMap
def supportsVectorRemove = true
}