SlideShare a Scribd company logo
1 of 22
Download to read offline
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

Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門Daiyu Hatakeyama
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法yoku0825
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料Hironori Miura
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編なべ
 
CyberAgentのPrivateCloudeを支えるStorage基盤
CyberAgentのPrivateCloudeを支えるStorage基盤CyberAgentのPrivateCloudeを支えるStorage基盤
CyberAgentのPrivateCloudeを支えるStorage基盤Hiroki Chinen
 
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11Sadayuki Furuhashi
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Shinsuke Sugaya
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Masahito Zembutsu
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかShunsukeNakamura17
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返りSotaro Kimura
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版Masahiro Nagano
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 

What's hot (20)

Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
CyberAgentのPrivateCloudeを支えるStorage基盤
CyberAgentのPrivateCloudeを支えるStorage基盤CyberAgentのPrivateCloudeを支えるStorage基盤
CyberAgentのPrivateCloudeを支えるStorage基盤
 
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 

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
 
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 JavaYuta Kawadai
 
Marionettejs getting started
Marionettejs getting startedMarionettejs getting started
Marionettejs getting startedKyohei 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から見るnetmapfurandon_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って便利だね!