Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Forever310
druid
提交
24a02680
D
druid
项目概览
Forever310
/
druid
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
druid
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
24a02680
编写于
4月 16, 2014
作者:
F
fjy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
cleanup code in router and add forwarding for get requests
上级
6893282a
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
199 addition
and
34 deletion
+199
-34
server/src/main/java/io/druid/client/RoutingDruidClient.java
server/src/main/java/io/druid/client/RoutingDruidClient.java
+18
-3
server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java
...ain/java/io/druid/server/AsyncQueryForwardingServlet.java
+135
-13
server/src/main/java/io/druid/server/router/QueryHostFinder.java
...src/main/java/io/druid/server/router/QueryHostFinder.java
+42
-17
server/src/main/java/io/druid/server/router/TieredBrokerHostSelector.java
...java/io/druid/server/router/TieredBrokerHostSelector.java
+1
-1
services/src/main/java/io/druid/cli/CliRouter.java
services/src/main/java/io/druid/cli/CliRouter.java
+3
-0
未找到文件。
server/src/main/java/io/druid/client/RoutingDruidClient.java
浏览文件 @
24a02680
...
...
@@ -28,7 +28,7 @@ import com.google.common.util.concurrent.ListenableFuture;
import
com.metamx.common.logger.Logger
;
import
com.metamx.http.client.HttpClient
;
import
com.metamx.http.client.response.HttpResponseHandler
;
import
io.druid.guice.annotations.
Global
;
import
io.druid.guice.annotations.
Client
;
import
io.druid.query.Query
;
import
org.jboss.netty.handler.codec.http.HttpHeaders
;
...
...
@@ -52,7 +52,7 @@ public class RoutingDruidClient<IntermediateType, FinalType>
@Inject
public
RoutingDruidClient
(
ObjectMapper
objectMapper
,
@
Global
HttpClient
httpClient
@
Client
HttpClient
httpClient
)
{
this
.
objectMapper
=
objectMapper
;
...
...
@@ -67,7 +67,7 @@ public class RoutingDruidClient<IntermediateType, FinalType>
return
openConnections
.
get
();
}
public
ListenableFuture
<
FinalType
>
run
(
public
ListenableFuture
<
FinalType
>
post
(
String
url
,
Query
query
,
HttpResponseHandler
<
IntermediateType
,
FinalType
>
responseHandler
...
...
@@ -109,4 +109,19 @@ public class RoutingDruidClient<IntermediateType, FinalType>
return
future
;
}
public
ListenableFuture
<
FinalType
>
get
(
String
url
,
HttpResponseHandler
<
IntermediateType
,
FinalType
>
responseHandler
)
{
try
{
return
httpClient
.
get
(
new
URL
(
url
))
.
go
(
responseHandler
);
}
catch
(
IOException
e
)
{
throw
Throwables
.
propagate
(
e
);
}
}
}
server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java
浏览文件 @
24a02680
...
...
@@ -85,6 +85,119 @@ public class AsyncQueryForwardingServlet extends HttpServlet
this
.
requestLogger
=
requestLogger
;
}
@Override
protected
void
doGet
(
final
HttpServletRequest
req
,
final
HttpServletResponse
resp
)
throws
ServletException
,
IOException
{
OutputStream
out
=
null
;
AsyncContext
ctx
=
null
;
try
{
ctx
=
req
.
startAsync
(
req
,
resp
);
final
AsyncContext
asyncContext
=
ctx
;
if
(
req
.
getAttribute
(
DISPATCHED
)
!=
null
)
{
return
;
}
out
=
resp
.
getOutputStream
();
final
OutputStream
outputStream
=
out
;
final
String
host
=
hostFinder
.
getDefaultHost
();
final
HttpResponseHandler
<
OutputStream
,
OutputStream
>
responseHandler
=
new
HttpResponseHandler
<
OutputStream
,
OutputStream
>()
{
@Override
public
ClientResponse
<
OutputStream
>
handleResponse
(
HttpResponse
response
)
{
resp
.
setStatus
(
response
.
getStatus
().
getCode
());
resp
.
setContentType
(
"application/json"
);
byte
[]
bytes
=
getContentBytes
(
response
.
getContent
());
if
(
bytes
.
length
>
0
)
{
try
{
outputStream
.
write
(
bytes
);
}
catch
(
Exception
e
)
{
asyncContext
.
complete
();
throw
Throwables
.
propagate
(
e
);
}
}
return
ClientResponse
.
finished
(
outputStream
);
}
@Override
public
ClientResponse
<
OutputStream
>
handleChunk
(
ClientResponse
<
OutputStream
>
clientResponse
,
HttpChunk
chunk
)
{
byte
[]
bytes
=
getContentBytes
(
chunk
.
getContent
());
if
(
bytes
.
length
>
0
)
{
try
{
clientResponse
.
getObj
().
write
(
bytes
);
}
catch
(
Exception
e
)
{
asyncContext
.
complete
();
throw
Throwables
.
propagate
(
e
);
}
}
return
clientResponse
;
}
@Override
public
ClientResponse
<
OutputStream
>
done
(
ClientResponse
<
OutputStream
>
clientResponse
)
{
final
OutputStream
obj
=
clientResponse
.
getObj
();
try
{
resp
.
flushBuffer
();
outputStream
.
close
();
}
catch
(
Exception
e
)
{
throw
Throwables
.
propagate
(
e
);
}
finally
{
asyncContext
.
complete
();
}
return
ClientResponse
.
finished
(
obj
);
}
};
asyncContext
.
start
(
new
Runnable
()
{
@Override
public
void
run
()
{
routingDruidClient
.
get
(
makeUrl
(
host
,
req
),
responseHandler
);
}
}
);
asyncContext
.
dispatch
();
req
.
setAttribute
(
DISPATCHED
,
true
);
}
catch
(
Exception
e
)
{
if
(!
resp
.
isCommitted
())
{
resp
.
setStatus
(
500
);
resp
.
resetBuffer
();
if
(
out
==
null
)
{
out
=
resp
.
getOutputStream
();
}
if
(
ctx
!=
null
)
{
ctx
.
complete
();
}
out
.
write
((
e
.
getMessage
()
==
null
)
?
"Exception null"
.
getBytes
(
UTF8
)
:
e
.
getMessage
().
getBytes
(
UTF8
));
out
.
write
(
"\n"
.
getBytes
(
UTF8
));
}
resp
.
flushBuffer
();
}
}
@Override
protected
void
doPost
(
final
HttpServletRequest
req
,
final
HttpServletResponse
resp
...
...
@@ -99,16 +212,16 @@ public class AsyncQueryForwardingServlet extends HttpServlet
final
ObjectMapper
objectMapper
=
isSmile
?
smileMapper
:
jsonMapper
;
OutputStream
out
=
null
;
AsyncContext
ctx
=
null
;
try
{
final
AsyncContext
ctx
=
req
.
startAsync
(
req
,
resp
);
ctx
=
req
.
startAsync
(
req
,
resp
);
final
AsyncContext
asyncContext
=
ctx
;
if
(
req
.
getAttribute
(
DISPATCHED
)
!=
null
)
{
return
;
}
req
.
setAttribute
(
DISPATCHED
,
true
);
query
=
objectMapper
.
readValue
(
req
.
getInputStream
(),
Query
.
class
);
queryId
=
query
.
getId
();
if
(
queryId
==
null
)
{
...
...
@@ -142,6 +255,7 @@ public class AsyncQueryForwardingServlet extends HttpServlet
outputStream
.
write
(
bytes
);
}
catch
(
Exception
e
)
{
asyncContext
.
complete
();
throw
Throwables
.
propagate
(
e
);
}
}
...
...
@@ -159,6 +273,7 @@ public class AsyncQueryForwardingServlet extends HttpServlet
clientResponse
.
getObj
().
write
(
bytes
);
}
catch
(
Exception
e
)
{
asyncContext
.
complete
();
throw
Throwables
.
propagate
(
e
);
}
}
...
...
@@ -202,30 +317,26 @@ public class AsyncQueryForwardingServlet extends HttpServlet
throw
Throwables
.
propagate
(
e
);
}
finally
{
ctx
.
dispatch
();
asyncContext
.
complete
();
}
return
ClientResponse
.
finished
(
obj
);
}
private
byte
[]
getContentBytes
(
ChannelBuffer
content
)
{
byte
[]
contentBytes
=
new
byte
[
content
.
readableBytes
()];
content
.
readBytes
(
contentBytes
);
return
contentBytes
;
}
};
ctx
.
start
(
asyncContext
.
start
(
new
Runnable
()
{
@Override
public
void
run
()
{
routingDruidClient
.
run
(
makeUrl
(
host
,
req
),
theQuery
,
responseHandler
);
routingDruidClient
.
post
(
makeUrl
(
host
,
req
),
theQuery
,
responseHandler
);
}
}
);
asyncContext
.
dispatch
();
req
.
setAttribute
(
DISPATCHED
,
true
);
}
catch
(
Exception
e
)
{
if
(!
resp
.
isCommitted
())
{
...
...
@@ -242,6 +353,10 @@ public class AsyncQueryForwardingServlet extends HttpServlet
resp
.
flushBuffer
();
if
(
ctx
!=
null
)
{
ctx
.
complete
();
}
try
{
requestLogger
.
log
(
new
RequestLogLine
(
...
...
@@ -272,4 +387,11 @@ public class AsyncQueryForwardingServlet extends HttpServlet
}
return
String
.
format
(
"http://%s%s?%s"
,
host
,
req
.
getRequestURI
(),
req
.
getQueryString
());
}
private
byte
[]
getContentBytes
(
ChannelBuffer
content
)
{
byte
[]
contentBytes
=
new
byte
[
content
.
readableBytes
()];
content
.
readBytes
(
contentBytes
);
return
contentBytes
;
}
}
server/src/main/java/io/druid/server/router/QueryHostFinder.java
浏览文件 @
24a02680
...
...
@@ -49,7 +49,49 @@ public class QueryHostFinder<T>
public
Server
findServer
(
Query
<
T
>
query
)
{
final
Pair
<
String
,
ServerDiscoverySelector
>
selected
=
hostSelector
.
select
(
query
);
return
findServerInner
(
selected
);
}
public
Server
findDefaultServer
()
{
final
Pair
<
String
,
ServerDiscoverySelector
>
selected
=
hostSelector
.
getDefaultLookup
();
return
findServerInner
(
selected
);
}
public
String
getHost
(
Query
<
T
>
query
)
{
Server
server
=
findServer
(
query
);
if
(
server
==
null
)
{
log
.
makeAlert
(
"Catastrophic failure! No servers found at all! Failing request!"
).
emit
();
return
null
;
}
log
.
debug
(
"Selected [%s]"
,
server
.
getHost
());
return
server
.
getHost
();
}
public
String
getDefaultHost
()
{
Server
server
=
findDefaultServer
();
if
(
server
==
null
)
{
log
.
makeAlert
(
"Catastrophic failure! No servers found at all! Failing request!"
).
emit
();
return
null
;
}
return
server
.
getHost
();
}
private
Server
findServerInner
(
final
Pair
<
String
,
ServerDiscoverySelector
>
selected
)
{
if
(
selected
==
null
)
{
log
.
error
(
"Danger, Will Robinson! Unable to find any brokers!"
);
}
...
...
@@ -82,21 +124,4 @@ public class QueryHostFinder<T>
return
server
;
}
public
String
getHost
(
Query
<
T
>
query
)
{
Server
server
=
findServer
(
query
);
if
(
server
==
null
)
{
log
.
makeAlert
(
"Catastrophic failure! No servers found at all! Failing request!"
).
emit
();
return
null
;
}
log
.
debug
(
"Selected [%s]"
,
server
.
getHost
());
return
server
.
getHost
();
}
}
server/src/main/java/io/druid/server/router/TieredBrokerHostSelector.java
浏览文件 @
24a02680
...
...
@@ -193,7 +193,7 @@ public class TieredBrokerHostSelector<T> implements HostSelector<T>
return
new
Pair
<>(
brokerServiceName
,
retVal
);
}
p
rivate
Pair
<
String
,
ServerDiscoverySelector
>
getDefaultLookup
()
p
ublic
Pair
<
String
,
ServerDiscoverySelector
>
getDefaultLookup
()
{
final
String
brokerServiceName
=
tierConfig
.
getDefaultBrokerServiceName
();
final
ServerDiscoverySelector
retVal
=
selectorMap
.
get
(
brokerServiceName
);
...
...
services/src/main/java/io/druid/cli/CliRouter.java
浏览文件 @
24a02680
...
...
@@ -29,10 +29,12 @@ import io.druid.client.RoutingDruidClient;
import
io.druid.curator.discovery.DiscoveryModule
;
import
io.druid.curator.discovery.ServerDiscoveryFactory
;
import
io.druid.curator.discovery.ServerDiscoverySelector
;
import
io.druid.guice.HttpClientModule
;
import
io.druid.guice.JsonConfigProvider
;
import
io.druid.guice.LazySingleton
;
import
io.druid.guice.LifecycleModule
;
import
io.druid.guice.ManageLifecycle
;
import
io.druid.guice.annotations.Client
;
import
io.druid.guice.annotations.Self
;
import
io.druid.server.initialization.JettyServerInitializer
;
import
io.druid.server.router.CoordinatorRuleManager
;
...
...
@@ -62,6 +64,7 @@ public class CliRouter extends ServerRunnable
protected
List
<
Object
>
getModules
()
{
return
ImmutableList
.<
Object
>
of
(
new
HttpClientModule
(
"druid.router.http"
,
Client
.
class
),
new
Module
()
{
@Override
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录