aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/scala/spark/storage/StorageLevel.scala
blob: 693a679c4e79fc7adb788fc705e93f79af76b3f2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package spark.storage

import java.io._

class StorageLevel(
    var useDisk: Boolean, 
    var useMemory: Boolean,
    var deserialized: Boolean,
    var replication: Int = 1)
  extends Externalizable {

  // TODO: Also add fields for caching priority, dataset ID, and flushing.
  
  def this(booleanInt: Int, replication: Int) {
    this(((booleanInt & 4) != 0),
        ((booleanInt & 2) != 0), 
        ((booleanInt & 1) != 0),
        replication)
  }

  def this() = this(false, true, false)  // For deserialization

  override def clone(): StorageLevel = new StorageLevel(
    this.useDisk, this.useMemory, this.deserialized, this.replication)

  override def equals(other: Any): Boolean = other match {
    case s: StorageLevel =>
      s.useDisk == useDisk && 
      s.useMemory == useMemory &&
      s.deserialized == deserialized &&
      s.replication == replication 
    case _ =>
      false
  }
 
  def isValid() = ((useMemory || useDisk) && (replication > 0))

  def toInt(): Int = {
    var ret = 0
    if (useDisk) {
      ret += 4
    }
    if (useMemory) {
      ret += 2
    }
    if (deserialized) {
      ret += 1
    }
    return ret
  }

  override def writeExternal(out: ObjectOutput) {
    out.writeByte(toInt().toByte)
    out.writeByte(replication.toByte)
  }

  override def readExternal(in: ObjectInput) {
    val flags = in.readByte()
    useDisk = (flags & 4) != 0
    useMemory = (flags & 2) != 0
    deserialized = (flags & 1) != 0
    replication = in.readByte()
  }

  override def toString(): String =
    "StorageLevel(%b, %b, %b, %d)".format(useDisk, useMemory, deserialized, replication)
}

object StorageLevel {
  val NONE = new StorageLevel(false, false, false)
  val DISK_ONLY = new StorageLevel(true, false, false)
  val MEMORY_ONLY = new StorageLevel(false, true, false)
  val MEMORY_ONLY_2 = new StorageLevel(false, true, false, 2)
  val MEMORY_ONLY_DESER = new StorageLevel(false, true, true)
  val MEMORY_ONLY_DESER_2 = new StorageLevel(false, true, true, 2)
  val DISK_AND_MEMORY = new StorageLevel(true, true, false)
  val DISK_AND_MEMORY_2 = new StorageLevel(true, true, false, 2)
  val DISK_AND_MEMORY_DESER = new StorageLevel(true, true, true)
  val DISK_AND_MEMORY_DESER_2 = new StorageLevel(true, true, true, 2)
}