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
3a26f3cd
Commit
3a26f3cd
authored
Jun 26, 2018
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
938374de
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
203 additions
and
0 deletions
+203
-0
setup.py
setup.py
+5
-0
wcfs/__init__.py
wcfs/__init__.py
+195
-0
wcfs/wcfs.go
wcfs/wcfs.go
+3
-0
No files found.
setup.py
View file @
3a26f3cd
...
...
@@ -246,6 +246,8 @@ setup(
'six'
,
# compat py2/py3
'psutil'
,
# demo_zbigarray
'pygolang'
,
# wcfs
],
extras_require
=
{
...
...
@@ -260,6 +262,9 @@ setup(
},
entry_points
=
{
'console_scripts'
:
[
# start wcfs
'wcfs = wendelin.wcfs:main'
,
# demo to test
'demo-zbigarray = wendelin.demo.demo_zbigarray:main'
,
]
...
...
wcfs/__init__.py
0 → 100644
View file @
3a26f3cd
# -*- coding: utf-8 -*-
# Copyright (C) 2018 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.
"""Module wcfs.py provides python gateway for spawning and interoperating with wcfs server
XXX doc
"""
import
os
,
sys
,
hashlib
,
tempfile
,
subprocess
,
errno
,
time
import
logging
as
log
from
os.path
import
dirname
from
pygolang
import
go
,
chan
,
select
,
default
# WCFS represents connection to wcfs server.
class
WCFS
(
object
):
# XXX + .zurl?
# .mountpoint path to mountpoint
# ._fwcfs /.wcfs opened
def
__init__
(
self
,
mountpoint
):
self
.
mountpoint
=
mountpoint
# XXX open a file to keep the server from going away (at least cleanly)
# run starts and runs wcfs server for ZODB @ zurl.
#
# it mounts wcfs at a location that is with 1-1 corresponence with zurl.
# it then waits for wcfs to exit (either due to unmount or an error).
#
# it is an error if wcfs was already started.
#
# run(zurl).
def
run
(
zurl
):
mntpt
=
_mntpt_4zurl
(
zurl
)
# try opening .wcfs - it is an error if we can do it.
# XXX -> option to wcfs itself
try
:
f
=
open
(
mntpt
+
"/.wcfs"
)
except
IOError
as
e
:
if
e
.
errno
!=
errno
.
ENOENT
:
raise
else
:
f
.
close
()
raise
RuntimeError
(
"wcfs: start %s: already started"
%
zurl
)
# seems to be ok to start
# XXX race window if something starts after ^^^ check
subprocess
.
call
([
_wcfs_exe
(),
zurl
,
mntpt
],
close_fds
=
True
)
# join connects to wcfs server for ZODB @ zurl.
#
# if wcfs for that service was already started, join connects to it.
# otherwise it starts wcfs for zurl if autostart is True or (None and system
# default for autostart is True). XXX
#
# join(zurl) -> WCFS.
def
join
(
zurl
,
autostart
=
None
):
mntpt
=
_mntpt_4zurl
(
zurl
)
# try opening .wcfs - if we succeed - it is already mounted.
# XXX -> wcfs itself?
try
:
f
=
open
(
mntpt
+
"/.wcfs"
)
except
IOError
as
e
:
if
e
.
errno
!=
errno
.
ENOENT
:
raise
else
:
# already have it
return
WCFS
(
mntpt
,
f
)
# XXX autostart=None processing
if
not
autostart
:
raise
RuntimeError
(
"wcfs: join %s: server not started"
%
zurl
)
log
.
info
(
"wcfs: starting for %s ..."
,
zurl
)
# cancelch cancels wcfs server running (and waitmounted in initialization phase)
cancelch
=
chan
()
# wcfs spawns and monitors wcfs server. it is running until either wcfs
# server terminates or cancel.
ewcfs
=
chan
(
1
)
# err | None
def
wcfs
():
err
=
None
try
:
p
=
subprocess
.
Popen
([
_wcfs_exe
(),
zurl
,
mntpt
],
close_fds
=
True
)
while
1
:
ret
=
p
.
poll
()
if
ret
is
not
None
:
err
=
"wcfs: exited with %s"
%
ret
break
_
,
_rx
=
select
(
cancelch
.
recv
,
# 0
default
,
# 1
)
if
_
==
0
:
p
.
terminate
()
break
time
.
sleep
(
1
)
except
Exception
as
e
:
log
.
exception
(
"wcfs server"
)
err
=
"wcfs: %s"
%
e
# XXX wrap with errctx
ewcfs
.
send
(
err
)
# waitmounted waits till wcfs mount is ready.
mounted
=
chan
(
1
)
# file | err
def
waitmounted
():
err
=
None
# XXX try/except + errctx
while
1
:
if
os
.
path
.
exists
(
"%s/.wcfs"
%
mntpt
):
break
_
,
_rx
=
select
(
cancelch
.
recv
,
# 0
default
,
# 1
)
if
_
==
0
:
err
=
"waitmounted: cancel"
break
time
.
sleep
(
1
)
mounted
.
send
(
err
)
# spawn wcfs and wait till it is mounted.
go
(
wcfs
)
go
(
waitmounted
)
_
,
_rx
=
select
(
ewcfs
.
recv
,
# 0
mounted
.
recv
,
# 1
)
if
_
==
0
:
# wcfs error
cancelch
.
close
()
raise
RuntimeError
(
_rx
)
if
_
==
1
:
if
not
isinstance
(
_rx
,
file
):
cancelch
.
close
()
# mounted ok - construct WCFS object
# XXX do we need to remember cancelch in WCFS and close it upon leaving?
f
=
_rx
return
WCFS
(
mntpt
,
f
)
# _wcfs_exe returns path to wcfs executable.
# TODO install wcfs exe along wcfs/ py package.
def
_wcfs_exe
():
return
'%s/wcfs'
%
dirname
(
__file__
)
# _mntpt_4zurl returns wcfs should-be mountpoint for ZODB @ zurl.
def
_mntpt_4zurl
(
zurl
):
# XXX stub.
# XXX what is zurl is zconfig://... ? -> then we have to look inside?
m
=
hashlib
.
sha1
()
m
.
update
(
zurl
)
return
"%s/wcfs/%s"
%
(
tempfile
.
gettempdir
(),
m
.
hexdigest
())
# if called as main just -> run(argv[1])
def
main
():
run
(
sys
.
argv
[
1
])
wcfs/wcfs.go
View file @
3a26f3cd
...
...
@@ -241,6 +241,9 @@ package main
// link above), but better we have proper FUSE flag for filesystem server to
// tell the kernel it is fully responsible for invalidating pagecache.
// usage: wcfs zurl mountpoint
// /.wcfs + option to prevent starting if wcfs was already started ?
// /zurl ?
func
main
()
{
}
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