Javaを用いたマルチスレッド処理におけるclient.shutdown()時のログ

572 views
Skip to first unread message

tetsuyam

unread,
Apr 2, 2013, 8:07:26 PM4/2/13
to couchb...@googlegroups.com

松田です。

お疲れ様です。


JavaSDKを使って複数スレッドで、各スレッドごと

client = new CouchbaseClient(nodes,"ycsb","");

client.shutdown()

とすると、以下の様なログが出ますが、原因についてなにかご存知の方はいらっしゃらないでしょうか?


2013-04-03 09:02:11.613 INFO com.couchbase.client.ViewConnection:  Suppressing duplicate attempt to shut down
java.lang.IllegalStateException: Shutting down
        at net.spy.memcached.MemcachedConnection.checkState(MemcachedConnection.java:903)
        at net.spy.memcached.MemcachedConnection.enqueueOperation(MemcachedConnection.java:719)
        at net.spy.memcached.MemcachedClient.asyncStore(MemcachedClient.java:302)
        at net.spy.memcached.MemcachedClient.set(MemcachedClient.java:745)
        at com.yahoo.ycsb.db.CouchbaseServerClient.insert(CouchbaseServerClient.java:91)
        at com.yahoo.ycsb.DBWrapper.insert(DBWrapper.java:148)
        at com.yahoo.ycsb.workloads.CoreWorkload.doTransactionInsert(CoreWorkload.java:639)
        at com.yahoo.ycsb.workloads.CoreWorkload.doTransaction(CoreWorkload.java:487)
        at com.yahoo.ycsb.ClientThread.run(Client.java:233)


具体的には、YCSBを走らせる際、

「couchbaseと接続, (set, getなど) shutdown()」

という処理を各スレッドごとにしているのですが、

1スレッドでは問題ないのですが、2スレッド以上になると上記のようなエラーが出ます。

データ等は正しく書き込まれているのですが、最後の接続を切る部分でエラーが出ているようです。


couchbase関係なく、単なるJavaの知識不足かもですが、何かアイデアがありましたらご教授下さい。

よろしくお願いします。

Koji Kawamura

unread,
Apr 3, 2013, 1:01:37 AM4/3/13
to couchbase-jp
松田さん

河村です。

CouchbaseのJavaクライアントはマルチスレッド対応で、裏っかわでシングルスレッドのコネクションをクライアント/サーバ間で張っています。
IllegalStateExceptionということで、既に他のスレッドによりコネクションのスレッドが閉じられていると思います。

CouchbaseServerClientのインスタンスはどのように生成していますか?

2013/4/3 tetsuyam <tetsuy...@gmail.com>:
> --
> You received this message because you are subscribed to the Google Groups
> "couchbase-jp" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to couchbase-jp...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>

tetsuyam

unread,
Apr 3, 2013, 2:35:57 AM4/3/13
to couchb...@googlegroups.com
河村さん

松田です。
返信ありがとうございます。


インスタンス生成は以下のようにしています。(ほぼサンプル通りです。)
        ArrayList<URI> nodes = new ArrayList<URI>();
        String url = props.getProperty("couchbase.url","http://couchbaseHost1:8091/pools");

        nodes.add(URI.create(url));

        // Try to connect to the client
        try {
          client = new CouchbaseClient(nodes,"ycsb","");
          System.out.println("Successly connected");
        } catch (Exception e) {
          System.err.println("Error connecting to Couchbase: " + e.getMessage());
          System.exit(1);
        }

    }


スレッドごとにインスタンスを生成し、shutdownしている(はず)
という理解なのですが、最初にshutdownしたタイミングで全てのスレッドがshutdownされてしまっているのでしょうか?

2013年4月3日水曜日 14時01分37秒 UTC+9 Koji Kawamura:

Koji Kawamura

unread,
Apr 3, 2013, 5:16:56 AM4/3/13
to couchbase-jp
松田さん

河村です。

> スレッドごとにインスタンスを生成し、shutdownしている(はず)
> という理解なのですが、最初にshutdownしたタイミングで全てのスレッドがshutdownされてしまっているのでしょうか?
少なくとも、shutdown()を呼び出した際にMemcachedConnectionは既にshutdownされています。
クライアントのバージョンはいくつでしょうか?

一応、こちらでも簡単にテストしてみましたが再現はしませんでした(1.1.4を利用)。

テストしたソース↓
public static void main(String[] args) {

int nThreads = 10;
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
for(int i = 0; i < nThreads; i++)
executor.execute(new CouchbaseWork());
executor.shutdown();
}

private static class CouchbaseWork implements Runnable {

private CouchbaseClient client;
public void run() {
ArrayList<URI> nodes = new ArrayList<URI>();
String url = "http://host:8091/pools";

nodes.add(URI.create(url));

try {
client = new CouchbaseClient(nodes,"test","");
System.out.println("Successly connected");
} catch (Exception e) {
System.err.println("Error connecting to Couchbase: " + e.getMessage());
System.exit(1);
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Shutting down client.");
client.shutdown();
}
}


2013/4/3 tetsuyam <tetsuy...@gmail.com>:

tetsuyam

unread,
Apr 3, 2013, 11:10:53 AM4/3/13
to couchb...@googlegroups.com
河村さん


松田です。
わざわざ試していただきありがとうございます。

クライアントのバージョンは同じ1.14を使っています。

>少なくとも、shutdown()を呼び出した際にMemcachedConnectionは既にshutdownされています。 
そう思って違うDBでも試したみたのですが、同様のコードで違うDB(MongoDB)に試したところ、
そちらでは特にエラー的なものは出ませんでした。


スレッドのコントロール部を確認してみようと思います。



2013年4月3日水曜日 18時16分56秒 UTC+9 Koji Kawamura:

Koji Kawamura

unread,
Apr 3, 2013, 9:10:02 PM4/3/13
to couchbase-jp
松田さん

河村です。

> スレッドのコントロール部を確認してみようと思います。
そうですねー。

YCSBでのCouchbase検証ということで、
Altorosという会社がクライアントのソースコードを公開しています。
もうご存知かもしれませんが、一応共有しておきます。
こちらも参考にしてみてください。
https://github.com/Altoros/YCSB/blob/master/src/couchbase-2.0/src/main/java/com/yahoo/ycsb/couchbase/CouchbaseClient2_0.java

検証結果、楽しみですね!

2013/4/4 tetsuyam <tetsuy...@gmail.com>:

tetsuyam

unread,
Apr 3, 2013, 11:22:33 PM4/3/13
to couchb...@googlegroups.com
河村さん


松田です。
やはり、スレッドの処理がうまくできていなかったようで、
排他処理を入れるようにすると無事に動きました。
お騒がせしてすみません。。。

検証結果は、何かの機会にでも発表出来ればなーと思います。



Altorosのコードは、読んでみたのですがよくわからなかったので、
YCSB DB拡張の勉強も兼ねて自分でイチから書いてみた次第です。

色々と親切にご対応していただきありがとうございました!


2013年4月4日木曜日 10時10分02秒 UTC+9 Koji Kawamura:

Koji Kawamura

unread,
Apr 4, 2013, 12:40:12 AM4/4/13
to couchbase-jp
松田さん

河村です。
解決したようで良かったです!

> 検証結果は、何かの機会にでも発表出来ればなーと思います。
是非よろしくお願いします :)
Reply all
Reply to author
Forward
0 new messages