2016-07-06 4 views
1

クロニクルマップのv3.9.0を使用しています。プロセスAがChronicleMapに書き込みを行い、プロセスBがAが使用するのと同じ永続化ファイルで初期化するプロセスが2つあります。ロード後、私はプロセスAとプロセスBでMap.sizeを印刷しますが、私は異なるMapサイズを取得します。私は両方のサイズが同じであることを期待しています。どのような場合には、この現象を見ることができますか?クロニクルマップv3.9.0異なるサイズを返す

この問題のトラブルシューティングを行うにはどうすればよいですか?何らかのフラッシュ操作が必要ですか?

私がしようとしたことは、getAllメソッドを使ってファイルをダンプすることですが、私が持っているエディタをほとんど破壊している1つのファイルにすべてをjsonとしてダンプします。私はプロセスBでMapEntryOperationsを使用して、面白いことがあるかどうかを調べようとしましたが、何かがマップに書き込まれたときに主に呼び出されますが、永続ストアからマップが直接初期化されたときは呼び出されないようです。

答えて

2

のようなもので「カウント」のエントリに試すことができます。このため、他のプロセスではデータ全体が表示されませんでした。チュートリアルのRecoveryセクションで説明したように

は詳しく説明:

.recoverPersistedTo()独占クロニクル地図にアクセスする必要があります。他のプロセスが回復を実行しようとしている間に、同時プロセスがクロニクルマップにアクセスしている場合、アクセスプロセス側の操作結果および回復結果は不特定である。データがさらに破損する可能性があります。この店舗で.recoverPersistedTo()を呼び出すときにクロニクルマップストアに他のプロセスがアクセスしていないことを確認する必要があります。 "

0

これはかなり変わったようです。クロニクルマップのサイズは、単一のメモリ位置に格納されません。 ChronicleMap.size()は、各セグメントのサイズを合計して合計します。したがって、サイズは「弱く一貫性があります」、1つのプロセスが常にマップに書き込む場合、複数のスレッド/プロセスからの呼び出しによってわずかに異なる値が返される可能性があります。しかし、誰も地図に書いていない場合(例えば、ロード直後、プロセスAが書込みを開始していない場合など)、すべての発信者は同じ値を参照する必要があります。

代わりのgetAll()、手動で出力を分析し、あなたは私が代わりにcreatePersistedTo方法のcreateOrRecoverPersistedToを使用していた

int entries = 0; 
for (K k : map.keySet()) { 
    entries++; 
} 
+0

今日、私はあなたの提案した方法を適用しようとしました。 – vijar

+1

'createPersistedTo()を使用していますか?この問題を診断する方法はありますか?これをシステム(Windows環境)で一貫して再現できます。 'または' createOrRecoverPersistedTo() 'メソッドを使用してマップを開きますか?また、Linux環境であなたのケースを実行しようとしますか? – leventov

+0

' createOrRecoverPersistedTo() 'を使用しています – vijar

関連する問題