JCC-Storage/common/pkgs/ec/rs_test.go

238 lines
6.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package ec
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"testing"
"gitlink.org.cn/cloudream/common/pkgs/ipfs"
//"gitlink.org.cn/cloudream/common/pkgs/ipfs"
//"gitlink.org.cn/cloudream/storage/agent/internal/config"
//stgglb "gitlink.org.cn/cloudream/storage/common/globals"
stgglb "gitlink.org.cn/cloudream/storage/common/globals"
)
func test_Combile(t *testing.T) {
chunkSize := int64(6)
blkReader, _ := NewBlockReader()
defer blkReader.Close()
blkReader.SetJumpRead("QmcN1EJm2w9XT62Q9YqA5Ym7YDzjmnqJYc565bzRs5VosW", 46, 3)
blkReader.SetchunkSize(chunkSize)
dataBlocks := make([]io.ReadCloser, 3)
dataBlocks[0], _ = blkReader.JumpFetchBlock(0)
dataBlocks[1], _ = blkReader.JumpFetchBlock(1)
dataBlocks[2], _ = blkReader.JumpFetchBlock(2)
enc, _ := NewRs(3, 5, chunkSize)
fptr, _ := enc.Combine(dataBlocks, 46)
print_ioreaders(t, []io.ReadCloser{fptr}, chunkSize)
}
func test_Encode(t *testing.T) {
enc, _ := NewRs(3, 5, 10)
rc := make([]io.ReadCloser, 3)
rc[0] = ioutil.NopCloser(bytes.NewBufferString("11111111"))
rc[1] = ioutil.NopCloser(bytes.NewBufferString("22222222"))
rc[2] = ioutil.NopCloser(bytes.NewBufferString("33333333"))
/*rc[0].Close()
rc[1].Close()
rc[2].Close()*/
print("#$$$$$$$$$$$")
out, _ := enc.ReconstructData(rc, []int{0, 1, 2})
//out, _ := enc.Encode(rc)
buf := make([]byte, 100)
out[0].Read(buf)
fmt.Println(buf)
out[1].Read(buf)
fmt.Println(buf)
t.Logf(string(buf))
t.Log(buf)
}
/*
------------------------------------------------
hash:QmX49sGugmtVPfNo13q84YL1NwGmr5yzWDDmJZ7PniQ9b6
内容1111122222233333333334444444445663454543534534
hash:QmcN1EJm2w9XT62Q9YqA5Ym7YDzjmnqJYc565bzRs5VosW
(5,3),chunkSize:6
data1:QmS2t7xFgTMTX2DGYsbDdmHnGvaG6sc7D9k1R2WZyuDx56
data2:QmUSZvuABjfGKF1c4VxvVBdH31SroDm2QyLGBrVFomRM8P
data3:QmcD3RpUh5rwMhf9yBywBeT6ibT1P5DSJC67aoD77jhTBn
内容qqqqqqqqwwwwwwwwwwwwwweeeeeeeeeeeeerrrrrrrrrrr
-----------------------------------------------------
*/
func test_Fetch(t *testing.T) {
blkReader, _ := NewBlockReader()
/*****************************FetchBlock*************************/
/*r, _ := blkReader.FetchBLock("QmX49sGugmtVPfNo13q84YL1NwGmr5yzWDDmJZ7PniQ9b6")
data, _ := ioutil.ReadAll(r)
t.Logf(string(data))*/
/**********************FetchBlocks************************************
hashs := []string{"QmcN1EJm2w9XT62Q9YqA5Ym7YDzjmnqJYc565bzRs5VosW", "QmX49sGugmtVPfNo13q84YL1NwGmr5yzWDDmJZ7PniQ9b6"}
rs, _ := blkReader.FetchBLocks(hashs)
data1, _ := ioutil.ReadAll(rs[0])
data2, _ := ioutil.ReadAll(rs[1])
t.Logf(string(data1))
t.Logf(string(data2))
/*************************JumpFetchBlock*********************************/
blkReader.SetJumpRead("QmcN1EJm2w9XT62Q9YqA5Ym7YDzjmnqJYc565bzRs5VosW", 46, 3)
blkReader.SetchunkSize(6)
r, _ := blkReader.JumpFetchBlock(1)
data, _ := ioutil.ReadAll(r)
t.Logf(string(data))
}
func test_Fetch_and_Encode(t *testing.T) {
chunkSize := int64(6)
blkReader, _ := NewBlockReader()
defer blkReader.Close()
blkReader.SetJumpRead("QmcN1EJm2w9XT62Q9YqA5Ym7YDzjmnqJYc565bzRs5VosW", 46, 3)
blkReader.SetchunkSize(int64(chunkSize))
dataBlocks := make([]io.ReadCloser, 3)
for i := range dataBlocks {
dataBlocks[i], _ = blkReader.JumpFetchBlock(i)
}
enc, _ := NewRs(3, 5, chunkSize)
parityBlocks, _ := enc.Encode(dataBlocks)
parityData := make([]string, 2)
finished := false
for {
if finished {
break
}
buf := make([]byte, chunkSize)
for i, pipe := range parityBlocks {
_, err := pipe.Read(buf)
if err != nil {
finished = true
break
}
parityData[i] = parityData[i] + string(buf)
}
}
t.Logf(parityData[0])
t.Logf(parityData[1])
}
func test_Fetch_and_Encode_and_Degraded(t *testing.T) {
chunkSize := int64(6)
blkReader, _ := NewBlockReader()
defer blkReader.Close()
blkReader.SetJumpRead("QmcN1EJm2w9XT62Q9YqA5Ym7YDzjmnqJYc565bzRs5VosW", 46, 3)
blkReader.SetchunkSize(int64(chunkSize))
dataBlocks := make([]io.ReadCloser, 3)
for i := range dataBlocks {
dataBlocks[i], _ = blkReader.JumpFetchBlock(i)
}
enc, _ := NewRs(3, 5, chunkSize)
parityBlocks, _ := enc.Encode(dataBlocks)
go func() {
ioutil.ReadAll(parityBlocks[0])
}()
degradedBlocks := make([]io.ReadCloser, 3)
degradedBlocks[0], _ = blkReader.JumpFetchBlock(1)
degradedBlocks[1], _ = blkReader.JumpFetchBlock(2)
degradedBlocks[2] = parityBlocks[1]
newDataBlocks, _ := enc.ReconstructData(degradedBlocks, []int{1, 2, 4})
newData := make([]string, 3)
finished := false
for {
if finished {
break
}
buf := make([]byte, chunkSize)
for i, pipe := range newDataBlocks {
_, err := pipe.Read(buf)
if err != nil {
finished = true
break
}
newData[i] = newData[i] + string(buf)
}
}
t.Logf(newData[0])
t.Logf(newData[1])
t.Logf(newData[2])
}
func test_pin_data_blocks(t *testing.T) {
chunkSize := int64(6)
blkReader, _ := NewBlockReader()
defer blkReader.Close()
blkReader.SetJumpRead("QmcN1EJm2w9XT62Q9YqA5Ym7YDzjmnqJYc565bzRs5VosW", 46, 3)
blkReader.SetchunkSize(int64(chunkSize))
dataBlocks := make([]io.ReadCloser, 3)
ipfsclient, _ := stgglb.IPFSPool.Acquire()
for i := range dataBlocks {
dataBlocks[i], _ = blkReader.JumpFetchBlock(i)
hash, _ := ipfsclient.CreateFile(dataBlocks[i])
t.Logf(hash)
}
}
func print_ioreaders(t *testing.T, readers []io.ReadCloser, chunkSize int64) {
newData := make([]string, len(readers))
finished := false
for {
if finished {
break
}
buf := make([]byte, chunkSize)
for i, pipe := range readers {
_, err := pipe.Read(buf)
if err != nil {
finished = true
break
}
newData[i] = newData[i] + string(buf)
}
}
for _, data := range newData {
t.Logf(data)
}
}
func test_reconstructData(t *testing.T) {
blkReader, _ := NewBlockReader()
defer blkReader.Close()
hashs := []string{"QmS2t7xFgTMTX2DGYsbDdmHnGvaG6sc7D9k1R2WZyuDx56", "QmUSZvuABjfGKF1c4VxvVBdH31SroDm2QyLGBrVFomRM8P", "QmcD3RpUh5rwMhf9yBywBeT6ibT1P5DSJC67aoD77jhTBn"}
dataBlocks, _ := blkReader.FetchBLocks(hashs)
chunkSize := int64(6)
enc, _ := NewRs(3, 5, chunkSize)
print("@@@@@@@@@")
newDataBlocks, _ := enc.ReconstructSome(dataBlocks, []int{0, 1, 2}, []int{3, 4})
print("!!!!!!!!!")
print_ioreaders(t, newDataBlocks, chunkSize)
}
func Test_main(t *testing.T) {
//test_Encode(t)
//stgglb.InitLocal(&config.Cfg().Local)
stgglb.InitIPFSPool(&ipfs.Config{Port: 5001})
//test_Fetch(t)
//test_Fetch_and_Encode(t)
//test_Fetch_and_Encode_and_Degraded(t)
//test_pin_data_blocks(t)
//test_reconstructData(t)
test_Combile(t)
}
/*
func Test_Fetch_Encode_ReconstructData(t *testing.T) {
inFileName := "test.txt"
enc, _ := NewRs(3, 5, 10)
file, err := os.Open(inFileName)
if err != nil {
t.Error(err)
}
var data io.ReadCloser
data = file
//enc.Encode(data)
}*/