Skip to content

Commit a3f45b5

Browse files
committed
refactor: buffermgr
1 parent 8c3d3a2 commit a3f45b5

29 files changed

+110
-103
lines changed

Diff for: Makefile

+1-5
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ coverage:
2020
go test -coverprofile=.coverage/coverage.out $(PKG)
2121
go tool cover -html=.coverage/coverage.out -o .coverage/coverage.html
2222
mockgen:
23-
find ./pkg -name 'interface.go' -exec sh -c 'for file; do \
24-
dest_dir=$$(dirname "$$file")/mock; \
25-
mkdir -p "$$dest_dir"; \
26-
mockgen -source="$$file" -destination="$$dest_dir/$$(basename "$$file")" -package=mock; \
27-
done' sh {} +
23+
go generate ./...
2824
fmt:
2925
go fmt $(PKG)
3026
import-tools:

Diff for: pkg/buffer_mgr/buffer_mgr.go renamed to pkg/buffer/buffer_mgr.go

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
package buffermgr
1+
package buffer
22

33
import (
44
"errors"
55
"fmt"
66
"sync"
77
"time"
88

9-
"github.com/kj455/simple-db/pkg/buffer"
109
"github.com/kj455/simple-db/pkg/file"
1110
ttime "github.com/kj455/simple-db/pkg/time"
1211
)
1312

1413
const defaultMaxWaitTime = 10 * time.Second
1514

1615
type BufferMgrImpl struct {
17-
pool []buffer.Buffer
16+
pool []Buffer
1817
availableNum int
1918
mu sync.Mutex
2019
time ttime.Time
@@ -35,7 +34,7 @@ func WithTime(t ttime.Time) Option {
3534
}
3635
}
3736

