Skip to content

Commit c547f5c

Browse files
committed
add: daily backup
1 parent 50efd6e commit c547f5c

File tree

8 files changed

+104
-58
lines changed

8 files changed

+104
-58
lines changed

src/os_3m_engine/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import sys
2+
from .engine import create
23

3-
__all__ = ['__version__', 'version_info']
4+
__all__ = ['__version__', 'version_info', 'create']
45

56
import pkgutil
67
__version__ = pkgutil.get_data(__package__, 'VERSION').decode('ascii').strip()
78
version_info = tuple(int(v) if v.isdigit() else v
89
for v in __version__.split('.'))
10+
11+
912
del pkgutil
13+
del sys

src/os_3m_engine/backend.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .common import Queue
1+
from .common import Configurable, Queue
22
from .driver import Driver
33
from .othread import Othread
44

@@ -43,3 +43,7 @@ def run(self):
4343
if hasattr(self.runtime_context, 'transport_thread'):
4444
self.runtime_context.transport_thread.stop()
4545

46+
47+
class Backend(Configurable):
48+
def process(self):
49+
raise NotImplementedError

src/os_3m_engine/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11

22
import sys
3+
34
_PY3 = sys.version_info[0] == 3
45

56
if _PY3:

src/os_3m_engine/engine.py

Lines changed: 68 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,61 +3,27 @@
33
import sys
44
import threading
55
import time
6-
from .common import Configurable, RuntimeContext, Queue
7-
from .frontend import FrontendThread
8-
from .transport import TransportThread
9-
from .backend import BackendThread
10-
from .othread import MultithreadManager
11-
from .utils import getatters
126

7+
from .backend import BackendThread, BackendDriver
8+
from .common import Configurable, Queue, RuntimeContext
9+
from .frontend import FrontendThread, FrontendDriver
10+
from .transport import TransportThread, TransportDriver, BridgeDriver
11+
from .utils import getatters, getlastattr
12+
from .othread import OthreadManager
1313

14-
class MultithreadEngine(Configurable):
1514

16-
def __init__(self, config):
17-
super(MultithreadEngine, self).__init__(config)
18-
self.__ensure()
15+
class Engine(Configurable):
16+
17+
def __init__(self, config, runtime_context):
18+
super(Engine, self).__init__(config)
1919
self.__start_lock = threading.Lock()
2020
self.__started = False
2121
self.__stopped = False
22-
self._runtime_context = RuntimeContext()
23-
24-
def __ensure(self):
25-
engine_config = self.config.engine
26-
assert any([hasattr(engine_config, x)
27-
for x in ('transport', 'backend')])
28-
29-
def __setup(self):
30-
runtime_context = self._runtime_context
31-
engine_config = self.config.engine
32-
33-
runtime_context.frontend_thread_queue = Queue.Queue(
34-
engine_config.frontend.queue_size)
35-
36-
runtime_context.frontend_thread = MultithreadManager(
37-
self.config, runtime_context,
38-
FrontendThread, engine_config.frontend.thread_num,
39-
engine_config.frontend.driver_cls)
40-
runtime_context.frontend_thread.setDaemon(True)
41-
42-
if hasattr(engine_config, 'transport'):
43-
44-
if hasattr(engine_config, 'backend'):
45-
runtime_context.backend_thread_queue = Queue.Queue(
46-
engine_config.backend.queue_size)
47-
48-
runtime_context.transport_thread = MultithreadManager(
49-
self.config, runtime_context,
50-
TransportThread, engine_config.transport.thread_num,
51-
engine_config.transport.driver_cls)
22+
self._runtime_context = runtime_context
5223

53-
if hasattr(engine_config, 'backend'):
54-
runtime_context.backend_thread = MultithreadManager(
55-
self.config, runtime_context,
56-
BackendThread, engine_config.backend.thread_num,
57-
engine_config.backend.driver_cls)
58-
59-
def __start(self):
24+
def start(self):
6025

