Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
G
goshimmer
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
iota-imt
goshimmer
Commits
3adb203d
Commit
3adb203d
authored
5 years ago
by
Hans Moog
Browse files
Options
Downloads
Patches
Plain Diff
Feat: changed database to use a single badger instance with prefixes
parent
a0c10851
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
packages/database/badger_instance.go
+53
-0
53 additions, 0 deletions
packages/database/badger_instance.go
packages/database/database.go
+18
-60
18 additions, 60 deletions
packages/database/database.go
packages/database/interfaces.go
+0
-2
0 additions, 2 deletions
packages/database/interfaces.go
with
71 additions
and
62 deletions
packages/database/badger_instance.go
0 → 100644
+
53
−
0
View file @
3adb203d
package
database
import
(
"os"
"sync"
"github.com/dgraph-io/badger"
"github.com/dgraph-io/badger/options"
)
var
instance
*
badger
.
DB
var
openLock
sync
.
Mutex
func
GetBadgerInstance
()
(
result
*
badger
.
DB
,
err
error
)
{
openLock
.
Lock
()
if
instance
==
nil
{
directory
:=
*
DIRECTORY
.
Value
if
_
,
osErr
:=
os
.
Stat
(
directory
);
osErr
!=
nil
{
err
=
osErr
return
}
else
if
os
.
IsNotExist
(
err
)
{
if
osErr
:=
os
.
Mkdir
(
directory
,
0700
);
osErr
!=
nil
{
err
=
osErr
return
}
}
opts
:=
badger
.
DefaultOptions
(
directory
)
opts
.
Logger
=
&
logger
{}
opts
.
Truncate
=
true
opts
.
TableLoadingMode
=
options
.
MemoryMap
db
,
badgerErr
:=
badger
.
Open
(
opts
)
if
err
!=
nil
{
err
=
badgerErr
return
}
instance
=
db
}
openLock
.
Unlock
()
result
=
instance
return
}
This diff is collapsed.
Click to expand it.
packages/database/database.go
+
18
−
60
View file @
3adb203d
package
database
package
database
import
(
import
(
"os"
"path/filepath"
"sync"
"sync"
"github.com/dgraph-io/badger"
"github.com/dgraph-io/badger"
"github.com/dgraph-io/badger/options"
)
)
var
databasesByName
=
make
(
map
[
string
]
*
databaseImpl
)
var
databasesByName
=
make
(
map
[
string
]
*
databaseImpl
)
...
@@ -17,6 +14,7 @@ var ErrKeyNotFound = badger.ErrKeyNotFound
...
@@ -17,6 +14,7 @@ var ErrKeyNotFound = badger.ErrKeyNotFound
type
databaseImpl
struct
{
type
databaseImpl
struct
{
db
*
badger
.
DB
db
*
badger
.
DB
name
string
name
string
prefix
[]
byte
openLock
sync
.
Mutex
openLock
sync
.
Mutex
}
}
...
@@ -28,50 +26,24 @@ func Get(name string) (Database, error) {
...
@@ -28,50 +26,24 @@ func Get(name string) (Database, error) {
return
database
,
nil
return
database
,
nil
}
}
database
:=
&
databaseImpl
{
badgerInstance
,
err
:=
GetBadgerInstance
()
db
:
nil
,
if
err
!=
nil
{
name
:
name
,
}
if
err
:=
database
.
Open
();
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
database
:=
&
databaseImpl
{
db
:
badgerInstance
,
name
:
name
,
prefix
:
[]
byte
(
name
+
"_"
),
}
databasesByName
[
name
]
=
database
databasesByName
[
name
]
=
database
return
databasesByName
[
name
],
nil
return
databasesByName
[
name
],
nil
}
}
func
(
this
*
databaseImpl
)
Open
()
error
{
this
.
openLock
.
Lock
()
defer
this
.
openLock
.
Unlock
()
if
this
.
db
==
nil
{
directory
:=
*
DIRECTORY
.
Value
if
_
,
err
:=
os
.
Stat
(
directory
);
os
.
IsNotExist
(
err
)
{
if
err
:=
os
.
Mkdir
(
directory
,
0700
);
err
!=
nil
{
return
err
}
}
opts
:=
badger
.
DefaultOptions
(
filepath
.
Join
(
directory
,
this
.
name
))
opts
.
Logger
=
&
logger
{}
opts
.
Truncate
=
true
opts
.
TableLoadingMode
=
options
.
MemoryMap
db
,
err
:=
badger
.
Open
(
opts
)
if
err
!=
nil
{
return
err
}
this
.
db
=
db
}
return
nil
}
func
(
this
*
databaseImpl
)
Set
(
key
[]
byte
,
value
[]
byte
)
error
{
func
(
this
*
databaseImpl
)
Set
(
key
[]
byte
,
value
[]
byte
)
error
{
if
err
:=
this
.
db
.
Update
(
func
(
txn
*
badger
.
Txn
)
error
{
return
txn
.
Set
(
key
,
value
)
});
err
!=
nil
{
if
err
:=
this
.
db
.
Update
(
func
(
txn
*
badger
.
Txn
)
error
{
return
txn
.
Set
(
append
(
this
.
prefix
,
key
...
)
,
value
)
});
err
!=
nil
{
return
err
return
err
}
}
...
@@ -80,7 +52,7 @@ func (this *databaseImpl) Set(key []byte, value []byte) error {
...
@@ -80,7 +52,7 @@ func (this *databaseImpl) Set(key []byte, value []byte) error {
func
(
this
*
databaseImpl
)
Contains
(
key
[]
byte
)
(
bool
,
error
)
{
func
(
this
*
databaseImpl
)
Contains
(
key
[]
byte
)
(
bool
,
error
)
{
err
:=
this
.
db
.
View
(
func
(
txn
*
badger
.
Txn
)
error
{
err
:=
this
.
db
.
View
(
func
(
txn
*
badger
.
Txn
)
error
{
_
,
err
:=
txn
.
Get
(
key
)
_
,
err
:=
txn
.
Get
(
append
(
this
.
prefix
,
key
...
)
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -99,7 +71,7 @@ func (this *databaseImpl) Get(key []byte) ([]byte, error) {
...
@@ -99,7 +71,7 @@ func (this *databaseImpl) Get(key []byte) ([]byte, error) {
var
result
[]
byte
=
nil
var
result
[]
byte
=
nil
err
:=
this
.
db
.
View
(
func
(
txn
*
badger
.
Txn
)
error
{
err
:=
this
.
db
.
View
(
func
(
txn
*
badger
.
Txn
)
error
{
item
,
err
:=
txn
.
Get
(
key
)
item
,
err
:=
txn
.
Get
(
append
(
this
.
prefix
,
key
...
)
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -116,7 +88,7 @@ func (this *databaseImpl) Get(key []byte) ([]byte, error) {
...
@@ -116,7 +88,7 @@ func (this *databaseImpl) Get(key []byte) ([]byte, error) {
func
(
this
*
databaseImpl
)
Delete
(
key
[]
byte
)
error
{
func
(
this
*
databaseImpl
)
Delete
(
key
[]
byte
)
error
{
err
:=
this
.
db
.
Update
(
func
(
txn
*
badger
.
Txn
)
error
{
err
:=
this
.
db
.
Update
(
func
(
txn
*
badger
.
Txn
)
error
{
err
:=
txn
.
Delete
(
key
)
err
:=
txn
.
Delete
(
append
(
this
.
prefix
,
key
...
)
)
return
err
return
err
})
})
return
err
return
err
...
@@ -124,8 +96,11 @@ func (this *databaseImpl) Delete(key []byte) error {
...
@@ -124,8 +96,11 @@ func (this *databaseImpl) Delete(key []byte) error {
func
(
this
*
databaseImpl
)
ForEach
(
consumer
func
([]
byte
,
[]
byte
))
error
{
func
(
this
*
databaseImpl
)
ForEach
(
consumer
func
([]
byte
,
[]
byte
))
error
{
err
:=
this
.
db
.
View
(
func
(
txn
*
badger
.
Txn
)
error
{
err
:=
this
.
db
.
View
(
func
(
txn
*
badger
.
Txn
)
error
{
iteratorOptions
:=
badger
.
DefaultIteratorOptions
iteratorOptions
.
Prefix
=
this
.
prefix
// create an iterator the default options
// create an iterator the default options
it
:=
txn
.
NewIterator
(
badger
.
DefaultI
teratorOptions
)
it
:=
txn
.
NewIterator
(
i
teratorOptions
)
defer
it
.
Close
()
defer
it
.
Close
()
// loop through every key-value-pair and call the function
// loop through every key-value-pair and call the function
...
@@ -137,26 +112,9 @@ func (this *databaseImpl) ForEach(consumer func([]byte, []byte)) error {
...
@@ -137,26 +112,9 @@ func (this *databaseImpl) ForEach(consumer func([]byte, []byte)) error {
return
err
return
err
}
}
consumer
(
item
.
Key
(),
value
)
consumer
(
item
.
Key
()
[
len
(
this
.
prefix
)
:
]
,
value
)
}
}
return
nil
return
nil
})
})
return
err
return
err
}
}
func
(
this
*
databaseImpl
)
Close
()
error
{
this
.
openLock
.
Lock
()
defer
this
.
openLock
.
Unlock
()
if
this
.
db
!=
nil
{
err
:=
this
.
db
.
Close
()
this
.
db
=
nil
if
err
!=
nil
{
return
err
}
}
return
nil
}
This diff is collapsed.
Click to expand it.
packages/database/interfaces.go
+
0
−
2
View file @
3adb203d
package
database
package
database
type
Database
interface
{
type
Database
interface
{
Open
()
error
Set
(
key
[]
byte
,
value
[]
byte
)
error
Set
(
key
[]
byte
,
value
[]
byte
)
error
Contains
(
key
[]
byte
)
(
bool
,
error
)
Contains
(
key
[]
byte
)
(
bool
,
error
)
Get
(
key
[]
byte
)
([]
byte
,
error
)
Get
(
key
[]
byte
)
([]
byte
,
error
)
ForEach
(
func
(
key
[]
byte
,
value
[]
byte
))
error
ForEach
(
func
(
key
[]
byte
,
value
[]
byte
))
error
Delete
(
key
[]
byte
)
error
Delete
(
key
[]
byte
)
error
Close
()
error
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment