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
fecf1327
Commit
fecf1327
authored
Jul 01, 2021
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
X Unexport SetXXX from packages API
parent
bf9a7405
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
177 additions
and
179 deletions
+177
-179
wcfs/internal/set/gen-set
wcfs/internal/set/gen-set
+4
-6
wcfs/internal/set/set.go
wcfs/internal/set/set.go
+4
-4
wcfs/internal/set/set.go.in
wcfs/internal/set/set.go.in
+1
-1
wcfs/internal/set/zset_i64.go
wcfs/internal/set/zset_i64.go
+20
-20
wcfs/internal/set/zset_oid.go
wcfs/internal/set/zset_oid.go
+20
-20
wcfs/internal/set/zset_str.go
wcfs/internal/set/zset_str.go
+20
-20
wcfs/internal/set/zset_tid.go
wcfs/internal/set/zset_tid.go
+20
-20
wcfs/internal/xbtree/pptreesubset.go
wcfs/internal/xbtree/pptreesubset.go
+2
-2
wcfs/internal/xbtree/treediff.go
wcfs/internal/xbtree/treediff.go
+8
-8
wcfs/internal/xbtree/xbtree.go
wcfs/internal/xbtree/xbtree.go
+3
-3
wcfs/internal/xbtree/δbtail.go
wcfs/internal/xbtree/δbtail.go
+11
-11
wcfs/internal/xbtree/δbtail_test.go
wcfs/internal/xbtree/δbtail_test.go
+39
-39
wcfs/internal/zdata/δftail.go
wcfs/internal/zdata/δftail.go
+15
-15
wcfs/internal/zdata/δftail_test.go
wcfs/internal/zdata/δftail_test.go
+7
-7
wcfs/wcfs.go
wcfs/wcfs.go
+3
-3
No files found.
wcfs/internal/set/gen-set
View file @
fecf1327
...
...
@@ -21,10 +21,9 @@
# See COPYING file for full licensing terms.
# See https://www.nexedi.com/licensing for rationale and options.
PACKAGE
=
$1
KIND
=
$2
VALUE
=
$3
out
=
$4
KIND
=
$1
VALUE
=
$2
out
=
$3
input
=
$(
dirname
$0
)
/set.go.in
...
...
@@ -32,7 +31,6 @@ echo "// Code generated by gen-set $KIND $VALUE; DO NOT EDIT." >$out
echo
>>
$out
sed
\
-e
"s/PACKAGE/
$PACKAGE
/g"
\
-e
"s/VALUE/
$VALUE
/g"
\
-e
"s/Set/
Set
${
KIND
}
/g"
\
-e
"s/Set/
${
KIND
}
/g"
\
$input
>>
$out
wcfs/internal/set/set.go
View file @
fecf1327
...
...
@@ -19,10 +19,10 @@
package
set
//go:generate ./gen-set
set
I64 int64 zset_i64.go
//go:generate ./gen-set
set
Str string zset_str.go
//go:generate ./gen-set
set
Oid _Oid zset_oid.go
//go:generate ./gen-set
set
Tid _Tid zset_tid.go
//go:generate ./gen-set I64 int64 zset_i64.go
//go:generate ./gen-set Str string zset_str.go
//go:generate ./gen-set Oid _Oid zset_oid.go
//go:generate ./gen-set Tid _Tid zset_tid.go
import
(
"lab.nexedi.com/kirr/neo/go/zodb"
...
...
wcfs/internal/set/set.go.in
View file @
fecf1327
...
...
@@ -17,7 +17,7 @@
//
See
COPYING
file
for
full
licensing
terms
.
//
See
https
://
www
.
nexedi
.
com
/
licensing
for
rationale
and
options
.
package
PACKAGE
package
set
import
(
"fmt"
...
...
wcfs/internal/set/zset_i64.go
View file @
fecf1327
...
...
@@ -27,35 +27,35 @@ import (
"strings"
)
//
Set
I64 is a set of int64.
type
Set
I64
map
[
int64
]
struct
{}
// I64 is a set of int64.
type
I64
map
[
int64
]
struct
{}
// Add adds v to the set.
func
(
s
Set
I64
)
Add
(
v
int64
)
{
func
(
s
I64
)
Add
(
v
int64
)
{
s
[
v
]
=
struct
{}{}
}
// Del removes v from the set.
// it is noop if v was not in the set.
func
(
s
Set
I64
)
Del
(
v
int64
)
{
func
(
s
I64
)
Del
(
v
int64
)
{
delete
(
s
,
v
)
}
// Has checks whether the set contains v.
func
(
s
Set
I64
)
Has
(
v
int64
)
bool
{
func
(
s
I64
)
Has
(
v
int64
)
bool
{
_
,
ok
:=
s
[
v
]
return
ok
}
// Update adds t values to s.
func
(
s
SetI64
)
Update
(
t
Set
I64
)
{
func
(
s
I64
)
Update
(
t
I64
)
{
for
v
:=
range
t
{
s
.
Add
(
v
)
}
}
// Elements returns all elements of set as slice.
func
(
s
Set
I64
)
Elements
()
[]
int64
{
func
(
s
I64
)
Elements
()
[]
int64
{
ev
:=
make
([]
int64
,
len
(
s
))
i
:=
0
for
e
:=
range
s
{
...
...
@@ -66,14 +66,14 @@ func (s SetI64) Elements() []int64 {
}
// Union returns s ∪ t
func
(
s
SetI64
)
Union
(
t
SetI64
)
Set
I64
{
func
(
s
I64
)
Union
(
t
I64
)
I64
{
// l = max(len(s), len(t))
l
:=
len
(
s
)
if
lt
:=
len
(
t
);
lt
>
l
{
l
=
lt
}
u
:=
make
(
Set
I64
,
l
)
u
:=
make
(
I64
,
l
)
for
v
:=
range
s
{
u
.
Add
(
v
)
...
...
@@ -85,8 +85,8 @@ func (s SetI64) Union(t SetI64) SetI64 {
}
// Intersection returns s ∩ t
func
(
s
SetI64
)
Intersection
(
t
SetI64
)
Set
I64
{
i
:=
Set
I64
{}
func
(
s
I64
)
Intersection
(
t
I64
)
I64
{
i
:=
I64
{}
for
v
:=
range
s
{
if
t
.
Has
(
v
)
{
i
.
Add
(
v
)
...
...
@@ -96,8 +96,8 @@ func (s SetI64) Intersection(t SetI64) SetI64 {
}
// Difference returns s\t.
func
(
s
SetI64
)
Difference
(
t
SetI64
)
Set
I64
{
d
:=
Set
I64
{}
func
(
s
I64
)
Difference
(
t
I64
)
I64
{
d
:=
I64
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -107,8 +107,8 @@ func (s SetI64) Difference(t SetI64) SetI64 {
}
// SymmetricDifference returns s Δ t.
func
(
s
SetI64
)
SymmetricDifference
(
t
SetI64
)
Set
I64
{
d
:=
Set
I64
{}
func
(
s
I64
)
SymmetricDifference
(
t
I64
)
I64
{
d
:=
I64
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -123,7 +123,7 @@ func (s SetI64) SymmetricDifference(t SetI64) SetI64 {
}
// Equal returns whether a == b.
func
(
a
SetI64
)
Equal
(
b
Set
I64
)
bool
{
func
(
a
I64
)
Equal
(
b
I64
)
bool
{
if
len
(
a
)
!=
len
(
b
)
{
return
false
}
...
...
@@ -139,8 +139,8 @@ func (a SetI64) Equal(b SetI64) bool {
}
// Clone returns copy of the set.
func
(
orig
SetI64
)
Clone
()
Set
I64
{
klon
:=
make
(
Set
I64
,
len
(
orig
))
func
(
orig
I64
)
Clone
()
I64
{
klon
:=
make
(
I64
,
len
(
orig
))
for
v
:=
range
orig
{
klon
.
Add
(
v
)
}
...
...
@@ -149,7 +149,7 @@ func (orig SetI64) Clone() SetI64 {
// --------
func
(
s
Set
I64
)
SortedElements
()
[]
int64
{
func
(
s
I64
)
SortedElements
()
[]
int64
{
ev
:=
s
.
Elements
()
sort
.
Slice
(
ev
,
func
(
i
,
j
int
)
bool
{
return
ev
[
i
]
<
ev
[
j
]
...
...
@@ -157,7 +157,7 @@ func (s SetI64) SortedElements() []int64 {
return
ev
}
func
(
s
Set
I64
)
String
()
string
{
func
(
s
I64
)
String
()
string
{
ev
:=
s
.
SortedElements
()
strv
:=
make
([]
string
,
len
(
ev
))
for
i
,
v
:=
range
ev
{
...
...
wcfs/internal/set/zset_oid.go
View file @
fecf1327
...
...
@@ -27,35 +27,35 @@ import (
"strings"
)
//
Set
Oid is a set of _Oid.
type
Set
Oid
map
[
_Oid
]
struct
{}
// Oid is a set of _Oid.
type
Oid
map
[
_Oid
]
struct
{}
// Add adds v to the set.
func
(
s
Set
Oid
)
Add
(
v
_Oid
)
{
func
(
s
Oid
)
Add
(
v
_Oid
)
{
s
[
v
]
=
struct
{}{}
}
// Del removes v from the set.
// it is noop if v was not in the set.
func
(
s
Set
Oid
)
Del
(
v
_Oid
)
{
func
(
s
Oid
)
Del
(
v
_Oid
)
{
delete
(
s
,
v
)
}
// Has checks whether the set contains v.
func
(
s
Set
Oid
)
Has
(
v
_Oid
)
bool
{
func
(
s
Oid
)
Has
(
v
_Oid
)
bool
{
_
,
ok
:=
s
[
v
]
return
ok
}
// Update adds t values to s.
func
(
s
SetOid
)
Update
(
t
Set
Oid
)
{
func
(
s
Oid
)
Update
(
t
Oid
)
{
for
v
:=
range
t
{
s
.
Add
(
v
)
}
}
// Elements returns all elements of set as slice.
func
(
s
Set
Oid
)
Elements
()
[]
_Oid
{
func
(
s
Oid
)
Elements
()
[]
_Oid
{
ev
:=
make
([]
_Oid
,
len
(
s
))
i
:=
0
for
e
:=
range
s
{
...
...
@@ -66,14 +66,14 @@ func (s SetOid) Elements() []_Oid {
}
// Union returns s ∪ t
func
(
s
SetOid
)
Union
(
t
SetOid
)
Set
Oid
{
func
(
s
Oid
)
Union
(
t
Oid
)
Oid
{
// l = max(len(s), len(t))
l
:=
len
(
s
)
if
lt
:=
len
(
t
);
lt
>
l
{
l
=
lt
}
u
:=
make
(
Set
Oid
,
l
)
u
:=
make
(
Oid
,
l
)
for
v
:=
range
s
{
u
.
Add
(
v
)
...
...
@@ -85,8 +85,8 @@ func (s SetOid) Union(t SetOid) SetOid {
}
// Intersection returns s ∩ t
func
(
s
SetOid
)
Intersection
(
t
SetOid
)
Set
Oid
{
i
:=
Set
Oid
{}
func
(
s
Oid
)
Intersection
(
t
Oid
)
Oid
{
i
:=
Oid
{}
for
v
:=
range
s
{
if
t
.
Has
(
v
)
{
i
.
Add
(
v
)
...
...
@@ -96,8 +96,8 @@ func (s SetOid) Intersection(t SetOid) SetOid {
}
// Difference returns s\t.
func
(
s
SetOid
)
Difference
(
t
SetOid
)
Set
Oid
{
d
:=
Set
Oid
{}
func
(
s
Oid
)
Difference
(
t
Oid
)
Oid
{
d
:=
Oid
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -107,8 +107,8 @@ func (s SetOid) Difference(t SetOid) SetOid {
}
// SymmetricDifference returns s Δ t.
func
(
s
SetOid
)
SymmetricDifference
(
t
SetOid
)
Set
Oid
{
d
:=
Set
Oid
{}
func
(
s
Oid
)
SymmetricDifference
(
t
Oid
)
Oid
{
d
:=
Oid
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -123,7 +123,7 @@ func (s SetOid) SymmetricDifference(t SetOid) SetOid {
}
// Equal returns whether a == b.
func
(
a
SetOid
)
Equal
(
b
Set
Oid
)
bool
{
func
(
a
Oid
)
Equal
(
b
Oid
)
bool
{
if
len
(
a
)
!=
len
(
b
)
{
return
false
}
...
...
@@ -139,8 +139,8 @@ func (a SetOid) Equal(b SetOid) bool {
}
// Clone returns copy of the set.
func
(
orig
SetOid
)
Clone
()
Set
Oid
{
klon
:=
make
(
Set
Oid
,
len
(
orig
))
func
(
orig
Oid
)
Clone
()
Oid
{
klon
:=
make
(
Oid
,
len
(
orig
))
for
v
:=
range
orig
{
klon
.
Add
(
v
)
}
...
...
@@ -149,7 +149,7 @@ func (orig SetOid) Clone() SetOid {
// --------
func
(
s
Set
Oid
)
SortedElements
()
[]
_Oid
{
func
(
s
Oid
)
SortedElements
()
[]
_Oid
{
ev
:=
s
.
Elements
()
sort
.
Slice
(
ev
,
func
(
i
,
j
int
)
bool
{
return
ev
[
i
]
<
ev
[
j
]
...
...
@@ -157,7 +157,7 @@ func (s SetOid) SortedElements() []_Oid {
return
ev
}
func
(
s
Set
Oid
)
String
()
string
{
func
(
s
Oid
)
String
()
string
{
ev
:=
s
.
SortedElements
()
strv
:=
make
([]
string
,
len
(
ev
))
for
i
,
v
:=
range
ev
{
...
...
wcfs/internal/set/zset_str.go
View file @
fecf1327
...
...
@@ -27,35 +27,35 @@ import (
"strings"
)
// S
etS
tr is a set of string.
type
S
etS
tr
map
[
string
]
struct
{}
// Str is a set of string.
type
Str
map
[
string
]
struct
{}
// Add adds v to the set.
func
(
s
S
etS
tr
)
Add
(
v
string
)
{
func
(
s
Str
)
Add
(
v
string
)
{
s
[
v
]
=
struct
{}{}
}
// Del removes v from the set.
// it is noop if v was not in the set.
func
(
s
S
etS
tr
)
Del
(
v
string
)
{
func
(
s
Str
)
Del
(
v
string
)
{
delete
(
s
,
v
)
}
// Has checks whether the set contains v.
func
(
s
S
etS
tr
)
Has
(
v
string
)
bool
{
func
(
s
Str
)
Has
(
v
string
)
bool
{
_
,
ok
:=
s
[
v
]
return
ok
}
// Update adds t values to s.
func
(
s
S
etStr
)
Update
(
t
Set
Str
)
{
func
(
s
S
tr
)
Update
(
t
Str
)
{
for
v
:=
range
t
{
s
.
Add
(
v
)
}
}
// Elements returns all elements of set as slice.
func
(
s
S
etS
tr
)
Elements
()
[]
string
{
func
(
s
Str
)
Elements
()
[]
string
{
ev
:=
make
([]
string
,
len
(
s
))
i
:=
0
for
e
:=
range
s
{
...
...
@@ -66,14 +66,14 @@ func (s SetStr) Elements() []string {
}
// Union returns s ∪ t
func
(
s
S
etStr
)
Union
(
t
SetStr
)
Set
Str
{
func
(
s
S
tr
)
Union
(
t
Str
)
Str
{
// l = max(len(s), len(t))
l
:=
len
(
s
)
if
lt
:=
len
(
t
);
lt
>
l
{
l
=
lt
}
u
:=
make
(
S
etS
tr
,
l
)
u
:=
make
(
Str
,
l
)
for
v
:=
range
s
{
u
.
Add
(
v
)
...
...
@@ -85,8 +85,8 @@ func (s SetStr) Union(t SetStr) SetStr {
}
// Intersection returns s ∩ t
func
(
s
S
etStr
)
Intersection
(
t
SetStr
)
Set
Str
{
i
:=
S
etS
tr
{}
func
(
s
S
tr
)
Intersection
(
t
Str
)
Str
{
i
:=
Str
{}
for
v
:=
range
s
{
if
t
.
Has
(
v
)
{
i
.
Add
(
v
)
...
...
@@ -96,8 +96,8 @@ func (s SetStr) Intersection(t SetStr) SetStr {
}
// Difference returns s\t.
func
(
s
S
etStr
)
Difference
(
t
SetStr
)
Set
Str
{
d
:=
S
etS
tr
{}
func
(
s
S
tr
)
Difference
(
t
Str
)
Str
{
d
:=
Str
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -107,8 +107,8 @@ func (s SetStr) Difference(t SetStr) SetStr {
}
// SymmetricDifference returns s Δ t.
func
(
s
S
etStr
)
SymmetricDifference
(
t
SetStr
)
Set
Str
{
d
:=
S
etS
tr
{}
func
(
s
S
tr
)
SymmetricDifference
(
t
Str
)
Str
{
d
:=
Str
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -123,7 +123,7 @@ func (s SetStr) SymmetricDifference(t SetStr) SetStr {
}
// Equal returns whether a == b.
func
(
a
S
etStr
)
Equal
(
b
Set
Str
)
bool
{
func
(
a
S
tr
)
Equal
(
b
Str
)
bool
{
if
len
(
a
)
!=
len
(
b
)
{
return
false
}
...
...
@@ -139,8 +139,8 @@ func (a SetStr) Equal(b SetStr) bool {
}
// Clone returns copy of the set.
func
(
orig
S
etStr
)
Clone
()
Set
Str
{
klon
:=
make
(
S
etS
tr
,
len
(
orig
))
func
(
orig
S
tr
)
Clone
()
Str
{
klon
:=
make
(
Str
,
len
(
orig
))
for
v
:=
range
orig
{
klon
.
Add
(
v
)
}
...
...
@@ -149,7 +149,7 @@ func (orig SetStr) Clone() SetStr {
// --------
func
(
s
S
etS
tr
)
SortedElements
()
[]
string
{
func
(
s
Str
)
SortedElements
()
[]
string
{
ev
:=
s
.
Elements
()
sort
.
Slice
(
ev
,
func
(
i
,
j
int
)
bool
{
return
ev
[
i
]
<
ev
[
j
]
...
...
@@ -157,7 +157,7 @@ func (s SetStr) SortedElements() []string {
return
ev
}
func
(
s
S
etS
tr
)
String
()
string
{
func
(
s
Str
)
String
()
string
{
ev
:=
s
.
SortedElements
()
strv
:=
make
([]
string
,
len
(
ev
))
for
i
,
v
:=
range
ev
{
...
...
wcfs/internal/set/zset_tid.go
View file @
fecf1327
...
...
@@ -27,35 +27,35 @@ import (
"strings"
)
//
Set
Tid is a set of _Tid.
type
Set
Tid
map
[
_Tid
]
struct
{}
// Tid is a set of _Tid.
type
Tid
map
[
_Tid
]
struct
{}
// Add adds v to the set.
func
(
s
Set
Tid
)
Add
(
v
_Tid
)
{
func
(
s
Tid
)
Add
(
v
_Tid
)
{
s
[
v
]
=
struct
{}{}
}
// Del removes v from the set.
// it is noop if v was not in the set.
func
(
s
Set
Tid
)
Del
(
v
_Tid
)
{
func
(
s
Tid
)
Del
(
v
_Tid
)
{
delete
(
s
,
v
)
}
// Has checks whether the set contains v.
func
(
s
Set
Tid
)
Has
(
v
_Tid
)
bool
{
func
(
s
Tid
)
Has
(
v
_Tid
)
bool
{
_
,
ok
:=
s
[
v
]
return
ok
}
// Update adds t values to s.
func
(
s
SetTid
)
Update
(
t
Set
Tid
)
{
func
(
s
Tid
)
Update
(
t
Tid
)
{
for
v
:=
range
t
{
s
.
Add
(
v
)
}
}
// Elements returns all elements of set as slice.
func
(
s
Set
Tid
)
Elements
()
[]
_Tid
{
func
(
s
Tid
)
Elements
()
[]
_Tid
{
ev
:=
make
([]
_Tid
,
len
(
s
))
i
:=
0
for
e
:=
range
s
{
...
...
@@ -66,14 +66,14 @@ func (s SetTid) Elements() []_Tid {
}
// Union returns s ∪ t
func
(
s
SetTid
)
Union
(
t
SetTid
)
Set
Tid
{
func
(
s
Tid
)
Union
(
t
Tid
)
Tid
{
// l = max(len(s), len(t))
l
:=
len
(
s
)
if
lt
:=
len
(
t
);
lt
>
l
{
l
=
lt
}
u
:=
make
(
Set
Tid
,
l
)
u
:=
make
(
Tid
,
l
)
for
v
:=
range
s
{
u
.
Add
(
v
)
...
...
@@ -85,8 +85,8 @@ func (s SetTid) Union(t SetTid) SetTid {
}
// Intersection returns s ∩ t
func
(
s
SetTid
)
Intersection
(
t
SetTid
)
Set
Tid
{
i
:=
Set
Tid
{}
func
(
s
Tid
)
Intersection
(
t
Tid
)
Tid
{
i
:=
Tid
{}
for
v
:=
range
s
{
if
t
.
Has
(
v
)
{
i
.
Add
(
v
)
...
...
@@ -96,8 +96,8 @@ func (s SetTid) Intersection(t SetTid) SetTid {
}
// Difference returns s\t.
func
(
s
SetTid
)
Difference
(
t
SetTid
)
Set
Tid
{
d
:=
Set
Tid
{}
func
(
s
Tid
)
Difference
(
t
Tid
)
Tid
{
d
:=
Tid
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -107,8 +107,8 @@ func (s SetTid) Difference(t SetTid) SetTid {
}
// SymmetricDifference returns s Δ t.
func
(
s
SetTid
)
SymmetricDifference
(
t
SetTid
)
Set
Tid
{
d
:=
Set
Tid
{}
func
(
s
Tid
)
SymmetricDifference
(
t
Tid
)
Tid
{
d
:=
Tid
{}
for
v
:=
range
s
{
if
!
t
.
Has
(
v
)
{
d
.
Add
(
v
)
...
...
@@ -123,7 +123,7 @@ func (s SetTid) SymmetricDifference(t SetTid) SetTid {
}
// Equal returns whether a == b.
func
(
a
SetTid
)
Equal
(
b
Set
Tid
)
bool
{
func
(
a
Tid
)
Equal
(
b
Tid
)
bool
{
if
len
(
a
)
!=
len
(
b
)
{
return
false
}
...
...
@@ -139,8 +139,8 @@ func (a SetTid) Equal(b SetTid) bool {
}
// Clone returns copy of the set.
func
(
orig
SetTid
)
Clone
()
Set
Tid
{
klon
:=
make
(
Set
Tid
,
len
(
orig
))
func
(
orig
Tid
)
Clone
()
Tid
{
klon
:=
make
(
Tid
,
len
(
orig
))
for
v
:=
range
orig
{
klon
.
Add
(
v
)
}
...
...
@@ -149,7 +149,7 @@ func (orig SetTid) Clone() SetTid {
// --------
func
(
s
Set
Tid
)
SortedElements
()
[]
_Tid
{
func
(
s
Tid
)
SortedElements
()
[]
_Tid
{
ev
:=
s
.
Elements
()
sort
.
Slice
(
ev
,
func
(
i
,
j
int
)
bool
{
return
ev
[
i
]
<
ev
[
j
]
...
...
@@ -157,7 +157,7 @@ func (s SetTid) SortedElements() []_Tid {
return
ev
}
func
(
s
Set
Tid
)
String
()
string
{
func
(
s
Tid
)
String
()
string
{
ev
:=
s
.
SortedElements
()
strv
:=
make
([]
string
,
len
(
ev
))
for
i
,
v
:=
range
ev
{
...
...
wcfs/internal/xbtree/pptreesubset.go
View file @
fecf1327
...
...
@@ -363,12 +363,12 @@ func (S PPTreeSubSet) verify() {
}()
// recompute {} oid -> children and verify .nchild against it
children
:=
make
(
map
[
zodb
.
Oid
]
S
etOid
,
len
(
S
))
children
:=
make
(
map
[
zodb
.
Oid
]
s
etOid
,
len
(
S
))
for
oid
,
t
:=
range
S
{
if
t
.
parent
!=
zodb
.
InvalidOid
{
cc
,
ok
:=
children
[
t
.
parent
]
if
!
ok
{
cc
=
make
(
S
etOid
,
1
)
cc
=
make
(
s
etOid
,
1
)
children
[
t
.
parent
]
=
cc
}
cc
.
Add
(
oid
)
...
...
wcfs/internal/xbtree/treediff.go
View file @
fecf1327
...
...
@@ -113,10 +113,10 @@ func (δv ΔValue) String() string {
// for example for e.g. t₀->t₁->b₂ if δZ/T={t₀ b₂} -> δZ/TC=δZ/T+{t₁}
//
// δtopsByRoot = {} root -> {top changed nodes in that tree}
func
δZConnectTracked
(
δZv
[]
zodb
.
Oid
,
T
PPTreeSubSet
)
(
δZTC
SetOid
,
δtopsByRoot
map
[
zodb
.
Oid
]
S
etOid
)
{
δZ
:=
S
etOid
{};
for
_
,
δ
:=
range
δZv
{
δZ
.
Add
(
δ
)
}
δZTC
=
S
etOid
{}
δtopsByRoot
=
map
[
zodb
.
Oid
]
S
etOid
{}
func
δZConnectTracked
(
δZv
[]
zodb
.
Oid
,
T
PPTreeSubSet
)
(
δZTC
setOid
,
δtopsByRoot
map
[
zodb
.
Oid
]
s
etOid
)
{
δZ
:=
s
etOid
{};
for
_
,
δ
:=
range
δZv
{
δZ
.
Add
(
δ
)
}
δZTC
=
s
etOid
{}
δtopsByRoot
=
map
[
zodb
.
Oid
]
s
etOid
{}
for
δ
:=
range
δZ
{
track
,
ok
:=
T
[
δ
]
...
...
@@ -138,7 +138,7 @@ func δZConnectTracked(δZv []zodb.Oid, T PPTreeSubSet) (δZTC SetOid, δtopsByR
root
:=
node
δtops
,
ok
:=
δtopsByRoot
[
root
]
if
!
ok
{
δtops
=
S
etOid
{}
δtops
=
s
etOid
{}
δtopsByRoot
[
root
]
=
δtops
}
δtops
.
Add
(
δ
)
...
...
@@ -338,7 +338,7 @@ func (rs rangeSplit) String() string {
// δtops is set of top nodes for changed subtrees.
// δZTC is connected(δZ/T) - connected closure for subset of δZ(old..new) that
// touches tracked nodes of T.
func
treediff
(
ctx
context
.
Context
,
root
zodb
.
Oid
,
δtops
SetOid
,
δZTC
S
etOid
,
trackSet
PPTreeSubSet
,
zconnOld
,
zconnNew
*
zodb
.
Connection
)
(
δT
map
[
Key
]
ΔValue
,
δtrack
*
ΔPPTreeSubSet
,
δtkeycov
*
RangedKeySet
,
err
error
)
{
func
treediff
(
ctx
context
.
Context
,
root
zodb
.
Oid
,
δtops
setOid
,
δZTC
s
etOid
,
trackSet
PPTreeSubSet
,
zconnOld
,
zconnNew
*
zodb
.
Connection
)
(
δT
map
[
Key
]
ΔValue
,
δtrack
*
ΔPPTreeSubSet
,
δtkeycov
*
RangedKeySet
,
err
error
)
{
defer
xerr
.
Contextf
(
&
err
,
"treediff %s..%s %s"
,
zconnOld
.
At
(),
zconnNew
.
At
(),
root
)
δT
=
map
[
Key
]
ΔValue
{}
...
...
@@ -401,7 +401,7 @@ func treediff(ctx context.Context, root zodb.Oid, δtops SetOid, δZTC SetOid, t
// consistent with b (= a + δ).
//
// δtkeycov represents how δtrack grows (always grows) tracking set key coverage.
func
diffX
(
ctx
context
.
Context
,
a
,
b
Node
,
δZTC
S
etOid
,
trackSet
PPTreeSubSet
)
(
δ
map
[
Key
]
ΔValue
,
δtrack
*
ΔPPTreeSubSet
,
δtkeycov
*
RangedKeySet
,
err
error
)
{
func
diffX
(
ctx
context
.
Context
,
a
,
b
Node
,
δZTC
s
etOid
,
trackSet
PPTreeSubSet
)
(
δ
map
[
Key
]
ΔValue
,
δtrack
*
ΔPPTreeSubSet
,
δtkeycov
*
RangedKeySet
,
err
error
)
{
if
a
==
nil
&&
b
==
nil
{
panic
(
"BUG: both a & b == nil"
)
// XXX -> not a bug e.g. for `ø ø T` sequence?
}
...
...
@@ -452,7 +452,7 @@ func diffX(ctx context.Context, a, b Node, δZTC SetOid, trackSet PPTreeSubSet)
//
// a, b point to top of subtrees @old and @new revisions.
// δZTC is connected set of objects covering δZT (objects changed in this tree in old..new).
func
diffT
(
ctx
context
.
Context
,
A
,
B
*
Tree
,
δZTC
S
etOid
,
trackSet
PPTreeSubSet
)
(
δ
map
[
Key
]
ΔValue
,
δtrack
*
ΔPPTreeSubSet
,
δtkeycov
*
RangedKeySet
,
err
error
)
{
func
diffT
(
ctx
context
.
Context
,
A
,
B
*
Tree
,
δZTC
s
etOid
,
trackSet
PPTreeSubSet
)
(
δ
map
[
Key
]
ΔValue
,
δtrack
*
ΔPPTreeSubSet
,
δtkeycov
*
RangedKeySet
,
err
error
)
{
tracefDiff
(
" diffT %s %s
\n
"
,
xidOf
(
A
),
xidOf
(
B
))
defer
xerr
.
Contextf
(
&
err
,
"diffT %s %s"
,
xidOf
(
A
),
xidOf
(
B
))
...
...
wcfs/internal/xbtree/xbtree.go
View file @
fecf1327
...
...
@@ -30,9 +30,9 @@ const KeyMin Key = math.MinInt64
type
Value
=
zodb
.
Oid
const
VDEL
=
zodb
.
InvalidOid
type
SetKey
=
set
.
Set
I64
type
SetOid
=
set
.
Set
Oid
type
SetTid
=
set
.
Set
Tid
type
setKey
=
set
.
I64
type
setOid
=
set
.
Oid
type
setTid
=
set
.
Tid
...
...
wcfs/internal/xbtree/δbtail.go
View file @
fecf1327
...
...
@@ -99,7 +99,7 @@ type ΔBtail struct {
trackSet
PPTreeSubSet
// set of trees for which .trackNew is non-empty
trackNewRoots
S
etOid
trackNewRoots
s
etOid
// handle to make connections to access database.
// TODO allow client to optionally provide zconnOld/zconnNew on e.g. Update()
...
...
@@ -129,7 +129,7 @@ type ΔTtail struct {
// It describes which trees were changed, but does not provide δkv details for changed trees.
type
ΔBroots
struct
{
Rev
zodb
.
Tid
ΔRoots
S
etOid
// which roots changed in this revision
ΔRoots
s
etOid
// which roots changed in this revision
}
// ΔB represents a change in BTrees space.
...
...
@@ -159,7 +159,7 @@ func NewΔBtail(at0 zodb.Tid, db *zodb.DB) *ΔBtail {
vδBroots
:
nil
,
vδTbyRoot
:
map
[
zodb
.
Oid
]
*
ΔTtail
{},
trackSet
:
PPTreeSubSet
{},
trackNewRoots
:
S
etOid
{},
trackNewRoots
:
s
etOid
{},
db
:
db
,
}
}
...
...
@@ -321,7 +321,7 @@ func (δBtail *ΔBtail) rebuildAll() (err error) {
δBtail
.
vδBroots_Update
(
root
,
δrevSet
)
}
δBtail
.
trackNewRoots
=
S
etOid
{}
δBtail
.
trackNewRoots
=
s
etOid
{}
return
nil
}
...
...
@@ -334,7 +334,7 @@ func (δBtail *ΔBtail) rebuildAll() (err error) {
// - set of revisions for which new entries in .vδT have been created.
//
// XXX place
func
(
δTtail
*
ΔTtail
)
rebuild
(
root
zodb
.
Oid
,
δZtail
*
zodb
.
ΔTail
,
db
*
zodb
.
DB
)
(
δtrackSet
PPTreeSubSet
,
δrevSet
S
etTid
,
err
error
)
{
func
(
δTtail
*
ΔTtail
)
rebuild
(
root
zodb
.
Oid
,
δZtail
*
zodb
.
ΔTail
,
db
*
zodb
.
DB
)
(
δtrackSet
PPTreeSubSet
,
δrevSet
s
etTid
,
err
error
)
{
defer
xerr
.
Context
(
&
err
,
"ΔTtail rebuild"
)
// XXX locking
...
...
@@ -348,7 +348,7 @@ func (δTtail *ΔTtail) rebuild(root zodb.Oid, δZtail *zodb.ΔTail, db *zodb.DB
return
nil
,
nil
,
nil
}
δrevSet
=
S
etTid
{}
δrevSet
=
s
etTid
{}
// go backwards and merge vδT <- treediff(lo..hi/trackNew)
vδZ
:=
δZtail
.
Data
()
...
...
@@ -474,7 +474,7 @@ func (δTtail *ΔTtail) rebuild1(atPrev zodb.Tid, δZ zodb.ΔRevEntry, trackNew
panicf
(
"BUG: δtopsByRoot has > 1 entries: %v
\n
trackNew: %v
\n
δZ: %v"
,
δtopsByRoot
,
trackNew
,
δZ
)
}
var
root
zodb
.
Oid
var
δtops
S
etOid
var
δtops
s
etOid
for
root_
,
δtops_
:=
range
δtopsByRoot
{
root
=
root_
δtops
=
δtops_
...
...
@@ -594,7 +594,7 @@ func (δBtail *ΔBtail) Update(δZ *zodb.EventCommit) (_ ΔB, err error) {
}
// vδBroots += δB
δroots
:=
S
etOid
{}
δroots
:=
s
etOid
{}
for
root
:=
range
δB
.
ΔByRoot
{
δroots
.
Add
(
root
)
}
...
...
@@ -681,7 +681,7 @@ func (δBtail *ΔBtail) _Update1(δZ *zodb.EventCommit) (δB1 _ΔBUpdate1, err e
// changed entries with δrevSet revisions.
//
// XXX place TODO δrevSet -> []rev↑
func
(
δBtail
*
ΔBtail
)
vδBroots_Update
(
root
zodb
.
Oid
,
δrevSet
S
etTid
)
{
func
(
δBtail
*
ΔBtail
)
vδBroots_Update
(
root
zodb
.
Oid
,
δrevSet
s
etTid
)
{
// XXX locking
for
rev
:=
range
δrevSet
{
l
:=
len
(
δBtail
.
vδBroots
)
...
...
@@ -689,7 +689,7 @@ func (δBtail *ΔBtail) vδBroots_Update(root zodb.Oid, δrevSet SetTid) {
return
rev
<=
δBtail
.
vδBroots
[
k
]
.
Rev
})
if
j
==
l
||
δBtail
.
vδBroots
[
j
]
.
Rev
!=
rev
{
δBroots
:=
ΔBroots
{
Rev
:
rev
,
ΔRoots
:
S
etOid
{}}
δBroots
:=
ΔBroots
{
Rev
:
rev
,
ΔRoots
:
s
etOid
{}}
// insert(@j, δBroots)
δBtail
.
vδBroots
=
append
(
δBtail
.
vδBroots
[
:
j
],
append
([]
ΔBroots
{
δBroots
},
...
...
@@ -708,7 +708,7 @@ func (δBtail *ΔBtail) ForgetPast(revCut zodb.Tid) {
// go through vδBroots till revcut -> find which trees to trim -> trim ΔTtails.
totrim
:=
S
etOid
{}
// roots whose ΔTtail has changes ≤ revCut
totrim
:=
s
etOid
{}
// roots whose ΔTtail has changes ≤ revCut
icut
:=
0
for
;
icut
<
len
(
δBtail
.
vδBroots
);
icut
++
{
δBroots
:=
δBtail
.
vδBroots
[
icut
]
...
...
wcfs/internal/xbtree/δbtail_test.go
View file @
fecf1327
...
...
@@ -333,7 +333,7 @@ func (rbs RBucketSet) coverage() string {
}
// trackSet returns what should be ΔBtail.trackSet coverage for specified tracked key set.
func
(
rbs
RBucketSet
)
trackSet
(
tracked
S
etKey
)
PPTreeSubSet
{
func
(
rbs
RBucketSet
)
trackSet
(
tracked
s
etKey
)
PPTreeSubSet
{
// nil = don't compute keyCover
// (trackSet is called from inside hot inner loop of rebuild test)
trackSet
:=
rbs
.
_trackSetWithCov
(
tracked
,
nil
)
...
...
@@ -341,13 +341,13 @@ func (rbs RBucketSet) trackSet(tracked SetKey) PPTreeSubSet {
}
// trackSetWithCov returns what should be ΔBtail.trackSet and its key coverage for specified tracked key set.
func
(
rbs
RBucketSet
)
trackSetWithCov
(
tracked
S
etKey
)
(
trackSet
PPTreeSubSet
,
keyCover
*
RangedKeySet
)
{
func
(
rbs
RBucketSet
)
trackSetWithCov
(
tracked
s
etKey
)
(
trackSet
PPTreeSubSet
,
keyCover
*
RangedKeySet
)
{
keyCover
=
&
RangedKeySet
{}
trackSet
=
rbs
.
_trackSetWithCov
(
tracked
,
keyCover
)
return
trackSet
,
keyCover
}
func
(
rbs
RBucketSet
)
_trackSetWithCov
(
tracked
S
etKey
,
outKeyCover
*
RangedKeySet
)
(
trackSet
PPTreeSubSet
)
{
func
(
rbs
RBucketSet
)
_trackSetWithCov
(
tracked
s
etKey
,
outKeyCover
*
RangedKeySet
)
(
trackSet
PPTreeSubSet
)
{
trackSet
=
PPTreeSubSet
{}
for
k
:=
range
tracked
{
kb
:=
rbs
.
Get
(
k
)
...
...
@@ -536,11 +536,11 @@ func XGetδKV(t1, t2 *tTreeCommit, δkvOid map[Key]ΔValue) map[Key]Δstring {
// Note: adjacency matrix is symmetric (KAdj verifies this at runtime):
//
// kadj(A,B) == kadj(B,A)
type
KAdjMatrix
map
[
Key
]
S
etKey
type
KAdjMatrix
map
[
Key
]
s
etKey
// Map returns kadj·keys .
func
(
kadj
KAdjMatrix
)
Map
(
keys
SetKey
)
S
etKey
{
res
:=
make
(
S
etKey
,
len
(
keys
))
func
(
kadj
KAdjMatrix
)
Map
(
keys
setKey
)
s
etKey
{
res
:=
make
(
s
etKey
,
len
(
keys
))
for
k
:=
range
keys
{
to
,
ok
:=
kadj
[
k
]
if
!
ok
{
...
...
@@ -574,7 +574,7 @@ func (kadjA KAdjMatrix) Mul(kadjB KAdjMatrix) KAdjMatrix {
// This set of keys defaults to allTestKeys(t1,t2).
//
// KAdj itself is verified by testΔBTail on entries with .kadjOK set.
func
KAdj
(
t1
,
t2
*
tTreeCommit
,
keysv
...
S
etKey
)
(
kadj
KAdjMatrix
)
{
func
KAdj
(
t1
,
t2
*
tTreeCommit
,
keysv
...
s
etKey
)
(
kadj
KAdjMatrix
)
{
// assert KAdj(A,B) == KAdj(B,A)
kadj12
:=
_KAdj
(
t1
,
t2
,
keysv
...
)
kadj21
:=
_KAdj
(
t2
,
t1
,
keysv
...
)
...
...
@@ -592,8 +592,8 @@ func debugfKAdj(format string, argv ...interface{}) {
}
}
func
_KAdj
(
t1
,
t2
*
tTreeCommit
,
keysv
...
S
etKey
)
(
kadj
KAdjMatrix
)
{
var
keys
S
etKey
func
_KAdj
(
t1
,
t2
*
tTreeCommit
,
keysv
...
s
etKey
)
(
kadj
KAdjMatrix
)
{
var
keys
s
etKey
switch
len
(
keysv
)
{
case
0
:
keys
=
allTestKeys
(
t1
,
t2
)
...
...
@@ -615,8 +615,8 @@ func _KAdj(t1, t2 *tTreeCommit, keysv ...SetKey) (kadj KAdjMatrix) {
// if k is tracked and covered by changed leaf -> changes to adjacents must be in Update(t1->t2).
kadj
=
KAdjMatrix
{}
for
k
:=
range
keys
{
adj1
:=
S
etKey
{}
adj2
:=
S
etKey
{}
adj1
:=
s
etKey
{}
adj2
:=
s
etKey
{}
q1
:=
&
RangedKeySet
{};
q1
.
Add
(
k
)
q2
:=
&
RangedKeySet
{};
q2
.
Add
(
k
)
...
...
@@ -686,7 +686,7 @@ func _KAdj(t1, t2 *tTreeCommit, keysv ...SetKey) (kadj KAdjMatrix) {
q2
.
Clear
()
}
adj
:=
S
etKey
{};
adj
.
Update
(
adj1
);
adj
.
Update
(
adj2
)
adj
:=
s
etKey
{};
adj
.
Update
(
adj1
);
adj
.
Update
(
adj2
)
kadj
[
k
]
=
adj
}
...
...
@@ -711,7 +711,7 @@ func xverifyΔBTail_Update(t *testing.T, subj string, db *zodb.DB, treeRoot zodb
// verify at1->at2 for all combination of initial tracked keys.
for
kidx
:=
range
IntSets
(
len
(
allKeyv
))
{
keys
:=
S
etKey
{}
keys
:=
s
etKey
{}
for
_
,
idx
:=
range
kidx
{
keys
.
Add
(
allKeyv
[
idx
])
}
...
...
@@ -727,17 +727,17 @@ func xverifyΔBTail_Update(t *testing.T, subj string, db *zodb.DB, treeRoot zodb
// xverifyΔBTail_Update1 verifies how ΔBTail handles ZODB update at1->at2 from initial
// tracked state defined by initialTrackedKeys.
func
xverifyΔBTail_Update1
(
t
*
testing
.
T
,
subj
string
,
db
*
zodb
.
DB
,
treeRoot
zodb
.
Oid
,
t1
,
t2
*
tTreeCommit
,
initialTrackedKeys
S
etKey
,
kadj
KAdjMatrix
)
{
func
xverifyΔBTail_Update1
(
t
*
testing
.
T
,
subj
string
,
db
*
zodb
.
DB
,
treeRoot
zodb
.
Oid
,
t1
,
t2
*
tTreeCommit
,
initialTrackedKeys
s
etKey
,
kadj
KAdjMatrix
)
{
X
:=
exc
.
Raiseif
//t.Logf("\n>>> Track=%s\n", initialTrackedKeys)
δZ
:=
t2
.
δZ
d12
:=
t2
.
δxkv
var
TrackedδZ
S
etKey
=
nil
var
kadjTrackedδZ
S
etKey
=
nil
var
TrackedδZ
s
etKey
=
nil
var
kadjTrackedδZ
s
etKey
=
nil
var
δT
,
δTok
map
[
Key
]
Δstring
=
nil
,
nil
δZset
:=
S
etOid
{}
δZset
:=
s
etOid
{}
for
_
,
oid
:=
range
δZ
.
Changev
{
δZset
.
Add
(
oid
)
}
...
...
@@ -768,7 +768,7 @@ func xverifyΔBTail_Update1(t *testing.T, subj string, db *zodb.DB, treeRoot zod
xtrackKeys
(
δbtail
,
t1
,
initialTrackedKeys
)
// TrackedδZ = Tracked ^ δZ (i.e. a tracked node has changed, or its coverage was changed)
TrackedδZ
=
S
etKey
{}
TrackedδZ
=
s
etKey
{}
for
k
:=
range
initialTrackedKeys
{
leaf1
:=
t1
.
xkv
.
Get
(
k
)
oid1
:=
leaf1
.
oid
...
...
@@ -785,7 +785,7 @@ func xverifyΔBTail_Update1(t *testing.T, subj string, db *zodb.DB, treeRoot zod
}
}
kadjTrackedδZ
=
S
etKey
{}
// kadj[Tracked^δZ] (all keys adjacent to tracked^δZ)
kadjTrackedδZ
=
s
etKey
{}
// kadj[Tracked^δZ] (all keys adjacent to tracked^δZ)
for
k
:=
range
TrackedδZ
{
kadjTrackedδZ
.
Update
(
kadj
[
k
])
}
...
...
@@ -857,11 +857,11 @@ func xverifyΔBTail_Update1(t *testing.T, subj string, db *zodb.DB, treeRoot zod
// assert δB.ByRoot == {treeRoot -> ...} if δTok != ø
// == ø if δTok == ø
rootsOK
:=
S
etOid
{}
rootsOK
:=
s
etOid
{}
if
len
(
δTok
)
>
0
{
rootsOK
.
Add
(
treeRoot
)
}
roots
:=
S
etOid
{}
roots
:=
s
etOid
{}
for
root
:=
range
δB
.
ΔByRoot
{
roots
.
Add
(
root
)
}
...
...
@@ -921,7 +921,7 @@ func (δBtail *ΔBtail) assertTrack(t *testing.T, subj string, trackSetOK PPTree
t
.
Errorf
(
"%s: trackSet:
\n\t
have: %v
\n\t
want: %v"
,
subj
,
δBtail
.
trackSet
,
trackSetOK
)
}
roots
:=
S
etOid
{}
roots
:=
s
etOid
{}
for
root
:=
range
δBtail
.
vδTbyRoot
{
roots
.
Add
(
root
)
}
...
...
@@ -942,7 +942,7 @@ func (δBtail *ΔBtail) assertTrack(t *testing.T, subj string, trackSetOK PPTree
δTtail
:=
δBtail
.
vδTbyRoot
[
root
]
trackNewRootsOK
:=
S
etOid
{}
trackNewRootsOK
:=
s
etOid
{}
if
!
trackNewOK
.
Empty
()
{
trackNewRootsOK
.
Add
(
root
)
}
...
...
@@ -990,7 +990,7 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
// verify t0 -> t1 Track(keys1) Rebuild -> t2 Track(keys2) Rebuild
// for all combinations of keys1 and keys2
for
k1idx
:=
range
IntSets
(
len
(
tAllKeyv
))
{
keys1
:=
S
etKey
{}
keys1
:=
s
etKey
{}
for
_
,
idx1
:=
range
k1idx
{
keys1
.
Add
(
tAllKeyv
[
idx1
])
}
...
...
@@ -1065,7 +1065,7 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
// reduce that to = tAllKeys - keys1R2 in short mode
// ( if key from keys2 already became tracked after Track(keys1) + Update,
// adding Track(that-key), is not adding much testing coverage to recompute paths )
var
tRestKeys2
S
etKey
var
tRestKeys2
s
etKey
if
testing
.
Short
()
{
tRestKeys2
=
tAllKeys
.
Difference
(
keys1R2
)
}
else
{
...
...
@@ -1074,7 +1074,7 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
tRestKeyv2
:=
tRestKeys2
.
SortedElements
()
for
k2idx
:=
range
IntSets
(
len
(
tRestKeyv2
))
{
keys2
:=
S
etKey
{}
keys2
:=
s
etKey
{}
for
_
,
idx2
:=
range
k2idx
{
keys2
.
Add
(
tRestKeyv2
[
idx2
])
}
...
...
@@ -1172,7 +1172,7 @@ func xverifyΔBTail_rebuild_U(t *testing.T, δbtail *ΔBtail, treeRoot zodb.Oid,
δrootsOK
=
0
}
δroots
:=
S
etOid
{}
δroots
:=
s
etOid
{}
for
root
:=
range
δbtail
.
vδTbyRoot
{
δroots
.
Add
(
root
)
}
...
...
@@ -1192,7 +1192,7 @@ func xverifyΔBTail_rebuild_U(t *testing.T, δbtail *ΔBtail, treeRoot zodb.Oid,
}
// xverifyΔBTail_rebuild_TR verifies ΔBtail state after Track(keys) + rebuild.
func
xverifyΔBTail_rebuild_TR
(
t
*
testing
.
T
,
δbtail
*
ΔBtail
,
tj
*
tTreeCommit
,
treeRoot
zodb
.
Oid
,
xat
map
[
zodb
.
Tid
]
string
,
keys
S
etKey
,
trackSet
PPTreeSubSet
,
trackNew
,
trackSetAfterRebuild
PPTreeSubSet
,
vδTok
...
map
[
Key
]
Δstring
)
{
func
xverifyΔBTail_rebuild_TR
(
t
*
testing
.
T
,
δbtail
*
ΔBtail
,
tj
*
tTreeCommit
,
treeRoot
zodb
.
Oid
,
xat
map
[
zodb
.
Tid
]
string
,
keys
s
etKey
,
trackSet
PPTreeSubSet
,
trackNew
,
trackSetAfterRebuild
PPTreeSubSet
,
vδTok
...
map
[
Key
]
Δstring
)
{
t
.
Helper
()
ø
:=
PPTreeSubSet
{}
...
...
@@ -1290,7 +1290,7 @@ func assertΔTtail(t *testing.T, subj string, δbtail *ΔBtail, tj *tTreeCommit,
// xtrackKeys issues δbtail.Track requests for tree[keys].
// XXX place
func
xtrackKeys
(
δbtail
*
ΔBtail
,
t
*
tTreeCommit
,
keys
S
etKey
)
{
func
xtrackKeys
(
δbtail
*
ΔBtail
,
t
*
tTreeCommit
,
keys
s
etKey
)
{
X
:=
exc
.
Raiseif
head
:=
δbtail
.
Head
()
if
head
!=
t
.
at
{
...
...
@@ -1338,7 +1338,7 @@ func ___xverifyΔBTail_GetAt(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt ..
// verify t1->t2-> ... ->tn Track(keys) Get(keys, @at)
// for all combinations of tracked keys and at
for kidx := range IntSets(len(tkeyv)) {
keys :=
S
etKey{}
keys :=
s
etKey{}
for _, idx := range kidx {
keys.Add(tkeyv[idx])
}
...
...
@@ -1350,7 +1350,7 @@ func ___xverifyΔBTail_GetAt(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt ..
})
}
func xverifyΔBTail_GetAt1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*tTreeCommit, xat map[zodb.Tid]string, keys
S
etKey) {
func xverifyΔBTail_GetAt1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*tTreeCommit, xat map[zodb.Tid]string, keys
s
etKey) {
X := exc.Raiseif
// t1->t2-> ... -> tn
...
...
@@ -1698,9 +1698,9 @@ func testΔBTail(t_ *testing.T, testq chan ΔBTestEntry) {
// TestΔBTail verifies ΔBTail for explicitly provided tree topologies.
func
TestΔBTail
(
t
*
testing
.
T
)
{
// K is shorthand for
S
etKey
K
:=
func
(
keyv
...
Key
)
S
etKey
{
ks
:=
S
etKey
{}
// K is shorthand for
s
etKey
K
:=
func
(
keyv
...
Key
)
s
etKey
{
ks
:=
s
etKey
{}
for
_
,
k
:=
range
keyv
{
ks
.
Add
(
k
)
}
return
ks
}
...
...
@@ -2158,7 +2158,7 @@ func TestΔBtailForget(t_ *testing.T) {
// start tracking. everything becomes tracked because t1's T/B1:a has [-∞,∞) coverage
// By starting tracking after t2 we verify vδBroots update in both Update and rebuild
_0
:=
S
etKey
{};
_0
.
Add
(
0
)
_0
:=
s
etKey
{};
_0
.
Add
(
0
)
xtrackKeys
(
δbtail
,
t2
,
_0
)
_
,
err
=
δbtail
.
Update
(
t3
.
δZ
);
X
(
err
)
...
...
@@ -2190,7 +2190,7 @@ func TestΔBtailClone(t_ *testing.T) {
t1
:=
t
.
CommitTree
(
"T2/B1:c-B2:d"
)
δbtail
:=
NewΔBtail
(
t0
.
at
,
t
.
db
)
_
,
err
:=
δbtail
.
Update
(
t1
.
δZ
);
X
(
err
)
_2
:=
S
etKey
{};
_2
.
Add
(
2
)
_2
:=
s
etKey
{};
_2
.
Add
(
2
)
xtrackKeys
(
δbtail
,
t1
,
_2
)
err
=
δbtail
.
rebuildAll
();
X
(
err
)
...
...
@@ -2266,7 +2266,7 @@ type Δstring struct {
}
func
kvdiff
(
kv1
,
kv2
map
[
Key
]
string
)
map
[
Key
]
Δstring
{
delta
:=
map
[
Key
]
Δstring
{}
keys
:=
S
etKey
{}
keys
:=
s
etKey
{}
for
k
:=
range
kv1
{
keys
.
Add
(
k
)
}
for
k
:=
range
kv2
{
keys
.
Add
(
k
)
}
...
...
@@ -2336,8 +2336,8 @@ func (xkv RBucketSet) Flatten() map[Key]string {
}
// allTestKeys returns all keys from vt + ∞.
func
allTestKeys
(
vt
...*
tTreeCommit
)
S
etKey
{
allKeys
:=
S
etKey
{};
allKeys
.
Add
(
KeyMax
)
// ∞ simulating ZBigFile.Size() query
func
allTestKeys
(
vt
...*
tTreeCommit
)
s
etKey
{
allKeys
:=
s
etKey
{};
allKeys
.
Add
(
KeyMax
)
// ∞ simulating ZBigFile.Size() query
for
_
,
t
:=
range
vt
{
for
_
,
b
:=
range
t
.
xkv
{
for
k
:=
range
b
.
kv
{
...
...
wcfs/internal/zdata/δftail.go
View file @
fecf1327
...
...
@@ -33,8 +33,8 @@ import (
"lab.nexedi.com/nexedi/wendelin.core/wcfs/internal/xzodb"
)
type
SetI64
=
set
.
Set
I64
type
SetOid
=
set
.
Set
Oid
type
setI64
=
set
.
I64
type
setOid
=
set
.
Oid
// ΔFtail represents tail of revisional changes to files.
//
...
...
@@ -75,9 +75,9 @@ type SetOid = set.SetOid
type
ΔFtail
struct
{
// ΔFtail merges ΔBtail with history of ZBlk
δBtail
*
xbtree
.
ΔBtail
fileIdx
map
[
zodb
.
Oid
]
S
etOid
// tree-root -> {} ZBigFile<oid> as of @head
fileIdx
map
[
zodb
.
Oid
]
s
etOid
// tree-root -> {} ZBigFile<oid> as of @head
trackSetZFile
S
etOid
// set of tracked ZBigFiles as of @head
trackSetZFile
s
etOid
// set of tracked ZBigFiles as of @head
trackSetZBlk
map
[
zodb
.
Oid
]
*
zblkTrack
// zblk -> {} root -> {}blk as of @head
// XXX kill
///*
...
...
@@ -95,8 +95,8 @@ type ΔFtail struct {
// zblkTrack keeps information in which root/blocks ZBlk is present as of @head.
type
zblkTrack
struct
{
// inroot map[zodb.Oid]
S
etI64 // {} root -> {}blk XXX later switch to this
infile
map
[
zodb
.
Oid
]
S
etI64
// {} foid -> {}blk
// inroot map[zodb.Oid]
s
etI64 // {} root -> {}blk XXX later switch to this
infile
map
[
zodb
.
Oid
]
s
etI64
// {} foid -> {}blk
}
// ΔF represents a change in files space.
...
...
@@ -108,7 +108,7 @@ type ΔF struct {
// ΔFile represents a change to one file.
type
ΔFile
struct
{
Rev
zodb
.
Tid
Blocks
S
etI64
// changed blocks XXX -> ΔBlocks ?
Blocks
s
etI64
// changed blocks XXX -> ΔBlocks ?
Size
bool
// whether file size changed XXX -> ΔSize?
}
...
...
@@ -123,8 +123,8 @@ type ΔFile struct {
func
NewΔFtail
(
at0
zodb
.
Tid
,
db
*
zodb
.
DB
)
*
ΔFtail
{
return
&
ΔFtail
{
δBtail
:
xbtree
.
NewΔBtail
(
at0
,
db
),
fileIdx
:
map
[
zodb
.
Oid
]
S
etOid
{},
trackSetZFile
:
S
etOid
{},
fileIdx
:
map
[
zodb
.
Oid
]
s
etOid
{},
trackSetZFile
:
s
etOid
{},
trackSetZBlk
:
map
[
zodb
.
Oid
]
*
zblkTrack
{},
trackNew
:
map
[
zodb
.
Oid
]
map
[
zodb
.
Oid
]
*
zblkTrack
{},
}
...
...
@@ -163,7 +163,7 @@ func (δFtail *ΔFtail) Track(file *ZBigFile, blk int64, path []btree.LONode, zb
root
:=
path
[
0
]
.
(
*
btree
.
LOBTree
)
files
,
ok
:=
δFtail
.
fileIdx
[
root
.
POid
()]
if
!
ok
{
files
=
S
etOid
{}
files
=
s
etOid
{}
δFtail
.
fileIdx
[
root
.
POid
()]
=
files
}
files
.
Add
(
foid
)
...
...
@@ -181,9 +181,9 @@ func (δFtail *ΔFtail) Track(file *ZBigFile, blk int64, path []btree.LONode, zb
blocks
,
ok
:=
zt
.
infile
[
foid
]
if
!
ok
{
blocks
=
make
(
S
etI64
,
1
)
blocks
=
make
(
s
etI64
,
1
)
if
zt
.
infile
==
nil
{
zt
.
infile
=
make
(
map
[
zodb
.
Oid
]
S
etI64
)
zt
.
infile
=
make
(
map
[
zodb
.
Oid
]
s
etI64
)
}
zt
.
infile
[
foid
]
=
blocks
}
...
...
@@ -243,7 +243,7 @@ func (δFtail *ΔFtail) Update(δZ *zodb.EventCommit, zhead *xzodb.ZConn) (_ ΔF
for
file
:=
range
files
{
δfile
,
ok
:=
δF
.
ByFile
[
file
]
if
!
ok
{
δfile
=
&
ΔFile
{
Rev
:
δF
.
Rev
,
Blocks
:
make
(
S
etI64
)}
δfile
=
&
ΔFile
{
Rev
:
δF
.
Rev
,
Blocks
:
make
(
s
etI64
)}
δF
.
ByFile
[
file
]
=
δfile
}
for
blk
/*, zblk*/
:=
range
δt
{
...
...
@@ -277,7 +277,7 @@ func (δFtail *ΔFtail) Update(δZ *zodb.EventCommit, zhead *xzodb.ZConn) (_ ΔF
for
foid
,
blocks
:=
range
zt
.
infile
{
δfile
,
ok
:=
δF
.
ByFile
[
foid
]
if
!
ok
{
δfile
=
&
ΔFile
{
Rev
:
δF
.
Rev
,
Blocks
:
make
(
S
etI64
)}
δfile
=
&
ΔFile
{
Rev
:
δF
.
Rev
,
Blocks
:
make
(
s
etI64
)}
δF
.
ByFile
[
foid
]
=
δfile
}
...
...
@@ -328,7 +328,7 @@ func (δFtail *ΔFtail) update(file *ZBigFile) {
// XXX -> func δF.δfile(foid) ?
δfile
,
ok
:=
δF
.
ByFile
[
foid
]
if
!
ok
{
δfile
=
&
ΔFile
{
Rev
:
δF
.
Rev
,
Blocks
:
make
(
S
etI64
)}
δfile
=
&
ΔFile
{
Rev
:
δF
.
Rev
,
Blocks
:
make
(
s
etI64
)}
δF
.
ByFile
[
foid
]
=
δfile
}
...
...
wcfs/internal/zdata/δftail_test.go
View file @
fecf1327
...
...
@@ -27,12 +27,12 @@ import (
"lab.nexedi.com/nexedi/wendelin.core/wcfs/internal/set"
)
type
SetStr
=
set
.
Set
Str
type
setStr
=
set
.
Str
// ΔFTestEntry represents one entry in ΔFtail tests.
type
ΔFTestEntry
struct
{
δblkTab
map
[
int64
]
string
// change in tree part {} #blk -> ZBlk<oid>
δblkData
S
etStr
// change to ZBlk objects
δblkData
s
etStr
// change to ZBlk objects
}
func
TestΔFtail
(
t
*
testing
.
T
)
{
...
...
@@ -40,8 +40,8 @@ func TestΔFtail(t *testing.T) {
type
δT
=
map
[
int64
]
string
// δD is shorthand to create δblkData.
δD
:=
func
(
zblkv
...
string
)
S
etStr
{
δ
:=
S
etStr
{}
δD
:=
func
(
zblkv
...
string
)
s
etStr
{
δ
:=
s
etStr
{}
for
_
,
zblk
:=
range
zblkv
{
δ
.
Add
(
zblk
)
}
...
...
@@ -58,9 +58,9 @@ func TestΔFtail(t *testing.T) {
vδf
:=
[]
ΔFile
{}
// (rev↑, {}blk) XXX +.Size?
blkTab
:=
map
[
int64
]
string
{}
// #blk -> ZBlk<oid>
Zinblk
:=
map
[
string
]
S
etI64
{}
// ZBlk<oid> -> which #blk refer to it
Zinblk
:=
map
[
string
]
s
etI64
{}
// ZBlk<oid> -> which #blk refer to it
for
_
,
test
:=
range
testv
{
δf
:=
S
etI64
{}
δf
:=
s
etI64
{}
for
blk
,
zblk
:=
range
test
.
δblkTab
{
// rebuild blkTab/Zinblk
...
...
@@ -75,7 +75,7 @@ func TestΔFtail(t *testing.T) {
blkTab
[
blk
]
=
zblk
inblk
,
ok
:=
Zinblk
[
zblk
]
if
!
ok
{
inblk
=
S
etI64
{}
inblk
=
s
etI64
{}
Zinblk
[
zblk
]
=
inblk
}
inblk
.
Add
(
blk
)
...
...
wcfs/wcfs.go
View file @
fecf1327
...
...
@@ -525,7 +525,7 @@ type (
ZData
=
zdata
.
ZData
ZBigFile
=
zdata
.
ZBigFile
SetI64
=
set
.
Set
I64
setI64
=
set
.
I64
)
// Root represents root of wcfs filesystem.
...
...
@@ -632,7 +632,7 @@ type BigFile struct {
// blocks that were ever read-accessed (head/ only) XXX locking by bfdir.δFmu ?
// XXX = δFtail.Tracked(f) ?
accessed
S
etI64
accessed
s
etI64
// inflight loadings of ZBigFile from ZODB.
// successful load results are kept here until blkdata is put into OS pagecache.
...
...
@@ -2210,7 +2210,7 @@ func (head *Head) bigopen(ctx context.Context, oid zodb.Oid) (_ *BigFile, err er
// FIXME: scan zfile.blktab - so that we can detect all btree changes
// see "XXX building δFtail lazily ..." in notes.txt
f
.
accessed
=
make
(
S
etI64
)
f
.
accessed
=
make
(
s
etI64
)
f
.
watchTab
=
make
(
map
[
*
Watch
]
struct
{})
}
...
...
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