26+
self.__acquire_start_lock(False, 'Can not start twice')
6127
runtime_context = self._runtime_context
6228
m = getatters(runtime_context, [
6329
'backend_thread',
@@ -87,11 +53,6 @@ def __acquire_start_lock(self, started, err_msg):
8753
finally:
8854
self.__start_lock.release()
8955

90-
def start(self):
91-
self.__acquire_start_lock(False, 'Can not start twice')
92-
self.__setup()
93-
self.__start()
94-
9556
def __stop(self):
9657
runtime_context = self._runtime_context
9758
runtime_context.frontend_thread.stop()
@@ -106,3 +67,58 @@ def stop(self):
10667
if not self.__stopped:
10768
self.__stop()
10869
self.__start_lock.release()
70+
71+
72+
class DEFAULT_FRONTEND_CONFIG(object):
73+
thread_num = 1
74+
driver_cls = FrontendDriver
75+
76+
77+
class DEFAULT_TRANSPORT_CONFIG(object):
78+
thread_num = 10
79+
80+
81+
class DEFAULT_BACKEND_CONFIG(object):
82+
thread_num =
83+
84+
85+
def create(frontend_config=DEFAULT_FRONTEND_CONFIG,
86+
transport_config=DEFAULT_TRANSPORT_CONFIG,
87+
backend_config=DEFAULT_BACKEND_CONFIG,
88+
app_config=None, runtime_context=None):
89+
90+
if frontend_config is None:
91+
raise ValueError('No frontend config')
92+
93+
if transport_config is None and backend_config is None:
94+
raise ValueError('Config at least one of transport/backend')
95+
96+
runtime_context = runtime_context if runtime_context is not None else RuntimeContext()
97+
98+
runtime_context.frontend_thread_queue = Queue.Queue(
99+
engine_config.frontend.queue_size)
100+
101+
runtime_context.frontend_thread = OthreadManager(
102+
app_config, runtime_context,
103+
FrontendThread, engine_config.frontend.thread_num,
104+
engine_config.frontend.driver_cls)
105+
runtime_context.frontend_thread.setDaemon(True)
106+
107+
if hasattr(engine_config, 'transport'):
108+
109+
if hasattr(engine_config, 'backend'):
110+
runtime_context.backend_thread_queue = Queue.Queue(
111+
engine_config.backend.queue_size)
112+
113+
runtime_context.transport_thread = OthreadManager(
114+
app_config, runtime_context,
115+
TransportThread, engine_config.transport.thread_num,
116+
engine_config.transport.driver_cls)
117+
118+
if hasattr(engine_config, 'backend'):
119+
runtime_context.backend_thread = OthreadManager(
120+
app_config, runtime_context,
121+
BackendThread, engine_config.backend.thread_num,
122+
engine_config.backend.driver_cls)
123+
124+
return Engine(engine_config, runtime_context)

src/os_3m_engine/frontend.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
from .common import Configurable, Queue
12
from .driver import Driver
2-
from .common import Queue
33
from .othread import Othread
44

55

@@ -38,3 +38,8 @@ def run(self):
3838
self.runtime_context.transport_thread.stop()
3939
elif hasattr(self.runtime_context, 'backend_thread'):
4040
self.runtime_context.backend_thread.stop()
41+
42+
43+
class Frontend(Configurable):
44+
def generate(self):
45+
raise NotImplementedError

src/os_3m_engine/othread.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import threading
3+
34
from .common import Configurable
45

56

@@ -36,9 +37,9 @@ def stop(self):
3637
self._stopping = True
3738

3839

39-
class MultithreadManager(Configurable):
40+
class OthreadManager(Configurable):
4041
def __init__(self, config, runtime_context, thread_cls, thread_num, driver_cls):
41-
super(MultithreadManager, self).__init__(config)
42+
super(OthreadManager, self).__init__(config)
4243
started = threading.Event()
4344
self._started = started
4445
self._threads = [thread_cls(config, started, driver_cls, name='%s.%d' % (

src/os_3m_engine/transport.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .common import Queue
1+
from .common import Configurable, Queue
22
from .driver import Driver
33
from .othread import Othread
44

@@ -57,3 +57,8 @@ def run(self):
5757
self.runtime_context.frontend_thread.stop()
5858
if hasattr(self.runtime_context, 'backend_thread'):
5959
self.runtime_context.backend_thread.stop()
60+
61+
62+
class Transport(Configurable):
63+
def transport(self):
64+
raise NotImplementedError

src/os_3m_engine/utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
11

22
def getatters(obj, attrs):
33
return [getattr(obj, attr) for attr in attrs if hasattr(obj, attr)]
4+
5+
6+
def getlastattr(attr, *objs):
7+
for obj in reversed(objs):
8+
if obj is None:
9+
continue
10+
elif hasattr(obj, attr):
11+
return getattr(obj, attr)
12+
13+
raise AttributeError("no attribute '%s'" % attr)

0 commit comments

Comments
 (0)