Class: PEROBS::BTreeNodeCache

Inherits:
Object
  • Object
show all
Defined in:
lib/perobs/BTreeNodeCache.rb

Instance Method Summary collapse

Constructor Details

#initialize(tree) ⇒ BTreeNodeCache

Returns a new instance of BTreeNodeCache.



34
35
36
37
# File 'lib/perobs/BTreeNodeCache.rb', line 34

def initialize(tree)
  @tree = tree
  clear
end

Instance Method Details

#_collect(address, ruby_object_id) ⇒ Object



78
79
80
# File 'lib/perobs/BTreeNodeCache.rb', line 78

def _collect(address, ruby_object_id)
  # Just a dummy for now
end

#clearObject

Remove all nodes from the cache.



100
101
102
103
104
# File 'lib/perobs/BTreeNodeCache.rb', line 100

def clear
  @top_nodes = {}
  @ephemeral_nodes = {}
  @modified_nodes = {}
end

#delete(address) ⇒ Object

Remove a node from the cache.

Parameters:

  • address (Integer)

    address of node to remove.



84
85
86
87
88
# File 'lib/perobs/BTreeNodeCache.rb', line 84

def delete(address)
  @ephemeral_nodes.delete(address)
  @top_nodes.delete(address)
  @modified_nodes.delete(address)
end

#flush(now = false) ⇒ Object

Flush all dirty nodes into the backing store.



91
92
93
94
95
96
97
# File 'lib/perobs/BTreeNodeCache.rb', line 91

def flush(now = false)
  if now || @modified_nodes.size > 1024
    @modified_nodes.each_value { |node| node.write_node }
    @modified_nodes = {}
  end
  @ephemeral_nodes = {}
end

#get(address) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/perobs/BTreeNodeCache.rb', line 39

def get(address)
  if (node = @modified_nodes[address])
    return node
  end

  if (node = @top_nodes[address])
    return node
  end

  if (node = @ephemeral_nodes[address])
    return node
  end

  BTreeNode::load(@tree, address)
end

#insert(node, modified = true) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/perobs/BTreeNodeCache.rb', line 62

def insert(node, modified = true)
  unless node
    PEROBS.log.fatal "nil cannot be cached"
  end
  node = node.get_node if node.is_a?(BTreeNodeLink)

  if modified
    @modified_nodes[node.node_address] = node
  end
  @ephemeral_nodes[node.node_address] = node

  if !@top_nodes.include?(node) && node.is_top?
    @top_nodes[node.node_address] = node
  end
end

#set_root(node) ⇒ Object



55
56
57
58
59
60
# File 'lib/perobs/BTreeNodeCache.rb', line 55

def set_root(node)
  node = node.get_node if node.is_a?(BTreeNodeLink)

  @top_nodes = {}
  @top_nodes[node.node_address] = node
end