Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
b6cac42e
Unverified
Commit
b6cac42e
authored
Mar 14, 2019
by
rjl493456442
Committed by
Péter Szilágyi
May 16, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core/rawdb: add file lock for freezer
parent
b69bdc2a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
43 additions
and
5 deletions
+43
-5
database.go
core/rawdb/database.go
+20
-2
freezer.go
core/rawdb/freezer.go
+16
-3
database.go
ethdb/database.go
+7
-0
No files found.
core/rawdb/database.go
View file @
b6cac42e
...
...
@@ -17,6 +17,8 @@
package
rawdb
import
(
"fmt"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/ethdb/leveldb"
"github.com/ethereum/go-ethereum/ethdb/memorydb"
...
...
@@ -25,7 +27,23 @@ import (
// freezerdb is a databse wrapper that enabled freezer data retrievals.
type
freezerdb
struct
{
ethdb
.
KeyValueStore
ethdb
.
Ancienter
ethdb
.
AncientStore
}
// Close implements io.Closer, closing both the fast key-value store as well as
// the slow ancient tables.
func
(
frdb
*
freezerdb
)
Close
()
error
{
var
errs
[]
error
if
err
:=
frdb
.
KeyValueStore
.
Close
();
err
!=
nil
{
errs
=
append
(
errs
,
err
)
}
if
err
:=
frdb
.
AncientStore
.
Close
();
err
!=
nil
{
errs
=
append
(
errs
,
err
)
}
if
len
(
errs
)
!=
0
{
return
fmt
.
Errorf
(
"%v"
,
errs
)
}
return
nil
}
// nofreezedb is a database wrapper that disables freezer data retrievals.
...
...
@@ -58,7 +76,7 @@ func NewDatabaseWithFreezer(db ethdb.KeyValueStore, freezer string, namespace st
return
&
freezerdb
{
KeyValueStore
:
db
,
Ancient
er
:
frdb
,
Ancient
Store
:
frdb
,
},
nil
}
...
...
core/rawdb/freezer.go
View file @
b6cac42e
...
...
@@ -20,6 +20,7 @@ import (
"errors"
"fmt"
"math"
"path/filepath"
"sync/atomic"
"time"
...
...
@@ -27,6 +28,7 @@ import (
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/metrics"
"github.com/prometheus/tsdb/fileutil"
)
// errUnknownTable is returned if the user attempts to read from a table that is
...
...
@@ -57,8 +59,9 @@ const (
// reserving it for go-ethereum. This would also reduce the memory requirements
// of Geth, and thus also GC overhead.
type
freezer
struct
{
tables
map
[
string
]
*
freezerTable
// Data tables for storing everything
frozen
uint64
// Number of blocks already frozen
tables
map
[
string
]
*
freezerTable
// Data tables for storing everything
frozen
uint64
// Number of blocks already frozen
instanceLock
fileutil
.
Releaser
// File-system lock to prevent double opens
}
// newFreezer creates a chain freezer that moves ancient chain data into
...
...
@@ -69,9 +72,14 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {
readMeter
=
metrics
.
NewRegisteredMeter
(
namespace
+
"ancient/read"
,
nil
)
writeMeter
=
metrics
.
NewRegisteredMeter
(
namespace
+
"ancient/write"
,
nil
)
)
lock
,
_
,
err
:=
fileutil
.
Flock
(
filepath
.
Join
(
datadir
,
"LOCK"
))
if
err
!=
nil
{
return
nil
,
err
}
// Open all the supported data tables
freezer
:=
&
freezer
{
tables
:
make
(
map
[
string
]
*
freezerTable
),
tables
:
make
(
map
[
string
]
*
freezerTable
),
instanceLock
:
lock
,
}
for
_
,
name
:=
range
[]
string
{
"hashes"
,
"headers"
,
"bodies"
,
"receipts"
,
"diffs"
}
{
table
,
err
:=
newTable
(
datadir
,
name
,
readMeter
,
writeMeter
)
...
...
@@ -79,6 +87,7 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {
for
_
,
table
:=
range
freezer
.
tables
{
table
.
Close
()
}
lock
.
Release
()
return
nil
,
err
}
freezer
.
tables
[
name
]
=
table
...
...
@@ -95,6 +104,7 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {
for
_
,
table
:=
range
freezer
.
tables
{
table
.
Close
()
}
lock
.
Release
()
return
nil
,
err
}
}
...
...
@@ -109,6 +119,9 @@ func (f *freezer) Close() error {
errs
=
append
(
errs
,
err
)
}
}
if
err
:=
f
.
instanceLock
.
Release
();
err
!=
nil
{
errs
=
append
(
errs
,
err
)
}
if
errs
!=
nil
{
return
fmt
.
Errorf
(
"%v"
,
errs
)
}
...
...
ethdb/database.go
View file @
b6cac42e
...
...
@@ -80,6 +80,13 @@ type AncientReader interface {
Ancienter
}
// AncientStore contains all the methods required to allow handling different
// ancient data stores backing immutable chain data store.
type
AncientStore
interface
{
Ancienter
io
.
Closer
}
// Database contains all the methods required by the high level database to not
// only access the key-value data store but also the chain freezer.
type
Database
interface
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment