Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / files / etc / archipelago / pithos.conf.py @ 4195cf5f

History | View | Annotate | Download (3.3 kB)

1 458f92b3 Dimitris Aragiorgis
# -*- coding: utf-8 -
2 458f92b3 Dimitris Aragiorgis
#
3 458f92b3 Dimitris Aragiorgis
# Copyright 2013 GRNET S.A. All rights reserved.
4 458f92b3 Dimitris Aragiorgis
#
5 458f92b3 Dimitris Aragiorgis
# Redistribution and use in source and binary forms, with or
6 458f92b3 Dimitris Aragiorgis
# without modification, are permitted provided that the following
7 458f92b3 Dimitris Aragiorgis
# conditions are met:
8 458f92b3 Dimitris Aragiorgis
#
9 458f92b3 Dimitris Aragiorgis
#   1. Redistributions of source code must retain the above
10 458f92b3 Dimitris Aragiorgis
#      copyright notice, this list of conditions and the following
11 458f92b3 Dimitris Aragiorgis
#      disclaimer.
12 458f92b3 Dimitris Aragiorgis
#
13 458f92b3 Dimitris Aragiorgis
#   2. Redistributions in binary form must reproduce the above
14 458f92b3 Dimitris Aragiorgis
#      copyright notice, this list of conditions and the following
15 458f92b3 Dimitris Aragiorgis
#      disclaimer in the documentation and/or other materials
16 458f92b3 Dimitris Aragiorgis
#      provided with the distribution.
17 458f92b3 Dimitris Aragiorgis
#
18 458f92b3 Dimitris Aragiorgis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 458f92b3 Dimitris Aragiorgis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 458f92b3 Dimitris Aragiorgis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 458f92b3 Dimitris Aragiorgis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 458f92b3 Dimitris Aragiorgis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 458f92b3 Dimitris Aragiorgis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 458f92b3 Dimitris Aragiorgis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 458f92b3 Dimitris Aragiorgis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 458f92b3 Dimitris Aragiorgis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 458f92b3 Dimitris Aragiorgis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 458f92b3 Dimitris Aragiorgis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 458f92b3 Dimitris Aragiorgis
# POSSIBILITY OF SUCH DAMAGE.
30 458f92b3 Dimitris Aragiorgis
#
31 458f92b3 Dimitris Aragiorgis
# The views and conclusions contained in the software and
32 458f92b3 Dimitris Aragiorgis
# documentation are those of the authors and should not be
33 458f92b3 Dimitris Aragiorgis
# interpreted as representing official policies, either expressed
34 458f92b3 Dimitris Aragiorgis
# or implied, of GRNET S.A.
35 458f92b3 Dimitris Aragiorgis
36 458f92b3 Dimitris Aragiorgis
from pithos.workers import glue
37 458f92b3 Dimitris Aragiorgis
import pickle
38 458f92b3 Dimitris Aragiorgis
from svipc import sem_init, sem_take, sem_give
39 458f92b3 Dimitris Aragiorgis
40 458f92b3 Dimitris Aragiorgis
def find_hole(WORKERS, FOLLOW_WORKERS):
41 458f92b3 Dimitris Aragiorgis
        old_key = []
42 458f92b3 Dimitris Aragiorgis
        old_age =  []
43 458f92b3 Dimitris Aragiorgis
        for key in FOLLOW_WORKERS:
44 458f92b3 Dimitris Aragiorgis
                if key not in WORKERS.keys():
45 458f92b3 Dimitris Aragiorgis
                        old_age.append(FOLLOW_WORKERS[key] )
46 458f92b3 Dimitris Aragiorgis
                        old_key.append( key )
47 458f92b3 Dimitris Aragiorgis
                        break
48 458f92b3 Dimitris Aragiorgis
        if len(old_age) and len(old_key):
49 458f92b3 Dimitris Aragiorgis
                for key in old_key:
50 458f92b3 Dimitris Aragiorgis
                        del FOLLOW_WORKERS[key]
51 458f92b3 Dimitris Aragiorgis
                return old_age
52 458f92b3 Dimitris Aragiorgis
        return old_age
53 458f92b3 Dimitris Aragiorgis
54 458f92b3 Dimitris Aragiorgis
def follow_workers(pid, wid, WORKERS):
55 458f92b3 Dimitris Aragiorgis
        hole = None
56 458f92b3 Dimitris Aragiorgis
        try:
57 458f92b3 Dimitris Aragiorgis
                fd = open('/dev/shm/wid','rb')
58 458f92b3 Dimitris Aragiorgis
                f = pickle.load(fd)
59 458f92b3 Dimitris Aragiorgis
                hole = find_hole(WORKERS, f)
60 458f92b3 Dimitris Aragiorgis
                if len(hole) > 0:
61 458f92b3 Dimitris Aragiorgis
                    k = {pid: int(hole[0])}
62 458f92b3 Dimitris Aragiorgis
                else:
63 458f92b3 Dimitris Aragiorgis
                    k = {pid: wid}
64 458f92b3 Dimitris Aragiorgis
                f.update(k)
65 458f92b3 Dimitris Aragiorgis
                fd.close()
66 458f92b3 Dimitris Aragiorgis
                fd = open('/dev/shm/wid','wb')
67 458f92b3 Dimitris Aragiorgis
                pickle.dump(f, fd)
68 458f92b3 Dimitris Aragiorgis
                fd.close()
69 458f92b3 Dimitris Aragiorgis
        except:
70 458f92b3 Dimitris Aragiorgis
                fd = open('/dev/shm/wid','wb')
71 458f92b3 Dimitris Aragiorgis
                pickle.dump({pid:wid}, fd)
72 458f92b3 Dimitris Aragiorgis
                fd.close()
73 458f92b3 Dimitris Aragiorgis
        return hole
74 458f92b3 Dimitris Aragiorgis
75 458f92b3 Dimitris Aragiorgis
def allocate_wid(pid, wid, WORKERS):
76 458f92b3 Dimitris Aragiorgis
        d = {pid: wid}
77 458f92b3 Dimitris Aragiorgis
        hole = None
78 458f92b3 Dimitris Aragiorgis
        if sem_init(88,nums=1) == 0:
79 458f92b3 Dimitris Aragiorgis
                hole = follow_workers(pid, wid, WORKERS)
80 458f92b3 Dimitris Aragiorgis
                sem_give(88,0)
81 458f92b3 Dimitris Aragiorgis
        else:
82 458f92b3 Dimitris Aragiorgis
                sem_take(88,0)
83 458f92b3 Dimitris Aragiorgis
                hole = follow_workers(pid, wid, WORKERS)
84 458f92b3 Dimitris Aragiorgis
                sem_give(88,0)
85 458f92b3 Dimitris Aragiorgis
        return hole
86 458f92b3 Dimitris Aragiorgis
87 458f92b3 Dimitris Aragiorgis
88 458f92b3 Dimitris Aragiorgis
def post_fork(server,worker):
89 458f92b3 Dimitris Aragiorgis
        wid = allocate_wid(worker.pid,worker.worker_id, server.WORKERS)
90 458f92b3 Dimitris Aragiorgis
        if wid:
91 458f92b3 Dimitris Aragiorgis
                glue.WorkerGlue.setmap(worker.pid,wid[0])
92 458f92b3 Dimitris Aragiorgis
        else:
93 458f92b3 Dimitris Aragiorgis
                glue.WorkerGlue.setmap(worker.pid,worker.worker_id)