SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
elasticsearch 
ソースコードを 
読みはじめてみた 
! 
@furandon_pig 
第6回elasticsearch勉強会
自己紹介 
• Twitter ID: @furandon_pig 
• 宮沢賢治の「フランドン農学校の豚」が由来です 
• 家では日々NetBSDを利用しています 
• elasticsearchを業務で使ったことはありません…… 
• が、「あの書籍」は購入済です
本日の発表内容 
• タイトルでネタバレ。 
• 「elasticsearchソースコードを読み始めてみた」 
• elasticsearchの学習 
• 動かして理解(わか)る→せいかい! 
• ソースコードから理解(わか)ろうとする→まちがい!
Q. なぜソースから読んだ? 
• 前回のelasticsearch勉強会にて…… 
• 私「elasticsearchのソースコードを読むにはどこ 
から?」 
• 開発者の方「クエリをレシーブしてリザルトをリ 
ターンする部分からリードするとベターだよ」 
• 訳:クエリを受けて結果を返す部分から読むの 
が早道だよ
本日の発表内容(その2) 
• ……というやり取りを経てソースコードリーディング 
• curl -XGET http://localhost:9200/ を受けたときの動作を 
ソースコードレベルで把握したい→目標 
• が、クエリをレシーブしてリザル(略)までたどり着くまでが 
タイヘン! 
• ソースコードから理解(わか)ろうとする→まちがい! 
• まずは順当に起動処理から追いかけることにしてみました
まずはソースコードを準備 
$ sudo yum install git 
$ sudo yum install maven 
! 
$ git clone https://github.com/elasticsearch/elasticsearch.git 
$ mvn clean package -DskipTests 
6
まずは bin/elasticsearch 
bin/elasticsearch: 
1 #!/bin/sh 
… 
127 launch_service() 
128 { 
… 
144 if [ "x$daemonized" = "x" ]; then 
145 es_parms="$es_parms -Des.foreground=yes" 
146 exec "$JAVA" $JAVA_OPTS $ES_JAVA_OPTS $es_parms - 
Des.path.home="$ES_HOME" -cp "$ES_CLASSPATH" $props  
147 org.elasticsearch.bootstrap.Elasticsearch 
… 
150 else 
151 # Startup Elasticsearch, background it, and write the 
pid. 
… 
155 fi 
156 } 
… 
216 # Start up the service 
217 launch_service "$pidfile" "$daemonized" "$properties" 
7
class Elasticsearch(1/2) 
src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java: 
25 public class Elasticsearch extends Bootstrap { 
26 
27 public static void close(String[] args) { 
28 Bootstrap.close(args); 
29 } 
30 
31 public static void main(String[] args) { 
32 Bootstrap.main(args); 
33 } 
34 } 
8
class Elasticsearch(2/2) 
Bootstrap 
Elasticsearch 
• class Bootstrapをラップしてい 
るだけ
Bootstrap.main() 
src/main/java/org/elasticsearch/bootstrap/Bootstrap.java: 
145 public static void main(String[] args) { 
146 System.setProperty("es.logger.prefix", ""); 
147 bootstrap = new Bootstrap(); 
… 
197 String stage = "Initialization"; 
198 try { 
199 if (!foreground) { 
200 Loggers.disableConsoleLogging(); 
201 System.out.close(); 
202 } 
203 bootstrap.setup(true, tuple); 
204 
205 stage = "Startup"; 
206 bootstrap.start(); 
… 
233 } catch (Throwable e) { 
… 
250 } 
251 } 
10
Bootstrap.{setup,start}() 
src/main/java/org/elasticsearch/bootstrap/Bootstrap.java: 
50 /** 
51 * A main entry point when starting from the command line. 
52 */ 
53 public class Bootstrap { 
… 
62 private void setup(boolean addShutdownHook, Tuple<Settings, 
Environment> tuple) throws Exception { 
… 
69 NodeBuilder nodeBuilder = 
NodeBuilder.nodeBuilder().settings(tuple.v1()).loadConfigSettings(fa 
lse); 
70 node = nodeBuilder.build(); 
… 
79 } 
… 
118 /** 
119 * hook for JSVC 
120 */ 
121 public void start() { 
122 node.start(); 
123 } 
11
NodeBuilder 
src/main/java/org/elasticsearch/node/NodeBuilder.java: 
26 /** 
27 * A node builder is used to construct a {@link Node} instance. 
… 
57 */ 
58 public class NodeBuilder { 
… 
64 /** 
65 * A convenient factory method to create a {@link 
NodeBuilder}. 
66 */ 
67 public static NodeBuilder nodeBuilder() { 
68 return new NodeBuilder(); 
69 } 
… 
155 /** 
156 * Builds the node without starting it. 
157 */ 
158 public Node build() { 
159 return new InternalNode(settings.build(), 
loadConfigSettings); 
160 } 
12
class InternalNode 
AutoClosable 
Releasable 
<<interface>> 
Node 
final 
InternalNode 
• ノードに関する情報を保持しているクラス 
• elasticsearchの各々のサーバのこと
InternalNode(1/2) 
src/main/java/org/elasticsearch/node/internal/InternalNode.java: 
111 public final class InternalNode implements Node { 
… 
116 private final Injector injector; 
… 
126 public InternalNode(Settings preparedSettings, boolean 
loadConfigSettings) throws ElasticsearchException { 
… 
138 logger.info("initializing …"); 
… 
157 try { 
… 
194 injector = modules.createInjector(); 
… 
204 logger.info("initialized"); 
205 } 
14
InternalNode 
src/main/java/org/elasticsearch/node/internal/InternalNode.java: 
217 public Node start() { 
… 
223 logger.info("starting ..."); 
… 
241 injector.getInstance(SearchService.class).start(); 
242 injector.getInstance(MonitorService.class).start(); 
243 injector.getInstance(RestController.class).start(); 
… 
258 logger.info("started"); 
259 
260 return this; 
261 } 
15
Node, Reasable, AutoCLosable 
src/main/java/org/elasticsearch/node/Node.java: 
35 public interface Node extends Releasable{ 
… 
47 /** 
48 * Start the node. If the node is already started, this 
method is no-op. 
49 */ 
50 Node start(); 
… 
66 } 
! 
src/main/java/org/elasticsearch/common/lease/Releasable.java: 
27 public interface Releasable extends AutoCloseable { 
28 
29 void close() throws ElasticsearchException; 
30 } 
! 
src/main/java/org/elasticsearch/common/lease/Releasable.java: 
27 public interface Releasable extends AutoCloseable { 
28 
29 void close() throws ElasticsearchException; 
30 } 
16
(最掲)bootstrap.main() 
src/main/java/org/elasticsearch/bootstrap/Bootstrap.java: 
145 public static void main(String[] args) { 
146 System.setProperty("es.logger.prefix", ""); 
147 bootstrap = new Bootstrap(); 
… 
197 String stage = "Initialization"; 
198 try { 
199 if (!foreground) { 
200 Loggers.disableConsoleLogging(); 
201 System.out.close(); 
202 } 
203 bootstrap.setup(true, tuple); 
204 
205 stage = "Startup"; 
206 bootstrap.start(); 
… 
233 } catch (Throwable e) { 
… 
250 } 
251 } 
17
InternalNode 
src/main/java/org/elasticsearch/node/internal/InternalNode.java: 
217 public Node start() { 
… 
223 logger.info("starting ..."); 
… 
241 injector.getInstance(SearchService.class).start(); 
242 injector.getInstance(MonitorService.class).start(); 
243 injector.getInstance(RestController.class).start(); 
… 
258 logger.info("started"); 
259 
260 return this; 
261 } 
18
class MonitorService 
ClosableComponent 
LifecycleComponent 
AbstractComponent 
<<abstract>> 
AbstractLifecycleComponent 
MonitorService 
• 各サービスの実体
MonitorService 
src/main/java/org/elasticsearch/monitor/MonitorService.java: 
36 public class MonitorService extends 
AbstractLifecycleComponent<MonitorService> { 
… 
83 @Override 
84 protected void doStart() throws ElasticsearchException { 
85 jvmMonitorService.start(); 
86 } 
! 
src/main/java/org/elasticsearch/common/component/AbstractLifecycleComponent.java: 
31 public abstract class AbstractLifecycleComponent<T> extends AbstractComponent 
implements LifecycleComponent<T> { 
… 
77 @Override 
78 public T start() throws ElasticsearchException { 
… 
85 doStart(); 
86 lifecycle.moveToStarted(); 
87 for (LifecycleListener listener : listeners) { 
88 listener.afterStart(); 
89 } 
90 return (T) this; 
91 } 
20
(再掲)InternalNode 
src/main/java/org/elasticsearch/node/internal/InternalNode.java: 
217 public Node start() { 
… 
223 logger.info("starting ..."); 
… 
241 injector.getInstance(SearchService.class).start(); 
242 injector.getInstance(MonitorService.class).start(); 
243 injector.getInstance(RestController.class).start(); 
… 
258 logger.info("started"); 
259 
260 return this; 
261 } 
21
まとめ 
• elasticsearchのソースコードを読み始めてみました 
• 順当にクラスを追いかけていけば読めます……が 
• 一つ前のメソッド呼び出しに戻ることが多い感じ 
• Abstractクラスの実装を追いかけるような場合 
• DI(Dependency Injection)が(個人的に)よく分かっていないので、 
InternalNodeまわりは読むのがツラい 
• 手続き指向おじさん(仮)には少し慣れが必要なソースコード 
• (まだほんのちょっとしか使ってないけど)UMLって便利だね!

Weitere ähnliche Inhalte

Was ist angesagt?

CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
グローバルセキュリティエキスパート株式会社(GSX)
 
CloudFront最近の事例と間違った使い方
CloudFront最近の事例と間違った使い方CloudFront最近の事例と間違った使い方
CloudFront最近の事例と間違った使い方
Hirokazu Ouchi
 

Was ist angesagt? (20)

Composer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放されるComposer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放される
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
Burp Suite v1.1 Introduction
Burp Suite v1.1 IntroductionBurp Suite v1.1 Introduction
Burp Suite v1.1 Introduction
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
AWSからのメール送信
AWSからのメール送信AWSからのメール送信
AWSからのメール送信
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
The Twelve-Factor Appで考えるAWSのサービス開発
The Twelve-Factor Appで考えるAWSのサービス開発The Twelve-Factor Appで考えるAWSのサービス開発
The Twelve-Factor Appで考えるAWSのサービス開発
 
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
 
AWSで透過プロキシをやってみた
AWSで透過プロキシをやってみたAWSで透過プロキシをやってみた
AWSで透過プロキシをやってみた
 
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
 
Zap vs burp
Zap vs burpZap vs burp
Zap vs burp
 
QtとC++でGUIプログラミング
QtとC++でGUIプログラミングQtとC++でGUIプログラミング
QtとC++でGUIプログラミング
 
엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみた
 
CloudFront最近の事例と間違った使い方
CloudFront最近の事例と間違った使い方CloudFront最近の事例と間違った使い方
CloudFront最近の事例と間違った使い方
 
Burp suite
Burp suiteBurp suite
Burp suite
 
Netcat - A Swiss Army Tool
Netcat - A Swiss Army ToolNetcat - A Swiss Army Tool
Netcat - A Swiss Army Tool
 
Pentest Application With GraphQL | Null Bangalore Meetup
Pentest Application With GraphQL | Null Bangalore Meetup Pentest Application With GraphQL | Null Bangalore Meetup
Pentest Application With GraphQL | Null Bangalore Meetup
 
Nginx Unitを試してみた話
Nginx Unitを試してみた話Nginx Unitを試してみた話
Nginx Unitを試してみた話
 

Ähnlich wie elasticsearchソースコードを読みはじめてみた

Webサーバ勉強会03
Webサーバ勉強会03Webサーバ勉強会03
Webサーバ勉強会03
oranie Narut
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
Takuya Tsuchida
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話
idkqh7 Nishino
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
Nanha Park
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
 
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
fumoto kazuhiro
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 

Ähnlich wie elasticsearchソースコードを読みはじめてみた (20)

Webサーバ勉強会03
Webサーバ勉強会03Webサーバ勉強会03
Webサーバ勉強会03
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
Marionettejs getting started
Marionettejs getting startedMarionettejs getting started
Marionettejs getting started
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Roslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインRoslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドイン
 

Mehr von furandon_pig

x86 CPUにejectコマンドを組み込みたい!
x86 CPUにejectコマンドを組み込みたい!x86 CPUにejectコマンドを組み込みたい!
x86 CPUにejectコマンドを組み込みたい!
furandon_pig
 

Mehr von furandon_pig (9)

CoderDojoの日常
CoderDojoの日常CoderDojoの日常
CoderDojoの日常
 
TDEで透過的暗号化
TDEで透過的暗号化TDEで透過的暗号化
TDEで透過的暗号化
 
ジャパリパークさいかいけーかく
ジャパリパークさいかいけーかくジャパリパークさいかいけーかく
ジャパリパークさいかいけーかく
 
パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmap
 
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
 
nginxに追加された新モジュール それがHTTP/2モジュールです
nginxに追加された新モジュール それがHTTP/2モジュールですnginxに追加された新モジュール それがHTTP/2モジュールです
nginxに追加された新モジュール それがHTTP/2モジュールです
 
プレゼン用の図を自動生成する話
プレゼン用の図を自動生成する話プレゼン用の図を自動生成する話
プレゼン用の図を自動生成する話
 
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
 
x86 CPUにejectコマンドを組み込みたい!
x86 CPUにejectコマンドを組み込みたい!x86 CPUにejectコマンドを組み込みたい!
x86 CPUにejectコマンドを組み込みたい!
 

elasticsearchソースコードを読みはじめてみた

  • 1. elasticsearch ソースコードを 読みはじめてみた ! @furandon_pig 第6回elasticsearch勉強会
  • 2. 自己紹介 • Twitter ID: @furandon_pig • 宮沢賢治の「フランドン農学校の豚」が由来です • 家では日々NetBSDを利用しています • elasticsearchを業務で使ったことはありません…… • が、「あの書籍」は購入済です
  • 3. 本日の発表内容 • タイトルでネタバレ。 • 「elasticsearchソースコードを読み始めてみた」 • elasticsearchの学習 • 動かして理解(わか)る→せいかい! • ソースコードから理解(わか)ろうとする→まちがい!
  • 4. Q. なぜソースから読んだ? • 前回のelasticsearch勉強会にて…… • 私「elasticsearchのソースコードを読むにはどこ から?」 • 開発者の方「クエリをレシーブしてリザルトをリ ターンする部分からリードするとベターだよ」 • 訳:クエリを受けて結果を返す部分から読むの が早道だよ
  • 5. 本日の発表内容(その2) • ……というやり取りを経てソースコードリーディング • curl -XGET http://localhost:9200/ を受けたときの動作を ソースコードレベルで把握したい→目標 • が、クエリをレシーブしてリザル(略)までたどり着くまでが タイヘン! • ソースコードから理解(わか)ろうとする→まちがい! • まずは順当に起動処理から追いかけることにしてみました
  • 6. まずはソースコードを準備 $ sudo yum install git $ sudo yum install maven ! $ git clone https://github.com/elasticsearch/elasticsearch.git $ mvn clean package -DskipTests 6
  • 7. まずは bin/elasticsearch bin/elasticsearch: 1 #!/bin/sh … 127 launch_service() 128 { … 144 if [ "x$daemonized" = "x" ]; then 145 es_parms="$es_parms -Des.foreground=yes" 146 exec "$JAVA" $JAVA_OPTS $ES_JAVA_OPTS $es_parms - Des.path.home="$ES_HOME" -cp "$ES_CLASSPATH" $props 147 org.elasticsearch.bootstrap.Elasticsearch … 150 else 151 # Startup Elasticsearch, background it, and write the pid. … 155 fi 156 } … 216 # Start up the service 217 launch_service "$pidfile" "$daemonized" "$properties" 7
  • 8. class Elasticsearch(1/2) src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java: 25 public class Elasticsearch extends Bootstrap { 26 27 public static void close(String[] args) { 28 Bootstrap.close(args); 29 } 30 31 public static void main(String[] args) { 32 Bootstrap.main(args); 33 } 34 } 8
  • 9. class Elasticsearch(2/2) Bootstrap Elasticsearch • class Bootstrapをラップしてい るだけ
  • 10. Bootstrap.main() src/main/java/org/elasticsearch/bootstrap/Bootstrap.java: 145 public static void main(String[] args) { 146 System.setProperty("es.logger.prefix", ""); 147 bootstrap = new Bootstrap(); … 197 String stage = "Initialization"; 198 try { 199 if (!foreground) { 200 Loggers.disableConsoleLogging(); 201 System.out.close(); 202 } 203 bootstrap.setup(true, tuple); 204 205 stage = "Startup"; 206 bootstrap.start(); … 233 } catch (Throwable e) { … 250 } 251 } 10
  • 11. Bootstrap.{setup,start}() src/main/java/org/elasticsearch/bootstrap/Bootstrap.java: 50 /** 51 * A main entry point when starting from the command line. 52 */ 53 public class Bootstrap { … 62 private void setup(boolean addShutdownHook, Tuple<Settings, Environment> tuple) throws Exception { … 69 NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().settings(tuple.v1()).loadConfigSettings(fa lse); 70 node = nodeBuilder.build(); … 79 } … 118 /** 119 * hook for JSVC 120 */ 121 public void start() { 122 node.start(); 123 } 11
  • 12. NodeBuilder src/main/java/org/elasticsearch/node/NodeBuilder.java: 26 /** 27 * A node builder is used to construct a {@link Node} instance. … 57 */ 58 public class NodeBuilder { … 64 /** 65 * A convenient factory method to create a {@link NodeBuilder}. 66 */ 67 public static NodeBuilder nodeBuilder() { 68 return new NodeBuilder(); 69 } … 155 /** 156 * Builds the node without starting it. 157 */ 158 public Node build() { 159 return new InternalNode(settings.build(), loadConfigSettings); 160 } 12
  • 13. class InternalNode AutoClosable Releasable <<interface>> Node final InternalNode • ノードに関する情報を保持しているクラス • elasticsearchの各々のサーバのこと
  • 14. InternalNode(1/2) src/main/java/org/elasticsearch/node/internal/InternalNode.java: 111 public final class InternalNode implements Node { … 116 private final Injector injector; … 126 public InternalNode(Settings preparedSettings, boolean loadConfigSettings) throws ElasticsearchException { … 138 logger.info("initializing …"); … 157 try { … 194 injector = modules.createInjector(); … 204 logger.info("initialized"); 205 } 14
  • 15. InternalNode src/main/java/org/elasticsearch/node/internal/InternalNode.java: 217 public Node start() { … 223 logger.info("starting ..."); … 241 injector.getInstance(SearchService.class).start(); 242 injector.getInstance(MonitorService.class).start(); 243 injector.getInstance(RestController.class).start(); … 258 logger.info("started"); 259 260 return this; 261 } 15
  • 16. Node, Reasable, AutoCLosable src/main/java/org/elasticsearch/node/Node.java: 35 public interface Node extends Releasable{ … 47 /** 48 * Start the node. If the node is already started, this method is no-op. 49 */ 50 Node start(); … 66 } ! src/main/java/org/elasticsearch/common/lease/Releasable.java: 27 public interface Releasable extends AutoCloseable { 28 29 void close() throws ElasticsearchException; 30 } ! src/main/java/org/elasticsearch/common/lease/Releasable.java: 27 public interface Releasable extends AutoCloseable { 28 29 void close() throws ElasticsearchException; 30 } 16
  • 17. (最掲)bootstrap.main() src/main/java/org/elasticsearch/bootstrap/Bootstrap.java: 145 public static void main(String[] args) { 146 System.setProperty("es.logger.prefix", ""); 147 bootstrap = new Bootstrap(); … 197 String stage = "Initialization"; 198 try { 199 if (!foreground) { 200 Loggers.disableConsoleLogging(); 201 System.out.close(); 202 } 203 bootstrap.setup(true, tuple); 204 205 stage = "Startup"; 206 bootstrap.start(); … 233 } catch (Throwable e) { … 250 } 251 } 17
  • 18. InternalNode src/main/java/org/elasticsearch/node/internal/InternalNode.java: 217 public Node start() { … 223 logger.info("starting ..."); … 241 injector.getInstance(SearchService.class).start(); 242 injector.getInstance(MonitorService.class).start(); 243 injector.getInstance(RestController.class).start(); … 258 logger.info("started"); 259 260 return this; 261 } 18
  • 19. class MonitorService ClosableComponent LifecycleComponent AbstractComponent <<abstract>> AbstractLifecycleComponent MonitorService • 各サービスの実体
  • 20. MonitorService src/main/java/org/elasticsearch/monitor/MonitorService.java: 36 public class MonitorService extends AbstractLifecycleComponent<MonitorService> { … 83 @Override 84 protected void doStart() throws ElasticsearchException { 85 jvmMonitorService.start(); 86 } ! src/main/java/org/elasticsearch/common/component/AbstractLifecycleComponent.java: 31 public abstract class AbstractLifecycleComponent<T> extends AbstractComponent implements LifecycleComponent<T> { … 77 @Override 78 public T start() throws ElasticsearchException { … 85 doStart(); 86 lifecycle.moveToStarted(); 87 for (LifecycleListener listener : listeners) { 88 listener.afterStart(); 89 } 90 return (T) this; 91 } 20
  • 21. (再掲)InternalNode src/main/java/org/elasticsearch/node/internal/InternalNode.java: 217 public Node start() { … 223 logger.info("starting ..."); … 241 injector.getInstance(SearchService.class).start(); 242 injector.getInstance(MonitorService.class).start(); 243 injector.getInstance(RestController.class).start(); … 258 logger.info("started"); 259 260 return this; 261 } 21
  • 22. まとめ • elasticsearchのソースコードを読み始めてみました • 順当にクラスを追いかけていけば読めます……が • 一つ前のメソッド呼び出しに戻ることが多い感じ • Abstractクラスの実装を追いかけるような場合 • DI(Dependency Injection)が(個人的に)よく分かっていないので、 InternalNodeまわりは読むのがツラい • 手続き指向おじさん(仮)には少し慣れが必要なソースコード • (まだほんのちょっとしか使ってないけど)UMLって便利だね!