ChurnTolerantDHTImplの自動再putについて

61 views
Skip to first unread message

Ryohei Banno

unread,
Nov 21, 2010, 12:32:59 PM11/21/10
to Overlay Weaver (Japanese)
こんにちは、北海道大学の坂野です。
dhtshellで、自動再putが効かなくなっているようなので、ご報告致します。

ソースを調べてみたのですが、要因はow.dht.impl.ChurnTolerantDHTImplの変数daemonsRunningだと思われ
ます。
ノード起動時、init()メソッドからstartDaemons()メソッドが呼び出され、daemonsRunningにtrueが代入されます
が、
その直後にdaemonsRunningの値が自動的にfalseになってしまうようです。

ChurnTolerantDHTImplはBasicDHTImplを継承していて、init()メソッドをオーバーライドしています。
このinit()メソッドはBasicDHTImpl側のコンストラクタから呼び出されているので、
init()メソッド実行の後にChurnTolerantDHTImplのフィールドが初期化されているのだと思います。

具体的には、以下のような順序になります。
BasicDHTImplのコンストラクタが実行される

BasicDHTImpl.init()が実行される

ChurnTolerantDHTImpl.init()が実行される(※daemonsRunningにtrueが代入される)

ChurnTolerantDHTImplのフィールド初期化(※daemonsRunningにfalseが代入される)

ChurnTolerantDHTImplのコンストラクタのsuper()以降が実行される
このため、ノード起動時daemonsRunning=falseになり、Reputterが停止してしまうようです。

以下は、上記問題の再現例です。

public class Test extends ParentClass {
private String str = "初期化";

public Test() {
super();
}

protected void process() {
super.process();

System.out.println("process()メソッド代入前:"+str);
str = "代入";
System.out.println("process()メソッド代入後:"+str);
}

protected void process2() {
System.out.println("process2()メソッド:"+str);
}

public static void main(String[] args) {
Test t = new Test();
t.process2();
}
}

class ParentClass {

public ParentClass() {
process();
}

protected void process() {
}
}


実行すると、次のような出力になります。

process()メソッド代入前:null
process()メソッド代入後:代入
process2()メソッド:初期化

Kazuyuki Shudo

unread,
Nov 21, 2010, 1:32:51 PM11/21/10
to overlayw...@googlegroups.com, r_b...@complex.eng.hokudai.ac.jp, 20...@shudo.net
坂野さん、首藤です。

> Message-ID: <b7d8224e-c098-4f32...@j33g2000vbb.googlegroups.com>
> From: Ryohei Banno <r_b...@complex.eng.hokudai.ac.jp>
> Date: Sun, 21 Nov 2010 09:32:59 -0800 (PST)

> こんにちは、北海道大学の坂野です。
> dhtshellで、自動再putが効かなくなっているようなので、ご報告致します。

あちゃー、やっちゃってますね。
御指摘の通り、自動再 put が効かなくなってました。

0.10 へのパッチを添付します。
(他の変更もわずかに含んでしまってます。)

こういう、呼び出し順となって、
ChurnTolerantDHTImpl クラスのメンバ変数 daemonsRunning が
false に初期化されてしまってました:

ChurnTolerantDHTImpl#<init> <- コンストラクタ
BasicDHTImpl#<init>
ChurnTolerantDHTImpl#init()
BasicDHTImpl#init()
ChurnTolerantDHTImpl のメンバ初期化

御連絡有難うございます。

Kazuyuki Shudo/首藤一幸 私をたばねないで あらせいとうの花のように
20...@shudo.net http://www.shudo.net/

overlayweaver-0.10-reputter.diff
Reply all
Reply to author
Forward
0 new messages