SlideShare a Scribd company logo
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って便利だね!

More Related Content

What's hot

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
 
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
土岐 孝平
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
Yusuke Kagata
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
do_aki
 
MySQLアンチパターン
MySQLアンチパターンMySQLアンチパターン
MySQLアンチパターン
yoku0825
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)
Tetsuyuki Kobayashi
 
Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかHiroshi Tokumaru
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
崇介 藤井
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
NTT DATA Technology & Innovation
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能についてshigeki_ohtsu
 
カスタムプランと汎用プラン
カスタムプランと汎用プランカスタムプランと汎用プラン
カスタムプランと汎用プラン
Masao Fujii
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
 
XSS再入門
XSS再入門XSS再入門
XSS再入門
Hiroshi Tokumaru
 

What's hot (20)

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
 
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
MySQLアンチパターン
MySQLアンチパターンMySQLアンチパターン
MySQLアンチパターン
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)
 
Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいか
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
 
カスタムプランと汎用プラン
カスタムプランと汎用プランカスタムプランと汎用プラン
カスタムプランと汎用プラン
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
XSS再入門
XSS再入門XSS再入門
XSS再入門
 

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

Webサーバ勉強会03
Webサーバ勉強会03Webサーバ勉強会03
Webサーバ勉強会03oranie Narut
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaTakuya Tsuchida
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
JustSystems Corporation
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築WSL2+docker+JupyterとVS Codeリモート環境の構築
WSL2+docker+JupyterとVS Codeリモート環境の構築
Saito5656
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
spring_raining
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話idkqh7 Nishino
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
Mr. Vengineer
 
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+BetamaxNobuhiro Sue
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsuNanha Park
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)fumoto kazuhiro
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
Kentaro Yoshida
 
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アプリケーション
Kazuhiro Hara
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
Yuta Kawadai
 
Marionettejs getting started
Marionettejs getting startedMarionettejs getting started
Marionettejs getting started
Kyohei Morimoto
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Roslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインRoslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドイン
Fujio Kojima
 

Similar to 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 のアドイン
 

More from furandon_pig

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

More from 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って便利だね!