Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
wendelin.core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
Kirill Smelkov
wendelin.core
Commits
9ac61959
Commit
9ac61959
authored
Jun 14, 2021
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
93941125
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
32 additions
and
17 deletions
+32
-17
wcfs/internal/xbtree/pptreesubset.go
wcfs/internal/xbtree/pptreesubset.go
+5
-0
wcfs/internal/xbtree/δbtail.go
wcfs/internal/xbtree/δbtail.go
+20
-10
wcfs/internal/xbtree/δbtail_test.go
wcfs/internal/xbtree/δbtail_test.go
+7
-7
No files found.
wcfs/internal/xbtree/pptreesubset.go
View file @
9ac61959
...
@@ -61,6 +61,11 @@ type nodeInTree struct {
...
@@ -61,6 +61,11 @@ type nodeInTree struct {
// XXX + [lo,hi) range this node is coming under in its parent XXX -> in its tree ?
// XXX + [lo,hi) range this node is coming under in its parent XXX -> in its tree ?
}
}
// Has returns whether node is in the set.
func
(
S
PPTreeSubSet
)
Has
(
oid
zodb
.
Oid
)
bool
{
_
,
ok
:=
S
[
oid
]
return
ok
}
// Path returns path leading to the node specified by oid.
// Path returns path leading to the node specified by oid.
//
//
...
...
wcfs/internal/xbtree/δbtail.go
View file @
9ac61959
...
@@ -234,8 +234,7 @@ func (δBtail *ΔBtail) Tail() zodb.Tid { return δBtail.δZtail.Tail() }
...
@@ -234,8 +234,7 @@ func (δBtail *ΔBtail) Tail() zodb.Tid { return δBtail.δZtail.Tail() }
// XXX path -> []oid ?
// XXX path -> []oid ?
//
//
// XXX catch cycles on add?
// XXX catch cycles on add?
// XXX no need to pass keyPresent since holeIdx was removed
func
(
δBtail
*
ΔBtail
)
Track
(
key
Key
,
nodePath
[]
Node
)
error
{
// XXX Tree|Bucket; path[0] = root
func
(
δBtail
*
ΔBtail
)
Track
(
key
Key
,
keyPresent
bool
,
nodePath
[]
Node
)
error
{
// XXX Tree|Bucket; path[0] = root
path
:=
nodePathToPath
(
nodePath
)
path
:=
nodePathToPath
(
nodePath
)
...
@@ -243,13 +242,25 @@ func (δBtail *ΔBtail) Track(key Key, keyPresent bool, nodePath []Node) error {
...
@@ -243,13 +242,25 @@ func (δBtail *ΔBtail) Track(key Key, keyPresent bool, nodePath []Node) error {
for
_
,
node
:=
range
nodePath
{
pathv
=
append
(
pathv
,
vnode
(
node
))
}
for
_
,
node
:=
range
nodePath
{
pathv
=
append
(
pathv
,
vnode
(
node
))
}
tracefΔBtail
(
"
\n
Track [%v] %s
\n
"
,
key
,
strings
.
Join
(
pathv
,
" -> "
))
tracefΔBtail
(
"
\n
Track [%v] %s
\n
"
,
key
,
strings
.
Join
(
pathv
,
" -> "
))
return
δBtail
.
track
(
key
,
keyPresent
,
path
)
return
δBtail
.
track
(
key
,
path
)
}
}
func
(
δBtail
*
ΔBtail
)
track
(
key
Key
,
keyPresent
bool
,
path
[]
zodb
.
Oid
)
error
{
func
(
δBtail
*
ΔBtail
)
track
(
key
Key
,
path
[]
zodb
.
Oid
)
error
{
// XXX locking
// XXX locking
root
:=
path
[
0
]
root
:=
path
[
0
]
// nothing to do if key is already tracked
leaf
:=
path
[
len
(
path
)
-
1
]
if
δBtail
.
trackSet
.
Has
(
leaf
)
{
path_
:=
δBtail
.
trackSet
.
Path
(
leaf
)
if
!
pathEqual
(
path
,
path_
)
{
panicf
(
"BUG: key %s is already tracked via path=%v
\n
track requests path=%v"
,
kstr
(
key
),
path_
,
path
)
}
return
nil
}
// queue path into trackNew
δTtail
,
ok
:=
δBtail
.
vδTbyRoot
[
root
]
δTtail
,
ok
:=
δBtail
.
vδTbyRoot
[
root
]
if
!
ok
{
if
!
ok
{
δTtail
=
newΔTtail
()
δTtail
=
newΔTtail
()
...
@@ -258,11 +269,6 @@ func (δBtail *ΔBtail) track(key Key, keyPresent bool, path []zodb.Oid) error {
...
@@ -258,11 +269,6 @@ func (δBtail *ΔBtail) track(key Key, keyPresent bool, path []zodb.Oid) error {
δBtail
.
trackNewRoots
.
Add
(
root
)
δBtail
.
trackNewRoots
.
Add
(
root
)
δTtail
.
trackNew
.
AddPath
(
path
)
δTtail
.
trackNew
.
AddPath
(
path
)
// track is track of path[-1] (i.e. leaf)
// XXX update diff XXX here? or as separate step?
// XXX update lastRevOf
return
nil
return
nil
}
}
...
@@ -289,7 +295,7 @@ func (δBtail *ΔBtail) rebuildAll() (err error) {
...
@@ -289,7 +295,7 @@ func (δBtail *ΔBtail) rebuildAll() (err error) {
// rebuild rebuilds ΔTtail taking trackNew requests into account.
// rebuild rebuilds ΔTtail taking trackNew requests into account.
//
//
// It returns set of nodes that must be added to ΔBtail.trackSet to account for
// It returns set of nodes that must be added to ΔBtail.trackSet to account for
// keys that becomes tracked. Note: this set is potentially wider compared to .trackNew.
// keys that becomes tracked. Note: this set is potentially wider compared to
what was in
.trackNew.
// XXX place
// XXX place
func
(
δTtail
*
ΔTtail
)
rebuild
(
δZtail
*
zodb
.
ΔTail
,
db
*
zodb
.
DB
)
(
δtrackSet
PPTreeSubSet
,
err
error
)
{
func
(
δTtail
*
ΔTtail
)
rebuild
(
δZtail
*
zodb
.
ΔTail
,
db
*
zodb
.
DB
)
(
δtrackSet
PPTreeSubSet
,
err
error
)
{
defer
xerr
.
Context
(
&
err
,
"ΔTtail rebuild"
)
defer
xerr
.
Context
(
&
err
,
"ΔTtail rebuild"
)
...
@@ -351,6 +357,7 @@ func (δTtail *ΔTtail) rebuild(δZtail *zodb.ΔTail, db *zodb.DB) (δtrackSet P
...
@@ -351,6 +357,7 @@ func (δTtail *ΔTtail) rebuild(δZtail *zodb.ΔTail, db *zodb.DB) (δtrackSet P
}
}
// FIXME use δtkeycov to recompute track coverage
// FIXME use δtkeycov to recompute track coverage
_
=
δtkeycov
debugfΔBtail
(
" -> root<%s> δkv*: %v δtrack*: %v
\n
"
,
root
,
δT
,
δtrack
)
debugfΔBtail
(
" -> root<%s> δkv*: %v δtrack*: %v
\n
"
,
root
,
δT
,
δtrack
)
...
@@ -501,6 +508,7 @@ if XXX_killWhenRebuildWorks {
...
@@ -501,6 +508,7 @@ if XXX_killWhenRebuildWorks {
δB
.
ΔByRoot
[
root
]
=
δT
δB
.
ΔByRoot
[
root
]
=
δT
δTtail
,
ok
:=
δBtail
.
vδTbyRoot
[
root
]
δTtail
,
ok
:=
δBtail
.
vδTbyRoot
[
root
]
if
!
ok
{
if
!
ok
{
// XXX should not happen (only roots requested to be present are present in δ)
// this root was not tracked before -> create δTtail for it with empty changes
// this root was not tracked before -> create δTtail for it with empty changes
δTtail
=
newΔTtail
()
δTtail
=
newΔTtail
()
δBtail
.
vδTbyRoot
[
root
]
=
δTtail
δBtail
.
vδTbyRoot
[
root
]
=
δTtail
...
@@ -514,6 +522,8 @@ if XXX_killWhenRebuildWorks {
...
@@ -514,6 +522,8 @@ if XXX_killWhenRebuildWorks {
δBtail
.
trackSet
.
ApplyΔ
(
δtrack
)
δBtail
.
trackSet
.
ApplyΔ
(
δtrack
)
δTKeyCov
.
ByRoot
[
root
]
=
δtkeycov
δTKeyCov
.
ByRoot
[
root
]
=
δtkeycov
// XXX if δtkeycov != ø -> rebuild δTtail
}
}
return
δB
,
δTKeyCov
,
nil
return
δB
,
δTKeyCov
,
nil
...
...
wcfs/internal/xbtree/δbtail_test.go
View file @
9ac61959
...
@@ -720,8 +720,8 @@ func xverifyΔBTail_Update1(t *testing.T, subj string, db *zodb.DB, treeRoot zod
...
@@ -720,8 +720,8 @@ func xverifyΔBTail_Update1(t *testing.T, subj string, db *zodb.DB, treeRoot zod
for
k
:=
range
initialTrackedKeys
{
for
k
:=
range
initialTrackedKeys
{
if
ztree
!=
nil
{
if
ztree
!=
nil
{
_
,
ok
,
path
,
err
:=
ZTreeGetBlkData
(
ctx
,
ztree
,
k
);
X
(
err
)
_
,
_
,
path
,
err
:=
ZTreeGetBlkData
(
ctx
,
ztree
,
k
);
X
(
err
)
err
=
δbtail
.
Track
(
k
,
ok
,
path
);
X
(
err
)
err
=
δbtail
.
Track
(
k
,
path
);
X
(
err
)
}
else
{
}
else
{
// if treeRoot is deleted - add it to tracked set with every key
// if treeRoot is deleted - add it to tracked set with every key
// being a hole. This aligns with the following situation
// being a hole. This aligns with the following situation
...
@@ -732,7 +732,7 @@ func xverifyΔBTail_Update1(t *testing.T, subj string, db *zodb.DB, treeRoot zod
...
@@ -732,7 +732,7 @@ func xverifyΔBTail_Update1(t *testing.T, subj string, db *zodb.DB, treeRoot zod
// continues to be tracked and all keys migrate to holes in the
// continues to be tracked and all keys migrate to holes in the
// tracking set. By aligning initial state to the same as after
// tracking set. By aligning initial state to the same as after
// T1->ø, we test what will happen on ø->T2.
// T1->ø, we test what will happen on ø->T2.
err
=
δbtail
.
track
(
k
,
false
,
[]
zodb
.
Oid
{
treeRoot
});
X
(
err
)
err
=
δbtail
.
track
(
k
,
[]
zodb
.
Oid
{
treeRoot
});
X
(
err
)
}
}
}
}
...
@@ -1108,8 +1108,8 @@ func xverifyΔBTail_rebuild_TR(t *testing.T, db *zodb.DB, δbtail *ΔBtail, tj *
...
@@ -1108,8 +1108,8 @@ func xverifyΔBTail_rebuild_TR(t *testing.T, db *zodb.DB, δbtail *ΔBtail, tj *
xtree
,
err
:=
zconn
.
Get
(
ctx
,
treeRoot
);
X
(
err
)
xtree
,
err
:=
zconn
.
Get
(
ctx
,
treeRoot
);
X
(
err
)
ztree
:=
xtree
.
(
*
Tree
)
ztree
:=
xtree
.
(
*
Tree
)
for
k
:=
range
keys
{
for
k
:=
range
keys
{
_
,
ok
,
path
,
err
:=
ZTreeGetBlkData
(
ctx
,
ztree
,
k
);
X
(
err
)
_
,
_
,
path
,
err
:=
ZTreeGetBlkData
(
ctx
,
ztree
,
k
);
X
(
err
)
err
=
δbtail
.
Track
(
k
,
ok
,
path
);
X
(
err
)
err
=
δbtail
.
Track
(
k
,
path
);
X
(
err
)
}
}
δbtail
.
assertTrack
(
t
,
fmt
.
Sprintf
(
"@%s: after Track%v"
,
xat
[
tj
.
at
],
keys
),
trackSet
,
trackNew
)
δbtail
.
assertTrack
(
t
,
fmt
.
Sprintf
(
"@%s: after Track%v"
,
xat
[
tj
.
at
],
keys
),
trackSet
,
trackNew
)
...
@@ -1218,8 +1218,8 @@ func xverifyΔBTail_GetAt1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*t
...
@@ -1218,8 +1218,8 @@ func xverifyΔBTail_GetAt1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*t
ztree
:=
xtree
.
(
*
Tree
)
ztree
:=
xtree
.
(
*
Tree
)
for
k
:=
range
keys
{
for
k
:=
range
keys
{
_
,
ok
,
path
,
err
:=
ZTreeGetBlkData
(
ctx
,
ztree
,
k
);
X
(
err
)
_
,
_
,
path
,
err
:=
ZTreeGetBlkData
(
ctx
,
ztree
,
k
);
X
(
err
)
err
=
δbtail
.
Track
(
k
,
ok
,
path
);
X
(
err
)
err
=
δbtail
.
Track
(
k
,
path
);
X
(
err
)
}
}
// verify GetAt(k, @at) for all keys and @at
// verify GetAt(k, @at) for all keys and @at
...
...
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