Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/swarm/swarm-smoke: Trigger chunk debug on timeout #19101

Merged
merged 8 commits into from
Feb 18, 2019
72 changes: 72 additions & 0 deletions cmd/swarm/swarm-smoke/upload_and_sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ package main

import (
"bytes"
"context"
"fmt"
"io/ioutil"
"math/rand"
"os"
"sync"
"time"

"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/metrics"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/swarm/api"
"github.com/ethereum/go-ethereum/swarm/storage"
"github.com/ethereum/go-ethereum/swarm/testutil"
"github.com/pborman/uuid"

Expand All @@ -50,11 +56,77 @@ func uploadAndSyncCmd(ctx *cli.Context, tuid string) error {
metrics.GetOrRegisterCounter(fmt.Sprintf("%s.timeout", commandName), nil).Inc(1)

// trigger debug functionality on randomBytes
err := triggerChunkDebug(randomBytes)
holisticode marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
log.Error("test timed out and triggerChunkDebug also produced error", "err", err)
holisticode marked this conversation as resolved.
Show resolved Hide resolved
}

return fmt.Errorf("timeout after %v sec", timeout)
}
}

func triggerChunkDebug(testData []byte) error {
holisticode marked this conversation as resolved.
Show resolved Hide resolved
log.Warn("Test timed out; running chunk debug sequence")

addrs, err := getAllRefs(testData)
if err != nil {
return err
}

// has-chunks
for _, host := range hosts {
httpHost := fmt.Sprintf("ws://%s:%d", host, 8546)
log.Trace("Calling `Has` on host", "httpHost", httpHost)
rpcClient, err := rpc.Dial(httpHost)
if err != nil {
log.Trace("Error dialing host", "err", err)
return err
}
log.Trace("rpc dial ok")
var hasInfo []api.HasInfo
err = rpcClient.Call(&hasInfo, "bzz_has", addrs)
if err != nil {
log.Trace("Error calling host", "err", err)
return err
}
log.Trace("rpc call ok")
count := 0
for _, info := range hasInfo {
if !info.Has {
count++
log.Error("Host does not have chunk", "host", httpHost, "chunk", info.Addr)
}
}
if count == 0 {
log.Info("Host reported to have all chunks", "host", httpHost)
}
}
return nil
}

func getAllRefs(testData []byte) (storage.AddressCollection, error) {
log.Trace("Getting all references for given root hash")
datadir, err := ioutil.TempDir("", "chunk-debug")
if err != nil {
return nil, fmt.Errorf("unable to create temp dir: %v", err)
}
defer os.RemoveAll(datadir)
fileStore, err := storage.NewLocalFileStore(datadir, make([]byte, 32))
if err != nil {
return nil, err
}
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
holisticode marked this conversation as resolved.
Show resolved Hide resolved
defer cancel()

reader := bytes.NewReader(testData)
addrs, err := fileStore.GetAllReferences(ctx, reader, false)
holisticode marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
return nil, err
}
log.Trace("All references retrieved")
return addrs, err
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could you please just fix the typo one line below? <3

func uplaodAndSync(c *cli.Context, randomBytes []byte, tuid string) error {
log.Info("uploading to "+httpEndpoint(hosts[0])+" and syncing", "tuid", tuid, "seed", seed)

Expand Down