====== I^UKey-ValueXgA uokuyamav=====================================================
JavaŎꂽAi^UKey-ValueXgAuokuyamav
_E[h肪Ƃ܂B

N@͖{eLXǵu@\ƃTv̎s@vB
  Ɂuokuyama\}.gifvQƂB
  blog:http://d.hatena.ne.jp/okuyamaoo/


EC
========================================================================================================
[New - @\P]
[[[X Ver 0.6.5 - (2010/05/30)]]
  Vacuum̎擾Ao^A폜̏płpɉC
    ]Vacuum͎擾Ao^A폜͏ubN悤ɂȂĂ(͑҂ԂɂȂ)
    ̃ubNԂ啝ɍ팸悤ɉCB
    ]ȂVacuumn܂ƏInubNĂApo悤(҂Ȃ)Ȃ
    okuyamȃgpԂɑ΂AX[vbgコB
    VacuumDataNode.properties"KeyManagerJob1.dataMemory=true"̗pvaluet@CɕۑĂ
      ꍇ̂ݗLƂȂB

  epropertiest@CɃRgǉ
    MasterNode.propertiesADataNode.propertiesATransactionNode.propertiesɃRg啝ɒǋL
    ܂ŃRgȂĐ\󂠂܂łB

  ReadMe.txtAReadMe-UTF.txt[@\ƃTv̎s@]A[Tv̎s@]ǋL
    TransactionNode̎gp@AMemcached݊ł̋N@ANCAg̎gp\\bhC
    ULockAsetNewValue(memcacheadd)̎gpTvǋL

========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.6.4 - (2010/05/21)]]
  f[^̕ۑKeylۑ悤ɕύX
    ]Keyl琶HashlۑĂȂႢ\ł͂邪Փ˂N\ׁA
    ʂ̃f[^ۑɌȂ̂ŁAKeylƂĕۑ悤ɕύXB
    Keylɂ̐tB(2048byte)
    ̕ύXɂϐ\󂠂܂񂪁A]o[Wł̃f[^͎gpłȂȂ܂B

  AB
    

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.3 - (2010/05/19)]]
  f[^m[hmemcachẽm[hƂėp\
    }X^[m[hNɒڃf[^m[hmemcachẽm[hƂėp\B
    ȉ̂悤ɐݒύXexecDataNode.batsmemcacheNCAgŃANZXłB

    ݒt@CDataNode.properties25s
    ----------------------------------
    KeyManagerHelper.Init=
              LLeɕύX
    KeyManagerHelper.Init=memcache
    ----------------------------------
    ƂċNmemcachevgRŉb\ƂȂB
    Ή\bh̓}X^[m[hmemcache[hƂċNꍇƓlƂȂB
    (Eset, Eget, Eadd, Edelete)(flagɑΉ)

    t@Cւ̃f[^i\
    ݒt@CDataNode.properties30sځA31s
    ----------------------------------
    KeyManagerJob1.memoryMode=false       
    KeyManagerJob1.dataMemory=true
    ----------------------------------
    L̐ݒŃgUNVO͎cAo^ꂽf[^̓ɕێ
    trueɂƊS[h(łɉғ)(P̂memcacheƂقړx̏xo)
    falseɂƊSt@C[h(łʂ̃f[^(ValuẽTCY)ێ\)

    ftHgł2560oCgvalueTCY̍őlƂȂ̂ŁAsrc\org\imdst\util\ImdstDefine.java150sڂ
    ύXcompile.batsRpCƋełf[^TCYύXłB


  KeylHashl߂郍WbNύX
    okuyamał͓o^ꂽKeyl̓nbVl߂Ă̒lۂ̓o^ɎgpĂ邪A
    ̒l̐WbNAnbVlU悤ɕύX
    ̕ύXɂA܂œo^f[^͑SĔjKv܂B
    ̕ύX󂯓Ȃꍇsrc\org\imdst\helper\MasterManagerHelper.java2660sځA2661sڂ
    ȉ̂悤ɕύXAcompile.batsăRpCsB
    --------------------------------------------------------------------
	private int hashCodeCnv(String str) {
		return new HashCodeBuilder(17,37).append(str).toHashCode();
		//return str.hashCode();
	}
               ύX(RgAEgւ)
	private int hashCodeCnv(String str) {
		//return new HashCodeBuilder(17,37).append(str).toHashCode();
		return str.hashCode();
	}
    --------------------------------------------------------------------


  f[^o^\bhsetValuȅx20%
    f[^m[hAX[uf[^m[hNsetValuesۂ̏x
    20%Bf[^m[hւ̓o^NGXgMɃX[uf[^m[hւ̑M悤ɏCB


  oOFix
    

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.2 - (2010/05/09)]]
  MemcahevgR[ḧȉ̏Ή
    1.memcachẽ\bhładdɑΉ
      o^f[^̏ꍇ̂ݓo^\memcacheaddR}hɑΉ

    2.memcachẽ\bhłdeleteɑΉ
      memcacheR}hłf[^폜pR}hdeleteɑΉ

    3.memcacheflago^ɑΉ
      memcacheR}hsetAaddɎw肷flagɑΉ
      getɓo^flagԋp

  f[^m[hԂ̃f[^Jo[̃f[^]ꕔύX
    ]̓m[h_ẼJo[ɃvP[Vm[h1ʐMőSĂ̓o^f[^擾ĂA
    ł͑傫ȃf[^o^ĂꍇɁAMAMŃɂ̂肫炸ɃJo[Ɏsꍇ
    ߁Agp\ȃ̎cʂmFȂAf[^𕪊ē]Jo[悤ɕύX
    f[^̕ۑł͂Ȃt@CɂĂꍇ́Aɂ̖͔\B

  PHPpNCAg(OkuyamaClient.class.php)getByteValue\bhǉ
    JavapNCAgœo^oCgf[^(setByteValueœo^f[^)擾ۂɎgp

  oOFix

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.1 - (2010/04/21)]]
  f[^݂Ȃꍇ̂ݕۑł郁\bhǉ
    +o^̃L[lłꍇ̂ݓo^\ƂȂAɓo^ς݂̏ꍇ͓o^łȂB

     *o^̏ꍇ̂ݓo^\ȃ\bh͈ȉłB
      ENCAg̃\bh:setNewValue
      E1:Keyl
      E2:Valuel
      E߂l:String[] vf1(f[^L):"true" or "false",vf2(s̓bZ[W):"bZ[W"

      ENCAg̃\bh:setNewValue
      E1:String Keyl
      E2:String[] taglz
      E3:String Valuel
      E߂l:String[] vf1(f[^L):"true" or "false",vf2(s̓bZ[W):"bZ[W"

  NCAgڑɕۑoőf[^TCYMasterNode擾悤ɕύX

  oOFix

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.0 - (2010/04/08)]]
  UbN@\ǉ
    +Cӂ̃f[^bN@\ǉB
    +UbN@\̓}X^[m[hpݒt@CłAMasterNode.properties9sڂ"TransactionMode=true"
     bN@\gp\ƂȂB
     ܂A72sڂ"TransactionManagerInfo=127.0.0.1:6655"TransactionManagerm[hw肷Kv
     āATransactionManagerm[hNĂKv邽߁AexecTransactionNode.batŋNB
     UbN@\gpꍇ́ASẴ}X^[m[h"TransactionMode=true"ŋNĂKvB
     ̐ݒt@C͑SĕUbN@\ŋNݒƂȂB
     execMasterNodeMemcached.bat͕UbN@\AmemcachevgR[hŋNB
     ܂A]̕UbN@\ȂŋNꍇ́A"TransactionMode=false"ƂexecMasterNode.batsB

    +dg݂ƂẮAClient烍bN擾˗sꍇATransactionManagerm[hɎw肵Keyl
     bNグB̍ہAłɕClient瓯KeylŃbN擾Ăꍇ́A
     w肵Ԃ̊ԁAbN̂҂A擾݂B
     bNꂽlɑ΂āAset,removeñANZXsꍇ́ATransactionManagerm[hɑ΂ĊY
     KeylANGXg𔭍sClientȊO烍bNĂ邩₢킹āAʃNCAgbN
     Ăꍇ́AbN̂҂B
     NCAgbNẮAbNȂꍇ́Â܂܏𑱍sB
     bÑ[XłB
     ȂAUbN@\Lɂꍇ́AƔ1ʐM邽߁Ax͗B
     ܂ATransactionManagerm[hSPOFƂȂ邪A@\ĂȂꍇ͖ĉғ邪A
     x͋ɒ[ɗ򉻂B
     ASPOFƂȂȂ悤ɉP\łB

    +ȉ͐ƂȂ
     *bN{f[^͈̋ȉƂȂB
      EbN\Keyl(f[^)͌ݓo^ς݂łĂAo^ĂȂĂ\łB
      E1NCAg瓯ɕ̃f[^bN\ł
      EbNf[^̓bN{NCAĝ݃bN\łB
      EbÑf[^̓bN{NCAĝݓo^\łB
      EbÑf[^̓bN{NCAĝݕύX\łB
      EbÑf[^̓bN{NCAĝݍ폜\łB
      EbÑf[^͑SNCAgQƉ\łB
 
     *bN@\gpJn\bh͈ȉłB
      ENCAg̃\bh:startTransaction
      EȂ
      E߂l:boolean true:X^[g false:X^[gs
        bN@\LTransactionManagerm[hNĂȂꍇ́AX^[gɎsB
          
     *bN\bhւ̈Ɩ߂l͈ȉłB
      ENCAg̃\bh:lockData
      E1:bNΏKeyl
        2:bNp
              (bNsȂꍇłAł̐ݒ莞Ԃo߂ƎIɉB
               Pʂ͕bB
               0ݒ肷ƃbN{NCAg܂ŉivɃbNB
               0w͐Ȃ)
        3:bN擾҂
              (ɕʃNCAgbÑf[^փbN{ꍇɁAݒ莞Ԃ̊ԃbN擾gCB
               Pʂ͕bB
               0ݒ肷1񃍃bN݂)
 
      E߂l:Stringz
               Stringz[0]:Lock "true"=Lock or "false"=Locks
 
 	 *bNJւ̈Ɩ߂l͈ȉłB
      ENCAg̃\bh:releaseLockData
      E1:bNΏKeyl
 
      E߂l:Stringz
               Stringz[0]:J "true"=J or "false"=Js

     *bN@\gpI\bh͈ȉłB
      ENCAg̃\bh:endTransaction
      EȂ
      E߂lȂ

    +JavaŁAPHPł̃NCAǵAbNA[X\
     MemchacheNCAg̓bNA[X@\͗płȂALock̃f[^setsꍇ"҂"ɓB

   ImdstKeyValueClientgp)
                                                                                                           
    // NCAgCX^X쐬                                                                        
    ImdstKeyValueClient client = new ImdstKeyValueClient();                                                
    // ڑ                                                                                                
    imdstKeyValueClient.connect("127.0.0.1", 8888);                                                        
    // TransactionJnăf[^LockAf[^XVA擾ALock                               
                                                                                                           
    // LockΏۂKeyl, Lockێ(b)(0͖), LockɎ擾Ăꍇ                  
    // 擾gC鎞(b)(01擾݂)                                                    
    ImdstKeyValueClient imdstKeyValueClient = new ImdstKeyValueClient();                                   
    imdstKeyValueClient.connect(args[1], port);                                                            
    String[] ret = null;                                                                                   
                                                                                                           
    // Lock                                                                                            
    if(!imdstKeyValueClient.startTransaction()) throw new Exception("Transaction Start Error!!");          
                                                                                                           
    long start = new Date().getTime();                                                                     
                                                                                                           
    // Locks                                                                                            
    // "DataKey"ƂKeyl10bԈێ郍bN쐬BɃbNĂꍇ́A5bԃbN擾 
    // JԂ                                                                                            
    ret = imdstKeyValueClient.lockData("DataKey", 10, 5);                                                  
    if (ret[0].equals("true")) {                                                                           
        System.out.println("Lock");                                                                    
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("Locks");                                                                    
    }                                                                                                      
                                                                                                           
                                                                                                           
    // ȉ̃RgAEg͂āARpCA                                                      
    // ʂ̃NCAgXVsƁAXVłȂ̂킩                                        
    //Thread.sleep(5000);                                                                                  
                                                                                                           
    // gŃbNĂ̂ōXV\                                                                    
    if (!imdstKeyValueClient.setValue(args[3], "LockDataValue")) {                                         
    	System.out.println("o^s");                                                                      
    }                                                                                                      
                                                                                                           
    // 擾                                                                                                
    ret = imdstKeyValueClient.getValue(args[3]);                                                           
    if (ret[0].equals("true")) {                                                                           
        // f[^L                                                                                      
        System.out.println("Lockɓo^f[^[" + ret[1] + "]");                                      
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("f[^Ȃ");                                                                  
    } else if (ret[0].equals("error")) {                                                                   
        System.out.println(ret[1]);                                                                        
    }                                                                                                      
                                                                                                           
    // gŃbNĂ̂ō폜\                                                                    
    ret = imdstKeyValueClient.removeValue(args[3]);                                                        
                                                                                                           
    if (ret[0].equals("true")) {                                                                           
        // f[^L                                                                                      
        System.out.println("Lockɍ폜f[^[" + ret[1] + "]");                                      
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("f[^Ȃ");                                                                  
    } else if (ret[0].equals("error")) {                                                                   
        System.out.println(ret[1]);                                                                        
    }                                                                                                      
                                                                                                           
    // LockJ                                                                                            
    ret = imdstKeyValueClient.releaseLockData(args[3]);                                                    
    if (ret[0].equals("true")) {                                                                           
        System.out.println("LockJ");                                                                
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("LockJs");                                                                
    }                                                                                                      
                                                                                                           
    long end = new Date().getTime();                                                                       
    System.out.println((end - start) + "milli second");                                                    
                                                                                                           
    // gUNVJ                                                                                
    imdstKeyValueClient.endTransaction();                                                                  
    // ڑؒf                                                                                            
    imdstKeyValueClient.close();                                                                           
   

  ̃oOC

  ́AUgUNV悤Ɏi߂B
========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.5.2 - (2010/03/28)]]
  MemcachevgRɈꕔΉ
    KVS̕WvgRɂȂAmemcachẽvgRɑΉ郂[hǉ
    MasterNode.properties14s"MasterManagerJob.Option=""MasterManagerJob.Option=memcache"Ƃ
    memcachevgRŃANZX\łB
    MasterNode2.propertiesmemcachep̐ݒt@CɂȂĂB
    execMasterNodeMemcached.batsmemcachevgRŗオB
    Ή\bhsetgetłB܂set,getflag0̂ݑΉĂB
    Ή͈͂𑝂₷\B

  f[^ۑ`t@C(DataNode.properties30sځA33sڂfalseƂꍇ)ɂꍇɁA
    ǋL^ŋLĂ邽߁At@Ciɔ剻邽߁Avacuum@\ǉB
    IɎsB

  documetfBNgǉ
    \]{ƁA\}zu

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.5.1 - (2010/03/17)]]
  PHPp̃NCAg쐬
	PHPMasterServerփANZXo悤ɃNCAg쐬B
	JavãR[hĂȂ܂B
	oCgf[^o^(setByteValue)A擾(getByteValue)郁\bĥݖB
    [Xetc_client\OkuyamaClient.class.phpɂȂ܂B
    TvsR[hetc_client\PhpTestSock.phpƁAspbatt@Cetc_client\PhpAutoTest.bat𓯍܂B

  ReadMe.txtAReadMe-UTF.txtŐV̏ԂɍXV

  ReadMe.txtAReadMe-UTF.txt"[[[X Ver 0.5.0 - (2010/03/17)]]"̋Lq~X
    ӏ͈ȉ
    -------------------------------------------------------------------------------------------------------------------------------------------
    TestSockTvScripts[h̃o[Wǉ( "2.3" Scripts)
    E擾AsTvN@
    java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.3 127.0.0.1:8888 20000 "var dataValue; var retValue = dataValue.replace('data', 'dummy'); var execRet = '1';"
                                                                        ^^^
                                                                127.0.0.1 8888
    -------------------------------------------------------------------------------------------------------------------------------------------

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.5.0 - (2010/03/17)]]
  f[^擾JavaScripts\ȃC^[tF[Xǉ
    ImdstKeyValueClientgetValueScript\bhŎs\B
    f[^擾JavaScriptŋLqXNvgKeylƓɓnAKeylValuel擾oꍇA
    ̒lɃXNvgšʂ擾łB
    XNvgŁAԋpĽyсAԋpl(Value)ݒ肷邱ƂoB
    XNvg̓f[^m[hŎs邽߁A܂Ŏ擾f[^ɑ΂ĉ̏ŉHorl̑Ó
    ؂ȂǂsĂꍇ́AXNvgŏsA擾}Ṽ\[X̐ߖA擾}V
    XybNz悤ȑK͂ȃf[^f[^m[h̃p[gpď\łB

    yXNvgLqz
     XNvg͈̐ȉ̖O̕ϐ錾KvB
    E "dataValue" = keylŎ擾ovaluelݒ肳BXNvgł͂̕ϐvaluelƂȂB
    E "execRet" = s(retValueϐ)NCAgɕԂƂw
                   (1ƕԋp 0ƕԋpȂ)
    E "retValue" = sʂi[BNCAgɕԂl

   ImdstKeyValueClientgp)
                                                                                                           
    StringBuffer scriptBuf = new StringBuffer();                                                           
    // XNvg쐬                                                                                    
    scriptBuf.append("var dataValue;");                                                                    
    scriptBuf.append("var execRet;");                                                                      
    scriptBuf.append("var retValue;");                                                                     
    // 擾Valuel"data"Ƃꍇ"dummy"ɒu                                      
    scriptBuf.append("retValue = dataValue.replace('data', 'dummy');");                                    
    // ԋpw                                                                                            
    scriptBuf.append("execRet = '1';");                                                                     
                                                                                                           
    // NCAgCX^X쐬                                                                        
    ImdstKeyValueClient client = new ImdstKeyValueClient();                                                
    // ڑ                                                                                                
    imdstKeyValueClient.connect("127.0.0.1", 8888);                                                        
    // Value擾yсAXNvgs˗                                                                 
    String[] retValue = imdstKeyValueClient.getValueScript("key1", scriptBuf.toString());                  
                                                                                                           
    // ʂ\                                                                                          
    // sʂ݂ꍇ"true"݂Ȃꍇ"false"AG[̏ꍇ"error"ԋp        
    System.out.println(retValue[0]);                                                                       
    // retValue[0]"true"̏ꍇ̓XNvg̕ԋplԋpB"error"̏ꍇ̓G[bZ[Wԋp
    System.out.println(retValue[1]);                                                                       
   

  TestSockTvScripts[h̃o[Wǉ( "2.3" Scripts)
    E擾AsTvN@
    java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.3 127.0.0.1 8888 20000 "var dataValue; var retValue = dataValue.replace('data', 'dummy'); var execRet = '1';"

  NCAgɃ}X^[m[h̎oVO[hyсA_E̍Đڑ@\ǉ
    ImdstKeyValueClientsetConnectionInfos\bhɐڑΏۂƂȂ}X^[m[h̐ڑz
    Zbg(tH[}bg"IP:PORTԍ"Stringz)AautoConnect\bhŐڑƁAm[hւ̐ڑ
    oȂꍇAڑ㏈rŐؒfꂽꍇȂǂAIɍĐڑғ邱ƂoB


  TestSockTvɎڑ[h̃o[Wǉ( "1.2"ڑœo^  "2.2"ڑŎ擾)
    Eo^TvN@
    java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1.2 "127.0.0.1:8888,127.0.0.1:8889" 20000
    E擾TvN@
    java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.2 "127.0.0.1:8888,127.0.0.1:8889" 20000

    execMasterNode.batexecMasterNode2.bat𓯎ɎsԂŏLsāAБ~ẮA
      ĎsJԂĂAғ邱ƂmFł܂B

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.4.0 - (2010/03/15)]]
 f[^m[h̓IǉT|[g
   }X^[m[hAf[^m[hNMasterNode.propertiesKeyMapNodesRuleAKeyMapNodesInfoA
   SubKeyMapNodesInfoɐVȃm[h̋LqǋLۑƁAIɃt@Cēǂݍ݂A
   f[^AX[um[hǉB
   ݒt@C͍ĕۑƂقڃA^Cɔf邽߁AۑOɊYm[hNĂKvB
    ݒ                                                m[hǉ
    MasterNode.properties   MasterNode.properties
   KeyMapNodesRule=2                                   KeyMapNodesRule=4,2                                                             
                                                                                                                                       
   KeyMapNodesInfo=localhost:5553,localhost:5554     =>KeyMapNodesInfo=localhost:5553,localhost:5554,localhost:6553,localhost:6554     
                                                     ۄ                                                                                
   SubKeyMapNodesInfo=localhost:5556,localhost:5557  SubKeyMapNodesInfo=localhost:5556,localhost:5557,localhost:6556,localhost:6557                          
                                                                                                                                       
     

 f[^m[hǉɐVm[hփf[^̈ڍss@\ǉ
   f[^m[hǉɉߋf[^m[h䐔^p̃f[^ɃANZX^C~OŒǉm[h
   Cf[^m[hAX[uf[^m[hփf[^Iɕۑ悤ɂAȌߋ̃f[^ۑm[h
   ANZXsȂ悤ɋ@\ǉB
   m[hǉsƎIɃf[^ANZXɍsB

 f[^m[hւ̃ANZXCf[^m[hAX[uf[^m[hԂŃoVOo郂[hǉ
   MasterNode.propertiesLoadBalanceMode̐ݒtrueɂƃoVOsB
   CƁAX[uŐ\傫قȂꍇ̓oVOsȂقǂꍇB
   U蕪͒PȃEhrłB

 }X^[m[h𕡐ғAוUA璷o@\ǉ
   ܂ł́A}X^[m[h1\ASPOFƂȂĂׁANo悤ɋ@\ǉB
   }X^[m[h1`nł̍\\A1͕K}X^[m[hł̃CɂȂȂ΂ȂȂB
   ŔAf[^m[h̐Ďƕ̃Jo[ׂ̈łB
   Jo[́ASẴ}X^[m[hĉғ邽߁As͔Ȃ\ƂȂĂB
   MasterNode.propertiesMainMasterNodeModeC̏ꍇtrueƂAX[ȕꍇfalseƂB
   ܂AX[ũ}X^[m[h̃lbg[N̖OƉғ|[gԍSlaveMasterNodesɃJ}؂ŗ񋓂B
   璷ȂꍇMainMasterNodeMode=trueƂ邾ł悢B

  [X\(src or classes)\MasterNode.properties(Cp) [X\(src or classes)\MasterNode2.properties(X[up)
  MasterNode.properties       MasterNode2.properties 
 MainMasterNodeMode=true                                 MainMasterNodeMode=false                          
                                                                                                           
 SlaveMasterNodes=127.0.0.1:8889                         SlaveMasterNodes=                                 
                                                                                                           
       

   C̃}X^[m[hŁAf[^m[h̊ĎAsAC̃}X^[m[hғoȂԂ
   Ȃꍇ́AX[ũ}X^[m[h̐ݒt@Cȉ̂悤ɏčĕۑƁA
   X[ũ}X^[m[hC̃}X^[m[hɕύXĉғn߂B
  MasterNode2.properties   
 MainMasterNodeMode=true                               
                                                       
 SlaveMasterNodes=(ʂ̃}X^[m[hꍇ͋Lq) 
                                                       
 
   SlaveMasterNodesɗ񋓂m[hғĂȂĂACm[hғB
   IɃX[uCɏi悤Ɍقǎ\B
   ImdstKeyValueClientɕ̃}X^[m[hݒł悤ɂA
     oVOAڑłȂꍇ̎ʃm[hĐڑ@\Ȃǂقǎ\B

 Nbatt@Cǉ
   execMasterNode2.bat <=X[u}X^[m[hNR}h
   execMasterNode.bat݂̂ł̉ғ͏]Ɠ悤ɉ\
========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.3.3 - (2010/03/12)]]
 f[^m[hm̃f[^Joɏ]͋Ñm[h̃f[^ċNĂm[h
   ŃJoĂAf[^̓o^A폜Ɏ{̗vfǉAJoɎ{
   mFAVm[h̃f[^K悤ɉPB

========================================================================================================
========================================================================================================
[New - sC&TvR[hǉ]
[[[X Ver 0.3.2 - (2010/03/10)]]
 萔Key-Value𓯂TagɕRtĕۑƐoȂsC

 TestSockɃL[lw肵č폜郂[hǉ("8")
   java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 8 127.0.0.1 8888 KeyName1
   L127.0.0.1̃|[g8888ԂŋNĂ}X^[m[hɐڑA"keyName1"ƂKeylŕۑ
  f[^폜B
========================================================================================================
========================================================================================================
[New - 폜\bh&f[^ۑƃt@CIł悤ɋ@\ǉ]
[[[X Ver 0.3.0 - (2010/03/4)]]
 폜\bhǉ
   ImdstKeyValueClientremoveValue\bhɂČĂяo\
   ^[lgetValueƓlŌʕ("true" or "false")ƍ폜łꍇ͑Ώۂ̒li[ꂽz
   TestSock"7"ԎwŌĂяo\
   ---------------------------------------------------------------------------------------------------
   java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1 127.0.0.1 8888 100         <= 100o^
   java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 7 127.0.0.1 8888 50         <= 50폜

 f[^ۑ`ƃt@CI\
   ܂ł̃o[Wł͉ғ̓f[^͏KeyValue̊֌WŃɕێĂB
   o^̃gUNVL^t@CƁAIȃ̃t@CoŉiۂĂA
   t@Co[hłKeŷ݃ɕێf[^̓t@CɃXgA邱ƂB
   ɂ胁ł̏Ȃ邱Ƃ\łAeXgłJVMIvV-Xmx256mƂ
   DataNode400ȏ̃f[^i[oB
   (Keyl̒DataNodei[͉eȂAQl"datasavekey_1"`"datasavekey_4000000"ƂKeyl)
   A܂Ő݂ĂȂi[f[^ɐ񂪏oB
   ݊i[łValuẽTCÝA512bytełB
   ȏ̃f[^i[ꍇ́AImdstKeyValueClientsetByteValue\bhgp邱ƂƂȂB
   512̎wύXꍇ͈xSẴf[^t@C(Tvł.\keymapfilefBNg̃t@C)
     Sč폜ĂAImdstDefinesaveDataMaxSizeύX邱ƂőΉ\B
   f[^t@Cۑ@͒ǋL^ƂȂ̂ŁAoL[\bh\B
   ƃt@C̐؂ւDataNode.properties
     "KeyManagerJob1.dataMemory=false" <=t@C
     "KeyManagerJob1.dataMemory=true"  <=
     Ő؂ւ\

========================================================================================================
========================================================================================================
[New - MasterNodeœK&\]̃eLXgYt]
[[[X Ver 0.2.2 - (2010/02/24)]]
 MasterNodẽWbNœKB
   œKcӏ͂܂cĂB

 œKOƌŁAȒPɐ\𑪒B茋ʂeLXgƂēYt
========================================================================================================
========================================================================================================
[New - sC]
[[[X Ver 0.2.1 - (2010/02/11)]]
 Jo[̋CB
   ~m[hÑ^C~OɂĐf[^Jo[ȂsCB

 src\MasterNode.propertiesɃRgǉB
========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.2.0 - (2010/02/08)]]
 vP[VyсAJo[@\ǉ
   f[^m[hNbVVXe̋@\~h~B

 [ǉ@\ڍ]
  1. 1̃f[^𕡐̃f[^m[hɓo^悤@\ǉ(vP[V)
     Uo^sƂŁAIɃf[^̕sAS̍UKVSւƐi܂B

  2. Jo[@\
     1.̋@\gpĂꍇACf[^m[hNbVꍇACf[^m[hAA
     X[um[h(vP[Vm[h)玩IɃf[^𕜌܂B
     X[um[hNbVꍇAA㎩IɃCf[^m[h畜܂B

  3. L2̋@\gpĂꍇ̓m[h~VXe̒~ȂɎgp\
     f[^m[hNbVX[um[h(vP[Vm[h)ւ̎ڍss邽߁A
     gpVXe̒~܂B

  L̎gp@́Asrc\MasterNode.propertiesQƂĂB
  execMasterNode.bat̓}X^[m[hN܂B
  execDataNode.bat̓Cf[^m[hN܂B
  execSlaveDataNode.bat̓X[uf[^m[hN܂B
========================================================================================================


XybN
 :Java(jdk1.6ɂĊJ)
 \[XGR[fBO:UTF-8
 쌟OS:WinsowsXp SP3ACentOS 5.3(final)
 KvCu:log4j-1.2.14.jarAjavamail-1.4.1.jar(JavaMail Ver1.4.1)
 Version:0.6.5(2010/05/30)


@\ƃTv̎s@
[@\]
1.Key-ValueXgA
  Key-ValueXgA܂B
  Key͕AValue͕ƁAbytef[^̗o^\łB

2.Tag@\
  Key̑Tago^ł܂B
  Tag͕ƂȂ܂B
  XgAłKey̓j[NȒlƂĈ܂ATag͕̃f[^ɕRt
  Ƃo܂B
  f[^ɂ炩ߔCӂTagt邱ƂŁATagwɂ
  xɊ֘Af[^擾\ƂȂ܂B
  ݂TagwŊ֘Af[^Keyz񂪎擾ł܂B


4.IłAiꂽf[^
  f[^̓o^NCAg߂AƂ̃f[^2̃f[^m[hɓo^܂
  o^̂ꂩ́AKeyl̓(1)ƃt@C(2)ɁAValuel̓t@C(3)ɂ̂ݓo^܂B
  Valuel(1,4)ɂ̂ݓo^邱Ƃ\łB
  L2ȊOɃgUNVOɃt@Cɓo^Ă܂B
  f[^m[h_EĂۑꂽKeylt@C񂩂畜邩A
  Keyl̃t@Cւ̔f͒Ił邽߁ÅԂŕۑOɃ_E͔jĂꍇ́A
  gUNVO畜܂B

  1.o^f[^͊ef[^m[h1ConcurrentHashMapɊi[܂B
      f[^̓o^Ao͑SĂs܂B
  2.t@CVXeɕۑf[^́AIɕۑConcurrentHashMap
      VACYf[^ƁAf[^o^̃OƂȂ܂B
      VACYf[^̓o^̓f[^o^A擾Ƃ͔񓯊ɂĎs܂B
  3.Valuel͌Œ蒷LFs1t@Cɏ܂܂B
      L^͒ǋL^ƂȂ܂B
      Keyl͂Valuel̍ŐV̈ʒuĂ܂B
  4.DataNode.properties"KeyManagerJob1.dataMemory"̒lŕύX\
      trueŃێAfalseŃt@Cۑ
      ǂ̏ꍇgUNVO͕ۑ̂ŁAs̃_Eɂf[^̕ɂ͉e͂܂B
      KeyManagerJob1.memoryMode=truȅꍇ͕܂


5.U^
  uokuyamav̓}X^m[hAf[^m[hAgUNVm[hANCAg4ō\܂B
  ꂼ̖ڂ͈ȉłB
  }X^m[h:Eݒ肳ꂽASY(1)ɏ]āANCAg̃f[^˗K؂
                 f[^m[hɈ˗܂B
               E1̃f[^2̃f[^m[hɃvP[V܂
                 擾ɊYf[^m[h_EĂꍇAvP[Ṽf[^m[h擾܂B
                 ܂Af[^m[h2ƂғĂꍇ́A𕪎UוUs܂B
                 f[^o^1̃f[^m[h_EĂꍇ̃m[hɕۑ𑱍s܂B
               Eł̏璷\łB
                 ŉғꍇ́AMasterNodełMainm[h肷KvB
               E~Ȃł̓Iȃf[^m[h̒ǉ܂B
                 f[^m[hǉꍇA܂łɓo^f[^ւ̃ANZX͓悤ɉ\łB
               EDataNode̐ĎA_E̕Ƀf[^ғm[h玩Jo[܂B
                 Jo[̓f[^̕sȂ悤ɓ܂B
                 1.Ǘf[^m[h̐ɈˑȒPȃASYłB
               Eݒt@Csrc\MasterNode.properties


  f[^m[h:Eł̍\\
               EL[ƃf[^̑gݍ킹Ńf[^ۑ܂B
                 f[^̓o^AoA폜C^[tF[X܂B
               Egł͑m[hւ̃f[^̐U蕪Ȃǂ͍sȂ܂B
               Eݒt@Csrc\DataNode.properties

  gUNVm[h:EULock(TransactionMode)gpꍇLockێAǗ܂B
                           TransactionModegpĂāÃm[h_EƋɒ[ɃX[vbg_E܂B
                           C\B
                         Eݒt@Csrc\TransactionNode.properties

  NCAg:E}X^m[hւ̒ʐMsۂ̃vOC^[tF[XłB
	           E}X^[m[h̏𕡐Zbg邱ƂŎUA}X^[m[h_E
                 ʃm[hւ̎ĐڑȂ܂B
               EJavaPHPꂼ̃NCvO܂B
                 gp@͈ȉ̍̓[X̃TvvOTestSock.javáA
                 etc_clietn\PhpTestSock.phpQƂĂB
                 NCAg̃\[Xt@C
                 Javasrc\org\imdst\client\ImdstKeyValueClient.java
                 PHPetc_client\OkuyamaClient.class.php

               C^[tF[XƂẮA
               1.setValue(Keyl, Valuel)                 :[Key()Value()̑gݍ킹ł̃f[^o^]
               2.setValue(Keyl, Taglz Valuel)       :[Key()Tag((z))Value()̑gݍ킹ł̃f[^o^]
               3.getValue(Keyl)                          :[Key()łValue()擾]
               4.getTagKeys(Tagl)                        :[Tag()łKeylQ(Keyl̔z)擾]
               5.setByteValue(Keyl, bytel)              :[Key()bytez̑gݍ킹ł̃f[^o^](PHP͖)
               6.setByteValue(Keyl, Taglz bytel)    :[Key()Tag((z))bytez̑gݍ킹ł̃f[^o^](PHP͖)
               7.getByteValue(Keyl)                      :[Key()ValuelBytezŎ擾.setByteValueœo^l̂ݎ擾ł]
               8.removeValue(Keyl)                       :[Key()Ńf[^폜]
               9.getValueScript(Keyl,JavaScriptR[h)   :[Key()JavaScriptR[hnA擾ꂽvaluelJavaScriptslԂ]
              10.startTransaction()                       :[Transaction[ĥ݁BTransactionJn(ULockgp\ɂȂ)]
              11.lockData(Keyl,Lock,Lock擾҂):[Transaction[ĥ݁BKeylLocksBLockԂŎw肵Ԉێ(0͖)Aʂ̃NCAgLockĂꍇLock擾҂Ԃ̊ԃgC]
              12.releaseLockData(Keyl)                   :[Transaction[ĥ݁Bg̎擾LockJ]
              13.setNewValue(Keyl, Valuel)              :[o^Keyl̏ꍇ̂ݓo^ł]
              14.setNewValue(Keyl, Taglz Valuel)    :[o^Keyl̏ꍇ̂ݓo^ł]

  ꂼ̃m[hԂ̒ʐMTCP/IPł̒ʐMƂȂ܂B
  ܂ANCAgƃ}X^m[hԂ̒ʐM͎IBase64ɂăGR[fBOgpĂ܂B



[N@]
 Windows

   O:1.\
              1̃}Vŉғ悤ȃTvݒt@CĂ܂B
              ꂼ̃m[h䐔
              }X^m[h:1
              f[^m[h:2(2CX^X~2(}X^[AX[u))

            2.em[h̎gp|[g͈ȉƂȂ܂B
              }X^m[h:8888
              pr:NCAg̗v҂
              ύXꍇ:srcfBNgzMasterNode.properties7sڂύX
                           7s=MasterManagerJob.Init=8888<=̔ԍ

              f[^m[h:5553A5554@5556A5557
              pr:}X^m[h̗v҂
              ύXꍇ:Cf[^m[h
                           srcfBNgzDataNode.properties7sځA13sڂύX
                           7s=KeyManagerJob1.Init=5553<=̔ԍ
                           13s=KeyManagerJob2.Init=5554<=̔ԍ
                           X[uf[^m[h
                           srcfBNgzSlaveDataNode.properties7sځA13sڂύX
                           7s=KeyManagerJob1.Init=5556<=̔ԍ
                           13s=KeyManagerJob2.Init=5557<=̔ԍ

 1.RpC
   ȈՓIȃRpCpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAcompile.batsĂB
   O:javac.exePATHʂĂ

 2.MasterNodeN
   ȈՓIMasterNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecMasterNode.batsĂB
   ݒt@Cclasses\MasterNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[o͋N܂B
   execMasterNode2.bat̓X[uMasterNodeN܂B
   execMasterNodeMemcached.bat̓X[uMasterNodememcache݊vgRŋN܂B
   O:1.java.exePATHʂĂ
        2.128MBƂĂ܂

 3.DataNodeN
   ȈՓIDataNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecDataNode.batsĂB
   2̃f[^m[hɋN܂B
   ݒt@Cclasses\DataNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[o͋N܂B
   O:1.java.exePATHʂĂ
        2.256MBƂĂ܂

 3.SlaveDataNodeN
   ȈՓIȃX[upDataNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecSlaveDataNode.batsĂB
   2̃f[^m[hɋN܂B
   ݒt@Cclasses\SlaveDataNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[oDataNode͋N܂B
   O:1.java.exePATHʂĂ
        2.256MBƂĂ܂

 4.TransactionNodeN
   ȈՓIȕULockpTransactionNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecTransactionNode.batsĂB
   ݒt@Cclasses\TransactionNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[o͋N܂B
   O:1.java.exePATHʂĂ
        2.256MBƂĂ܂

 execMasterNode2.batsƁAX[uMasterNodeN܂B
   |[gԍ8889gp܂B
   execMasterNodeMemcached.bat̓|[g11211ŃvgRmemcacheɂȂ܂B
   ݒt@Cclasses\MasterNode2.propertiesQƂĂ܂B

   ENTvł̍\}
                      
                 }X^[          X[u   
                 m[h            }X^[   
                 Port:8888         m[h     
                                   Port:8889  
                      
                        
            
                                
       
       
      f[^     f[^    
      m[h     m[h    
      Port:5553  Port:5554 
       
       
      X[u   X[u  
      f[^     f[^    
      m[h     m[h    
      Port:5556  Port:5557 
       
       

 4.Tv̎s@
   ȈՓIȐڑAo^A擾A폜TvpӂĂ܂B
   {t@CƓfBNgɂATestSock.classsĂ(jdk1.6ɂăRpCς)B
   ȂŎsƎgp@o͂܂B
   )
     # ȉ̗͎IɃCNgKeylValue1000o^Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1 127.0.0.1 8888 1000

     # ȉ̗̓L[lkey_aŃo[lvalue_bo^
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1.1 127.0.0.1 key_a value_b

     # ȉ̗͎IɃCNgKeylValue1000擾Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2 127.0.0.1 8888 1000

     # ȉ̗̓L[lkey_avalue擾
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.1 127.0.0.1 8888 key_a

     # ȉ̗̓}X^[m[hIP127.0.0.1,|[g8888IP127.0.0.1,|[g8889ɐڑoVO
     # IɃCNgKeylValue1000擾Ă
     # execMasterNode2.batNĂƁAexecMasterNode.bat̃vZXIĂғ
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.2 "127.0.0.1:8888,127.0.0.1:8889" 100

     # ȉ̗̓L[lkey_aŎ擾ValuelJavaScriptsʂ擾
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.3 127.0.0.1 8888 key_a "var dataValue; var retValue = dataValue.replace('b', 'scritpChangeRet'); var execRet = '1';"

     # ȉ̗͎IɃCNgKeylƓK4p^[TaglValue100o^Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 3 127.0.0.1 8888 100

     # ȉ̗Taglutag1vɕRtKeylValuel1擾Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 4 127.0.0.1 8888 1 tag1

     # ȉ̗KeyluwordfilevŁuC:\temp\SampleWord.docvt@C1o^Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 5 127.0.0.1 8888 1 C:\temp\SampleWord.doc wordfile

     # ȉ̗KeyluwordfileṽoCgf[^擾uC:\SampleWord.docvt@CƂ1쐬Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 6 127.0.0.1 8888 1 C:\SampleWord.doc wordfile

     # ȉ̗Keylukey_aṽf[^폜āAValue擾Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 8 127.0.0.1 8888 key_a

     # ȉ̗TransactionJnăf[^LockAf[^XVA擾ALock
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 10 127.0.0.1 8888 key_a 5 10

     # ȉ̗1xf[^o^ꍇɎgpĂяo
     # "key_abc"ƂKey1xo^Ȃ悤ɂꍇ
     # 2xs2ڂ̓G[ƂȂB(memcacheaddɑ)
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 11 127.0.0.1 8888 key_abc value_abc

     PHPɊւẮAetc_client\PhpAutoTest.batQƂĂB

[]
 ̓oOFixƕUgUNV(bN@\)Ă܂B

