├── isa-l-2.14.0.tar.gz ├── libmemcached-1.0.18.tar.gz ├── proxy ├── make.sh ├── repair │ ├── run.sh │ ├── ycsb_test.txt │ ├── ycsb_set.txt │ ├── 4K.txt │ ├── 16K.txt │ └── repair.cpp └── update │ ├── run.sh │ ├── ycsb_test.txt │ ├── ycsb_set.txt │ └── update.cpp ├── node └── cls.sh └── README.md /isa-l-2.14.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YuchongHu/logecmem/HEAD/isa-l-2.14.0.tar.gz -------------------------------------------------------------------------------- /libmemcached-1.0.18.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YuchongHu/logecmem/HEAD/libmemcached-1.0.18.tar.gz -------------------------------------------------------------------------------- /proxy/make.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | g++ -std=c++11 update/update.cpp -o update/update -lmemcached -lisal 4 | g++ -std=c++11 repair/repair.cpp -o repair/repair -lmemcached -lisal 5 | -------------------------------------------------------------------------------- /proxy/repair/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | N=14 4 | K=10 5 | dir="./" 6 | IP="192.168.1.200" 7 | 8 | echo -e "($N, $K) in $dir" 9 | 10 | ssh root@node "bash cls.sh" 11 | sleep 2 12 | ./repair $dir $N $K $IP> /dev/null -------------------------------------------------------------------------------- /node/cls.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ps -ef|grep "memcached"|cut -c 9-15|xargs kill -9 4 | 5 | IP="192.168.1.200" 6 | PORT=11211 7 | 8 | #data 9 | for ((i=0;i<16;i++)) 10 | do 11 | 12 | memcached -d -m 2048 -u root -l $IP -p $(($PORT + $i)) 13 | done 14 | 15 | #parity 16 | memcached -d -m 2048 -u root -l $IP -p 20000 17 | memcached -d -m 2048 -u root -l $IP -p 20001 18 | memcached -d -m 2048 -u root -l $IP -p 20002 -------------------------------------------------------------------------------- /proxy/update/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | N=14 4 | K=10 5 | dir="./" 6 | IP="192.168.1.200" 7 | 8 | echo -e "($N,$K) in $dir" 9 | 10 | #1-> in-palce; 2->full-stripe; 3->LogECMem 11 | ssh root@node "bash cls.sh" 12 | sleep 2 13 | ./update 1 $dir $N $K $IP> /dev/null 14 | 15 | ssh root@node "bash cls.sh" 16 | sleep 2 17 | ./update 2 $dir $N $K $IP> /dev/null 18 | 19 | ssh root@node "bash cls.sh" 20 | sleep 2 21 | ./update 3 $dir $N $K $IP> /dev/null -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Welcome 2 | ===== 3 | 4 | This is the source code for LogECMem, which is tested on Ubuntu 16.04. 5 | 6 | 7 | Preparation 8 | ==== 9 | 10 | These are the required libraries that users need to download separately. 11 | 12 | - gcc (v5.18.7), g++ (v5.4.0) 13 | - make (v4.1), cmake (v3.5.1), autogen (v5.18.7), autoconf (v2.69), automake (v1.14), 14 | - yasm (v1.3.0), nasm (v2.11) 15 | - libtool (v2.4.6) 16 | - boost libraries (libboost-all-dev) (v1.58) 17 | - libevent (libevent-dev) (v2.0.21) 18 | `$ sudo apt-get install gcc g++ make cmake autogen autoconf automake yasm nasm libtool libboost-all-dev libevent-dev` 19 | 20 | Users can install the following library manually: *Intel®-storage-acceleration-library (ISA-l) (v2.14.0)*. 21 | 22 | $ tar -zxvf isa-l-2.14.0.tar.gz 23 | $ cd isa-l-2.14.0 24 | $ sh autogen.sh 25 | $ ./configure; make; sudo make install 26 | 27 | 28 | LogECMem Installation 29 | ==== 30 | 31 | **Memcached Servers (v1.4.25)** 32 | 33 | Users can use apt-get to install Memcached instances in servers. 34 | 35 | $ sudo apt-get install memcached 36 | 37 | For standalone setup, users can use `bash cls.sh` to re-set memcached instances with IPs and Ports; 38 | For distributed setup, users can use multiple nodes with different IPs to run memcached instances. 39 | 40 | 41 | **LogECMem Proxy** 42 | 43 | Users use source code to install libmemcached (extented from v1.0.18) in the proxy. 44 | 45 | $ cd libmemcached-1.0.18 46 | $ sh configure; make; sudo make install 47 | $ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH #(if it ocuurs library path issue) 48 | 49 | Users can setup passwardless SSH login, and use `SSH root@node bash cls.sh` to re-set memcached instances in the proxy. 50 | 51 | User use g++ to compile update.cpp and repair.cpp. 52 | 53 | $ bash make.sh 54 | 55 | **Workloads** 56 | 57 | Users can use the provided workloads (`ycsb_set.txt` and `ycsb_test.txt`) in each directory to do demo tests, and further more workloads via YCSB with *basic* parameter in *https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload*. 58 | 59 | Benchmarks 60 | ==== 61 | 62 | 1.**Update latency and Memory overhead** 63 | Users can configure *N, K, workload dir, and server IP* parameters, and gain all three In-palace, Full-stripe and LogECMem results. **"./update [1|2|3] dir N K IP > /dev/null"**, 1|2|3 indicates In-place|Full-stripe|LogECMem respectively, *N* indicates the number of all data and parity chunks, *K* indicates the number of all data chunks, *dir* indicates the path of workloads and *IP* indicates the DRAM node's IP. Note that users can configure more IPs and Ports in update.cpp and run.sh for distributed setup. 64 | 65 | 66 | $ cd update 67 | $ bash run.sh 68 | 69 | 2.**Multiple chunks failures performance** 70 | Users can configure *N, K, workload dir and server IP* parameters, and gain all schemes' repair performance. **"./repair dir N K > /dev/null"**, *N* indicates the number of all data and parity chunks, *K* indicates the number of all data chunks, *dir* indicates the path of workloads and *IP* indicates the DRAM node's IP. Note that users can configure more in repair.cpp and run.sh for distributed setup. 71 | 72 | 73 | $ cd repair 74 | $ bash run.sh -------------------------------------------------------------------------------- /proxy/repair/ycsb_test.txt: -------------------------------------------------------------------------------- 1 | Operationcount=100 2 | 3 | READ user8049444314573886243 4 | READ user5691533215384974621 5 | READ user4635659444355057900 6 | READ user7114138408451725489 7 | READ user6284781860667377211 8 | READ user4997363039078325801 9 | READ user3584813500638707425 10 | READ user7114138408451725489 11 | READ user1005413005517793606 12 | READ user3584813500638707425 13 | READ user4876795174170569834 14 | READ user5108340224729704523 15 | READ user4288574356201733490 16 | UPDATE user1815123219418632147 17 | READ user2176826814141900048 18 | READ user4881823001484136080 19 | READ user2991564855356304835 20 | READ user2061286776547710327 21 | READ user2287803999793278770 22 | READ user2408371864701034737 23 | READ user7576763534199239620 24 | READ user8753205170136912308 25 | READ user5108340224729704523 26 | READ user2408371864701034737 27 | READ user2056258949234144081 28 | READ user4052466453699787802 29 | UPDATE user1815123219418632147 30 | READ user7817899264014751554 31 | READ user9105318085603802964 32 | READ user8984750220696046997 33 | READ user4520119406760868179 34 | READ user6641457628077078866 35 | UPDATE user4881823001484136080 36 | READ user3464245635730951458 37 | READ user7702359226420561833 38 | READ user8290580044389398177 39 | READ user4173034318607543769 40 | READ user1473065958578873983 41 | READ user6279754033353810965 42 | READ user5817128907606296834 43 | UPDATE user2061286776547710327 44 | READ user3584813500638707425 45 | READ user8049444314573886243 46 | UPDATE user7340655631697293932 47 | READ user1815123219418632147 48 | READ user8517097267634966620 49 | READ user171028630419879082 50 | READ user759249448388715426 51 | READ user2649507594516546671 52 | READ user5223880262323894244 53 | READ user6873002678636213555 54 | READ user2876024817762115114 55 | READ user3232700585171816769 56 | READ user1473065958578873983 57 | READ user5108340224729704523 58 | READ user417192187548957262 59 | READ user8049444314573886243 60 | READ user7576763534199239620 61 | READ user5465015992139406178 62 | READ user8512069440321400374 63 | READ user3705381365546463392 64 | READ user3353268450079572736 65 | READ user7923848622352564030 66 | READ user5465015992139406178 67 | READ user3464245635730951458 68 | READ user2061286776547710327 69 | READ user2991564855356304835 70 | READ user3232700585171816769 71 | READ user764277275702281672 72 | READ user4881823001484136080 73 | READ user3705381365546463392 74 | READ user7461223496605049899 75 | READ user3237728412485383015 76 | READ user7109110581138159243 77 | READ user2996592682669871081 78 | READ user5932668945200486555 79 | READ user3931898588792031835 80 | READ user7114138408451725489 81 | READ user643709410794525705 82 | READ user8873773035044668275 83 | READ user4052466453699787802 84 | READ user1468038131265307737 85 | READ user3584813500638707425 86 | READ user6525917590482889145 87 | READ user2056258949234144081 88 | READ user532732225143146983 89 | READ user8753205170136912308 90 | UPDATE user6752434813728457588 91 | READ user8753205170136912308 92 | READ user2876024817762115114 93 | READ user3820921403140653113 94 | READ user2403344037387468491 95 | READ user2408371864701034737 96 | READ user8164984352168075964 97 | READ user6867974851322647309 98 | READ user6641457628077078866 99 | READ user9100290258290236718 100 | READ user417192187548957262 101 | READ user643709410794525705 102 | READ user6752434813728457588 103 | 104 | 105 | RUN_INSERT=6 106 | RUN_READ=94 -------------------------------------------------------------------------------- /proxy/update/ycsb_test.txt: -------------------------------------------------------------------------------- 1 | Operationcount=100 2 | 3 | READ user8049444314573886243 4 | READ user5691533215384974621 5 | READ user4635659444355057900 6 | READ user7114138408451725489 7 | READ user6284781860667377211 8 | READ user4997363039078325801 9 | READ user3584813500638707425 10 | READ user7114138408451725489 11 | READ user1005413005517793606 12 | READ user3584813500638707425 13 | READ user4876795174170569834 14 | READ user5108340224729704523 15 | READ user4288574356201733490 16 | UPDATE user1815123219418632147 17 | READ user2176826814141900048 18 | READ user4881823001484136080 19 | READ user2991564855356304835 20 | READ user2061286776547710327 21 | READ user2287803999793278770 22 | READ user2408371864701034737 23 | READ user7576763534199239620 24 | READ user8753205170136912308 25 | READ user5108340224729704523 26 | READ user2408371864701034737 27 | READ user2056258949234144081 28 | READ user4052466453699787802 29 | UPDATE user1815123219418632147 30 | READ user7817899264014751554 31 | READ user9105318085603802964 32 | READ user8984750220696046997 33 | READ user4520119406760868179 34 | READ user6641457628077078866 35 | UPDATE user4881823001484136080 36 | READ user3464245635730951458 37 | READ user7702359226420561833 38 | READ user8290580044389398177 39 | READ user4173034318607543769 40 | READ user1473065958578873983 41 | READ user6279754033353810965 42 | READ user5817128907606296834 43 | UPDATE user2061286776547710327 44 | READ user3584813500638707425 45 | READ user8049444314573886243 46 | UPDATE user7340655631697293932 47 | READ user1815123219418632147 48 | READ user8517097267634966620 49 | READ user171028630419879082 50 | READ user759249448388715426 51 | READ user2649507594516546671 52 | READ user5223880262323894244 53 | READ user6873002678636213555 54 | READ user2876024817762115114 55 | READ user3232700585171816769 56 | READ user1473065958578873983 57 | READ user5108340224729704523 58 | READ user417192187548957262 59 | READ user8049444314573886243 60 | READ user7576763534199239620 61 | READ user5465015992139406178 62 | READ user8512069440321400374 63 | READ user3705381365546463392 64 | READ user3353268450079572736 65 | READ user7923848622352564030 66 | READ user5465015992139406178 67 | READ user3464245635730951458 68 | READ user2061286776547710327 69 | READ user2991564855356304835 70 | READ user3232700585171816769 71 | READ user764277275702281672 72 | READ user4881823001484136080 73 | READ user3705381365546463392 74 | READ user7461223496605049899 75 | READ user3237728412485383015 76 | READ user7109110581138159243 77 | READ user2996592682669871081 78 | READ user5932668945200486555 79 | READ user3931898588792031835 80 | READ user7114138408451725489 81 | READ user643709410794525705 82 | READ user8873773035044668275 83 | READ user4052466453699787802 84 | READ user1468038131265307737 85 | READ user3584813500638707425 86 | READ user6525917590482889145 87 | READ user2056258949234144081 88 | READ user532732225143146983 89 | READ user8753205170136912308 90 | UPDATE user6752434813728457588 91 | READ user8753205170136912308 92 | READ user2876024817762115114 93 | READ user3820921403140653113 94 | READ user2403344037387468491 95 | READ user2408371864701034737 96 | READ user8164984352168075964 97 | READ user6867974851322647309 98 | READ user6641457628077078866 99 | READ user9100290258290236718 100 | READ user417192187548957262 101 | READ user643709410794525705 102 | READ user6752434813728457588 103 | 104 | 105 | RUN_INSERT=6 106 | RUN_READ=94 -------------------------------------------------------------------------------- /proxy/repair/ycsb_set.txt: -------------------------------------------------------------------------------- 1 | Operationcount=100 2 | 3 | INSERT user6284781860667377211 4 | INSERT user8517097267634966620 5 | INSERT user1820151046732198393 6 | INSERT user4052466453699787802 7 | INSERT user3232700585171816769 8 | INSERT user1000385178204227360 9 | INSERT user7697331399106995587 10 | INSERT user5465015992139406178 11 | INSERT user6873002678636213555 12 | INSERT user9105318085603802964 13 | INSERT user2408371864701034737 14 | INSERT user4640687271668624146 15 | INSERT user2644479767202980425 16 | INSERT user412164360235391016 17 | INSERT user7109110581138159243 18 | INSERT user4876795174170569834 19 | INSERT user7461223496605049899 20 | INSERT user8753205170136912308 21 | INSERT user2996592682669871081 22 | INSERT user5228908089637460490 23 | INSERT user2056258949234144081 24 | INSERT user176056457733445328 25 | INSERT user6520889763169322899 26 | INSERT user4288574356201733490 27 | INSERT user8049444314573886243 28 | INSERT user8164984352168075964 29 | INSERT user3584813500638707425 30 | INSERT user5817128907606296834 31 | INSERT user1468038131265307737 32 | INSERT user764277275702281672 33 | INSERT user5932668945200486555 34 | INSERT user3700353538232897146 35 | INSERT user3931898588792031835 36 | INSERT user6164213995759621244 37 | INSERT user532732225143146983 38 | INSERT user1699583181824442426 39 | INSERT user5585583857047162145 40 | INSERT user3353268450079572736 41 | INSERT user8396529402727210653 42 | INSERT user7817899264014751554 43 | INSERT user4520119406760868179 44 | INSERT user6752434813728457588 45 | INSERT user55488592825689361 46 | INSERT user2287803999793278770 47 | INSERT user4997363039078325801 48 | INSERT user2765047632110736392 49 | INSERT user8984750220696046997 50 | INSERT user7229678446045915210 51 | INSERT user5108340224729704523 52 | INSERT user7340655631697293932 53 | INSERT user643709410794525705 54 | INSERT user2876024817762115114 55 | INSERT user4409142221109489457 56 | INSERT user2176826814141900048 57 | INSERT user8873773035044668275 58 | INSERT user6641457628077078866 59 | INSERT user5696561042698540867 60 | INSERT user7928876449666130276 61 | INSERT user1231930228763362049 62 | INSERT user3464245635730951458 63 | INSERT user3820921403140653113 64 | INSERT user1588605996173063704 65 | INSERT user8285552217075831931 66 | INSERT user6053236810108242522 67 | INSERT user7456195669291483653 68 | INSERT user5223880262323894244 69 | INSERT user6525917590482889145 70 | INSERT user8758232997450478554 71 | INSERT user1473065958578873983 72 | INSERT user3705381365546463392 73 | INSERT user2991564855356304835 74 | INSERT user759249448388715426 75 | INSERT user6867974851322647309 76 | INSERT user4635659444355057900 77 | INSERT user7114138408451725489 78 | INSERT user9100290258290236718 79 | INSERT user2061286776547710327 80 | INSERT user4293602183515299736 81 | INSERT user2403344037387468491 82 | INSERT user171028630419879082 83 | INSERT user6279754033353810965 84 | INSERT user4047438626386221556 85 | INSERT user7702359226420561833 86 | INSERT user8512069440321400374 87 | INSERT user2649507594516546671 88 | INSERT user4881823001484136080 89 | INSERT user1815123219418632147 90 | INSERT user417192187548957262 91 | INSERT user5691533215384974621 92 | INSERT user3459217808417385212 93 | INSERT user8290580044389398177 94 | INSERT user7923848622352564030 95 | INSERT user3237728412485383015 96 | INSERT user5470043819452972424 97 | INSERT user1226902401449795803 98 | INSERT user1005413005517793606 99 | INSERT user8637665132542722587 100 | INSERT user7576763534199239620 101 | INSERT user4173034318607543769 102 | INSERT user6405349725575133178 103 | 104 | 105 | LOAD_INSERT=100 -------------------------------------------------------------------------------- /proxy/update/ycsb_set.txt: -------------------------------------------------------------------------------- 1 | Operationcount=100 2 | 3 | INSERT user6284781860667377211 4 | INSERT user8517097267634966620 5 | INSERT user1820151046732198393 6 | INSERT user4052466453699787802 7 | INSERT user3232700585171816769 8 | INSERT user1000385178204227360 9 | INSERT user7697331399106995587 10 | INSERT user5465015992139406178 11 | INSERT user6873002678636213555 12 | INSERT user9105318085603802964 13 | INSERT user2408371864701034737 14 | INSERT user4640687271668624146 15 | INSERT user2644479767202980425 16 | INSERT user412164360235391016 17 | INSERT user7109110581138159243 18 | INSERT user4876795174170569834 19 | INSERT user7461223496605049899 20 | INSERT user8753205170136912308 21 | INSERT user2996592682669871081 22 | INSERT user5228908089637460490 23 | INSERT user2056258949234144081 24 | INSERT user176056457733445328 25 | INSERT user6520889763169322899 26 | INSERT user4288574356201733490 27 | INSERT user8049444314573886243 28 | INSERT user8164984352168075964 29 | INSERT user3584813500638707425 30 | INSERT user5817128907606296834 31 | INSERT user1468038131265307737 32 | INSERT user764277275702281672 33 | INSERT user5932668945200486555 34 | INSERT user3700353538232897146 35 | INSERT user3931898588792031835 36 | INSERT user6164213995759621244 37 | INSERT user532732225143146983 38 | INSERT user1699583181824442426 39 | INSERT user5585583857047162145 40 | INSERT user3353268450079572736 41 | INSERT user8396529402727210653 42 | INSERT user7817899264014751554 43 | INSERT user4520119406760868179 44 | INSERT user6752434813728457588 45 | INSERT user55488592825689361 46 | INSERT user2287803999793278770 47 | INSERT user4997363039078325801 48 | INSERT user2765047632110736392 49 | INSERT user8984750220696046997 50 | INSERT user7229678446045915210 51 | INSERT user5108340224729704523 52 | INSERT user7340655631697293932 53 | INSERT user643709410794525705 54 | INSERT user2876024817762115114 55 | INSERT user4409142221109489457 56 | INSERT user2176826814141900048 57 | INSERT user8873773035044668275 58 | INSERT user6641457628077078866 59 | INSERT user5696561042698540867 60 | INSERT user7928876449666130276 61 | INSERT user1231930228763362049 62 | INSERT user3464245635730951458 63 | INSERT user3820921403140653113 64 | INSERT user1588605996173063704 65 | INSERT user8285552217075831931 66 | INSERT user6053236810108242522 67 | INSERT user7456195669291483653 68 | INSERT user5223880262323894244 69 | INSERT user6525917590482889145 70 | INSERT user8758232997450478554 71 | INSERT user1473065958578873983 72 | INSERT user3705381365546463392 73 | INSERT user2991564855356304835 74 | INSERT user759249448388715426 75 | INSERT user6867974851322647309 76 | INSERT user4635659444355057900 77 | INSERT user7114138408451725489 78 | INSERT user9100290258290236718 79 | INSERT user2061286776547710327 80 | INSERT user4293602183515299736 81 | INSERT user2403344037387468491 82 | INSERT user171028630419879082 83 | INSERT user6279754033353810965 84 | INSERT user4047438626386221556 85 | INSERT user7702359226420561833 86 | INSERT user8512069440321400374 87 | INSERT user2649507594516546671 88 | INSERT user4881823001484136080 89 | INSERT user1815123219418632147 90 | INSERT user417192187548957262 91 | INSERT user5691533215384974621 92 | INSERT user3459217808417385212 93 | INSERT user8290580044389398177 94 | INSERT user7923848622352564030 95 | INSERT user3237728412485383015 96 | INSERT user5470043819452972424 97 | INSERT user1226902401449795803 98 | INSERT user1005413005517793606 99 | INSERT user8637665132542722587 100 | INSERT user7576763534199239620 101 | INSERT user4173034318607543769 102 | INSERT user6405349725575133178 103 | 104 | 105 | LOAD_INSERT=100 -------------------------------------------------------------------------------- /proxy/repair/4K.txt: -------------------------------------------------------------------------------- 1 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -------------------------------------------------------------------------------- /proxy/repair/16K.txt: -------------------------------------------------------------------------------- 1 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd -------------------------------------------------------------------------------- /proxy/repair/repair.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "libmemcached/memcached.h" 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | using namespace std; 17 | //g++ -std=c++11 repair.cpp -o repair -lmemcached -lisal 18 | 19 | unsigned int N, K, SERVER, CHUNK_SIZE; 20 | char path[100] = {0}; //path 21 | char IP[100] = "127.0.0.1"; // node server 22 | 23 | static double timeval_diff(struct timeval *start, 24 | struct timeval *end) 25 | { 26 | double r = end->tv_sec - start->tv_sec; 27 | if (end->tv_usec > start->tv_usec) 28 | r += (end->tv_usec - start->tv_usec) / 1000000.0; 29 | else if (end->tv_usec < start->tv_usec) 30 | r -= (start->tv_usec - end->tv_usec) / 1000000.0; 31 | return r; 32 | } 33 | 34 | struct request_st 35 | { 36 | int op; //read=0,update=1 37 | string key; 38 | }; 39 | 40 | vector vload; 41 | vector vrun; 42 | 43 | vector memc(N - K); //data +XOR,P2,P3 44 | //the buffers of each memcached; 45 | vector > vbuf(SERVER); 46 | 47 | unsigned int StripID = 0; 48 | unsigned int encode_inc = 0; //for random encoding 49 | unsigned int delta_inc = 0; //for all parity delta 50 | unsigned int version_inc = 0; //for all version data 51 | 52 | //stripe metadata 53 | map > object_index; //key -> stripID, offset 54 | 55 | //stripe ID -> keys+flag(flag mark for valid or not), invaild=1; 56 | vector > > stripe_index; 57 | 58 | double time_all = 0; 59 | double time_dram_all = 0; 60 | double time_disk_all = 0; 61 | int degraded_all = 0; 62 | 63 | //0 -> can not, 1->can 64 | int check_encode(vector &dd) 65 | { 66 | int count = 0; 67 | int inc1 = encode_inc; 68 | for (int i = 0; i < SERVER; i++) 69 | { 70 | if (!vbuf[inc1 % SERVER].empty()) 71 | { 72 | count++; 73 | if (count == K) 74 | { 75 | cout << "\tcan encode!" << endl; 76 | break; 77 | } 78 | } 79 | inc1++; 80 | } 81 | //round_rabin the start tranverse point 82 | encode_inc++; 83 | 84 | //can encode 85 | if (count == K) 86 | { 87 | int inc2 = encode_inc - 1; 88 | for (int i = 0; count > 0 && i < SERVER; i++) 89 | { 90 | if (!vbuf[inc2 % SERVER].empty()) 91 | { 92 | //dd keys 93 | cout << "\t\t" << vbuf[inc2 % SERVER].front() << endl; 94 | dd.push_back(vbuf[inc2 % SERVER].front()); 95 | vbuf[inc2 % SERVER].pop(); 96 | count--; 97 | } 98 | inc2++; 99 | } 100 | return 1; 101 | } 102 | else 103 | return 0; 104 | } 105 | 106 | void encode(vector &dd, vector &pp) 107 | { 108 | unsigned char *data[K]; 109 | unsigned char *parity[N - K]; 110 | 111 | for (int i = 0; i < K; i++) 112 | { 113 | data[i] = new unsigned char[CHUNK_SIZE]; 114 | memset(data[i], dd[i][5] - '0' + 'a', CHUNK_SIZE * sizeof(char)); 115 | //memcpy(data[i],dd[i].data(),CHUNK_SIZE); 116 | } 117 | 118 | for (int i = 0; i < N - K; i++) 119 | { 120 | parity[i] = new unsigned char[CHUNK_SIZE]; 121 | } 122 | 123 | unsigned char encode_gftbl[32 * K * (N - K)]; 124 | unsigned char encode_matrix[N * K]; 125 | 126 | gf_gen_rs_matrix(encode_matrix, N, K); 127 | ec_init_tables(K, N - K, &(encode_matrix[K * K]), encode_gftbl); 128 | 129 | ec_encode_data(CHUNK_SIZE, K, N - K, encode_gftbl, data, parity); 130 | 131 | for (int i = 0; i < K; i++) 132 | { 133 | delete[] data[i]; 134 | } 135 | 136 | for (int i = 0; i < N - K; i++) 137 | { 138 | pp[i] = (const char *)parity[i]; 139 | delete[] parity[i]; 140 | } 141 | 142 | cout << "\tENCODE OK" << endl; 143 | } 144 | 145 | int init() 146 | { 147 | char p1[100] = {0}, p2[100] = {0}; 148 | sprintf(p1, "./%s/%s", path, "ycsb_set.txt"); 149 | FILE *fin_load = fopen(p1, "r"); 150 | sprintf(p2, "./%s/%s", path, "ycsb_test.txt"); 151 | FILE *fin_run = fopen(p2, "r"); 152 | 153 | char tmp[1024]; 154 | while (fgets(tmp, 10240, fin_load) && (!feof(fin_load))) 155 | { 156 | char key[250] = {0}; 157 | if (sscanf(tmp, "INSERT %s", key)) 158 | { 159 | vload.push_back(string(key)); 160 | } 161 | } 162 | 163 | struct request_st rr; 164 | while (fgets(tmp, 10240, fin_run) && (!feof(fin_run))) 165 | { 166 | char key[250] = {0}; 167 | if (sscanf(tmp, "READ %s", key)) 168 | { 169 | rr.op = 0; 170 | rr.key = string(key); 171 | vrun.push_back(rr); 172 | } 173 | if (sscanf(tmp, "UPDATE %s", key)) 174 | { 175 | rr.op = 1; 176 | rr.key = string(key); 177 | vrun.push_back(rr); 178 | } 179 | } 180 | 181 | fclose(fin_load); 182 | fclose(fin_run); 183 | 184 | cout << "FILE LOAD OK" << endl; 185 | 186 | //Add server 187 | memcached_return rc; 188 | memc.resize(N - K); 189 | vbuf.resize(SERVER); 190 | 191 | memc[0] = memcached_create(NULL); 192 | memc[1] = memcached_create(NULL); 193 | memc[2] = memcached_create(NULL); 194 | memc[3] = memcached_create(NULL); 195 | 196 | //data+P1 197 | for(int i=0; i dd; 226 | if (check_encode(dd) == 1) 227 | { 228 | //encode 229 | vector pp(N - K); 230 | 231 | encode(dd, pp); 232 | 233 | //store XOR & non-XOR parity chunks 234 | for (int j = 0; j < N - K; j++) 235 | { 236 | char p1[100] = {0}; 237 | sprintf(p1, "SID%u-P%d", StripID, j + 1); 238 | //todo, need consider the distribution of XOR parity 239 | rc = memcached_set(memc[j], p1, strlen(p1), pp[j].data(), CHUNK_SIZE, 0, 0); 240 | } 241 | 242 | cout << "\tPARITY SET OK" << endl; 243 | //put into Object Index 244 | //###key->stripe ID### 245 | for (int j = 0; j < dd.size(); j++) 246 | { 247 | //key->stripeID, offset 248 | object_index.insert(pair >(dd[j], pair(StripID, j))); 249 | } 250 | 251 | //put into Stripe Index, only data, parity can be calculated 252 | //###StripeID -> keys+flag### 253 | vector > ddd; 254 | for (int i = 0; i < dd.size(); i++) 255 | { 256 | ddd.push_back(pair(dd[i], 0)); //valid, flag=0, for batch coding; 257 | } 258 | 259 | stripe_index.push_back(ddd); 260 | 261 | cout << "\tMETADTA OK" << endl; 262 | 263 | StripID++; 264 | } 265 | } 266 | } 267 | } 268 | 269 | void run() 270 | { 271 | size_t val_len; 272 | uint32_t flags; 273 | memcached_return rc; 274 | struct timeval begin, end, bb, ee; 275 | //run test 276 | int count = 1; 277 | while (count--) 278 | { 279 | for (int i = 0; i < vrun.size(); i++) 280 | { 281 | if (vrun[i].op == 1) //update, skip 282 | continue; 283 | else 284 | { 285 | degraded_all++; 286 | gettimeofday(&begin, 0); 287 | cout << "Degraded reads [" << i << "](" << vrun[i].key << ")" << endl; 288 | 289 | //full DRAM 290 | auto iter = object_index.find(vrun[i].key); 291 | 292 | unsigned int sid = 0, offset = 0; 293 | if (iter != object_index.end()) 294 | { 295 | cout << "Encoded" << endl; 296 | sid = (iter->second).first; 297 | offset = (iter->second).second; 298 | } 299 | else 300 | { 301 | cout << "Not encoded" << endl; 302 | continue; 303 | } 304 | 305 | cout << "\tsid= " << sid << " offset= " << offset << endl; 306 | 307 | int err_arr[2] = {-1, -1}; 308 | err_arr[0] = offset; //itself 309 | if (offset == 0) 310 | { 311 | err_arr[1] = 1; 312 | } 313 | else 314 | { 315 | err_arr[1] = offset - 1; //assump front & itself are failed; 316 | } 317 | 318 | cout << "Assume " << err_arr[0] << " and " << err_arr[1] << " fail\n"; 319 | 320 | gettimeofday(&bb, 0); 321 | //DRAM 322 | char *left_data[K]; 323 | int in = 0; 324 | for (int j = 0; j < K; j++) 325 | { 326 | if (j == err_arr[0] || j == err_arr[1]) 327 | continue; 328 | left_data[in++] = memcached_get(memc[0], stripe_index[sid][j].first.c_str(), stripe_index[sid][j].first.length(), &val_len, &flags, &rc); 329 | if (rc == MEMCACHED_SUCCESS) 330 | cout << "\tRead Success " << stripe_index[sid][j].first.c_str() << endl; 331 | } 332 | cout << "Read DRAM DATA OVER!" << endl; 333 | 334 | //XOR parity 335 | char p1[100] = {0}; 336 | sprintf(p1, "SID%u-P%d", sid, 1); 337 | left_data[in++] = memcached_get(memc[0], p1, strlen(p1), &val_len, &flags, &rc); 338 | if (rc == MEMCACHED_SUCCESS) 339 | cout << "Read DRAM XOR OVER!" << endl; 340 | 341 | gettimeofday(&ee, 0); 342 | time_dram_all += timeval_diff(&bb, &ee); 343 | 344 | gettimeofday(&bb, 0); 345 | //disk 346 | FILE *fin = fopen("4K.txt", "r"); 347 | char tmp[102400] = {0}; 348 | if (fin) 349 | { 350 | fgets(tmp, 102400, fin); 351 | left_data[in] = new char[CHUNK_SIZE]; 352 | memcpy(left_data[in], tmp, CHUNK_SIZE); 353 | fclose(fin); 354 | cout << "Read Disk P2 OVER! " << left_data[in] << endl; 355 | } 356 | else 357 | cerr << "FILE OPEN FAILED" << endl; 358 | 359 | gettimeofday(&ee, 0); 360 | time_disk_all += timeval_diff(&bb, &ee); 361 | 362 | unsigned char encode_matrix[N * K] = {0}; 363 | unsigned char error_matrix[N * K] = {0}; 364 | unsigned char invert_matrix[N * K] = {0}; 365 | unsigned char decode_matrix[N * K] = {0}; 366 | 367 | for (int j = 0, r = 0; j < N; j++) 368 | { 369 | if (j == err_arr[0] || j == err_arr[1]) 370 | continue; 371 | for (int a = 0; a < K; a++) 372 | error_matrix[r * K + a] = encode_matrix[j * K + a]; 373 | r++; 374 | } 375 | 376 | gf_invert_matrix(error_matrix, invert_matrix, K); 377 | 378 | cout << "Error Matrix" << endl; 379 | 380 | for (int e = 0; e < 2; e++) 381 | { 382 | int idx = err_arr[e]; 383 | if (idx < K) // We lost one of the buffers containing the data 384 | { 385 | for (int j = 0; j < K; j++) 386 | decode_matrix[e * K + j] = invert_matrix[idx * K + j]; 387 | } 388 | else // We lost one of the buffer containing the error correction codes 389 | { 390 | for (int j = 0; j < K; j++) 391 | { 392 | unsigned char s = 0; 393 | //mul the encode matrix coefficient to get the failed data only 394 | for (int a = 0; a < K; a++) 395 | s ^= gf_mul(invert_matrix[a * K + j], encode_matrix[idx * K + a]); 396 | decode_matrix[e * K + j] = s; 397 | } 398 | } 399 | } 400 | 401 | cout << "Decode Matrix" << endl; 402 | 403 | unsigned char decode_gftbl[32 * K * (N - K)]; 404 | unsigned char *recovery_data[2]; 405 | 406 | for (int j = 0; j < 2; j++) 407 | recovery_data[j] = new unsigned char[CHUNK_SIZE]; 408 | 409 | for (int j = 0; j < K; j++) 410 | { 411 | left_data[j] = new char[CHUNK_SIZE]; 412 | memset(left_data[j], '1', CHUNK_SIZE * sizeof(char)); 413 | } 414 | 415 | ec_init_tables(K, N - K, decode_matrix, decode_gftbl); 416 | ec_encode_data(CHUNK_SIZE, K, 2, decode_gftbl, (unsigned char **)left_data, recovery_data); 417 | 418 | cout << "Decode OVER" << endl 419 | << endl; 420 | 421 | for (int j = 0; j < 2; j++) 422 | delete[] recovery_data[j]; 423 | delete left_data[in]; 424 | 425 | gettimeofday(&end, 0); 426 | time_all += timeval_diff(&begin, &end); 427 | } 428 | } 429 | } 430 | } 431 | 432 | void run_plr() 433 | { 434 | size_t val_len; 435 | uint32_t flags; 436 | memcached_return rc; 437 | struct timeval begin, end, bb, ee; 438 | int count = 1; 439 | while (count--) 440 | { 441 | for (int i = 0; i < vrun.size(); i++) 442 | { 443 | if (vrun[i].op == 1) //update, skip 444 | continue; 445 | else 446 | { 447 | degraded_all++; 448 | gettimeofday(&begin, 0); 449 | cout << "Degraded reads [" << i << "](" << vrun[i].key << ")" << endl; 450 | 451 | //full DRAM 452 | auto iter = object_index.find(vrun[i].key); 453 | 454 | unsigned int sid = 0, offset = 0; 455 | if (iter != object_index.end()) 456 | { 457 | cout << "Encoded" << endl; 458 | sid = (iter->second).first; 459 | offset = (iter->second).second; 460 | } 461 | else 462 | { 463 | cout << "Not encoded" << endl; 464 | continue; 465 | } 466 | 467 | cout << "\tsid= " << sid << " offset= " << offset << endl; 468 | 469 | int err_arr[2] = {-1, -1}; 470 | err_arr[0] = offset; //itself 471 | if (offset == 0) 472 | { 473 | err_arr[1] = 1; 474 | } 475 | else 476 | { 477 | err_arr[1] = offset - 1; //assump front & itself are failed; 478 | } 479 | 480 | cout << "Assume " << err_arr[0] << " and " << err_arr[1] << " fail\n"; 481 | 482 | gettimeofday(&bb, 0); 483 | //DRAM 484 | char *left_data[K]; 485 | int in = 0; 486 | for (int j = 0; j < K; j++) 487 | { 488 | if (j == err_arr[0] || j == err_arr[1]) 489 | continue; 490 | left_data[in++] = memcached_get(memc[0], stripe_index[sid][j].first.c_str(), stripe_index[sid][j].first.length(), &val_len, &flags, &rc); 491 | if (rc == MEMCACHED_SUCCESS) 492 | cout << "\tRead Success " << stripe_index[sid][j].first.c_str() << endl; 493 | } 494 | cout << "Read DRAM DATA OVER!" << endl; 495 | 496 | //XOR parity 497 | char p1[100] = {0}; 498 | sprintf(p1, "SID%u-P%d", sid, 1); 499 | left_data[in++] = memcached_get(memc[0], p1, strlen(p1), &val_len, &flags, &rc); 500 | if (rc == MEMCACHED_SUCCESS) 501 | cout << "Read DRAM XOR OVER!" << endl; 502 | 503 | gettimeofday(&ee, 0); 504 | time_dram_all += timeval_diff(&bb, &ee); 505 | 506 | gettimeofday(&bb, 0); 507 | //disk 508 | FILE *fin = fopen("16K.txt", "r"); 509 | char tmp[102400] = {0}; 510 | 511 | left_data[in] = new char[CHUNK_SIZE]; 512 | vector v_left; 513 | 514 | if (fin) 515 | { 516 | fgets(tmp, 102400, fin); 517 | for (int j = 0; j < strlen(tmp) / CHUNK_SIZE; j++) 518 | { 519 | char *t = new char[CHUNK_SIZE]; 520 | memcpy(t, tmp + CHUNK_SIZE * j, CHUNK_SIZE); 521 | v_left.push_back(t); 522 | } 523 | 524 | fclose(fin); 525 | cout << "Read Disk P2 OVER! " << endl; 526 | } 527 | else 528 | cerr << "FILE OPEN FAILED" << endl; 529 | 530 | //XOR, only for two, simulator 531 | unsigned char encode_gftbl_xor[32 * 2 * 1]; 532 | unsigned char encode_matrix_xor[3 * 2]; 533 | 534 | gf_gen_rs_matrix(encode_matrix_xor, 3, 2); 535 | ec_init_tables(2, 1, &(encode_matrix_xor[2 * 2]), encode_gftbl_xor); 536 | 537 | char *tt[2]; 538 | for (int j = 0; j < 2; j++) 539 | { 540 | tt[j] = new char[CHUNK_SIZE]; 541 | memcpy(tt[j], v_left[j], CHUNK_SIZE); 542 | } 543 | 544 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, (unsigned char **)tt, (unsigned char **)&(left_data[in])); 545 | 546 | cout << "\tCREATE NEW PARITY OK" << endl; 547 | 548 | gettimeofday(&ee, 0); 549 | time_disk_all += timeval_diff(&bb, &ee); 550 | 551 | unsigned char encode_matrix[N * K] = {0}; 552 | unsigned char error_matrix[N * K] = {0}; 553 | unsigned char invert_matrix[N * K] = {0}; 554 | unsigned char decode_matrix[N * K] = {0}; 555 | 556 | for (int j = 0, r = 0; j < N; j++) 557 | { 558 | if (j == err_arr[0] || j == err_arr[1]) 559 | continue; 560 | for (int a = 0; a < K; a++) 561 | error_matrix[r * K + a] = encode_matrix[j * K + a]; 562 | r++; 563 | } 564 | 565 | gf_invert_matrix(error_matrix, invert_matrix, K); 566 | 567 | cout << "Error Matrix" << endl; 568 | 569 | for (int e = 0; e < 2; e++) 570 | { 571 | int idx = err_arr[e]; 572 | if (idx < K) // We lost one of the buffers containing the data 573 | { 574 | for (int j = 0; j < K; j++) 575 | decode_matrix[e * K + j] = invert_matrix[idx * K + j]; 576 | } 577 | else // We lost one of the buffer containing the error correction codes 578 | { 579 | for (int j = 0; j < K; j++) 580 | { 581 | unsigned char s = 0; 582 | //mul the encode matrix coefficient to get the failed data only 583 | for (int a = 0; a < K; a++) 584 | s ^= gf_mul(invert_matrix[a * K + j], encode_matrix[idx * K + a]); 585 | decode_matrix[e * K + j] = s; 586 | } 587 | } 588 | } 589 | 590 | cout << "Decode Matrix" << endl; 591 | 592 | unsigned char decode_gftbl[32 * K * (N - K)]; 593 | unsigned char *recovery_data[2]; 594 | 595 | for (int j = 0; j < 2; j++) 596 | recovery_data[j] = new unsigned char[CHUNK_SIZE]; 597 | 598 | for (int j = 0; j < K; j++) 599 | { 600 | left_data[j] = new char[CHUNK_SIZE]; 601 | memset(left_data[j], '1', CHUNK_SIZE * sizeof(char)); 602 | } 603 | 604 | ec_init_tables(K, N - K, decode_matrix, decode_gftbl); 605 | ec_encode_data(CHUNK_SIZE, K, 2, decode_gftbl, (unsigned char **)left_data, recovery_data); 606 | 607 | cout << "Decode OVER" << endl 608 | << endl; 609 | 610 | for (int j = 0; j < 2; j++) 611 | delete[] recovery_data[j]; 612 | delete left_data[in]; 613 | 614 | gettimeofday(&end, 0); 615 | time_all += timeval_diff(&begin, &end); 616 | } 617 | } 618 | } 619 | } 620 | 621 | int main(int argc, char *argv[]) 622 | { 623 | //para config 624 | N = 14; 625 | K = 10; 626 | SERVER = 16; 627 | CHUNK_SIZE = 4096; 628 | 629 | sscanf(argv[2], "%d", &N); 630 | sscanf(argv[3], "%d", &K); 631 | sscanf(argv[4], "%s", IP); 632 | 633 | sscanf(argv[1], "%s", path); 634 | init(); 635 | 636 | run(); 637 | 638 | cerr << endl 639 | << "[PL] ALL Time: " << time_all << " s" << endl; 640 | cerr << "ALL Degraded: " << degraded_all << endl; 641 | cerr << "AVG time: " << time_all / degraded_all * 1.0 * 1000000 << "us" << endl; 642 | cerr << "AVG time_dram_all of K-1 chunks: " << time_dram_all / degraded_all * 1.0 * 1000000 / (K - 1) << "us" << endl; 643 | cerr << "AVG time_disk_all of 1 chunks (add transfer time): " << time_disk_all / degraded_all * 1.0 * 1000000 << "us" << endl; 644 | 645 | time_all = 0; 646 | time_dram_all = 0; 647 | time_disk_all = 0; 648 | degraded_all = 0; 649 | 650 | run_plr(); 651 | 652 | cerr << endl 653 | << "[PLR] ALL Time: " << time_all << " s" << endl; 654 | cerr << "ALL Degraded: " << degraded_all << endl; 655 | cerr << "AVG time: " << time_all / degraded_all * 1.0 * 1000000 << "us" << endl; 656 | cerr << "AVG time_dram_all of K-1 chunks: " << time_dram_all / degraded_all * 1.0 * 1000000 / (K - 1) << "us" << endl; 657 | cerr << "AVG time_disk_all of 1 chunks (add transfer time): " << time_disk_all / degraded_all * 1.0 * 1000000 << "us" << endl; 658 | 659 | return 0; 660 | } -------------------------------------------------------------------------------- /proxy/update/update.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "libmemcached/memcached.h" 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | using namespace std; 17 | //g++ -std=c++11 update.cpp -o update -lmemcached -lisal 18 | 19 | unsigned int N, K, SERVER, CHUNK_SIZE; 20 | char path[100] = {0}; //path 21 | char IP[100] = "127.0.0.1"; // node server 22 | 23 | static double timeval_diff(struct timeval *start, 24 | struct timeval *end) 25 | { 26 | double r = end->tv_sec - start->tv_sec; 27 | if (end->tv_usec > start->tv_usec) 28 | r += (end->tv_usec - start->tv_usec) / 1000000.0; 29 | else if (end->tv_usec < start->tv_usec) 30 | r -= (start->tv_usec - end->tv_usec) / 1000000.0; 31 | return r; 32 | } 33 | 34 | struct request_st 35 | { 36 | int op; //read=0,update=1 37 | string key; 38 | }; 39 | 40 | vector vload; 41 | vector vrun; 42 | 43 | vector memc(N - K); //data +XOR,P2,P3 44 | //the buffers of each memcached; 45 | vector > vbuf(SERVER); 46 | 47 | unsigned int StripID = 0; 48 | unsigned int encode_inc = 0; //for random encoding 49 | unsigned int delta_inc = 0; //for all parity delta 50 | unsigned int version_inc = 0; //for all version data 51 | 52 | //stripe metadata 53 | map > object_index; //key -> stripID, offset 54 | 55 | //stripe ID -> keys+flag(flag mark for valid or not), invaild=1; 56 | vector > > stripe_index; 57 | 58 | double time_all = 0; 59 | int update_all = 0; 60 | 61 | //IO times 62 | unsigned int set_all = 0; 63 | unsigned int get_all = 0; 64 | unsigned int del_all = 0; 65 | unsigned int dram_all = 0; 66 | unsigned int disk_all = 0; 67 | 68 | double time_encode = 0; 69 | int delete_all = 0; 70 | 71 | //0 -> can not, 1->can 72 | int check_encode(vector &dd) 73 | { 74 | int count = 0; 75 | int inc1 = encode_inc; 76 | for (int i = 0; i < SERVER; i++) 77 | { 78 | if (!vbuf[inc1 % SERVER].empty()) 79 | { 80 | count++; 81 | if (count == K) 82 | { 83 | cout << "\tcan encode!" << endl; 84 | break; 85 | } 86 | } 87 | inc1++; 88 | } 89 | //round_rabin the start tranverse point 90 | encode_inc++; 91 | 92 | //can encode 93 | if (count == K) 94 | { 95 | int inc2 = encode_inc - 1; 96 | for (int i = 0; count > 0 && i < SERVER; i++) 97 | { 98 | if (!vbuf[inc2 % SERVER].empty()) 99 | { 100 | //dd keys 101 | cout << "\t\t" << vbuf[inc2 % SERVER].front() << endl; 102 | dd.push_back(vbuf[inc2 % SERVER].front()); 103 | vbuf[inc2 % SERVER].pop(); 104 | count--; 105 | } 106 | inc2++; 107 | } 108 | return 1; 109 | } 110 | else 111 | return 0; 112 | } 113 | 114 | void encode(vector &dd, vector &pp) 115 | { 116 | unsigned char *data[K]; 117 | unsigned char *parity[N - K]; 118 | 119 | for (int i = 0; i < K; i++) 120 | { 121 | data[i] = new unsigned char[CHUNK_SIZE]; 122 | memset(data[i], dd[i][5] - '0' + 'a', CHUNK_SIZE * sizeof(char)); 123 | //memcpy(data[i],dd[i].data(),CHUNK_SIZE); 124 | } 125 | 126 | for (int i = 0; i < N - K; i++) 127 | { 128 | parity[i] = new unsigned char[CHUNK_SIZE]; 129 | } 130 | 131 | unsigned char encode_gftbl[32 * K * (N - K)]; 132 | unsigned char encode_matrix[N * K]; 133 | 134 | gf_gen_rs_matrix(encode_matrix, N, K); 135 | ec_init_tables(K, N - K, &(encode_matrix[K * K]), encode_gftbl); 136 | 137 | ec_encode_data(CHUNK_SIZE, K, N - K, encode_gftbl, data, parity); 138 | 139 | for (int i = 0; i < K; i++) 140 | { 141 | delete[] data[i]; 142 | } 143 | 144 | for (int i = 0; i < N - K; i++) 145 | { 146 | pp[i] = (const char *)parity[i]; 147 | delete[] parity[i]; 148 | } 149 | 150 | cout << "\tENCODE OK" << endl; 151 | } 152 | 153 | int init() 154 | { 155 | char p1[100] = {0}, p2[100] = {0}; 156 | sprintf(p1, "./%s/%s", path, "ycsb_set.txt"); 157 | FILE *fin_load = fopen(p1, "r"); 158 | sprintf(p2, "./%s/%s", path, "ycsb_test.txt"); 159 | FILE *fin_run = fopen(p2, "r"); 160 | 161 | if (!(fin_load || fin_run)) 162 | cerr << "Load or Run file error!" << endl; 163 | char tmp[1024]; 164 | while (fgets(tmp, 1024, fin_load) && (!feof(fin_load))) 165 | { 166 | char key[250] = {0}; 167 | if (sscanf(tmp, "INSERT %s", key)) 168 | { 169 | vload.push_back(string(key)); 170 | } 171 | } 172 | 173 | struct request_st rr; 174 | while (fgets(tmp, 1024, fin_run) && (!feof(fin_run))) 175 | { 176 | char key[250] = {0}; 177 | if (sscanf(tmp, "READ %s", key)) 178 | { 179 | rr.op = 0; 180 | rr.key = string(key); 181 | vrun.push_back(rr); 182 | } 183 | if (sscanf(tmp, "UPDATE %s", key)) 184 | { 185 | rr.op = 1; 186 | rr.key = string(key); 187 | vrun.push_back(rr); 188 | } 189 | } 190 | 191 | fclose(fin_load); 192 | fclose(fin_run); 193 | cout << "FILE LOAD OK" << endl; 194 | 195 | //Add server 196 | memcached_return rc; 197 | memc.resize(N - K); 198 | vbuf.resize(SERVER); 199 | 200 | memc[0] = memcached_create(NULL); 201 | memc[1] = memcached_create(NULL); 202 | memc[2] = memcached_create(NULL); 203 | memc[3] = memcached_create(NULL); 204 | 205 | //data+P1 206 | for(int i=0; i dd; 234 | if (check_encode(dd) == 1) 235 | { 236 | //encode 237 | vector pp(N - K); 238 | 239 | encode(dd, pp); 240 | 241 | //store XOR & non-XOR parity chunks 242 | for (int j = 0; j < N - K; j++) 243 | { 244 | char p1[100] = {0}; 245 | sprintf(p1, "SID%u-P%d", StripID, j + 1); 246 | //todo, need consider the distribution of XOR parity 247 | rc = memcached_set(memc[j], p1, strlen(p1), pp[j].data(), CHUNK_SIZE, 0, 0); 248 | } 249 | 250 | cout << "\tPARITY SET OK" << endl; 251 | //put into Object Index 252 | //###key->stripe ID### 253 | for (int j = 0; j < dd.size(); j++) 254 | { 255 | //key->stripeID, offset 256 | object_index.insert(pair >(dd[j], pair(StripID, j))); 257 | } 258 | 259 | //put into Stripe Index, only data, parity can be calculated 260 | //###StripeID -> keys+flag### 261 | vector > ddd; 262 | for (int i = 0; i < dd.size(); i++) 263 | { 264 | ddd.push_back(pair(dd[i], 0)); //valid, flag=0, for batch coding; 265 | } 266 | 267 | stripe_index.push_back(ddd); 268 | 269 | cout << "\tMETADTA OK" << endl; 270 | 271 | StripID++; 272 | } 273 | } 274 | } 275 | } 276 | 277 | void run_inplace() 278 | { 279 | cerr << endl << "[In-place]"; 280 | unsigned char encode_gftbl[32 * K * (N - K)]; 281 | unsigned char encode_matrix[N * K]; 282 | 283 | gf_gen_rs_matrix(encode_matrix, N, K); 284 | ec_init_tables(K, N - K, &(encode_matrix[K * K]), encode_gftbl); 285 | 286 | //XOR 287 | unsigned char encode_gftbl_xor[32 * 2 * 1]; 288 | unsigned char encode_matrix_xor[3 * 2]; 289 | 290 | gf_gen_rs_matrix(encode_matrix_xor, 3, 2); 291 | ec_init_tables(2, 1, &(encode_matrix_xor[2 * 2]), encode_gftbl_xor); 292 | 293 | struct timeval begin, end; 294 | for (int i = 0; i < vrun.size(); i++) 295 | { 296 | if (vrun[i].op == 0) //read, skip 297 | continue; 298 | else 299 | { 300 | update_all++; 301 | double time_single = 0; 302 | 303 | size_t val_len; 304 | uint32_t flags; 305 | memcached_return rc; 306 | 307 | cout << endl 308 | << "[" << i << "].Start update (" << vrun[i].key << ")" << endl; 309 | //1. retrieve old 310 | char *old_data = memcached_get(memc[0], vrun[i].key.data(), vrun[i].key.length(), &val_len, &flags, &rc); 311 | 312 | if (old_data) 313 | cout << "\t1.RETRIEVE OLD DATA OK, (" << old_data[0] << ")" << endl; 314 | else 315 | old_data = new char[CHUNK_SIZE]; 316 | 317 | //2. set new value 318 | char new_data[CHUNK_SIZE] = {0}; 319 | memset(new_data, 'N', CHUNK_SIZE * sizeof(char)); 320 | rc = memcached_set(memc[0], vrun[i].key.data(), vrun[i].key.length(), new_data, CHUNK_SIZE, 0, 0); 321 | 322 | cout << "\t2.SET NEW VALUE OK, (" << new_data[0] << ")" << endl; 323 | 324 | gettimeofday(&begin, 0); 325 | //3. create data deltas 326 | unsigned char *delta_data = new unsigned char[CHUNK_SIZE]; 327 | unsigned char *delta_parity[N - K]; 328 | unsigned char *new_parity[N - K]; 329 | 330 | //data delta 331 | unsigned char *d[2]; 332 | d[0] = (unsigned char *)old_data; 333 | d[1] = (unsigned char *)new_data; 334 | 335 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, d, &delta_data); 336 | cout << "\t3.CREATE DATA DELTA OK, [" << (unsigned int)delta_data[0] << "]" << endl; 337 | 338 | //4. create parity deltas 339 | for (int j = 0; j < N - K; j++) 340 | { 341 | delta_parity[j] = new unsigned char[CHUNK_SIZE]; 342 | new_parity[j] = new unsigned char[CHUNK_SIZE]; 343 | } 344 | 345 | //obtain offset 346 | ec_encode_data_update(CHUNK_SIZE, K, N - K, object_index[vrun[i].key.data()].second, encode_gftbl, delta_data, delta_parity); 347 | 348 | cout << "\t4.CREATE PARITY DELTAS OK, "; 349 | for (int j = 0; j < N - K; j++) 350 | cout << "[" << (unsigned int)delta_parity[j][0] << "] "; 351 | cout << endl; 352 | 353 | //5. retrieve parity chunk 354 | char *old_parity[N - K]; 355 | 356 | unsigned int sid = object_index[vrun[i].key.data()].first; 357 | 358 | //XOR & non-XOR parity chunks 359 | for (int j = 0; j < N - K; j++) 360 | { 361 | char p1[100] = {0}; 362 | sprintf(p1, "SID%u-P%d", sid, j + 1); 363 | old_parity[j] = memcached_get(memc[j], p1, strlen(p1), &val_len, &flags, &rc); 364 | get_all++; 365 | if (old_parity[j]) 366 | cout << "old P" << j + 1 << ":[" << (int)old_parity[j][0] << "]; "; 367 | else 368 | old_parity[j] = new char[CHUNK_SIZE]; 369 | } 370 | 371 | cout << endl 372 | << "\t5.RETRIEVE OLD PARITY OK" << endl; 373 | 374 | //6. create all new parity,XOR operation, K=2, N=3 375 | for (int j = 0; j < N - K; j++) 376 | { 377 | unsigned char *p[2]; 378 | p[0] = (unsigned char *)old_parity[j]; 379 | p[1] = delta_parity[j]; 380 | 381 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, p, &(new_parity[j])); 382 | } 383 | 384 | cout << "\t6.CREATE NEW PARITY OK" << endl 385 | << "\t\t"; 386 | for (int j = 0; j < N - K; j++) 387 | cout << "new P" << j + 1 << ":[" << (int)new_parity[j][0] << "]; "; 388 | cout << endl; 389 | 390 | //7. set new parity, in-place 391 | //store non-XOR parity chunks 392 | for (int j = 0; j < N - K; j++) 393 | { 394 | char p1[100] = {0}; 395 | sprintf(p1, "SID%u-P%d", sid, j + 1); 396 | rc = memcached_set(memc[j], p1, strlen(p1), (char *)new_parity[j], CHUNK_SIZE, 0, 0); 397 | set_all++; 398 | } 399 | 400 | cout << "\t7.SET NEW PARITY OK" << endl; 401 | 402 | gettimeofday(&end, 0); 403 | time_single = timeval_diff(&begin, &end); 404 | time_all += time_single; 405 | 406 | cout << "Time: " << time_single << " s" << endl; 407 | 408 | for (int j = 0; j < N - K; j++) 409 | { 410 | delete[] delta_parity[j]; 411 | delete[] new_parity[j]; 412 | } 413 | 414 | delete[] delta_data; 415 | } 416 | } 417 | } 418 | 419 | void run_hybrid() 420 | { 421 | cerr << endl << "[LogECMem]"; 422 | unsigned char encode_gftbl[32 * K * (N - K)]; 423 | unsigned char encode_matrix[N * K]; 424 | 425 | gf_gen_rs_matrix(encode_matrix, N, K); 426 | ec_init_tables(K, N - K, &(encode_matrix[K * K]), encode_gftbl); 427 | 428 | //XOR 429 | unsigned char encode_gftbl_xor[32 * 2 * 1]; 430 | unsigned char encode_matrix_xor[3 * 2]; 431 | 432 | gf_gen_rs_matrix(encode_matrix_xor, 3, 2); 433 | ec_init_tables(2, 1, &(encode_matrix_xor[2 * 2]), encode_gftbl_xor); 434 | 435 | struct timeval begin, end; 436 | //run test 437 | for (int i = 0; i < vrun.size(); i++) 438 | { 439 | if (vrun[i].op == 0) //read, skip 440 | continue; 441 | else 442 | { 443 | update_all++; 444 | double time_single = 0; 445 | 446 | size_t val_len; 447 | uint32_t flags; 448 | memcached_return rc; 449 | 450 | cout << endl 451 | << "[" << i << "].Start update (" << vrun[i].key << ")" << endl; 452 | //1. retrieve old 453 | char *old_data = memcached_get(memc[0], vrun[i].key.data(), vrun[i].key.length(), &val_len, &flags, &rc); 454 | 455 | if (old_data) 456 | cout << "\t1.RETRIEVE OLD DATA OK, (" << old_data[0] << ")" << endl; 457 | else 458 | old_data = new char[CHUNK_SIZE]; 459 | //2. set new value 460 | char new_data[CHUNK_SIZE] = {0}; 461 | memset(new_data, 'N', CHUNK_SIZE * sizeof(char)); 462 | rc = memcached_set(memc[0], vrun[i].key.data(), vrun[i].key.length(), new_data, CHUNK_SIZE, 0, 0); 463 | 464 | cout << "\t2.SET NEW VALUE OK, (" << new_data[0] << ")" << endl; 465 | 466 | gettimeofday(&begin, 0); 467 | //3. create data deltas 468 | unsigned char *delta_data = new unsigned char[CHUNK_SIZE]; 469 | unsigned char *delta_parity[N - K]; 470 | 471 | //data delta 472 | unsigned char *d[2]; 473 | d[0] = (unsigned char *)old_data; 474 | d[1] = (unsigned char *)new_data; 475 | 476 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, d, &delta_data); 477 | cout << "\t3.CREATE DATA DELTA OK, [" << (unsigned int)delta_data[0] << "]" << endl; 478 | 479 | //4. create parity deltas 480 | for (int j = 0; j < N - K; j++) 481 | { 482 | delta_parity[j] = new unsigned char[CHUNK_SIZE]; 483 | } 484 | 485 | //obtain offset 486 | ec_encode_data_update(CHUNK_SIZE, K, N - K, object_index[vrun[i].key.data()].second, encode_gftbl, delta_data, delta_parity); 487 | 488 | cout << "\t4.CREATE PARITY DELTAS OK, "; 489 | for (int j = 0; j < N - K; j++) 490 | cout << "[" << (unsigned int)delta_parity[j][0] << "] "; 491 | cout << endl; 492 | 493 | //5. retrieve XOR 494 | char *old_parity; 495 | 496 | //XOR parity 497 | char p1[100] = {0}; 498 | //obtain stripeID 499 | unsigned int sid = object_index[vrun[i].key.data()].first; 500 | sprintf(p1, "SID%u-P%d", sid, 1); 501 | old_parity = memcached_get(memc[0], p1, strlen(p1), &val_len, &flags, &rc); 502 | get_all++; 503 | 504 | if (old_parity) 505 | cout << "\t\told P1:[" << (int)old_parity[0] << "]; "; 506 | else 507 | old_parity = new char[CHUNK_SIZE]; 508 | 509 | cout << endl 510 | << "\t5.RETRIEVE OLD XOR PARITY OK" << endl; 511 | 512 | //6. create new XOR parity 513 | unsigned char *new_parity = new unsigned char[CHUNK_SIZE]; 514 | unsigned char *p[2]; 515 | p[0] = (unsigned char *)old_parity; 516 | p[1] = delta_parity[0]; 517 | 518 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, p, &(new_parity)); 519 | 520 | cout << "\t6.CREATE XOR NEW PARITY OK" << endl 521 | << "\t\t"; 522 | cout << "new P1:[" << (int)new_parity[0] << "]; " << endl; 523 | 524 | //7. set XOR & parity delta, 525 | //Todo, need extra metadata 526 | //store XOR parity, in-place 527 | memset(p1, '\0', 100 * sizeof(char)); 528 | sprintf(p1, "SID%u-P%d", sid, 1); 529 | rc = memcached_set(memc[0], p1, strlen(p1), (char *)new_parity, CHUNK_SIZE, 0, 0); 530 | set_all++; 531 | 532 | //store non-XOR parity delta 533 | for (int j = 1; j < N - K; j++) 534 | { 535 | char p2[100] = {0}; 536 | sprintf(p2, "[Delta-%u]SID%u-P%d", delta_inc++, sid, j + 1); 537 | //todo, need consider the distribution of XOR parity 538 | rc = memcached_set(memc[j], p2, strlen(p2), (char *)delta_parity[j], CHUNK_SIZE, 0, 0); 539 | set_all++; 540 | disk_all++; 541 | } 542 | 543 | cout << "\t7.SET DELTAS PARITY OK" << endl; 544 | 545 | gettimeofday(&end, 0); 546 | time_single = timeval_diff(&begin, &end); 547 | time_all += time_single; 548 | 549 | cout << "Time: " << time_single << " s" << endl; 550 | 551 | for (int j = 0; j < N - K; j++) 552 | { 553 | delete[] delta_parity[j]; 554 | } 555 | 556 | delete[] delta_data; 557 | delete[] new_parity; 558 | } 559 | } 560 | } 561 | 562 | //for back stripe 563 | int head = 0; 564 | const char *find_object(int back) 565 | { 566 | static int h = 0; 567 | for (; head < back && head < stripe_index.size(); head++) 568 | { 569 | for (; h < stripe_index[head].size(); h++) 570 | { 571 | if (stripe_index[back][h].second == 0) //non-empty 572 | { 573 | cout << "Find non-empty" << endl; 574 | h++; 575 | return stripe_index[back][h - 1].first.data(); 576 | } 577 | } 578 | 579 | //delete the parity of the stripe 580 | cout << "Delete stripe, SID=" << head << " (" << stripe_index[head].size() << ")" << endl; 581 | delete_all++; 582 | 583 | for (int i = 0; i < N - K; i++) 584 | { 585 | char p1[100] = {0}; 586 | sprintf(p1, "SID%u-P%d", head, i + 1); 587 | memcached_delete(memc[i], p1, strlen(p1), 0); 588 | del_all++; 589 | } 590 | 591 | h = 0; //back to 0 592 | } 593 | if (head >= back) 594 | return NULL; 595 | } 596 | 597 | void run_full() 598 | { 599 | cerr << endl << "[Full-Stripe]"; 600 | unsigned char encode_gftbl[32 * K * (N - K)]; 601 | unsigned char encode_matrix[N * K]; 602 | 603 | gf_gen_rs_matrix(encode_matrix, N, K); 604 | ec_init_tables(K, N - K, &(encode_matrix[K * K]), encode_gftbl); 605 | 606 | unsigned char encode_gftbl_xor[32 * 2 * 1]; 607 | unsigned char encode_matrix_xor[3 * 2]; 608 | 609 | gf_gen_rs_matrix(encode_matrix_xor, 3, 2); 610 | ec_init_tables(2, 1, &(encode_matrix_xor[2 * 2]), encode_gftbl_xor); 611 | 612 | struct timeval begin, end; 613 | //run test 614 | for (int i = 0; i < vrun.size(); i++) 615 | { 616 | if (vrun[i].op == 0) //read, skip 617 | continue; 618 | else 619 | { 620 | update_all++; 621 | //normal encode 622 | char key[100] = {0}; //+version 623 | sprintf(key, "[update-%u]%s", version_inc++, vrun[i].key.data()); 624 | char value[CHUNK_SIZE + 1] = {0}; 625 | //random 626 | memset(value, key[5] - '0' + 'a', CHUNK_SIZE * sizeof(char)); 627 | //cout << value < dd; 649 | if (check_encode(dd) == 1) 650 | { 651 | //encode 652 | vector pp(N - K); 653 | 654 | encode(dd, pp); 655 | 656 | //store XOR & non-XOR parity chunks 657 | for (int j = 0; j < N - K; j++) 658 | { 659 | char p1[100] = {0}; 660 | sprintf(p1, "SID%u-P%d", StripID, j + 1); 661 | //todo, need consider the distribution of XOR parity 662 | rc = memcached_set(memc[j], p1, strlen(p1), pp[j].data(), CHUNK_SIZE, 0, 0); 663 | set_all++; 664 | dram_all++; 665 | } 666 | 667 | cout << "\tPARITY SET OK" << endl; 668 | //put into Object Index 669 | //###key->stripe ID### 670 | for (int j = 0; j < dd.size(); j++) 671 | { 672 | //key->stripeID, offset 673 | if (dd[j].substr(0, 8).compare("[update-") == 0) //updated key 674 | { 675 | //prefix "user" 676 | int pos = dd[j].find("user", 0); 677 | object_index[dd[j].substr(pos)] = pair(StripID, j); //overlap former 678 | //object_index.insert(pair >(dd[j].substr(pos), pair(StripID, j))); 679 | } 680 | else 681 | object_index.insert(pair >(dd[j], pair(StripID, j))); 682 | } 683 | 684 | //put into Stripe Index, only data, parity can be calculated 685 | //###StripeID -> keys+flag### 686 | vector > ddd; 687 | for (int i = 0; i < dd.size(); i++) 688 | { 689 | ddd.push_back(pair(dd[i], 0)); //valid, flag=0; 690 | } 691 | 692 | stripe_index.push_back(ddd); 693 | 694 | cout << "\tMETADTA OK, SID= " << StripID << endl; 695 | 696 | StripID++; 697 | } 698 | } 699 | gettimeofday(&end, 0); 700 | cout << "Time of encoding new stripes: " << timeval_diff(&begin, &end) << endl; 701 | time_encode = timeval_diff(&begin, &end); 702 | time_all += time_encode; 703 | } 704 | } 705 | 706 | size_t val_len; 707 | uint32_t flags; 708 | memcached_return rc; 709 | 710 | //GC module 711 | gettimeofday(&begin, 0); 712 | cout << endl 713 | << "GC Start!" << endl 714 | << endl; 715 | int back = 0; 716 | for (back = stripe_index.size() - 1; head < back && head < stripe_index.size() && back > 0; back--) 717 | { 718 | //find an empty stripe backfoward 719 | vector > vdelta(N - K); //each update a list of delta for p1,p2,p3 720 | for (int i = 0; i < stripe_index[back].size(); i++) 721 | { 722 | if (stripe_index[back][i].second == 1) //empty, need replaced 723 | { 724 | char *old_data = memcached_get(memc[0], stripe_index[back][i].first.data(), stripe_index[back][i].first.length(), &val_len, &flags, &rc); 725 | get_all++; 726 | 727 | if (!old_data) 728 | old_data = new char[CHUNK_SIZE]; 729 | 730 | //need delete the old data; 731 | memcached_delete(memc[0], stripe_index[back][i].first.data(), stripe_index[back][i].first.length(), 0); 732 | del_all++; 733 | 734 | //find a non-empty 735 | const char *key = find_object(back); 736 | if (key == NULL) 737 | { 738 | cout << endl 739 | << "GC OVER! Delete Stripe " << delete_all << endl; 740 | break; 741 | } 742 | else 743 | { 744 | char *new_data = memcached_get(memc[0], key, strlen(key), &val_len, &flags, &rc); 745 | get_all++; 746 | 747 | if (!new_data) 748 | new_data = new char[CHUNK_SIZE]; 749 | 750 | unsigned char *delta_data = new unsigned char[CHUNK_SIZE]; 751 | unsigned char *delta_parity[N - K]; 752 | //data delta 753 | unsigned char *d[2]; 754 | d[0] = (unsigned char *)old_data; 755 | d[1] = (unsigned char *)new_data; 756 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, d, &delta_data); 757 | cout << "\tCREATE DATA DELTAS OK, " 758 | << "for " << stripe_index[back][i].first.data() << endl; 759 | 760 | //parity delta 761 | for (int a = 0; a < N - K; a++) 762 | { 763 | delta_parity[a] = new unsigned char[CHUNK_SIZE]; 764 | } 765 | 766 | ec_encode_data_update(CHUNK_SIZE, K, N - K, object_index[vrun[i].key.data()].second, encode_gftbl, delta_data, delta_parity); 767 | cout << "\tCREATE PARITY DELTAS OK" << endl; 768 | 769 | for (int a = 0; a < N - K; a++) 770 | { 771 | vdelta[a].push_back(delta_parity[a]); 772 | } 773 | 774 | //free deltas 775 | delete[] delta_data; 776 | for (int i = 0; i < N - K; i++) 777 | { 778 | delete[] delta_parity[i]; 779 | } 780 | } 781 | } 782 | } 783 | 784 | //in-place 785 | if (vdelta[0].size()) //not empty 786 | { 787 | //retrieve parity chunk 788 | char *old_parity[N - K]; 789 | 790 | //XOR & non-XOR parity chunks 791 | for (int i = 0; i < N - K; i++) 792 | { 793 | char p1[100] = {0}; 794 | sprintf(p1, "SID%u-P%d", back, i + 1); 795 | old_parity[i] = memcached_get(memc[i], p1, strlen(p1), &val_len, &flags, &rc); 796 | get_all++; 797 | if (old_parity[i]) 798 | cout << "old P" << i + 1 << ":[" << (int)old_parity[i][0] << "]; "; 799 | else 800 | old_parity[i] = new char[CHUNK_SIZE]; 801 | } 802 | 803 | cout << endl 804 | << "\tRETRIEVE OLD PARITY OK" << endl; 805 | 806 | //need multiple XOR calculation for all paritys 807 | unsigned char *new_parity[N - K]; 808 | 809 | //create all new parity,XOR old & delta1, K=2, N=3 810 | for (int i = 0; i < N - K; i++) 811 | { 812 | new_parity[i] = new unsigned char[CHUNK_SIZE]; 813 | unsigned char *p[2]; 814 | p[0] = (unsigned char *)old_parity[i]; 815 | p[1] = (unsigned char *)vdelta[i][0]; 816 | 817 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, p, &(new_parity[i])); 818 | } 819 | 820 | cout << "\tCREATE NEW PARITY OK" << endl; 821 | 822 | //further delta 823 | for (int i = 0; i < N - K; i++) 824 | { 825 | for (int j = 1; j < vdelta[0].size(); j++) 826 | { 827 | unsigned char *p[2]; 828 | memcpy(old_parity[i], new_parity[i], CHUNK_SIZE * sizeof(unsigned char)); 829 | p[0] = (unsigned char *)old_parity[i]; 830 | p[1] = (unsigned char *)vdelta[i][j]; 831 | 832 | ec_encode_data(CHUNK_SIZE, 2, 1, encode_gftbl_xor, p, &(new_parity[i])); 833 | } 834 | } 835 | 836 | cout << "\tCREATE FURTHER NEW PARITY OK" << endl 837 | << "\t\t"; 838 | for (int i = 0; i < N - K; i++) 839 | cout << "new P" << i + 1 << ":[" << (int)new_parity[i][0] << "]; "; 840 | cout << endl; 841 | 842 | //store XOR & non-XOR parity chunks 843 | for (int i = 0; i < N - K; i++) 844 | { 845 | char p1[100] = {0}; 846 | sprintf(p1, "SID%u-P%d", back, i + 1); 847 | //todo, need consider the distribution of XOR parity 848 | rc = memcached_set(memc[i], p1, strlen(p1), (char *)new_parity[i], CHUNK_SIZE, 0, 0); 849 | set_all++; 850 | } 851 | 852 | cout << "\tSET NEW PARITY OK" << endl; 853 | 854 | //free vdeltas 855 | for (int i = 0; i < N - K; i++) 856 | { 857 | delete[] new_parity[i]; 858 | } 859 | } 860 | } 861 | if (head >= back) 862 | cerr << "GC OVER! Delete Stripe " << delete_all << endl; 863 | 864 | gettimeofday(&end, 0); 865 | cerr << "Time of encoding: " << time_encode << endl; 866 | cerr << "Time of GC: " << timeval_diff(&begin, &end); 867 | time_all += timeval_diff(&begin, &end); 868 | } 869 | 870 | //./update op path N K 871 | int main(int argc, char *argv[]) 872 | { 873 | //para config 874 | N = 14; 875 | K = 10; 876 | SERVER = 16; 877 | CHUNK_SIZE = 4096; //4K 878 | 879 | // if (argc < 1) 880 | // { 881 | // //./update 1 10K95z 882 | // printf("Command Wrong!\n\n"); 883 | // exit(-1); 884 | // } 885 | 886 | sscanf(argv[2], "%s", path); 887 | sscanf(argv[3], "%d", &N); 888 | sscanf(argv[4], "%d", &K); 889 | sscanf(argv[5], "%s", IP); 890 | 891 | init(); 892 | 893 | int op = 0; 894 | sscanf(argv[1], "%d", &op); 895 | 896 | if (op == 1) 897 | run_inplace(); 898 | else if (op == 2) 899 | run_full(); 900 | else if (op == 3) 901 | run_hybrid(); 902 | else 903 | ; 904 | 905 | cerr << "ALL Time: " << time_all << " s" << endl; 906 | cerr << "ALL Update: " << update_all << endl; 907 | cerr << "AVG time: " << fixed << setprecision(1) << time_all / update_all * 1000000.0 << " us" << endl; 908 | cerr << "SET: " << set_all << "; GET: " << get_all << "; DEL: " << del_all << "; ALL IOs: " << set_all + get_all + del_all << endl; 909 | cerr << "DRAM Extra Cost: " << dram_all << endl; 910 | //cerr << "Disk Extra Cost: " << disk_all << endl; 911 | return 0; 912 | } --------------------------------------------------------------------------------