・AbstractMasterManagerHelperのcheckのスペルを修正
・KeyManagerHelper-appendValueを追加
・MasterManagerHelper-base64エンコード後の固定値作成、appendValue実装前
・ServerPreprocess- "-dwmqs" ImdstDefine.delayWriteMaxQueueingSizeを追加
・CoreValueMap-SerializeMapのMapの固定サイズを追加
・SystemUtil- diskAccessSyncに強制flushのメソッド追加
@@ -980,7 +980,7 @@ | ||
980 | 980 | } catch(Exception e) { |
981 | 981 | |
982 | 982 | retStrs[0] = "false"; |
983 | - logger.info("Node Ping Chekc Error Node Name = [" + nodeName + "] Port [" + port + "]"); | |
983 | + logger.info("Node Ping Check Error Node Name = [" + nodeName + "] Port [" + port + "]"); | |
984 | 984 | logger.info(e); |
985 | 985 | } finally { |
986 | 986 | try { |
@@ -516,7 +516,25 @@ | ||
516 | 516 | retParamBuf.append(ImdstDefine.keyHelperClientParamSep); |
517 | 517 | retParamBuf.append(retParams[2]); |
518 | 518 | break; |
519 | + case 18 : | |
519 | 520 | |
521 | + // Key値に既に登録済みの値がある場合は後続に指定のValueをAppendする | |
522 | + requestHashCode = clientParameterList[1]; // 対象のKey値 | |
523 | + transactionCode = clientParameterList[2]; // Transactionコード | |
524 | + requestDataNode = clientParameterList[3]; // Appendする値 | |
525 | + String addSep = clientParameterList[4]; // Appendする場合に利用するセパレータ | |
526 | + String existsCheck = clientParameterList[5];// 事前に値の存在チェックを行う指定 | |
527 | + | |
528 | + // メソッド呼び出し | |
529 | + retParams = this.appendValue(requestHashCode, requestDataNode, addSep, existsCheck, transactionCode); | |
530 | + retParamBuf.append(retParams[0]); | |
531 | + retParamBuf.append(ImdstDefine.keyHelperClientParamSep); | |
532 | + retParamBuf.append(retParams[1]); | |
533 | + retParamBuf.append(ImdstDefine.keyHelperClientParamSep); | |
534 | + retParamBuf.append(retParams[2]); | |
535 | + | |
536 | + break; | |
537 | + | |
520 | 538 | case 20 : |
521 | 539 | |
522 | 540 | // KeyMapManager Direct Connection |
@@ -1052,8 +1070,8 @@ | ||
1052 | 1070 | |
1053 | 1071 | // Key値で特定した値を渡された値で計算する |
1054 | 1072 | // 計算ルールは以下 |
1055 | - // 1.送信された値をintに変換する。変換できない場合はfalseで返す.<br> | |
1056 | - // 2.送信された値をintに変換する。変換した値を足しこむ.<br> | |
1073 | + // 1.送信された値をlongに変換する。変換できない場合はfalseで返す.<br> | |
1074 | + // 2.送信された値をlongに変換する。変換した値を足しこむ.<br> | |
1057 | 1075 | // 3.送信されたKey値で値がとれない。falseで返す.<br> |
1058 | 1076 | // 4.送信されたKey値で取得した値が数値ではない。0で更新.<br> |
1059 | 1077 | private String[] calcValue(String key, String dataNodeStr, String transactionCode) { |
@@ -1097,6 +1115,71 @@ | ||
1097 | 1115 | } |
1098 | 1116 | |
1099 | 1117 | |
1118 | + // KeyとDataNode値を既存の値に付加する | |
1119 | + // データが事前に存在するかどうかをチェックすることが可能 | |
1120 | + // existsCheck="1"チェックする、existsCheck="2"チェックしない | |
1121 | + // 登録後の値が長さの規定値を超える場合エラーとなる | |
1122 | + // | |
1123 | + private String[] appendValue(String key, String dataNodeStr, String addSep, String existsCheck, String transactionCode) { | |
1124 | + //logger.debug("KeyManagerHelper - appendValue - start"); | |
1125 | + String[] retStrs = new String[3]; | |
1126 | + try { | |
1127 | + if (dataNodeStr.length() < setDatanodeMaxSize) { | |
1128 | + if(!this.keyMapManager.checkError()) { | |
1129 | + | |
1130 | + // 事前に存在チェックを行う場合 | |
1131 | + if (existsCheck.equals("1")) { | |
1132 | + if (this.keyMapManager.containsKeyPair(key)) { | |
1133 | + retStrs[0] = "18"; | |
1134 | + retStrs[1] = "false"; | |
1135 | + retStrs[2] = "A value does not exist"; | |
1136 | + return retStrs; | |
1137 | + } | |
1138 | + } | |
1139 | + | |
1140 | + // 付加処理を行う | |
1141 | + int appendRet = this.keyMapManager.appendValue(key, dataNodeStr, addSep, transactionCode); | |
1142 | + if(appendRet == 0) { | |
1143 | + | |
1144 | + retStrs[0] = "18"; | |
1145 | + retStrs[1] = "true"; | |
1146 | + retStrs[2] = "OK"; | |
1147 | + } else if (appendRet == 1){ | |
1148 | + | |
1149 | + retStrs[0] = "18"; | |
1150 | + retStrs[1] = "false"; | |
1151 | + retStrs[2] = "NG:Max Data Size Over"; | |
1152 | + } else { | |
1153 | + | |
1154 | + retStrs[0] = "18"; | |
1155 | + retStrs[1] = "false"; | |
1156 | + retStrs[2] = "NG:Other Error"; | |
1157 | + } | |
1158 | + } else { | |
1159 | + | |
1160 | + retStrs[0] = "18"; | |
1161 | + retStrs[1] = "false"; | |
1162 | + retStrs[2] = "NG:KeyMapManager - appendValue - CheckError - NG"; | |
1163 | + } | |
1164 | + } else { | |
1165 | + | |
1166 | + retStrs[0] = "18"; | |
1167 | + retStrs[1] = "false"; | |
1168 | + retStrs[2] = "NG:Max Data Size Over"; | |
1169 | + } | |
1170 | + } catch (BatchException be) { | |
1171 | + | |
1172 | + logger.debug("KeyManagerHelper - appendValue - Error", be); | |
1173 | + retStrs[0] = "18"; | |
1174 | + retStrs[1] = "false"; | |
1175 | + retStrs[2] = "NG:KeyManagerHelper - appendValue - Exception - " + be.toString(); | |
1176 | + } | |
1177 | + //logger.debug("KeyManagerHelper - appendValue - end"); | |
1178 | + return retStrs; | |
1179 | + } | |
1180 | + | |
1181 | + | |
1182 | + | |
1100 | 1183 | // KeyでDataNode値を取得する |
1101 | 1184 | private String[] getDatanode(String key) { |
1102 | 1185 | //logger.debug("KeyManagerHelper - getDatanode - start"); |
@@ -96,6 +96,10 @@ | ||
96 | 96 | // クライアントからのinitメソッド用返却パラメータ |
97 | 97 | private static String[] initReturnParam = {"0", "true", new Integer(ImdstDefine.saveDataMaxSize).toString()}; |
98 | 98 | |
99 | + // valueのbase64でエンコード後の最大サイズ | |
100 | + private int encodeMaxDataSize = new Double(ImdstDefine.saveDataMaxSize * 1.38).intValue(); | |
101 | + | |
102 | + | |
99 | 103 | // 検索Index作成用の辞書 |
100 | 104 | private static ConcurrentHashMap searchIndexDictionaryMap = new ConcurrentHashMap(500, 480, 1024); |
101 | 105 | private static String[] searchIndexDictionaryList = new String[0]; |
@@ -438,6 +442,11 @@ | ||
438 | 442 | // 取得と同時に有効日付Update |
439 | 443 | retParams = this.getValueAndUpdateExpireTime(clientParameterList[1]); |
440 | 444 | break; |
445 | + case 18 : | |
446 | + | |
447 | + // 値の付加 | |
448 | + //retParams = this.appendValue(clientParameterList[1], clientParameterList[2], clientParameterList[3], clientParameterList[4], clientParameterList[54]); | |
449 | + break; | |
441 | 450 | case 22 : |
442 | 451 | |
443 | 452 | // 複数Key値を指定することで、紐付くValueを一度に取得する(memcachedのmget) |
@@ -1318,9 +1327,11 @@ | ||
1318 | 1327 | // N-GramのNを決めるループ |
1319 | 1328 | |
1320 | 1329 | for (int typeIdx = indexMinLength; typeIdx < indexLength; typeIdx++) { |
1330 | + | |
1321 | 1331 | try { |
1322 | 1332 | // 文字列の最後まで繰り返すループ |
1323 | 1333 | for (int i = 0; i < ImdstDefine.saveDataMaxSize; i++) { |
1334 | + | |
1324 | 1335 | String checkStr = oldRealKeyStr.substring(i, i+typeIdx); |
1325 | 1336 | |
1326 | 1337 | if(SystemUtil.checkNoIndexCharacter(checkStr)) { |
@@ -1369,6 +1380,7 @@ | ||
1369 | 1380 | try { |
1370 | 1381 | |
1371 | 1382 | for (int i = 0; i < ImdstDefine.saveDataMaxSize; i++) { |
1383 | + | |
1372 | 1384 | String checkStr = realKeyStr.substring(i, i+typeIdx); |
1373 | 1385 | |
1374 | 1386 | if(SystemUtil.checkNoIndexCharacter(checkStr)) { |
@@ -7441,7 +7453,7 @@ | ||
7441 | 7453 | // Value値の長さをチェック |
7442 | 7454 | private boolean checkValueLength(String value) { |
7443 | 7455 | if (value == null) return false; |
7444 | - if (value.length() >= new Double(ImdstDefine.saveDataMaxSize * 1.38).intValue()) return false; | |
7456 | + if (value.length() >= this.encodeMaxDataSize) return false; | |
7445 | 7457 | return true; |
7446 | 7458 | } |
7447 | 7459 | } |
\ No newline at end of file |
@@ -653,7 +653,7 @@ | ||
653 | 653 | private long nowIterationFpPosition = 0; |
654 | 654 | |
655 | 655 | // 遅延書き込み依頼用のQueueの最大サイズ |
656 | - private int delayWriteQueueSize = 8000; | |
656 | + private volatile int delayWriteQueueSize = ImdstDefine.delayWriteMaxQueueingSize; | |
657 | 657 | |
658 | 658 | // 遅延書き込み依頼用のQueue |
659 | 659 | private ArrayBlockingQueue delayWriteQueue = new ArrayBlockingQueue(delayWriteQueueSize); |
@@ -816,13 +816,18 @@ | ||
816 | 816 | try { |
817 | 817 | |
818 | 818 | // Key値の場所を特定する |
819 | +long start1 = System.nanoTime(); | |
819 | 820 | long[] dataLineNoRet = this.getLinePoint(key, raf); |
821 | +long end1 = System.nanoTime(); | |
820 | 822 | |
821 | 823 | if (dataLineNoRet[0] == -1) { |
822 | - | |
824 | +long start2 = System.nanoTime(); | |
823 | 825 | wr.write(buf.toString()); |
824 | 826 | SystemUtil.diskAccessSync(wr); |
825 | - | |
827 | +long end2 = System.nanoTime(); | |
828 | + if (((end2 - start2) > (1000 * 1000 * 10)) || ((end1 - start1) > (1000 * 1000 * 10))) { | |
829 | + System.out.println("1=" + ((end1 - start1) / 1000 /1000) + " 2=" + ((end2 - start2) / 1000 /1000)); | |
830 | + } | |
826 | 831 | // The size of an increment |
827 | 832 | this.totalSize.getAndIncrement(); |
828 | 833 | } else { |
@@ -921,11 +926,15 @@ | ||
921 | 926 | } |
922 | 927 | //end1 = System.nanoTime(); |
923 | 928 | //start2 = System.nanoTime(); |
929 | + if (this.delayWriteQueue.size() > (delayWriteQueueSize - 2000)) Thread.sleep(10); | |
930 | + if (this.delayWriteQueue.size() > (delayWriteQueueSize - 1000)) Thread.sleep(20); | |
931 | + | |
924 | 932 | this.delayWriteQueue.put(instructionObj); |
925 | 933 | //end2 = System.nanoTime(); |
926 | 934 | this.delayWriteRequestCount++; |
927 | 935 | |
928 | - if (this.delayWriteQueue.size() > (delayWriteQueueSize - 500)) Thread.sleep(50); | |
936 | + if (this.delayWriteQueue.size() > (delayWriteQueueSize - 500)) Thread.sleep(100); | |
937 | + if ((this.delayWriteRequestCount % 10000) == 0) System.out.println("NowQueueSize=" + this.delayWriteQueue.size()); | |
929 | 938 | //if (ImdstDefine.fileBaseMapTimeDebug) { |
930 | 939 | // System.out.println("Set 1="+(end1 - start1) + " 2="+(end2 - start2)); |
931 | 940 | //} |
@@ -403,9 +403,8 @@ | ||
403 | 403 | if (deletedLine == null) { |
404 | 404 | |
405 | 405 | this.bw.write(writeBuf.toString()); |
406 | + SystemUtil.diskAccessSync(this.bw, false); | |
406 | 407 | |
407 | - SystemUtil.diskAccessSync(this.bw); | |
408 | - | |
409 | 408 | this.lineCount++; |
410 | 409 | |
411 | 410 | if (mapValueInSize) { |
@@ -160,6 +160,8 @@ | ||
160 | 160 | private int memoryLimitSize = -1; |
161 | 161 | private String[] virtualStorageDirs = null; |
162 | 162 | |
163 | + | |
164 | + | |
163 | 165 | // 初期化メソッド |
164 | 166 | // Transactionを管理する場合に呼び出す |
165 | 167 | public KeyMapManager(String keyMapFilePath, String workKeyMapFilePath, boolean workFileMemory, int keySize, boolean dataMemory, boolean dataManage) throws BatchException { |
@@ -665,7 +667,6 @@ | ||
665 | 667 | |
666 | 668 | if (!blocking) { |
667 | 669 | try { |
668 | - | |
669 | 670 | //logger.debug("setKeyPair - synchronized - start"); |
670 | 671 | // このsynchroの方法は正しくないきがするが。。。 |
671 | 672 | synchronized(this.parallelSyncObjs[((key.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { |
@@ -677,10 +678,18 @@ | ||
677 | 678 | } |
678 | 679 | } |
679 | 680 | |
681 | + | |
680 | 682 | String data = null; |
683 | + String[] keyNoddes = keyNode.split(ImdstDefine.setTimeParamSep); | |
681 | 684 | |
682 | - boolean containsKeyRet = containsKeyPair(key); | |
685 | + if (keyNoddes.length > 1) { | |
686 | + data = keyNoddes[0] + ImdstDefine.setTimeParamSep + keyNoddes[1]; | |
687 | + } else { | |
688 | + data = keyNoddes[0] + ImdstDefine.setTimeParamSep + "0"; | |
689 | + } | |
683 | 690 | |
691 | + /*boolean containsKeyRet = containsKeyPair(key); | |
692 | + | |
684 | 693 | if (!containsKeyRet) { |
685 | 694 | |
686 | 695 | String[] keyNoddes = keyNode.split(ImdstDefine.setTimeParamSep); |
@@ -700,6 +709,7 @@ | ||
700 | 709 | |
701 | 710 | data = keyNoddes[0] + ImdstDefine.setTimeParamSep + (System.nanoTime() + 1); |
702 | 711 | } else { |
712 | +System.out.println("aaaaaaaaaaaaaaaa[" + keyNode + "]"); | |
703 | 713 | |
704 | 714 | data = keyNode; |
705 | 715 | } |
@@ -708,7 +718,7 @@ | ||
708 | 718 | data = keyNoddes[0] + ImdstDefine.setTimeParamSep + "0"; |
709 | 719 | } |
710 | 720 | |
711 | - } | |
721 | + }*/ | |
712 | 722 | |
713 | 723 | |
714 | 724 |
@@ -1828,6 +1838,127 @@ | ||
1828 | 1838 | } |
1829 | 1839 | |
1830 | 1840 | |
1841 | + /** | |
1842 | + * キーを指定することで紐付くValueの後ろに渡されたValueを付加する.<br> | |
1843 | + * 値が存在しない場合は新規の値としてただ登録される.<br> | |
1844 | + * | |
1845 | + * @param key キー値 | |
1846 | + * @param appendValue 付加する値(base64でエンコード済み) | |
1847 | + * @param appendSep 値が既に存在する場合にセパレータとして付加する値(ブランク指定(B)の場合は何も付加されない) | |
1848 | + * @param transactionCode | |
1849 | + * @return boolean 成否 0=成功、1=サイズオーバによりエラー | |
1850 | + */ | |
1851 | + public int appendValue(String key, String appendValue, String appendSep, String transactionCode) throws BatchException { | |
1852 | + int ret = -1; | |
1853 | + String data = null; | |
1854 | + | |
1855 | + if (!blocking) { | |
1856 | + try { | |
1857 | + | |
1858 | + //logger.debug("appendValue - synchronized - start"); | |
1859 | + // このsynchroの方法は正しくないきがするが。。。 | |
1860 | + synchronized(this.parallelSyncObjs[((key.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { | |
1861 | + boolean containsKeyRet = containsKeyPair(key); | |
1862 | + if (containsKeyRet) { | |
1863 | + | |
1864 | + String tmp = keyMapObjGet(key); | |
1865 | + String[] keyNoddes = tmp.split(ImdstDefine.setTimeParamSep); | |
1866 | + String setDataStr = null; | |
1867 | + | |
1868 | + if (tmp != null) { | |
1869 | + | |
1870 | + String targetData = keyNoddes[0]; | |
1871 | + | |
1872 | + if (keyNoddes[0].indexOf(",") != -1) { | |
1873 | + String[] workSplitData = keyNoddes[0].split(","); | |
1874 | + targetData = workSplitData[0]; | |
1875 | + } | |
1876 | + | |
1877 | + if (targetData.equals(ImdstDefine.imdstBlankStrData)) { | |
1878 | + if (appendValue.equals(ImdstDefine.imdstBlankStrData)) { | |
1879 | + setDataStr = appendValue; | |
1880 | + } else { | |
1881 | + setDataStr = new String(BASE64DecoderStream.decode(appendValue.getBytes())); | |
1882 | + } | |
1883 | + } else { | |
1884 | + | |
1885 | + if (appendSep.equals(ImdstDefine.imdstBlankStrData)) { | |
1886 | + appendSep = ""; | |
1887 | + } else { | |
1888 | + appendSep = new String(BASE64DecoderStream.decode(appendSep.getBytes())); | |
1889 | + } | |
1890 | + String nowData = new String(BASE64DecoderStream.decode(targetData.getBytes())); | |
1891 | + setDataStr = nowData + appendSep + appendValue; | |
1892 | + } | |
1893 | + | |
1894 | + // 登録前に長さをチェック | |
1895 | + if (ImdstDefine.saveDataMaxSize < ((byte[])setDataStr.getBytes()).length) { | |
1896 | + return 1; | |
1897 | + } | |
1898 | + | |
1899 | + if (keyNoddes.length > 1) { | |
1900 | + | |
1901 | + data = new String(BASE64EncoderStream.encode(setDataStr.getBytes())) + ImdstDefine.setTimeParamSep + (Long.parseLong(keyNoddes[1]) + 1); | |
1902 | + } else { | |
1903 | + | |
1904 | + data = new String(BASE64EncoderStream.encode(setDataStr.getBytes())) + ImdstDefine.setTimeParamSep + "0"; | |
1905 | + } | |
1906 | + | |
1907 | + } | |
1908 | + } | |
1909 | + | |
1910 | + if (data != null) { | |
1911 | + // 登録 | |
1912 | + keyMapObjPut(key, data); | |
1913 | + | |
1914 | + // データ操作履歴ファイルに追記 | |
1915 | + if (this.workFileMemory == false) { | |
1916 | + synchronized(this.lockWorkFileSync) { | |
1917 | + | |
1918 | + if (this.workFileFlushTiming) { | |
1919 | + | |
1920 | + this.bw.write(new StringBuilder(ImdstDefine.stringBufferSmall_2Size).append("+").append(KeyMapManager.workFileSeq).append(key).append(KeyMapManager.workFileSeq).append(data).append(KeyMapManager.workFileSeq).append(JavaSystemApi.currentTimeMillis).append(KeyMapManager.workFileSeq).append(KeyMapManager.workFileEndPoint).append("\n").toString()); | |
1921 | + SystemUtil.diskAccessSync(this.bw); | |
1922 | + this.checkTransactionLogWriterLimit(this.tLogWriteCount.incrementAndGet()); | |
1923 | + } else { | |
1924 | + | |
1925 | + this.dataTransactionFileFlushDaemon.addDataTransaction(new StringBuilder(ImdstDefine.stringBufferSmall_2Size).append("+").append(KeyMapManager.workFileSeq).append(key).append(KeyMapManager.workFileSeq).append(data).append(KeyMapManager.workFileSeq).append(JavaSystemApi.currentTimeMillis).append(KeyMapManager.workFileSeq).append(KeyMapManager.workFileEndPoint).append("\n").toString()); | |
1926 | + } | |
1927 | + } | |
1928 | + } | |
1929 | + | |
1930 | + // Diffモードでかつsync後は再度モードを確認後、addする | |
1931 | + if (this.diffDataPoolingFlg) { | |
1932 | + synchronized (diffSync) { | |
1933 | + if (this.diffDataPoolingFlg) { | |
1934 | + | |
1935 | + this.diffDataPoolingListForFileBase.add("+" + KeyMapManager.workFileSeq + key + KeyMapManager.workFileSeq + data); | |
1936 | + } | |
1937 | + } | |
1938 | + } | |
1939 | + | |
1940 | + // データの書き込みを指示 | |
1941 | + this.writeMapFileFlg = true; | |
1942 | + ret = 0; | |
1943 | + } | |
1944 | + } | |
1945 | + | |
1946 | + //logger.debug("appendValue - synchronized - end"); | |
1947 | + } catch (BatchException be) { | |
1948 | + logger.error("appendValue - InnerError", be); | |
1949 | + throw be; | |
1950 | + } catch (Exception e) { | |
1951 | + e.printStackTrace(); | |
1952 | + logger.error("appendValue - Error"); | |
1953 | + blocking = true; | |
1954 | + StatusUtil.setStatusAndMessage(1, "appendValue - Error [" + e.getMessage() + "]"); | |
1955 | + throw new BatchException(e); | |
1956 | + } | |
1957 | + } | |
1958 | + return ret; | |
1959 | + } | |
1960 | + | |
1961 | + | |
1831 | 1962 | // キーを指定することでキーが存在するかを返す |
1832 | 1963 | public boolean containsKeyPair(String key) { |
1833 | 1964 | boolean ret = false; |
@@ -366,6 +366,17 @@ | ||
366 | 366 | * @throw Exception |
367 | 367 | */ |
368 | 368 | public static int diskAccessSync(Object fileAccessor) throws Exception { |
369 | + return diskAccessSync(fileAccessor, true); | |
370 | + } | |
371 | + | |
372 | + /** | |
373 | + * Diskへの書き込みをSyncする.<br> | |
374 | + * | |
375 | + * @param fileAccessor FileアクセスStream | |
376 | + * @param type Streamの種類 1=BufferedWriter 2=CustomBufferedWriter | |
377 | + * @throw Exception | |
378 | + */ | |
379 | + public static int diskAccessSync(Object fileAccessor, boolean auto) throws Exception { | |
369 | 380 | try { |
370 | 381 | int type = 0; |
371 | 382 | int syncIdx = 0; |
@@ -387,6 +398,10 @@ | ||
387 | 398 | |
388 | 399 | |
389 | 400 | if (type == 1) { |
401 | + if (auto == false) { | |
402 | + ((BufferedWriter)fileAccessor).flush(); | |
403 | + return 0; | |
404 | + } | |
390 | 405 | synchronized (diskAccessSync[syncIdx]) { |
391 | 406 | ((BufferedWriter)fileAccessor).flush(); |
392 | 407 | } |
@@ -53,7 +53,11 @@ | ||
53 | 53 | mainMap = new PartialConcurrentHashMap(size, upper, multi, virtualStoreDirs); |
54 | 54 | } else { |
55 | 55 | |
56 | - if (size > 19999999) { | |
56 | + if (size > 100000000) { | |
57 | + multi = new Double(size * 0.1).intValue(); | |
58 | + } else if (size > 59999999) { | |
59 | + multi = 4000000; | |
60 | + } else if (size > 19999999) { | |
57 | 61 | multi = 2000000; |
58 | 62 | } else if (size > 9999999) { |
59 | 63 | multi = 1000000; |
@@ -87,8 +91,11 @@ | ||
87 | 91 | System.out.println("ConcurrentHashMap Use"); |
88 | 92 | mainMap = new ConcurrentHashMap(size, upper, multi); |
89 | 93 | } else { |
90 | - | |
91 | - if (size > 19999999) { | |
94 | + if (size > 100000000) { | |
95 | + multi = new Double(size * 0.1).intValue(); | |
96 | + } else if (size > 59999999) { | |
97 | + multi = 4000000; | |
98 | + } else if (size > 19999999) { | |
92 | 99 | multi = 2000000; |
93 | 100 | } else if (size > 9999999) { |
94 | 101 | multi = 1000000; |
@@ -11,7 +11,7 @@ | ||
11 | 11 | */ |
12 | 12 | public class ImdstDefine { |
13 | 13 | |
14 | - public static final String okuyamaVersion = "VERSION okuyama-0.9.0"; | |
14 | + public static final String okuyamaVersion = "VERSION okuyama-0.9.1"; | |
15 | 15 | |
16 | 16 | // -- KeyMapファイルに関係する定数 ------------------------------------------------- |
17 | 17 | // KeyNodeのWorkファイルでのセパレータ |
@@ -290,7 +290,7 @@ | ||
290 | 290 | public volatile static String serializerClassName = null; |
291 | 291 | |
292 | 292 | // 保存出来る、Key、Tag、Valueの最大長 |
293 | - // Valueの最大長 | |
293 | + // Valueの最大長(base64エンコード前) | |
294 | 294 | public volatile static int saveDataMaxSize = 1572864; |
295 | 295 | |
296 | 296 | // 大きいデータ保存する場合は以下の数値の用に最も保存する回数の多いサイズに合わせると |
@@ -297,7 +297,7 @@ | ||
297 | 297 | // レスポンスが向上す。下記の場合は512KB |
298 | 298 | //public static final int saveDataMaxSize =524288; |
299 | 299 | |
300 | - // Key,Tagの最大長 | |
300 | + // Key,Tagの最大長(base64エンコード後) | |
301 | 301 | public volatile static int saveKeyMaxSize = 468; |
302 | 302 | |
303 | 303 | // 共通のデータファイルに書き出す最大サイズ |
@@ -459,6 +459,9 @@ | ||
459 | 459 | public static final long workFileChangeNewFileSize = 1610612736; |
460 | 460 | |
461 | 461 | |
462 | + // DelayWriteCoreFileBaseKeyMapがディスクに書きだすデータをどれだけメモリにキューイングするかのレコード数 | |
463 | + public volatile static int delayWriteMaxQueueingSize = 8000; | |
464 | + | |
462 | 465 | // ファイルシステムへの同時アクセス係数 |
463 | 466 | public volatile static int parallelDiskAccess = 49; |
464 | 467 |
@@ -28,7 +28,9 @@ | ||
28 | 28 | * -svic ImdstDefine.startVaccumInvalidCount /有効期限切れのデータのクリーニングを行う間隔(分/単位)<br> |
29 | 29 | * -csf ImdstDefine.calcSizeFlg /保存データの合計サイズを計算するかどうかの指定 true=計算する/false=計算しない 計算しない方が高速に値の登録が可能<br> |
30 | 30 | * -rdvp ImdstDefine.reuseDataFileValuePositionFlg /完全ファイルモードでDataNodeを起動した際に値の更新時にデータファイル上のValueの場所を再利用するかの設定.true/再利用する, false/再利用しない |
31 | - * | |
31 | + * -dwmqs ImdstDefine.delayWriteMaxQueueingSize /DelayWriteCoreFileBaseKeyMapのメモリ上へのキューイングレコード数 | |
32 | + * | |
33 | + | |
32 | 34 | * <br> |
33 | 35 | * @author T.Okuyama |
34 | 36 | * @license GPL(Lv3) |
@@ -232,6 +234,17 @@ | ||
232 | 234 | } |
233 | 235 | } |
234 | 236 | |
237 | + | |
238 | + // -dwmqs | |
239 | + if (startOptions[i].trim().equals("-dwmqs")) { | |
240 | + if (startOptions.length > (i+1)) { | |
241 | + try { | |
242 | + ImdstDefine.delayWriteMaxQueueingSize = Integer.parseInt(startOptions[i+1]); | |
243 | + } catch(NumberFormatException nfe) { | |
244 | + } | |
245 | + } | |
246 | + } | |
247 | + | |
235 | 248 | } |
236 | 249 | } |
237 | 250 | } catch (Exception e) { |