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
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Joshua
wendelin.core
Commits
4b18c448
Commit
4b18c448
authored
Apr 03, 2019
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
6116d52a
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
257 additions
and
42 deletions
+257
-42
wcfs/internal/xbtree/zset_object.go
wcfs/internal/xbtree/zset_object.go
+56
-0
wcfs/internal/xbtree/zset_tree.go
wcfs/internal/xbtree/zset_tree.go
+56
-0
wcfs/internal/xbtree/δbtail.go
wcfs/internal/xbtree/δbtail.go
+36
-16
wcfs/internal/δbtree/zset_object.go
wcfs/internal/δbtree/zset_object.go
+2
-0
wcfs/internal/δbtree/zset_tree.go
wcfs/internal/δbtree/zset_tree.go
+2
-0
wcfs/misc.go
wcfs/misc.go
+25
-0
wcfs/wcfs.go
wcfs/wcfs.go
+21
-25
wcfs/zset_bigfile.go
wcfs/zset_bigfile.go
+56
-0
wcfs/zset_i64.go
wcfs/zset_i64.go
+2
-0
wcfs/zδtail_i64.go
wcfs/zδtail_i64.go
+1
-1
No files found.
wcfs/internal/xbtree/zset_object.go
0 → 100644
View file @
4b18c448
// Code generated by gen-set Object interface{}; DO NOT EDIT.
// Copyright (C) 2015-2019 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
package
xbtree
// SetObject is a set of interface{}.
type
SetObject
map
[
interface
{}]
struct
{}
// Add adds v to the set.
func
(
s
SetObject
)
Add
(
v
interface
{})
{
s
[
v
]
=
struct
{}{}
}
// XXX + Del(v) ?
// Has checks whether the set contains v.
func
(
s
SetObject
)
Has
(
v
interface
{})
bool
{
_
,
ok
:=
s
[
v
]
return
ok
}
// Update adds t values to s.
func
(
s
SetObject
)
Update
(
t
SetObject
)
{
for
v
:=
range
t
{
s
.
Add
(
v
)
}
}
// Elements returns all elements of set as slice.
func
(
s
SetObject
)
Elements
()
[]
interface
{}
{
ev
:=
make
([]
interface
{},
len
(
s
))
i
:=
0
for
e
:=
range
s
{
ev
[
i
]
=
e
i
++
}
return
ev
}
wcfs/internal/xbtree/zset_tree.go
0 → 100644
View file @
4b18c448
// Code generated by gen-set Tree *Tree; DO NOT EDIT.
// Copyright (C) 2015-2019 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
package
xbtree
// SetTree is a set of *Tree.
type
SetTree
map
[
*
Tree
]
struct
{}
// Add adds v to the set.
func
(
s
SetTree
)
Add
(
v
*
Tree
)
{
s
[
v
]
=
struct
{}{}
}
// XXX + Del(v) ?
// Has checks whether the set contains v.
func
(
s
SetTree
)
Has
(
v
*
Tree
)
bool
{
_
,
ok
:=
s
[
v
]
return
ok
}
// Update adds t values to s.
func
(
s
SetTree
)
Update
(
t
SetTree
)
{
for
v
:=
range
t
{
s
.
Add
(
v
)
}
}
// Elements returns all elements of set as slice.
func
(
s
SetTree
)
Elements
()
[]
*
Tree
{
ev
:=
make
([]
*
Tree
,
len
(
s
))
i
:=
0
for
e
:=
range
s
{
ev
[
i
]
=
e
i
++
}
return
ev
}
wcfs/internal/xbtree/δbtail.go
View file @
4b18c448
...
...
@@ -69,8 +69,9 @@ package xbtree
// . -k(blk) -> invalidate #blk
// . +k(blk) -> invalidate #blk (e.g. if blk was previously read as hole)
//go:generate ../../gen-set δbtree Tree *Tree zset_tree.go
//go:generate ../../gen-set δbtree Object interface{} zset_object.go
//go:generate ../../gen-set xbtree Tree *Tree zset_tree.go
// //go:generate ../../gen-set xbtree Oid zodb.Oid zset_oid.go
//go:generate ../../gen-set xbtree Object interface{} zset_object.go
import
(
"lab.nexedi.com/kirr/neo/go/zodb"
...
...
@@ -106,9 +107,14 @@ type ΔTail struct {
// XXX or ask client provide db on every call?
db
*
zodb
.
DB
// to open connections to load new/old tree|buckets
// root index: BTree|Bucket -> top tree element.
// XXX represent root by oid instead of live object?
rootIdx
map
[
zodb
.
Oid
]
SetTree
// oid -> {} roots
// tracked index: BTree|Bucket -> top tree element.
trackIdx
map
[
zodb
.
Oid
]
SetTree
// oid -> {} roots XXX root -> oid?
// tracked objects that are not yet taken into in current δBtail
trackNew
map
[
zodb
.
Oid
]
struct
{}
// XXX SetOid
// index for LastRevOf queries
lastRevOf
map
[
zodb
.
Oid
]
map
[
Key
]
zodb
.
Tid
// {} root -> {} key -> last
}
// ΔRevEntry represents information about BTrees changes in one revision.
...
...
@@ -119,7 +125,7 @@ type ΔRevEntry struct {
// ΔTree represents changes to one tree.
type
ΔTree
struct
{
Root
XXX
// XXX -> Oid?
Root
*
Tree
// XXX -> Oid?
Keyv
[]
Key
}
...
...
@@ -129,14 +135,15 @@ type ΔTree struct {
// Initial coverage is (at₀, at₀].
func
NewΔTail
(
at0
zodb
.
Tid
)
*
ΔTail
{
return
&
ΔTail
{
δZtail
:
zodb
.
NewΔTail
(
at0
),
root
:
make
(
map
[
zodb
.
Oid
]
SetTree
),
δZtail
:
zodb
.
NewΔTail
(
at0
),
trackIdx
:
make
(
map
[
zodb
.
Oid
]
SetTree
),
}
}
// Head is similar to zodb.ΔTail.Head . XXX ok?
func
(
δb
*
ΔTail
)
Head
()
zodb
.
Tid
{
return
δb
.
head
//return δb.head
return
δb
.
δZtail
.
Head
()
}
// Tail is similar to zodb.ΔTail.Tail . XXX ok?
...
...
@@ -149,7 +156,7 @@ func (δb *ΔTail) Tail() zodb.Tid {
// Track adds tree path to tracked set.
//
// XXX
tailv
is rebuild to also include keys corresponding to added nodes.
// XXX
δBtail
is rebuild to also include keys corresponding to added nodes.
//
// XXX path is at @at state.
// XXX objects in path must be with .PJar().At() == .head
...
...
@@ -159,8 +166,11 @@ func (δb *ΔTail) Track(path []Node) { // XXX Tree|Bucket; path[0] = root
root = path[0]
for obj in path:
if not obj in trackIdx:
.
new += obj # XXX .4rebuild += ... ?
.
trackNew += obj
.trackIdx[obj] += root
XXX update diff XXX here? or as separate step?
XXX update lastRevOf
*/
}
...
...
@@ -175,8 +185,9 @@ func (δb *ΔTail) Track(path []Node) { // XXX Tree|Bucket; path[0] = root
func
(
δB
*
ΔTail
)
Update
(
δZ
*
zodb
.
EventCommit
)
{
/*
.δZtail += δZ
.update()
*/
δB
.
update
()
}
// update brings .δBtail up to date by recomputing diff XXX and taking new
// entries in .δZtail into account.
...
...
@@ -204,15 +215,24 @@ func (δB *ΔTail) update() {
...
.δBtail <- [] of (root, []key)
.δBtail <- (δZ.rev, [](root, []key))
XXX rebuilf lastRevOf
*/
}
// XXX -> Get(root, key, at) -> (valueOid, rev) ?
func
(
δB
*
ΔTail
)
LastRevOf
(
root
Tree
,
key
Key
,
at
zodb
.
Tid
)
zodb
.
Tid
{
panic
(
"TODO"
)
// XXX return 0 as stub?
func
(
δB
*
ΔTail
)
LastRevOf
(
root
Tree
,
key
Key
,
at
zodb
.
Tid
)
(
_
zodb
.
Tid
,
exact
bool
)
{
/*
lastRevOf = δB.lastRevOf[root]
rev = lastRevOf[key]
while rev > at:
rev = scan δB.δBtail ↓ looking for change(key) # XXX linear scan
return rev
*/
return
0
,
false
// XXX stub (saying take only ZBlk.rev into account)
}
func
(
δB
*
ΔTail
)
ForgetPast
(
revCut
zodb
.
Tid
)
{
panic
(
"TODO"
)
δB
.
δZtail
.
ForgetPast
(
revCut
)
// XXX stub
}
wcfs/internal/δbtree/zset_object.go
View file @
4b18c448
...
...
@@ -29,6 +29,8 @@ func (s SetObject) Add(v interface{}) {
s
[
v
]
=
struct
{}{}
}
// XXX + Del(v) ?
// Has checks whether the set contains v.
func
(
s
SetObject
)
Has
(
v
interface
{})
bool
{
_
,
ok
:=
s
[
v
]
...
...
wcfs/internal/δbtree/zset_tree.go
View file @
4b18c448
...
...
@@ -29,6 +29,8 @@ func (s SetTree) Add(v *Tree) {
s
[
v
]
=
struct
{}{}
}
// XXX + Del(v) ?
// Has checks whether the set contains v.
func
(
s
SetTree
)
Has
(
v
*
Tree
)
bool
{
_
,
ok
:=
s
[
v
]
...
...
wcfs/misc.go
View file @
4b18c448
...
...
@@ -20,6 +20,8 @@
package
main
// misc utilities
//go:generate ./gen-set main BigFile *BigFile zset_bigfile.go
import
(
"context"
"fmt"
...
...
@@ -40,6 +42,9 @@ import (
"lab.nexedi.com/kirr/neo/go/transaction"
"lab.nexedi.com/kirr/neo/go/zodb"
"lab.nexedi.com/kirr/neo/go/zodb/btree"
"./internal/xbtree"
)
// ---- FUSE ----
...
...
@@ -663,6 +668,26 @@ func parseWatch(msg string) (oid zodb.Oid, at zodb.Tid, err error) {
return
oid
,
at
,
nil
}
// ---- btree.ΔTail + root -> BigFile ----
// ΔFTail is btree.ΔTail but additionally tracks tree-root -> file relation.
type
ΔFTail
struct
{
*
xbtree
.
ΔTail
fileIdx
map
[
*
btree
.
LOBTree
]
SetBigFile
// root -> {} BigFile XXX root -> oid?
}
func
(
δf
*
ΔFTail
)
Track
(
file
*
BigFile
,
path
[]
btree
.
LONode
)
{
δf
.
ΔTail
.
Track
(
path
)
root
:=
path
[
0
]
.
(
*
btree
.
LOBTree
)
files
,
ok
:=
δf
.
fileIdx
[
root
]
if
!
ok
{
files
=
SetBigFile
{}
δf
.
fileIdx
[
root
]
=
files
}
files
.
Add
(
file
)
}
// ---- make df happy (else it complains "function not supported") ----
func
(
root
*
Root
)
StatFs
()
*
fuse
.
StatfsOut
{
...
...
wcfs/wcfs.go
View file @
4b18c448
...
...
@@ -428,8 +428,6 @@ import (
"github.com/hanwen/go-fuse/fuse"
"github.com/hanwen/go-fuse/fuse/nodefs"
"github.com/pkg/errors"
"./internal/δbtree"
)
// Root represents root of wcfs filesystem.
...
...
@@ -501,12 +499,10 @@ type BigFileDir struct {
fileMu
sync
.
Mutex
fileTab
map
[
zodb
.
Oid
]
*
BigFile
// visited BTree nodes of all BigFiles
// -> which file + ordering for toposort on δbtree
//
// δ of tracked BTree nodes of all BigFiles + -> which file
// (used only for head/, not revX/)
indexMu
sync
.
Mutex
indexLooked
*
δbtree
.
PathSet
// XXX naming
δFmu
sync
.
Mutex
// XXX -> ΔFTail?
δFtail
*
ΔFTail
}
// /(head|<rev>)/bigfile/<bigfileX> - served by BigFile.
...
...
@@ -525,8 +521,8 @@ type BigFile struct {
size
int64
// zfile.Size()
rev
zodb
.
Tid
// last revision that modified zfile data
// tail change history of this file.
δtail
*
ΔTailI64
// [](rev↑, []#blk)
//
// tail change history of this file.
//
δtail *ΔTailI64 // [](rev↑, []#blk)
// inflight loadings of ZBigFile from ZODB.
// successful load results are kept here until blkdata is put into OS pagecache.
...
...
@@ -871,7 +867,7 @@ retry:
}
file
.
size
=
size
bfdir
.
indexLooked
.
Add
(
file
,
treePath
)
bfdir
.
δFtail
.
Track
(
file
,
treePath
)
file
.
rev
=
zhead
.
At
()
}
...
...
@@ -1155,9 +1151,9 @@ func (f *BigFile) updateWatchers(ctx context.Context, blk int64, treepath []btre
// update δbtree index
bfdir
:=
f
.
head
.
bfdir
bfdir
.
indexM
u
.
Lock
()
// XXX locking correct?
bfdir
.
indexLooked
.
Add
(
f
,
treepath
)
bfdir
.
indexM
u
.
Unlock
()
bfdir
.
δFm
u
.
Lock
()
// XXX locking correct?
bfdir
.
δFtail
.
Track
(
f
,
treepath
)
bfdir
.
δFm
u
.
Unlock
()
blkrevmax
,
_
:=
f
.
δtail
.
LastRevOf
(
blk
,
f
.
zfile
.
PJar
()
.
At
())
// XXX = f.head.zconn.At()
blkrevmax
=
tidmin
(
blkrevmax
,
pathRevMax
)
...
...
@@ -1623,10 +1619,10 @@ func (root *Root) lookup(name string, fctx *fuse.Context) (_ *Head, err error) {
}
bfdir
:=
&
BigFileDir
{
fsNode
:
newFSNode
(
&
fsOptions
{
Sticky
:
false
}),
// XXX + BigFileDir.OnForget()
head
:
revDir
,
fileTab
:
make
(
map
[
zodb
.
Oid
]
*
BigFile
),
indexLooked
:
nil
,
// δbtree index
not needed/used for @revX/
fsNode
:
newFSNode
(
&
fsOptions
{
Sticky
:
false
}),
// XXX + BigFileDir.OnForget()
head
:
revDir
,
fileTab
:
make
(
map
[
zodb
.
Oid
]
*
BigFile
),
δFtail
:
nil
,
// δFtail
not needed/used for @revX/
}
revDir
.
bfdir
=
bfdir
...
...
@@ -1705,11 +1701,11 @@ func (head *Head) bigopen(ctx context.Context, oid zodb.Oid) (_ *BigFile, err er
loading
:
make
(
map
[
int64
]
*
blkLoadState
),
}
// only head/ needs δ
btree index
.
// only head/ needs δ
Ftail
.
if
head
.
rev
==
0
{
head
.
bfdir
.
indexM
u
.
Lock
()
// XXX locking ok?
head
.
bfdir
.
indexLooked
.
Add
(
f
,
treePath
)
head
.
bfdir
.
indexM
u
.
Unlock
()
head
.
bfdir
.
δFm
u
.
Lock
()
// XXX locking ok?
head
.
bfdir
.
δFtail
.
Track
(
f
,
treePath
)
head
.
bfdir
.
δFm
u
.
Unlock
()
}
return
f
,
nil
...
...
@@ -1881,10 +1877,10 @@ func main() {
}
bfdir
:=
&
BigFileDir
{
fsNode
:
newFSNode
(
fSticky
),
head
:
head
,
fileTab
:
make
(
map
[
zodb
.
Oid
]
*
BigFile
),
indexLooked
:
δbtree
.
NewPathSet
(
),
fsNode
:
newFSNode
(
fSticky
),
head
:
head
,
fileTab
:
make
(
map
[
zodb
.
Oid
]
*
BigFile
),
δFtail
:
NewΔFtail
(
zhead
.
At
()
),
}
head
.
bfdir
=
bfdir
...
...
wcfs/zset_bigfile.go
0 → 100644
View file @
4b18c448
// Code generated by gen-set BigFile *BigFile; DO NOT EDIT.
// Copyright (C) 2015-2019 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
package
main
// SetBigFile is a set of *BigFile.
type
SetBigFile
map
[
*
BigFile
]
struct
{}
// Add adds v to the set.
func
(
s
SetBigFile
)
Add
(
v
*
BigFile
)
{
s
[
v
]
=
struct
{}{}
}
// XXX + Del(v) ?
// Has checks whether the set contains v.
func
(
s
SetBigFile
)
Has
(
v
*
BigFile
)
bool
{
_
,
ok
:=
s
[
v
]
return
ok
}
// Update adds t values to s.
func
(
s
SetBigFile
)
Update
(
t
SetBigFile
)
{
for
v
:=
range
t
{
s
.
Add
(
v
)
}
}
// Elements returns all elements of set as slice.
func
(
s
SetBigFile
)
Elements
()
[]
*
BigFile
{
ev
:=
make
([]
*
BigFile
,
len
(
s
))
i
:=
0
for
e
:=
range
s
{
ev
[
i
]
=
e
i
++
}
return
ev
}
wcfs/zset_i64.go
View file @
4b18c448
...
...
@@ -29,6 +29,8 @@ func (s SetI64) Add(v int64) {
s
[
v
]
=
struct
{}{}
}
// XXX + Del(v) ?
// Has checks whether the set contains v.
func
(
s
SetI64
)
Has
(
v
int64
)
bool
{
_
,
ok
:=
s
[
v
]
...
...
wcfs/zδtail_i64.go
View file @
4b18c448
// Code generated by gen-δtail I64 int64; DO NOT EDIT.
// (from lab.nexedi.com/kirr/neo/go/zodb @ v1.9-
146-g4224b580
)
// (from lab.nexedi.com/kirr/neo/go/zodb @ v1.9-
2242-g1b838adf
)
// Copyright (C) 2018-2019 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
...
...
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