ROMA裏技とか

ROMAのあまり知られていない機能や裏技的なものの紹介です

# evalコマンド
plugin_debug.rbを読み込んでいる場合、ROMAコンソール上でevalコマンドが使用できます
ROMAに関する値を参照したり、値の書き換え、進行中のプロセスの強制終了などが可能です

```rb
> eval @stats
#<Roma::Stats:0x00000001a79fa8>

> eval @stats.log_level
debug

> stat run_recover
stats.run_recover true
END

> eval @stats.run_recover=false
false

> stat run_recover
stats.run_recover false
END
```
### evalで参照できる値の例

```rb
> eval methods
[:ev_eval, :get_key_info, :ev_alist_at, :ev_alist_clear・・・・

> eval self
#<Roma::Command::Receiver:0x000000009d7f88>

> eval @storages["roma"]
#<Roma::Storage::TCStorage:0x00000001bdd160>

> eval @rttable
#<Roma::Routing::ChurnbasedRoutingTable:0x00000002acaa10>
```

# !!コマンド
!!コマンドは一つ前に実行されたコマンドを繰り返します

```rb
> stat version_of_nodes
routing.version_of_nodes {"localhost_10001"=>66048, "localhost_10002"=>66048}
END

> !!
routing.version_of_nodes {"localhost_10001"=>66048, "localhost_10002"=>66048}
END

> stat lost_action
routing.lost_action auto_assign
END

> !!
routing.lost_action auto_assign
END
```

# disabled_cmd_protectオプション
ROMAは整合性を保つために、起動時に他のインスタンスが全て立ち上がるまではコマンドを受け付けないようにしています
しかし`--disabled_cmd_protect`オプションを使用すれば、強制的にこのプロテクトをoffにすることが出来ます

```bash
$ romad ${address} -p ${port} --disabled_cmd_protect
```

# failover機能
ROMAは常にインスタンス同士でヘルスチェックを行っており、サーバエラーなどでインスタンスが落ちるとすぐに検知してroutingの書き換えなどを行います
メンテナンスなどで一時的にROMA間のアクセスが途切れる場合など、なんらかの理由でこのfailover機能を一時的に無効化したい場合は`switch_failover`コマンドでon/offの切り替えができます

```rb
> stat failover
routing.enabled_failover true
END

> switch_failover off
{"localhost_10002"=>"DISABLED", "localhost_10001"=>"DISABLED"}

> stat failover
routing.enabled_failover false
END
```

# コンソール上でのログの確認
plugin_gui.rbを読み込んでいる場合、コンソール上でもログを確認することが可能です

```rb:ログ取得
> gather_logs <start_date> [end_date]\r\n 
```
```rb:ログ表示
> show_logs\r\n 
```
例

```rb
> gather_logs 2015-12-21T00:00:00
STARTED

> show_logs
2015-12-21 04:26:50 +0000
I, [2015-12-21T03:56:28.401614 #1586]  INFO -- : roma/plugin/plugin_storage.rb loaded
I, [2015-12-21T03:56:28.419204 #1586]  INFO -- : roma/plugin/plugin_mapcount.rb loaded
I, [2015-12-21T03:56:28.419858 #1586]  INFO -- : roma/plugin/plugin_gui.rb loaded
I, [2015-12-21T03:56:28.420322 #1586]  INFO -- : roma/plugin/plugin_cmd_aliases.rb loaded
I, [2015-12-21T03:56:28.420734 #1586]  INFO -- : roma/plugin/plugin_test.rb loaded.
.
.
.
W, [2015-12-21T04:26:27.759137 #3045]  WARN -- : failover disable now!!
W, [2015-12-21T04:26:37.759377 #3045]  WARN -- : failover disable now!!
W, [2015-12-21T04:26:47.759665 #3045]  WARN -- : failover disable now!!
D, [2015-12-21T04:26:50.775155 #3045] DEBUG -- : asyncev_start_get_logs ["2015-12-21T00:00:00", "current"]
D, [2015-12-21T04:26:50.775305 #3045] DEBUG -- : get_logs:start.
END
```

# latency測定
コマンドを指定して、latencyのaverageをログに出力することが出来ます
`set_latency_avg_calc_rule [on/off, time, command1, command2,....]`
`add_latency_avg_calc_cmd [command1, command2,....]`
`del_latency_avg_calc_cmd [command1, command2,....]`
`chg_latency_avg_calc_time_count [count]`

例

```
> set_latency_avg_calc_rule on 10 set get
{"localhost_10002"=>"ACTIVATED", "localhost_10001"=>"ACTIVATED"}
```
log file

```
.
.
D, [2015-12-21T04:32:13.645454 #3045] DEBUG -- : Latency average[set]: 1.06072156(denominator=3 max=1.47735364 min=0.81634303)
D, [2015-12-21T04:32:15.213215 #3045] DEBUG -- : Latency average[get]: 0.00016599(denominator=3 max=0.00019756 min=0.00014080)
.
.
```

# get_routing_history
構築時のインスタンス情報を確認することが出来ます

```
> get_routing_history
localhost_10001
localhost_10002
END
```

# routing event
インスタンスの追加や破棄などのイベントを確認することが可能です

```
> stat event
routing.event ["2015-12-21T04:36:39.814602 leave localhost_10002", "2015-12-21T04:37:07.812046 join localhost_20001"]
```

# 動的変更コマンド
ROMAの設定を変更するときは、config.rbを編集して起動時に--configオプションで読み込むことで反映できますが、ROMA起動後もconfigのほとんどの項目を変更することが可能です
例

```rb
> set_lost_action shutdown
{"localhost_10002"=>STORED, "localhost_10001"=>"STORED"}

> set_log_level info
STORED

> set_hilatency_warn_time 10
{"localhost_10002"=>STORED, "localhost_10001"=>"STORED"}
```
# 参照URL
ROMA Commands Page: http://roma-kvs.org/commands.html