ReadMeへコメン追加。ListテストによりバグFix
@@ -2137,8 +2137,7 @@ | ||
2137 | 2137 | errorFlg = true; |
2138 | 2138 | } |
2139 | 2139 | } |
2140 | -Object[] test = okuyamaClient.listLen(listName); | |
2141 | -System.out.println(listName+" size=" + test[1]); | |
2140 | + | |
2142 | 2141 | // Indexテスト |
2143 | 2142 | for (long idx = 0; idx < 5000L; idx++) { |
2144 | 2143 |
@@ -2167,8 +2166,6 @@ | ||
2167 | 2166 | errorFlg = true; |
2168 | 2167 | } |
2169 | 2168 | } |
2170 | -test = okuyamaClient.listLen(listName); | |
2171 | -System.out.println(listName+" size=" + test[1]); | |
2172 | 2169 | |
2173 | 2170 | // Indexテスト |
2174 | 2171 | for (long idx = 0; idx < 5000L; idx++) { |
@@ -2205,8 +2202,108 @@ | ||
2205 | 2202 | idxTest2++; |
2206 | 2203 | } |
2207 | 2204 | |
2205 | + // LPOPテスト | |
2206 | + for (long idx = 0; idx < 5000L; idx++) { | |
2208 | 2207 | |
2208 | + String[] retTmp = okuyamaClient.listLPop(listName); | |
2209 | + if (!retTmp[0].equals("true")) { | |
2210 | + System.out.println("List error8 =" + listName); | |
2211 | + System.out.println(retTmp[1]); | |
2212 | + errorFlg = true; | |
2213 | + } else { | |
2214 | + if (!retTmp[1].equals("Llistdata."+(4999-idx))) { | |
2215 | + System.out.println("List error8-1 =" + listName); | |
2216 | + System.out.println(retTmp[1]); | |
2217 | + errorFlg = true; | |
2218 | + } | |
2219 | + } | |
2220 | + } | |
2221 | + // LPOPテスト | |
2222 | + idxTest2 = 0; | |
2223 | + for (long idx = 5000L; idx < 10000L; idx++) { | |
2224 | + | |
2225 | + String[] retTmp = okuyamaClient.listLPop(listName); | |
2226 | + if (!retTmp[0].equals("true")) { | |
2227 | + System.out.println("List create error9 =" + listName); | |
2228 | + System.out.println(retTmp[1]); | |
2229 | + errorFlg = true; | |
2230 | + } else { | |
2231 | + if (!retTmp[1].equals("Rlistdata."+idxTest2)) { | |
2232 | + System.out.println("List create error9-1 =" + listName); | |
2233 | + System.out.println(retTmp[1]); | |
2234 | + errorFlg = true; | |
2235 | + } | |
2236 | + } | |
2237 | + idxTest2++; | |
2238 | + } | |
2209 | 2239 | |
2240 | + String[] nullRetTmp = okuyamaClient.listLPop(listName); | |
2241 | + if (!nullRetTmp[0].equals("false")) { | |
2242 | + System.out.println("List create error10 =" + listName); | |
2243 | + System.out.println(nullRetTmp[1]); | |
2244 | + errorFlg = true; | |
2245 | + } | |
2246 | + | |
2247 | + | |
2248 | + // LPUSH | |
2249 | + for (int idx = 0; idx < 5000; idx++) { | |
2250 | + String[] retTmp = okuyamaClient.listLPush(listName, "Llistdata."+idx); | |
2251 | + | |
2252 | + if (!retTmp[0].equals("true")) { | |
2253 | + | |
2254 | + System.out.println("List create error3 =" + listName); | |
2255 | + System.out.println(retTmp[1]); | |
2256 | + errorFlg = true; | |
2257 | + } | |
2258 | + } | |
2259 | + | |
2260 | + // RPUSH | |
2261 | + for (int idx = 0; idx < 5000; idx++) { | |
2262 | + String[] retTmp = okuyamaClient.listRPush(listName, "Rlistdata."+idx); | |
2263 | + | |
2264 | + if (!retTmp[0].equals("true")) { | |
2265 | + | |
2266 | + System.out.println("List create error5 =" + listName); | |
2267 | + System.out.println(retTmp[1]); | |
2268 | + errorFlg = true; | |
2269 | + } | |
2270 | + } | |
2271 | + | |
2272 | + // RPOPテスト | |
2273 | + idxTest2 = 9999; | |
2274 | + for (long idx = 5000L; idx < 10000L; idx++) { | |
2275 | + | |
2276 | + String[] retTmp = okuyamaClient.listRPop(listName); | |
2277 | + if (!retTmp[0].equals("true")) { | |
2278 | + System.out.println("List create error11 =" + listName); | |
2279 | + System.out.println(retTmp[1]); | |
2280 | + errorFlg = true; | |
2281 | + } else { | |
2282 | + if (!retTmp[1].equals("Rlistdata."+(idxTest2-idx))) { | |
2283 | + System.out.println("List create error11-1 =" + listName); | |
2284 | + System.out.println(retTmp[1]); | |
2285 | + errorFlg = true; | |
2286 | + } | |
2287 | + } | |
2288 | + } | |
2289 | + | |
2290 | + // RPOPテスト | |
2291 | + for (long idx = 4999; idx > -1L; idx--) { | |
2292 | + | |
2293 | + String[] retTmp = okuyamaClient.listRPop(listName); | |
2294 | + if (!retTmp[0].equals("true")) { | |
2295 | + System.out.println("List error12 =" + listName); | |
2296 | + System.out.println(retTmp[1]); | |
2297 | + errorFlg = true; | |
2298 | + } else { | |
2299 | + if (!retTmp[1].equals("Llistdata."+(4999L-idx))) { | |
2300 | + System.out.println("List error12-1 =" + listName); | |
2301 | + System.out.println("RealData=[" + retTmp[1] + "]!=" + " TestPattern[Llistdata."+(4999L-idx)+"]"); | |
2302 | + errorFlg = true; | |
2303 | + } | |
2304 | + } | |
2305 | + } | |
2306 | + | |
2210 | 2307 | long endTime = new Date().getTime(); |
2211 | 2308 | System.out.println("List Method= " + (endTime - startTime) + " milli second"); |
2212 | 2309 |
@@ -645,7 +645,12 @@ | ||
645 | 645 | } else { |
646 | 646 | |
647 | 647 | logger.info("Recover Step - 17"); |
648 | + super.setDeadNode(nodeInfo, 1, null, true); | |
649 | + String[] diffMissNodeDt = nodeInfo.split(":"); | |
650 | + StatusUtil.setNodeStatusDt(diffMissNodeDt[0] + ":" + diffMissNodeDt[1], "Node Check Dead"); | |
651 | + | |
648 | 652 | throw new Exception("Diff Mode Off Error Ret=[" + diffModeOffRet + "]"); |
653 | + | |
649 | 654 | } |
650 | 655 | |
651 | 656 | logger.info("Recover Step - 18"); |
@@ -3427,8 +3427,8 @@ | ||
3427 | 3427 | key = (String)obj.getKey(); |
3428 | 3428 | try { |
3429 | 3429 | String decodeKey = new String(BASE64DecoderStream.decode(key.getBytes())); |
3430 | - if (decodeKey.indexOf("{imdst_") != 0) { | |
3431 | - pw.println(decodeKey); | |
3430 | + if (decodeKey.indexOf("{imdst_") != 0) { // TagとListは除外 | |
3431 | + pw.println(key); | |
3432 | 3432 | pw.flush(); |
3433 | 3433 | } |
3434 | 3434 | } catch(Exception ee){} |
@@ -9593,7 +9593,7 @@ | ||
9593 | 9593 | |
9594 | 9594 | /** |
9595 | 9595 | * List構造のサイズを取得する.<br> |
9596 | - * Listを事前に作成していない場合はerrorとなる<br> | |
9596 | + * Listを事前に作成していない場合はfalseとなる<br> | |
9597 | 9597 | * |
9598 | 9598 | * @param listNameStr List名 |
9599 | 9599 | * @return Object[] 要素1(取得成否):"true"=成功 or "false"=リスト無し or "error"=エラー, 要素2(成功の場合は結果(Long値)、falseの場合はnull、errorの場合はエラー等のメッセージ(String値)) |
@@ -22,7 +22,67 @@ | ||
22 | 22 | ・改修履歴 |
23 | 23 | ======================================================================================================== |
24 | 24 | [New - 新機能追加、不具合対応] |
25 | -[[リリース Ver 0.9.5 - (2013/04/XX)]] | |
25 | +[[リリース Ver 0.9.5 - (2013/09/20)]] | |
26 | + | |
27 | +■各DataNodeが保存しているKeyの一覧を取得する機能を追加 | |
28 | + DataNodeが持つ全てのKeyとTagの一覧を取得する機能をUtilClientに追加しました。 | |
29 | + 各DataNodeに接続し、当該機能を実行することでKeyの一覧が改行区切りで標準出力に出力される。 | |
30 | + 利用方法は以下 | |
31 | + 使い方) | |
32 | + $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.5.jar okuyama.imdst.client.UtilClient keylist datanodeip:5553 | |
33 | + 引数説明 | |
34 | + 1)keylist : 命令(固定) | |
35 | + 2)datanodeip:5553 : Keyを確認したい、DataNodeのIPアドレスとポート番号を"IP:Port番号"のフォーマットで指定 | |
36 | + ※注意:Tag名及び、List内のデータは出力されない。 | |
37 | + | |
38 | +■List型を追加 | |
39 | + 文字型を要素とする双方向型リストの機能を追加。先頭(左側)及び、末尾(右側)への値の追加が常に一定時間となり、先頭及び、末尾から値を削除しながら取り出すことが出来る | |
40 | + この操作もList内の要素数に関係なく常に同じ処理時間=O(1)となる。 | |
41 | + また、List内の要素番号(Index)指定での任意の位置からの値の取り出しが可能である。この命令の処理時間はリストの要素数に対して線形的に時間コスト=O(n)がかかる。 | |
42 | + Listの現在の要素数を取得することも可能でありこの命令の時間は要素数に関係なく常に一定=O(1)である。 | |
43 | + Listの要素数の最大は(2の63乗-1)である | |
44 | + 以下はOkuyamaClient上のそれぞれのメソッドのインターフェースである。 | |
45 | + | |
46 | + ・String[] createListStruct(String listName) | |
47 | + ->リスト作成メソッド。ここで指定したList名にて以降のメソッドはListへアクセスする | |
48 | + | |
49 | + ・String[] listLPush(String listName, String pushData) | |
50 | + ->指定したリストの先頭(左端)へ値を追加する。 | |
51 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
52 | + pushDataのサイズ上限はokuyamaのValueのMaxサイズである | |
53 | + | |
54 | + ・String[] listRPush(String listName, String pushData) | |
55 | + ->指定したリストの末尾(右端)へ値を追加する。 | |
56 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
57 | + pushDataのサイズ上限はokuyamaのValueのMaxサイズである | |
58 | + | |
59 | + ・String[] listIndex(String listName, long index) | |
60 | + ->指定したリストの指定した位置から要素を取得する。 | |
61 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
62 | + indexへは取得したい位置を指定。indexは0起算である。要素数<index、リスト作成前の場合結果無しが返る。 | |
63 | + | |
64 | + ・String[] listLPop(String listName) | |
65 | + ->指定したリストの先頭(左端)から値を取得後、削除を行う。 | |
66 | + リストは左に1つ詰めらる。 | |
67 | + 本メソッドはokuyama中でアトミックに実行されるため、 | |
68 | + 同一要素が複数のクライアントへ返ることはない。 | |
69 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
70 | + 要素がない場合、リスト作成前の場合結果無しが返る。 | |
71 | + | |
72 | + ・String[] listRPop(String listName) | |
73 | + ->指定したリストの末尾(右端)から値を取得後、削除を行う。 | |
74 | + リストは右に1つ詰めらる。 | |
75 | + 本メソッドはokuyama中でアトミックに実行されるため、 | |
76 | + 同一要素が複数のクライアントへ返ることはない。 | |
77 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
78 | + 要素がない場合、リスト作成前の場合結果無しが返る。 | |
79 | + | |
80 | + ・Object[] listLen(String listName) | |
81 | + ->指定したリストの要素数を返す。 | |
82 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
83 | + リスト作成前の場合結果無しが返る。 | |
84 | + | |
85 | + | |
26 | 86 | ■リカバリ機能を強化 |
27 | 87 | 従来リカバリ中にMainMasterNodeが停止するとDataNodeのリカバリ処理が中途半端に終了してしまう問題が報告されました。 |
28 | 88 | その問題への対処として、リカバリ途中のDataNodeを判断し再度切り離す機能を追加。また、リカバリが必要なDataNodeを起動する際に |
@@ -37,18 +97,7 @@ | ||
37 | 97 | 省略時:false |
38 | 98 | 設定例: -rr true |
39 | 99 | |
40 | -■各DataNodeが保存しているKeyの一覧を取得する機能を追加 | |
41 | - DataNodeが持つ全てのKeyとTagの一覧を取得する機能をUtilClientに追加しました。 | |
42 | - 各DataNodeに接続し、当該機能を実行することでKeyの一覧が開業区切りで標準出力に出力される。 | |
43 | - 利用方法は以下 | |
44 | - 使い方) | |
45 | - $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.5.jar okuyama.imdst.client.UtilClient keylist datanodeip:5553 | |
46 | - 引数説明 | |
47 | - 1)keylist : 命令(固定) | |
48 | - 2)datanodeip:5553 : Keyを確認したい、DataNodeのIPアドレスとポート番号を"IP:Port番号"のフォーマットで指定 | |
49 | - ※注意:Tagに関しては内部では1つのTagが複数個に分割されて保持されているため、複数個のTagが出力されることになるので注意が必要である。 | |
50 | 100 | |
51 | - | |
52 | 101 | ■MasterNodeがデータ復旧を行わないオプションを追加 |
53 | 102 | MasterNodeはMainMasterNodeに昇格した場合、停止中のDataNodeが復旧すると必ずリカバリを行なっていた。 |
54 | 103 | 本オプションを指定するとMainMasterNodeに昇格した場合もリカバリを行わなくなる。 |
@@ -78,6 +127,7 @@ | ||
78 | 127 | 省略時:チェックを行わない(デフォルト) |
79 | 128 | 設定例: -smnca 192.168.1.100,192.168.2.101 |
80 | 129 | |
130 | + | |
81 | 131 | ■起動時に指定されて起動オプションを起動ログに出力する機能を追加 |
82 | 132 | 以下のフォーマットで出力される。 |
83 | 133 | ---------------- |
@@ -85,7 +135,9 @@ | ||
85 | 135 | {パラメータ} |
86 | 136 | ---------------- |
87 | 137 | |
88 | - | |
138 | +■性能向上及び、バグ修正 | |
139 | + | |
140 | + | |
89 | 141 | ======================================================================================================== |
90 | 142 | [New - 新機能追加、不具合対応] |
91 | 143 | [[リリース Ver 0.9.4 - (2012/12/05)]] |
@@ -22,14 +22,69 @@ | ||
22 | 22 | ・改修履歴 |
23 | 23 | ======================================================================================================== |
24 | 24 | [New - 新機能追加、不具合対応] |
25 | -[[リリース Ver 0.9.5 - (2013/04/XX)]] | |
26 | -■データ構造としてリスト構造を追加 | |
27 | - Key-Value+Tag以外に新たにリスト構造を追加しました。 | |
25 | +[[リリース Ver 0.9.5 - (2013/09/20)]] | |
28 | 26 | |
27 | +■各DataNodeが保存しているKeyの一覧を取得する機能を追加 | |
28 | + DataNodeが持つ全てのKeyとTagの一覧を取得する機能をUtilClientに追加しました。 | |
29 | + 各DataNodeに接続し、当該機能を実行することでKeyの一覧が改行区切りで標準出力に出力される。 | |
30 | + 利用方法は以下 | |
31 | + 使い方) | |
32 | + $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.5.jar okuyama.imdst.client.UtilClient keylist datanodeip:5553 | |
33 | + 引数説明 | |
34 | + 1)keylist : 命令(固定) | |
35 | + 2)datanodeip:5553 : Keyを確認したい、DataNodeのIPアドレスとポート番号を"IP:Port番号"のフォーマットで指定 | |
36 | + ※注意:Tag名及び、List内のデータは出力されない。 | |
29 | 37 | |
38 | +■List型を追加 | |
39 | + 文字型を要素とする双方向型リストの機能を追加。先頭(左側)及び、末尾(右側)への値の追加が常に一定時間となり、先頭及び、末尾から値を削除しながら取り出すことが出来る | |
40 | + この操作もList内の要素数に関係なく常に同じ処理時間=O(1)となる。 | |
41 | + また、List内の要素番号(Index)指定での任意の位置からの値の取り出しが可能である。この命令の処理時間はリストの要素数に対して線形的に時間コスト=O(n)がかかる。 | |
42 | + Listの現在の要素数を取得することも可能でありこの命令の時間は要素数に関係なく常に一定=O(1)である。 | |
43 | + Listの要素数の最大は(2の63乗-1)である | |
44 | + 以下はOkuyamaClient上のそれぞれのメソッドのインターフェースである。 | |
30 | 45 | |
46 | + ・String[] createListStruct(String listName) | |
47 | + ->リスト作成メソッド。ここで指定したList名にて以降のメソッドはListへアクセスする | |
48 | + | |
49 | + ・String[] listLPush(String listName, String pushData) | |
50 | + ->指定したリストの先頭(左端)へ値を追加する。 | |
51 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
52 | + pushDataのサイズ上限はokuyamaのValueのMaxサイズである | |
53 | + | |
54 | + ・String[] listRPush(String listName, String pushData) | |
55 | + ->指定したリストの末尾(右端)へ値を追加する。 | |
56 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
57 | + pushDataのサイズ上限はokuyamaのValueのMaxサイズである | |
58 | + | |
59 | + ・String[] listIndex(String listName, long index) | |
60 | + ->指定したリストの指定した位置から要素を取得する。 | |
61 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
62 | + indexへは取得したい位置を指定。indexは0起算である。要素数<index、リスト作成前の場合結果無しが返る。 | |
63 | + | |
64 | + ・String[] listLPop(String listName) | |
65 | + ->指定したリストの先頭(左端)から値を取得後、削除を行う。 | |
66 | + リストは左に1つ詰めらる。 | |
67 | + 本メソッドはokuyama中でアトミックに実行されるため、 | |
68 | + 同一要素が複数のクライアントへ返ることはない。 | |
69 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
70 | + 要素がない場合、リスト作成前の場合結果無しが返る。 | |
71 | + | |
72 | + ・String[] listRPop(String listName) | |
73 | + ->指定したリストの末尾(右端)から値を取得後、削除を行う。 | |
74 | + リストは右に1つ詰めらる。 | |
75 | + 本メソッドはokuyama中でアトミックに実行されるため、 | |
76 | + 同一要素が複数のクライアントへ返ることはない。 | |
77 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
78 | + 要素がない場合、リスト作成前の場合結果無しが返る。 | |
79 | + | |
80 | + ・Object[] listLen(String listName) | |
81 | + ->指定したリストの要素数を返す。 | |
82 | + listNameへはcreateListStructメソッドにて作成したリスト名を指定 | |
83 | + リスト作成前の場合結果無しが返る。 | |
84 | + | |
85 | + | |
31 | 86 | ■リカバリ機能を強化 |
32 | - 従来リカバリ中にMainMasterNodeが停止するとDataNodeのリカバリ処理が中途半端に終了してしまう問題があった。 | |
87 | + 従来リカバリ中にMainMasterNodeが停止するとDataNodeのリカバリ処理が中途半端に終了してしまう問題が報告されました。 | |
33 | 88 | その問題への対処として、リカバリ途中のDataNodeを判断し再度切り離す機能を追加。また、リカバリが必要なDataNodeを起動する際に |
34 | 89 | 起動引数として"-rr true"として起動することで、起動前が障害で停止したことに関係なくリカバリが行わるようになった。 |
35 | 90 | 例えばMasterNodeを起動する前にDataNodeを起動してしまうと、そのDataNodeはデータリカバリ対象にならなかった。 |
@@ -43,19 +98,6 @@ | ||
43 | 98 | 設定例: -rr true |
44 | 99 | |
45 | 100 | |
46 | -■各DataNodeが保存しているKeyの一覧を取得する機能を追加 | |
47 | - DataNodeが持つ全てのKeyとTagの一覧を取得する機能をUtilClientに追加しました。 | |
48 | - 各DataNodeに接続し、当該機能を実行することでKeyの一覧が改行区切りで標準出力に出力される。 | |
49 | - 利用方法は以下 | |
50 | - 使い方) | |
51 | - $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.5.jar okuyama.imdst.client.UtilClient keylist datanodeip:5553 | |
52 | - 引数説明 | |
53 | - 1)keylist : 命令(固定) | |
54 | - 2)datanodeip:5553 : Keyを確認したい、DataNodeのIPアドレスとポート番号を"IP:Port番号"のフォーマットで指定 | |
55 | - | |
56 | - ※注意:Tagに関しては内部では1つのTagが複数個に分割されて保持されているため、複数個のTagが出力されることになるので注意が必要である。 | |
57 | - | |
58 | - | |
59 | 101 | ■MasterNodeがデータ復旧を行わないオプションを追加 |
60 | 102 | MasterNodeはMainMasterNodeに昇格した場合、停止中のDataNodeが復旧すると必ずリカバリを行なっていた。 |
61 | 103 | 本オプションを指定するとMainMasterNodeに昇格した場合もリカバリを行わなくなる。 |
@@ -84,8 +126,8 @@ | ||
84 | 126 | 意味:記述された全てのアドレスにicmpで到達出来ない場合に自身をshutdownする |
85 | 127 | 省略時:チェックを行わない(デフォルト) |
86 | 128 | 設定例: -smnca 192.168.1.100,192.168.2.101 |
87 | - | |
88 | 129 | |
130 | + | |
89 | 131 | ■起動時に指定されて起動オプションを起動ログに出力する機能を追加 |
90 | 132 | 以下のフォーマットで出力される。 |
91 | 133 | ---------------- |
@@ -92,6 +134,10 @@ | ||
92 | 134 | Boot arguments |
93 | 135 | {パラメータ} |
94 | 136 | ---------------- |
137 | + | |
138 | +■性能向上及び、バグ修正 | |
139 | + | |
140 | + | |
95 | 141 | ======================================================================================================== |
96 | 142 | [New - 新機能追加、不具合対応] |
97 | 143 | [[リリース Ver 0.9.4 - (2012/12/05)]] |