38-
func NewBufferMgr(buffs []buffer.Buffer, opts ...Option) *BufferMgrImpl {
37+
func NewBufferMgr(buffs []Buffer, opts ...Option) *BufferMgrImpl {
3938
bm := &BufferMgrImpl{
4039
pool: buffs,
4140
availableNum: len(buffs),
@@ -48,11 +47,11 @@ func NewBufferMgr(buffs []buffer.Buffer, opts ...Option) *BufferMgrImpl {
4847
return bm
4948
}
5049

51-
func (bm *BufferMgrImpl) Pin(block file.BlockId) (buffer.Buffer, error) {
50+
func (bm *BufferMgrImpl) Pin(block file.BlockId) (Buffer, error) {
5251
bm.mu.Lock()
5352
defer bm.mu.Unlock()
5453
startTime := bm.time.Now()
55-
var buff buffer.Buffer
54+
var buff Buffer
5655
var ok bool
5756
for {
5857
buff, ok = bm.tryPin(block)
@@ -69,7 +68,7 @@ func (bm *BufferMgrImpl) Pin(block file.BlockId) (buffer.Buffer, error) {
6968
return buff, nil
7069
}
7170

72-
func (bm *BufferMgrImpl) Unpin(buff buffer.Buffer) {
71+
func (bm *BufferMgrImpl) Unpin(buff Buffer) {
7372
bm.mu.Lock()
7473
defer bm.mu.Unlock()
7574
buff.Unpin()
@@ -107,7 +106,7 @@ func (bm *BufferMgrImpl) hasWaitedTooLong(startTime time.Time) bool {
107106
return bm.time.Since(startTime) > bm.maxWaitTime
108107
}
109108

110-
func (bm *BufferMgrImpl) tryPin(block file.BlockId) (buffer.Buffer, bool) {
109+
func (bm *BufferMgrImpl) tryPin(block file.BlockId) (Buffer, bool) {
111110
buff, ok := bm.findBufferByBlock(block)
112111
if !ok {
113112
buff, ok = bm.findUnpinnedBuffer()
@@ -128,7 +127,7 @@ func (bm *BufferMgrImpl) tryPin(block file.BlockId) (buffer.Buffer, bool) {
128127
return buff, true
129128
}
130129

131-
func (bm *BufferMgrImpl) findBufferByBlock(block file.BlockId) (buffer.Buffer, bool) {
130+
func (bm *BufferMgrImpl) findBufferByBlock(block file.BlockId) (Buffer, bool) {
132131
for _, buff := range bm.pool {
133132
b := buff.Block()
134133
if b != nil && b.Equals(block) {
@@ -138,7 +137,7 @@ func (bm *BufferMgrImpl) findBufferByBlock(block file.BlockId) (buffer.Buffer, b
138137
return nil, false
139138
}
140139

141-
func (bm *BufferMgrImpl) findUnpinnedBuffer() (buffer.Buffer, bool) {
140+
func (bm *BufferMgrImpl) findUnpinnedBuffer() (Buffer, bool) {
142141
for _, buff := range bm.pool {
143142
if !buff.IsPinned() {
144143
return buff, true

Diff for: pkg/buffer_mgr/buffer_mgr_test.go renamed to pkg/buffer/buffer_mgr_test.go

+12-13
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
package buffermgr
1+
package buffer
22

33
import (
44
"testing"
55

6-
"github.com/kj455/simple-db/pkg/buffer"
76
"github.com/kj455/simple-db/pkg/file"
87
"github.com/kj455/simple-db/pkg/log"
98
"github.com/kj455/simple-db/pkg/testutil"
@@ -24,9 +23,9 @@ func TestBufferMgr_Pin(t *testing.T) {
2423
fileMgr := file.NewFileMgr(dir, blockSize)
2524
logMgr, err := log.NewLogMgr(fileMgr, logFileName)
2625
assert.NoError(t, err)
27-
buffs := make([]buffer.Buffer, buffNum)
26+
buffs := make([]Buffer, buffNum)
2827
for i := 0; i < buffNum; i++ {
29-
buffs[i] = buffer.NewBuffer(fileMgr, logMgr, blockSize)
28+
buffs[i] = NewBuffer(fileMgr, logMgr, blockSize)
3029
}
3130
bm := NewBufferMgr(buffs, WithMaxWaitTime(0))
3231
assert.Equal(t, buffNum, bm.AvailableNum())
@@ -49,9 +48,9 @@ func TestBufferMgr_Pin(t *testing.T) {
4948
fileMgr := file.NewFileMgr(dir, blockSize)
5049
logMgr, err := log.NewLogMgr(fileMgr, logFileName)
5150
assert.NoError(t, err)
52-
buffs := make([]buffer.Buffer, buffNum)
51+
buffs := make([]Buffer, buffNum)
5352
for i := 0; i < buffNum; i++ {
54-
buffs[i] = buffer.NewBuffer(fileMgr, logMgr, blockSize)
53+
buffs[i] = NewBuffer(fileMgr, logMgr, blockSize)
5554
}
5655
bm := NewBufferMgr(buffs, WithMaxWaitTime(0))
5756
blk := file.NewBlockId(logFileName, 0)
@@ -77,9 +76,9 @@ func TestBufferMgr_Pin(t *testing.T) {
7776
fileMgr := file.NewFileMgr(dir, blockSize)
7877
logMgr, err := log.NewLogMgr(fileMgr, logFileName)
7978
assert.NoError(t, err)
80-
buffs := make([]buffer.Buffer, buffNum)
79+
buffs := make([]Buffer, buffNum)
8180
for i := 0; i < buffNum; i++ {
82-
buffs[i] = buffer.NewBuffer(fileMgr, logMgr, blockSize)
81+
buffs[i] = NewBuffer(fileMgr, logMgr, blockSize)
8382
}
8483
bm := NewBufferMgr(buffs, WithMaxWaitTime(0))
8584
blk := file.NewBlockId(logFileName, 0)
@@ -107,8 +106,8 @@ func TestBufferMgrImpl_Unpin(t *testing.T) {
107106
fileMgr := file.NewFileMgr(dir, blockSize)
108107
logMgr, err := log.NewLogMgr(fileMgr, logFileName)
109108
assert.NoError(t, err)
110-
buff := buffer.NewBuffer(fileMgr, logMgr, blockSize)
111-
bm := NewBufferMgr([]buffer.Buffer{buff}, WithMaxWaitTime(0))
109+
buff := NewBuffer(fileMgr, logMgr, blockSize)
110+
bm := NewBufferMgr([]Buffer{buff}, WithMaxWaitTime(0))
112111
blk := file.NewBlockId(logFileName, 0)
113112

114113
_, err = bm.Pin(blk)
@@ -141,14 +140,14 @@ func TestBufferMgrImpl_FlushAll(t *testing.T) {
141140
fileMgr := file.NewFileMgr(dir, blockSize)
142141
logMgr, err := log.NewLogMgr(fileMgr, logFileName)
143142
assert.NoError(t, err)
144-
buff := buffer.NewBuffer(fileMgr, logMgr, blockSize)
145-
bm := NewBufferMgr([]buffer.Buffer{buff}, WithMaxWaitTime(0))
143+
buff := NewBuffer(fileMgr, logMgr, blockSize)
144+
bm := NewBufferMgr([]Buffer{buff}, WithMaxWaitTime(0))
146145
blk := file.NewBlockId(logFileName, 0)
147146
pBuf, err := bm.Pin(blk)
148147
assert.NoError(t, err)
149148

150149
// setup: buffer is modified by txNum 1
151-
pBuf.WriteContents(txNum, 1, func(p buffer.ReadWritePage) {
150+
pBuf.WriteContents(txNum, 1, func(p ReadWritePage) {
152151
p.SetInt(100, 200)
153152
})
154153

Diff for: pkg/buffer/interface.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
//go:generate mkdir -p mock
2+
//go:generate mockgen -source=./interface.go -package=mock -destination=./mock/interface.go
13
package buffer
24

3-
import "github.com/kj455/simple-db/pkg/file"
5+
import (
6+
"github.com/kj455/simple-db/pkg/file"
7+
)
48

59
type Buffer interface {
610
Block() file.BlockId
@@ -13,3 +17,16 @@ type Buffer interface {
1317
Pin()
1418
Unpin()
1519
}
20+
21+
/*
22+
BufferMgr has methods to pin and unpin a page.
23+
The method pin returns a Buffer object pinned to a page containing the specified block, and the unpin method unpins the page.
24+
The available method returns the number of unpinned buffer pages.
25+
And the method flushAll ensures that all pages modified by the specified transaction have been written to disk.
26+
*/
27+
type BufferMgr interface {
28+
Pin(block file.BlockId) (Buffer, error)
29+
Unpin(buff Buffer)
30+
AvailableNum() int
31+
FlushAll(txNum int) error
32+
}

Diff for: pkg/buffer_mgr/interface.go

-19
This file was deleted.

Diff for: pkg/driver/driver.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fmt"
88

99
"github.com/kj455/simple-db/pkg/buffer"
10-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
1110
"github.com/kj455/simple-db/pkg/file"
1211
"github.com/kj455/simple-db/pkg/log"
1312
"github.com/kj455/simple-db/pkg/metadata"
@@ -34,7 +33,7 @@ func (d *SimpleDriver) Open(name string) (driver.Conn, error) {
3433

3534
type Conn struct {
3635
fileMgr file.FileMgr
37-
bufMgr buffermgr.BufferMgr
36+
bufMgr buffer.BufferMgr
3837
logMgr log.LogMgr
3938
tx tx.Transaction
4039
mdMgr metadata.MetadataMgr
@@ -58,7 +57,7 @@ func NewConn(name string) (*Conn, error) {
5857
for i := 0; i < buffNum; i++ {
5958
buffs[i] = buffer.NewBuffer(fileMgr, logMgr, blockSize)
6059
}
61-
bm := buffermgr.NewBufferMgr(buffs)
60+
bm := buffer.NewBufferMgr(buffs)
6261
txNumGen := transaction.NewTxNumberGenerator()
6362
tx, err := transaction.NewTransaction(fileMgr, logMgr, bm, txNumGen)
6463
if err != nil {

Diff for: pkg/file/interface.go

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:generate mkdir -p mock
2+
//go:generate mockgen -source=./interface.go -package=mock -destination=./mock/interface.go
13
package file
24

35
import "bytes"

Diff for: pkg/log/interface.go

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:generate mkdir -p mock
2+
//go:generate mockgen -source=./interface.go -package=mock -destination=./mock/interface.go
13
package log
24

35
type LogMgr interface {

Diff for: pkg/metadata/stat_mgr_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/kj455/simple-db/pkg/buffer"
7-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
87
"github.com/kj455/simple-db/pkg/file"
98
"github.com/kj455/simple-db/pkg/log"
109
"github.com/kj455/simple-db/pkg/record"
@@ -29,7 +28,7 @@ func TestStatMgr(t *testing.T) {
2928
for i := range buffs {
3029
buffs[i] = buffer.NewBuffer(fileMgr, logMgr, blockSize)
3130
}
32-
bufferMgr := buffermgr.NewBufferMgr(buffs, buffermgr.WithMaxWaitTime(0))
31+
bufferMgr := buffer.NewBufferMgr(buffs, buffer.WithMaxWaitTime(0))
3332
txNumGen := transaction.NewTxNumberGenerator()
3433
tx, err := transaction.NewTransaction(fileMgr, logMgr, bufferMgr, txNumGen)
3534
assert.NoError(t, err)

Diff for: pkg/metadata/table_mgr_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/kj455/simple-db/pkg/buffer"
7-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
87
"github.com/kj455/simple-db/pkg/file"
98
"github.com/kj455/simple-db/pkg/log"
109
"github.com/kj455/simple-db/pkg/record"
@@ -27,7 +26,7 @@ func TestTableMgr(t *testing.T) {
2726
buff1 := buffer.NewBuffer(fileMgr, logMgr, blockSize)
2827
buff2 := buffer.NewBuffer(fileMgr, logMgr, blockSize)
2928
buff3 := buffer.NewBuffer(fileMgr, logMgr, blockSize)
30-
bufferMgr := buffermgr.NewBufferMgr([]buffer.Buffer{buff1, buff2, buff3})
29+
bufferMgr := buffer.NewBufferMgr([]buffer.Buffer{buff1, buff2, buff3})
3130
txNumGen := transaction.NewTxNumberGenerator()
3231
tx, err := transaction.NewTransaction(fileMgr, logMgr, bufferMgr, txNumGen)
3332
assert.NoError(t, err)

Diff for: pkg/metadata/view_mgr_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/kj455/simple-db/pkg/buffer"
7-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
87
"github.com/kj455/simple-db/pkg/file"
98
"github.com/kj455/simple-db/pkg/log"
109
"github.com/kj455/simple-db/pkg/testutil"
@@ -28,7 +27,7 @@ func TestViewMgr(t *testing.T) {
2827
for i := range buffs {
2928
buffs[i] = buffer.NewBuffer(fileMgr, logMgr, blockSize)
3029
}
31-
bufferMgr := buffermgr.NewBufferMgr(buffs, buffermgr.WithMaxWaitTime(0))
30+
bufferMgr := buffer.NewBufferMgr(buffs, buffer.WithMaxWaitTime(0))
3231
txNumGen := transaction.NewTxNumberGenerator()
3332
tx, err := transaction.NewTransaction(fileMgr, logMgr, bufferMgr, txNumGen)
3433
assert.NoError(t, err)

Diff for: pkg/plan/planner_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"testing"
88

99
"github.com/kj455/simple-db/pkg/buffer"
10-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
1110
"github.com/kj455/simple-db/pkg/file"
1211
"github.com/kj455/simple-db/pkg/log"
1312
"github.com/kj455/simple-db/pkg/metadata"
@@ -32,7 +31,7 @@ func TestPlanner(t *testing.T) {
3231
for i := 0; i < buffNum; i++ {
3332
buffs[i] = buffer.NewBuffer(fm, lm, blockSize)
3433
}
35-
bm := buffermgr.NewBufferMgr(buffs)
34+
bm := buffer.NewBufferMgr(buffs)
3635
txNumGen := transaction.NewTxNumberGenerator()
3736
tx, err := transaction.NewTransaction(fm, lm, bm, txNumGen)
3837
require.NoError(t, err)

Diff for: pkg/query/interface.go

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:generate mkdir -p mock
2+
//go:generate mockgen -source=./interface.go -package=mock -destination=./mock/interface.go
13
package query
24

35
import (

Diff for: pkg/query/product_scan_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/kj455/simple-db/pkg/buffer"
7-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
87
"github.com/kj455/simple-db/pkg/file"
98
"github.com/kj455/simple-db/pkg/log"
109
"github.com/kj455/simple-db/pkg/metadata"
@@ -35,7 +34,7 @@ func TestProductScan(t *testing.T) {
3534
for i := range buffs {
3635
buffs[i] = buffer.NewBuffer(fm, lm, blockSize)
3736
}
38-
bm := buffermgr.NewBufferMgr(buffs)
37+
bm := buffer.NewBufferMgr(buffs)
3938
txNumGen := transaction.NewTxNumberGenerator()
4039
tx, err := transaction.NewTransaction(fm, lm, bm, txNumGen)
4140
assert.NoError(t, err)

Diff for: pkg/query/project_scan_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/kj455/simple-db/pkg/buffer"
7-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
87
"github.com/kj455/simple-db/pkg/file"
98
"github.com/kj455/simple-db/pkg/log"
109
"github.com/kj455/simple-db/pkg/metadata"
@@ -28,7 +27,7 @@ func TestProjectScan(t *testing.T) {
2827
for i := range buffs {
2928
buffs[i] = buffer.NewBuffer(fm, lm, blockSize)
3029
}
31-
bm := buffermgr.NewBufferMgr(buffs)
30+
bm := buffer.NewBufferMgr(buffs)
3231
txNumGen := transaction.NewTxNumberGenerator()
3332
tx, err := transaction.NewTransaction(fm, lm, bm, txNumGen)
3433
assert.NoError(t, err)

Diff for: pkg/query/select_scan_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/kj455/simple-db/pkg/buffer"
7-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
87
"github.com/kj455/simple-db/pkg/constant"
98
"github.com/kj455/simple-db/pkg/file"
109
"github.com/kj455/simple-db/pkg/log"
@@ -29,7 +28,7 @@ func TestSelectScan(t *testing.T) {
2928
for i := range buffs {
3029
buffs[i] = buffer.NewBuffer(fm, lm, blockSize)
3130
}
32-
bm := buffermgr.NewBufferMgr(buffs)
31+
bm := buffer.NewBufferMgr(buffs)
3332
txNumGen := transaction.NewTxNumberGenerator()
3433
tx, err := transaction.NewTransaction(fm, lm, bm, txNumGen)
3534
assert.NoError(t, err)

Diff for: pkg/record/page_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/kj455/simple-db/pkg/buffer"
7-
buffermgr "github.com/kj455/simple-db/pkg/buffer_mgr"
87
"github.com/kj455/simple-db/pkg/file"
98
"github.com/kj455/simple-db/pkg/log"
109
"github.com/kj455/simple-db/pkg/testutil"
@@ -28,7 +27,7 @@ func TestRecordPage(t *testing.T) {
2827
lm, err := log.NewLogMgr(fm, logTestFileName)
2928
assert.NoError(t, err)
3029
buff := buffer.NewBuffer(fm, lm, blockSize)
31-
bm := buffermgr.NewBufferMgr([]buffer.Buffer{buff})
30+
bm := buffer.NewBufferMgr([]buffer.Buffer{buff})
3231
txNumGen := transaction.NewTxNumberGenerator()
3332
tx, err := transaction.NewTransaction(fm, lm, bm, txNumGen)
3433
assert.NoError(t, err)

0 commit comments

Comments
 (0)