Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
itminedu
synnefo
Commits
c75cda52
Commit
c75cda52
authored
Jun 17, 2014
by
Chrysostomos Nanakos
Browse files
pithos: Refactor Gunicorn conf file
parent
3b339674
Changes
2
Hide whitespace changes
Inline
Side-by-side
snf-pithos-app/conf/pithos.conf.py
View file @
c75cda52
...
...
@@ -14,63 +14,99 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from
pithos.workers
import
glue
import
pickle
from
svipc
import
sem_init
,
sem_take
,
sem_give
import
os
from
pithos.workers
import
glue
from
multiprocessing
import
Lock
def
find_hole
(
WORKERS
,
FOLLOW_WORKERS
):
old_key
=
[]
old_age
=
[]
for
key
in
FOLLOW_WORKERS
:
if
key
not
in
WORKERS
.
keys
():
old_age
.
append
(
FOLLOW_WORKERS
[
key
]
)
old_key
.
append
(
key
)
break
if
len
(
old_age
)
and
len
(
old_key
):
for
key
in
old_key
:
del
FOLLOW_WORKERS
[
key
]
return
old_age
old_key
=
[]
old_age
=
[]
for
key
in
FOLLOW_WORKERS
:
if
key
not
in
WORKERS
.
keys
():
old_age
.
append
(
FOLLOW_WORKERS
[
key
]
)
old_key
.
append
(
key
)
break
if
len
(
old_age
)
and
len
(
old_key
):
for
key
in
old_key
:
del
FOLLOW_WORKERS
[
key
]
return
old_age
return
old_age
def
follow_workers
(
pid
,
wid
,
WORKERS
):
hole
=
None
try
:
fd
=
open
(
'/dev/shm/wid'
,
'rb'
)
f
=
pickle
.
load
(
fd
)
hole
=
find_hole
(
WORKERS
,
f
)
if
len
(
hole
)
>
0
:
k
=
{
pid
:
int
(
hole
[
0
])}
else
:
k
=
{
pid
:
wid
}
f
.
update
(
k
)
fd
.
close
()
fd
=
open
(
'/dev/shm/wid'
,
'wb'
)
pickle
.
dump
(
f
,
fd
)
fd
.
close
()
e
xcept
:
fd
=
open
(
'/dev/shm/wid'
,
'wb'
)
pickle
.
dump
({
pid
:
wid
},
fd
)
fd
.
close
()
return
hole
hole
=
None
if
os
.
path
.
isfile
(
'/dev/shm/wid'
)
:
fd
=
open
(
'/dev/shm/wid'
,
'rb'
)
f
=
pickle
.
load
(
fd
)
hole
=
find_hole
(
WORKERS
,
f
)
if
len
(
hole
)
>
0
:
k
=
{
pid
:
int
(
hole
[
0
])}
else
:
k
=
{
pid
:
wid
}
f
.
update
(
k
)
fd
.
close
()
fd
=
open
(
'/dev/shm/wid'
,
'wb'
)
pickle
.
dump
(
f
,
fd
)
fd
.
close
()
e
lse
:
fd
=
open
(
'/dev/shm/wid'
,
'wb'
)
pickle
.
dump
({
pid
:
wid
},
fd
)
fd
.
close
()
return
hole
def
allocate_wid
(
pid
,
wid
,
WORKERS
):
d
=
{
pid
:
wid
}
hole
=
None
if
sem_init
(
88
,
nums
=
1
)
==
0
:
hole
=
follow_workers
(
pid
,
wid
,
WORKERS
)
sem_give
(
88
,
0
)
else
:
sem_take
(
88
,
0
)
hole
=
follow_workers
(
pid
,
wid
,
WORKERS
)
sem_give
(
88
,
0
)
return
hole
hole
=
None
hole
=
follow_workers
(
pid
,
wid
,
WORKERS
)
return
hole
def
when_ready
(
server
):
server
.
lock
=
Lock
()
def
update_workers
(
pid
,
wid
):
if
os
.
path
.
isfile
(
'/dev/shm/wid'
):
fd
=
open
(
'/dev/shm/wid'
,
'rb'
)
f
=
pickle
.
load
(
fd
)
for
k
,
v
in
f
.
items
():
if
wid
==
v
:
del
f
[
k
]
break
k
=
{
pid
:
wid
}
f
.
update
(
k
)
fd
.
close
()
fd
=
open
(
'/dev/shm/wid'
,
'wb'
)
pickle
.
dump
(
f
,
fd
)
fd
.
close
()
else
:
fd
=
open
(
'/dev/shm/wid'
,
'wb'
)
pickle
.
dump
({
pid
:
wid
},
fd
)
fd
.
close
()
def
resize_workers
(
no_workers
):
if
os
.
path
.
isfile
(
'/dev/shm/wid'
):
fd
=
open
(
'/dev/shm/wid'
,
'rb'
)
f
=
pickle
.
load
(
fd
)
for
k
,
v
in
f
.
items
():
if
v
>
no_workers
:
del
f
[
k
]
fd
.
close
()
fd
=
open
(
'/dev/shm/wid'
,
'wb'
)
pickle
.
dump
(
f
,
fd
)
fd
.
close
()
def
post_fork
(
server
,
worker
):
server
.
lock
.
acquire
()
if
worker
.
worker_id
<=
server
.
num_workers
:
update_workers
(
worker
.
pid
,
worker
.
worker_id
)
glue
.
WorkerGlue
.
setmap
(
worker
.
pid
,
worker
.
worker_id
)
else
:
wid
=
allocate_wid
(
worker
.
pid
,
worker
.
worker_id
,
server
.
WORKERS
)
if
wid
:
glue
.
WorkerGlue
.
setmap
(
worker
.
pid
,
wid
[
0
])
else
:
glue
.
WorkerGlue
.
setmap
(
worker
.
pid
,
worker
.
worker_id
)
glue
.
WorkerGlue
.
setmap
(
worker
.
pid
,
wid
[
0
])
resize_workers
(
server
.
num_workers
)
server
.
lock
.
release
()
def
worker_exit
(
server
,
worker
):
if
glue
.
WorkerGlue
.
ioctx_pool
:
glue
.
WorkerGlue
.
ioctx_pool
.
_shutdown_pool
()
def
on_exit
(
server
):
os
.
unlink
(
'/dev/shm/wid'
)
snf-pithos-backend/pithos/workers/glue.py
View file @
c75cda52
...
...
@@ -68,20 +68,24 @@ class WorkerGlue(object):
archipelago_segment_alignment
)
self
.
worker_id
=
worker_id
self
.
cnt
=
1
self
.
_ioctx_set
=
set
()
def
_pool_create
(
self
):
if
self
.
worker_id
==
1
:
ioctx
=
Xseg_ctx
(
self
.
segment
,
self
.
worker_id
+
self
.
cnt
)
self
.
cnt
+=
1
self
.
_ioctx_set
.
add
(
ioctx
)
return
ioctx
elif
self
.
worker_id
>
1
:
ioctx
=
Xseg_ctx
(
self
.
segment
,
(
self
.
worker_id
-
1
)
*
pool_size
+
2
+
self
.
cnt
)
self
.
cnt
+=
1
self
.
_ioctx_set
.
add
(
ioctx
)
return
ioctx
elif
self
.
worker_id
is
None
:
ioctx
=
Xseg_ctx
(
self
.
segment
)
self
.
_ioctx_set
.
add
(
ioctx
)
return
ioctx
def
_pool_verify
(
self
,
poolobj
):
...
...
@@ -90,4 +94,9 @@ class WorkerGlue(object):
def
_pool_cleanup
(
self
,
poolobj
):
return
False
def
_shutdown_pool
(
self
):
for
_
in
xrange
(
len
(
self
.
_ioctx_set
)):
ioctx
=
self
.
_ioctx_set
.
pop
()
ioctx
.
shutdown
()
WorkerGlue
.
ioctx_pool
=
XsegPool
()
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