Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
milvus
提交
63997d55
milvus
项目概览
BaiXuePrincess
/
milvus
与 Fork 源项目一致
从无法访问的项目Fork
通知
7
Star
4
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
milvus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
63997d55
编写于
10月 26, 2019
作者:
P
peng.xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement router plugins
上级
2ab0e0eb
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
108 addition
and
52 deletion
+108
-52
shards/mishards/__init__.py
shards/mishards/__init__.py
+3
-2
shards/mishards/router/__init__.py
shards/mishards/router/__init__.py
+22
-0
shards/mishards/router/factory.py
shards/mishards/router/factory.py
+49
-0
shards/mishards/router/plugins/file_based_hash_ring_router.py
...ds/mishards/router/plugins/file_based_hash_ring_router.py
+18
-50
shards/mishards/settings.py
shards/mishards/settings.py
+1
-0
shards/utils/pluginextension.py
shards/utils/pluginextension.py
+15
-0
未找到文件。
shards/mishards/__init__.py
浏览文件 @
63997d55
...
...
@@ -28,8 +28,9 @@ def create_app(testing_config=None):
settings
.
TracingConfig
,
span_decorator
=
GrpcSpanDecorator
())
from
mishards.routings
import
RouterFactory
router
=
RouterFactory
.
new_router
(
config
.
ROUTER_CLASS_NAME
,
connect_mgr
)
from
mishards.router.factory
import
RouterFactory
router
=
RouterFactory
(
config
.
ROUTER_PLUGIN_PATH
).
create
(
config
.
ROUTER_CLASS_NAME
,
conn_mgr
=
connect_mgr
)
grpc_server
.
init_app
(
conn_mgr
=
connect_mgr
,
tracer
=
tracer
,
...
...
shards/mishards/router/__init__.py
0 → 100644
浏览文件 @
63997d55
from
mishards
import
exceptions
class
RouterMixin
:
def
__init__
(
self
,
conn_mgr
):
self
.
conn_mgr
=
conn_mgr
def
routing
(
self
,
table_name
,
metadata
=
None
,
**
kwargs
):
raise
NotImplemented
()
def
connection
(
self
,
metadata
=
None
):
conn
=
self
.
conn_mgr
.
conn
(
'WOSERVER'
,
metadata
=
metadata
)
if
conn
:
conn
.
on_connect
(
metadata
=
metadata
)
return
conn
.
conn
def
query_conn
(
self
,
name
,
metadata
=
None
):
conn
=
self
.
conn_mgr
.
conn
(
name
,
metadata
=
metadata
)
if
not
conn
:
raise
exceptions
.
ConnectionNotFoundError
(
name
,
metadata
=
metadata
)
conn
.
on_connect
(
metadata
=
metadata
)
return
conn
.
conn
shards/mishards/router/factory.py
0 → 100644
浏览文件 @
63997d55
import
os
import
logging
from
functools
import
partial
# from pluginbase import PluginBase
# import importlib
from
utils.pluginextension
import
MiPluginBase
logger
=
logging
.
getLogger
(
__name__
)
here
=
os
.
path
.
abspath
(
os
.
path
.
dirname
(
__file__
))
get_path
=
partial
(
os
.
path
.
join
,
here
)
PLUGIN_PACKAGE_NAME
=
'router.plugins'
plugin_base
=
MiPluginBase
(
package
=
PLUGIN_PACKAGE_NAME
,
searchpath
=
[
get_path
(
'./plugins'
)])
class
RouterFactory
(
object
):
PLUGIN_TYPE
=
'Router'
def
__init__
(
self
,
searchpath
=
None
):
self
.
plugin_package_name
=
PLUGIN_PACKAGE_NAME
self
.
class_map
=
{}
searchpath
=
searchpath
if
searchpath
else
[]
searchpath
=
[
searchpath
]
if
isinstance
(
searchpath
,
str
)
else
searchpath
self
.
source
=
plugin_base
.
make_plugin_source
(
searchpath
=
searchpath
,
identifier
=
self
.
__class__
.
__name__
)
for
plugin_name
in
self
.
source
.
list_plugins
():
plugin
=
self
.
source
.
load_plugin
(
plugin_name
)
plugin
.
setup
(
self
)
def
on_plugin_setup
(
self
,
plugin_class
):
name
=
getattr
(
plugin_class
,
'name'
,
plugin_class
.
__name__
)
self
.
class_map
[
name
.
lower
()]
=
plugin_class
def
plugin
(
self
,
name
):
return
self
.
class_map
.
get
(
name
,
None
)
def
create
(
self
,
class_name
,
class_config
=
None
,
**
kwargs
):
if
not
class_name
:
raise
RuntimeError
(
'Please specify router class_name first!'
)
this_class
=
self
.
plugin
(
class_name
.
lower
())
if
not
this_class
:
raise
RuntimeError
(
'{} Plugin
\'
{}
\'
Not Installed!'
.
format
(
self
.
PLUGIN_TYPE
,
class_name
))
router
=
this_class
.
create
(
class_config
,
**
kwargs
)
return
router
shards/mishards/rout
ings
.py
→
shards/mishards/rout
er/plugins/file_based_hash_ring_router
.py
浏览文件 @
63997d55
import
logging
from
sqlalchemy
import
exc
as
sqlalchemy_exc
from
sqlalchemy
import
and_
from
mishards.models
import
Tables
from
mishards.router
import
RouterMixin
from
mishards
import
exceptions
,
db
from
mishards.hash_ring
import
HashRing
from
mishards.models
import
Tables
logger
=
logging
.
getLogger
(
__name__
)
class
RouteManager
:
ROUTER_CLASSES
=
{}
@
classmethod
def
register_router_class
(
cls
,
target
):
name
=
target
.
__dict__
.
get
(
'NAME'
,
None
)
name
=
name
if
name
else
target
.
__class__
.
__name__
cls
.
ROUTER_CLASSES
[
name
]
=
target
return
target
@
classmethod
def
get_router_class
(
cls
,
name
):
return
cls
.
ROUTER_CLASSES
.
get
(
name
,
None
)
class
RouterFactory
:
@
classmethod
def
new_router
(
cls
,
name
,
conn_mgr
,
**
kwargs
):
router_class
=
RouteManager
.
get_router_class
(
name
)
assert
router_class
return
router_class
(
conn_mgr
,
**
kwargs
)
class
RouterMixin
:
def
__init__
(
self
,
conn_mgr
):
self
.
conn_mgr
=
conn_mgr
def
routing
(
self
,
table_name
,
metadata
=
None
,
**
kwargs
):
raise
NotImplemented
()
def
connection
(
self
,
metadata
=
None
):
conn
=
self
.
conn_mgr
.
conn
(
'WOSERVER'
,
metadata
=
metadata
)
if
conn
:
conn
.
on_connect
(
metadata
=
metadata
)
return
conn
.
conn
def
query_conn
(
self
,
name
,
metadata
=
None
):
conn
=
self
.
conn_mgr
.
conn
(
name
,
metadata
=
metadata
)
if
not
conn
:
raise
exceptions
.
ConnectionNotFoundError
(
name
,
metadata
=
metadata
)
conn
.
on_connect
(
metadata
=
metadata
)
return
conn
.
conn
@
RouteManager
.
register_router_class
class
FileBasedHashRingRouter
(
RouterMixin
):
NAME
=
'FileBasedHashRingRouter'
class
Factory
(
RouterMixin
):
name
=
'FileBasedHashRingRouter'
def
__init__
(
self
,
conn_mgr
,
**
kwargs
):
super
(
F
ileBasedHashRingRouter
,
self
).
__init__
(
conn_mgr
)
super
(
F
actory
,
self
).
__init__
(
conn_mgr
)
def
routing
(
self
,
table_name
,
metadata
=
None
,
**
kwargs
):
range_array
=
kwargs
.
pop
(
'range_array'
,
None
)
...
...
@@ -94,3 +49,16 @@ class FileBasedHashRingRouter(RouterMixin):
routing
[
target_host
][
'file_ids'
].
append
(
str
(
f
.
id
))
return
routing
@
classmethod
def
create
(
cls
,
config
,
**
kwargs
):
conn_mgr
=
kwargs
.
pop
(
'conn_mgr'
,
None
)
if
not
conn_mgr
:
raise
RuntimeError
(
'Cannot find
\'
conn_mgr
\'
to initialize
\'
{}
\'
'
.
format
(
self
.
name
))
router
=
cls
(
conn_mgr
,
**
kwargs
)
return
router
def
setup
(
app
):
logger
.
info
(
'Plugin
\'
{}
\'
Installed In Package: {}'
.
format
(
__file__
,
app
.
plugin_package_name
))
app
.
on_plugin_setup
(
Factory
)
shards/mishards/settings.py
浏览文件 @
63997d55
...
...
@@ -76,6 +76,7 @@ class DefaultConfig:
SQL_ECHO
=
env
.
bool
(
'SQL_ECHO'
,
False
)
TRACING_PLUGIN_PATH
=
env
.
str
(
'TRACING_PLUGIN_PATH'
,
''
)
TRACING_TYPE
=
env
.
str
(
'TRACING_TYPE'
,
''
)
ROUTER_PLUGIN_PATH
=
env
.
str
(
'ROUTER_PLUGIN_PATH'
,
''
)
ROUTER_CLASS_NAME
=
env
.
str
(
'ROUTER_CLASS_NAME'
,
'FileBasedHashRingRouter'
)
...
...
shards/utils/pluginextension.py
0 → 100644
浏览文件 @
63997d55
import
importlib
from
pluginbase
import
PluginBase
,
PluginSource
class
MiPluginSource
(
PluginSource
):
def
load_plugin
(
self
,
name
):
if
'.'
in
name
:
raise
ImportError
(
'Plugin names cannot contain dots.'
)
with
self
:
return
importlib
.
import_module
(
self
.
base
.
package
+
'.'
+
name
)
class
MiPluginBase
(
PluginBase
):
def
make_plugin_source
(
self
,
*
args
,
**
kwargs
):
return
MiPluginSource
(
self
,
*
args
,
**
kwargs
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录