Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
client
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Terraform modules
Analyze
Contributor 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
elixxir
client
Commits
80edec44
Commit
80edec44
authored
4 years ago
by
Benjamin Wenger
Browse files
Options
Downloads
Patches
Plain Diff
added support for keeping old version files
parent
a020fe26
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
storage/e2e/session.go
+3
-0
3 additions, 0 deletions
storage/e2e/session.go
storage/versioned/kv.go
+46
-20
46 additions, 20 deletions
storage/versioned/kv.go
with
49 additions
and
20 deletions
storage/e2e/session.go
+
3
−
0
View file @
80edec44
...
@@ -154,6 +154,9 @@ func loadSession(ship *relationship, kv *versioned.KV,
...
@@ -154,6 +154,9 @@ func loadSession(ship *relationship, kv *versioned.KV,
return
nil
,
errors
.
WithMessagef
(
err
,
"Failed to load %s"
,
kv
.
GetFullKey
(
sessionKey
))
return
nil
,
errors
.
WithMessagef
(
err
,
"Failed to load %s"
,
kv
.
GetFullKey
(
sessionKey
))
}
}
obj
,
err
:=
sessionUpgradeTable
.
Upgrade
(
obj
)
err
=
session
.
unmarshal
(
obj
.
Data
)
err
=
session
.
unmarshal
(
obj
.
Data
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
...
This diff is collapsed.
Click to expand it.
storage/versioned/kv.go
+
46
−
20
View file @
80edec44
...
@@ -9,6 +9,7 @@ package versioned
...
@@ -9,6 +9,7 @@ package versioned
import
(
import
(
"fmt"
"fmt"
"github.com/pkg/errors"
jww
"github.com/spf13/jwalterweatherman"
jww
"github.com/spf13/jwalterweatherman"
"gitlab.com/elixxir/ekv"
"gitlab.com/elixxir/ekv"
"gitlab.com/xx_network/primitives/id"
"gitlab.com/xx_network/primitives/id"
...
@@ -57,8 +58,8 @@ func NewKV(data ekv.KeyValue) *KV {
...
@@ -57,8 +58,8 @@ func NewKV(data ekv.KeyValue) *KV {
// Get gets and upgrades data stored in the key/value store
// Get gets and upgrades data stored in the key/value store
// Make sure to inspect the version returned in the versioned object
// Make sure to inspect the version returned in the versioned object
func
(
v
*
KV
)
Get
(
key
string
)
(
*
Object
,
error
)
{
func
(
v
*
KV
)
Get
(
key
string
,
version
uint64
)
(
*
Object
,
error
)
{
key
=
v
.
makeKey
(
key
)
key
=
v
.
makeKey
(
key
,
version
)
jww
.
TRACE
.
Printf
(
"Get %p with key %v"
,
v
.
r
.
data
,
key
)
jww
.
TRACE
.
Printf
(
"Get %p with key %v"
,
v
.
r
.
data
,
key
)
// Get raw data
// Get raw data
result
:=
Object
{}
result
:=
Object
{}
...
@@ -69,22 +70,47 @@ func (v *KV) Get(key string) (*Object, error) {
...
@@ -69,22 +70,47 @@ func (v *KV) Get(key string) (*Object, error) {
return
&
result
,
nil
return
&
result
,
nil
}
}
type
UpgradeTable
struct
{
CurrentVersion
uint64
Table
[]
Upgrade
}
// Get gets and upgrades data stored in the key/value store
// Get gets and upgrades data stored in the key/value store
// Make sure to inspect the version returned in the versioned object
// Make sure to inspect the version returned in the versioned object
func
(
v
*
KV
)
GetUpgrade
(
key
string
,
table
[]
Upgrade
)
(
*
Object
,
error
)
{
func
(
v
*
KV
)
GetUpgrade
(
key
string
,
ut
UpgradeTable
)
(
*
Object
,
error
)
{
key
=
v
.
makeKey
(
key
)
version
:=
ut
.
CurrentVersion
key
=
v
.
makeKey
(
key
,
version
)
if
uint64
(
len
(
ut
.
Table
))
!=
version
{
jww
.
FATAL
.
Panicf
(
"Cannot get upgrade for %s: table lengh (%d) "
+
"does not match current version (%d)"
,
key
,
len
(
ut
.
Table
),
version
)
}
var
result
*
Object
for
;
version
>=
0
;
version
--
{
key
=
v
.
makeKey
(
key
,
version
)
jww
.
TRACE
.
Printf
(
"Get %p with key %v"
,
v
.
r
.
data
,
key
)
jww
.
TRACE
.
Printf
(
"Get %p with key %v"
,
v
.
r
.
data
,
key
)
// Get raw data
// Get raw data
result
:
=
&
Object
{}
result
=
&
Object
{}
err
:=
v
.
r
.
data
.
Get
(
key
,
result
)
err
:=
v
.
r
.
data
.
Get
(
key
,
result
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
jww
.
WARN
.
Printf
(
"Failed to get keyvalue %s: %s"
,
key
,
err
)
}
else
{
break
}
}
if
version
<
0
{
return
nil
,
errors
.
Errorf
(
"Failed to get key and upgrade it for %s"
,
v
.
makeKey
(
key
,
ut
.
CurrentVersion
))
}
}
var
err
error
initialVersion
:=
result
.
Version
initialVersion
:=
result
.
Version
for
result
.
Version
<
uint64
(
len
(
t
able
)){
for
result
.
Version
<
uint64
(
len
(
ut
.
T
able
)){
oldVersion
:=
result
.
Version
oldVersion
:=
result
.
Version
result
,
err
=
t
able
[
oldVersion
](
result
)
result
,
err
=
ut
.
T
able
[
oldVersion
](
result
)
if
err
!=
nil
{
if
err
!=
nil
{
jww
.
FATAL
.
Panicf
(
"failed to upgrade key %s from "
+
jww
.
FATAL
.
Panicf
(
"failed to upgrade key %s from "
+
"version %v, initla version %v"
,
key
,
oldVersion
,
"version %v, initla version %v"
,
key
,
oldVersion
,
...
@@ -97,8 +123,8 @@ func (v *KV) GetUpgrade(key string, table []Upgrade) (*Object, error) {
...
@@ -97,8 +123,8 @@ func (v *KV) GetUpgrade(key string, table []Upgrade) (*Object, error) {
// delete removes a given key from the data store
// delete removes a given key from the data store
func
(
v
*
KV
)
Delete
(
key
string
)
error
{
func
(
v
*
KV
)
Delete
(
key
string
,
version
uint64
)
error
{
key
=
v
.
makeKey
(
key
)
key
=
v
.
makeKey
(
key
,
version
)
jww
.
TRACE
.
Printf
(
"delete %p with key %v"
,
v
.
r
.
data
,
key
)
jww
.
TRACE
.
Printf
(
"delete %p with key %v"
,
v
.
r
.
data
,
key
)
return
v
.
r
.
data
.
Delete
(
key
)
return
v
.
r
.
data
.
Delete
(
key
)
}
}
...
@@ -106,8 +132,8 @@ func (v *KV) Delete(key string) error {
...
@@ -106,8 +132,8 @@ func (v *KV) Delete(key string) error {
// Set upserts new data into the storage
// Set upserts new data into the storage
// When calling this, you are responsible for prefixing the key with the correct
// When calling this, you are responsible for prefixing the key with the correct
// type optionally unique id! Call MakeKeyWithPrefix() to do so.
// type optionally unique id! Call MakeKeyWithPrefix() to do so.
func
(
v
*
KV
)
Set
(
key
string
,
object
*
Object
)
error
{
func
(
v
*
KV
)
Set
(
key
string
,
version
uint64
,
object
*
Object
)
error
{
key
=
v
.
makeKey
(
key
)
key
=
v
.
makeKey
(
key
,
version
)
jww
.
TRACE
.
Printf
(
"Set %p with key %v"
,
v
.
r
.
data
,
key
)
jww
.
TRACE
.
Printf
(
"Set %p with key %v"
,
v
.
r
.
data
,
key
)
return
v
.
r
.
data
.
Set
(
key
,
object
)
return
v
.
r
.
data
.
Set
(
key
,
object
)
}
}
...
@@ -122,10 +148,10 @@ func (v *KV) Prefix(prefix string) *KV {
...
@@ -122,10 +148,10 @@ func (v *KV) Prefix(prefix string) *KV {
}
}
//Returns the key with all prefixes appended
//Returns the key with all prefixes appended
func
(
v
*
KV
)
GetFullKey
(
key
string
)
string
{
func
(
v
*
KV
)
GetFullKey
(
key
string
,
version
uint64
)
string
{
return
v
.
prefix
+
key
return
v
.
makeKey
(
key
,
version
)
}
}
func
(
v
*
KV
)
makeKey
(
key
string
)
string
{
func
(
v
*
KV
)
makeKey
(
key
string
,
version
uint64
)
string
{
return
v
.
prefix
+
key
return
fmt
.
Sprintf
(
"%s%s_%d"
,
v
.
prefix
,
key
,
version
)
}
}
\ No newline at end of file
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