add LRU, block structure · Java-Echo/DistributedMiniSQL@7013452 · GitHub
Skip to content

Commit 7013452

Browse files
committed
add LRU, block structure
1 parent 6eefc86 commit 7013452

7 files changed

Lines changed: 238 additions & 0 deletions

File tree

.idea/.gitignore

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/DistributedMiniSQL.iml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Buffermanager/LRU.go

Lines changed: 108 additions & 0 deletions

src/Buffermanager/block.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package Buffermanager
2+
3+
import (
4+
"io"
5+
"os"
6+
"sync"
7+
)
8+
9+
type block struct{
10+
filename string
11+
blockid uint64
12+
isDirty bool
13+
pin bool
14+
Data []byte
15+
next *block
16+
prev *block // double linked list
17+
sync.Mutex
18+
}
19+
20+
// operations
21+
// set dirty page
22+
func (b *block) setDirty(){
23+
b.isDirty = true
24+
}
25+
// set pin block
26+
func (b *block) setPin(){
27+
b.pin = true
28+
}
29+
// unset pin block
30+
func (b *block) setUnPin(){
31+
b.pin = false
32+
}
33+
// release the lock of reading block
34+
func (b *block) finishRead(){
35+
b.Unlock()
36+
return
37+
}
38+
39+
//reset the block
40+
func (b *block) reset(){
41+
b.isDirty = false
42+
b.pin = false
43+
}
44+
45+
// init the block
46+
func (b *block) init(filename string, bid uint64){
47+
b.filename = filename
48+
b.blockid = bid
49+
}
50+
51+
// read the file
52+
func (b *block) read() error{
53+
if b.isDirty {
54+
return b.flush()
55+
}
56+
file,err := os.Open(b.filename)
57+
if err != nil{
58+
return nil
59+
}
60+
defer file.Close()
61+
if err != nil {
62+
return err
63+
}
64+
bid64 := int64(b.blockid)
65+
_,err = file.Seek(bid64*blockSize,0)
66+
if err != nil{
67+
return err
68+
}
69+
70+
_,err = io.ReadFull(file,b.Data)
71+
if err != nil {
72+
return err
73+
}
74+
75+
return err
76+
}
77+
78+
// read back and flush
79+
func (b *block)flush() error{
80+
if !b.isDirty {
81+
return nil
82+
}
83+
file,err := os.OpenFile(b.filename, os.O_WRONLY,0666) // read and write
84+
defer file.Close()
85+
if err != nil {
86+
return err
87+
}
88+
bid64 := int64(b.blockid)
89+
_, err = file.Seek(bid64*blockSize,0) // _ is a placeholder
90+
if err != nil {
91+
return err
92+
}
93+
_,err = file.Write(b.Data)
94+
b.isDirty = false
95+
return err
96+
}

src/Buffermanager/buffermanager.go

Lines changed: 3 additions & 0 deletions

0 commit comments

Comments
 (0)