本文整理汇总了Golang中camlistore/org/pkg/blobserver.Receive函数的典型用法代码示例。如果您正苦于以下问题:Golang Receive函数的具体用法?Golang Receive怎么用?Golang Receive使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Receive函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: uploadPublicKey
func (h *Handler) uploadPublicKey() error {
h.pubKeyUploadMu.RLock()
if h.pubKeyUploaded {
h.pubKeyUploadMu.RUnlock()
return nil
}
h.pubKeyUploadMu.RUnlock()
sto := h.pubKeyDest
h.pubKeyUploadMu.Lock()
defer h.pubKeyUploadMu.Unlock()
if h.pubKeyUploaded {
return nil
}
_, err := blobserver.StatBlob(sto, h.pubKeyBlobRef)
if err == nil {
h.pubKeyUploaded = true
return nil
}
_, err = blobserver.Receive(sto, h.pubKeyBlobRef, strings.NewReader(h.pubKey))
log.Printf("uploadPublicKey(%T, %v) = %v", sto, h.pubKeyBlobRef, err)
if err == nil {
h.pubKeyUploaded = true
}
return err
}
示例2: reindex
func (ix *Index) reindex(br blob.Ref) {
// TODO: cap how many of these can be going at once, probably more than 1,
// and be more efficient than just blocking goroutines. For now, this:
reindexMu.Lock()
defer reindexMu.Unlock()
bs := ix.BlobSource
if bs == nil {
log.Printf("index: can't re-index %v: no BlobSource", br)
return
}
log.Printf("index: starting re-index of %v", br)
rc, _, err := bs.FetchStreaming(br)
if err != nil {
log.Printf("index: failed to fetch %v for reindexing: %v", br, err)
return
}
defer rc.Close()
sb, err := blobserver.Receive(ix, br, rc)
if err != nil {
log.Printf("index: reindex of %v failed: %v", br, err)
return
}
log.Printf("index: successfully reindexed %v", sb)
}
示例3: Fetch
func (sto *sto) Fetch(b blob.Ref) (rc io.ReadCloser, size uint32, err error) {
rc, size, err = sto.cache.Fetch(b)
if err == nil {
sto.touchBlob(blob.SizedRef{Ref: b, Size: size})
return
}
if err != os.ErrNotExist {
log.Printf("warning: proxycache cache fetch error for %v: %v", b, err)
}
rc, size, err = sto.cache.Fetch(b)
if err != nil {
return
}
all, err := ioutil.ReadAll(rc)
if err != nil {
return
}
go func() {
if _, err := blobserver.Receive(sto.cache, b, bytes.NewReader(all)); err != nil {
log.Printf("populating proxycache cache for %v: %v", b, err)
return
}
sto.touchBlob(blob.SizedRef{Ref: b, Size: size})
}()
return ioutil.NopCloser(bytes.NewReader(all)), size, nil
}
示例4: ReceiveBlob
func (sto *condStorage) ReceiveBlob(br blob.Ref, src io.Reader) (sb blob.SizedRef, err error) {
destSto, src, err := sto.storageForReceive(br, src)
if err != nil {
return
}
return blobserver.Receive(destSto, br, src)
}
示例5: TestReceive
func TestReceive(t *testing.T) {
sto := new(test.Fetcher)
data := []byte("some blob")
br := blob.SHA1FromBytes(data)
hub := blobserver.GetHub(sto)
ch := make(chan blob.Ref, 1)
hub.RegisterListener(ch)
sb, err := blobserver.Receive(sto, br, bytes.NewReader(data))
if err != nil {
t.Fatal(err)
}
if sb.Size != int64(len(data)) {
t.Errorf("received blob size = %d; want %d", sb.Size, len(data))
}
if sb.Ref != br {
t.Errorf("received blob = %v; want %v", sb.Ref, br)
}
select {
case got := <-ch:
if got != br {
t.Errorf("blobhub notified about %v; want %v", got, br)
}
case <-time.After(5 * time.Second):
t.Error("timeout waiting on blobhub")
}
}
示例6: uploadPublicKey
func (h *Handler) uploadPublicKey(sto blobserver.Storage, key string) error {
_, err := blobserver.StatBlob(sto, h.pubKeyBlobRef)
if err == nil {
return nil
}
_, err = blobserver.Receive(sto, h.pubKeyBlobRef, strings.NewReader(key))
return err
}
示例7: TestDoubleReceive
func TestDoubleReceive(t *testing.T) {
sto, cleanup := newTempDiskpacked(t)
defer cleanup()
size := func(n int) int64 {
path := sto.(*storage).filename(n)
fi, err := os.Stat(path)
if err != nil {
t.Fatal(err)
}
return fi.Size()
}
const blobSize = 5 << 10
b := &test.Blob{Contents: strings.Repeat("a", blobSize)}
br := b.BlobRef()
_, err := blobserver.Receive(sto, br, b.Reader())
if err != nil {
t.Fatal(err)
}
if size(0) < blobSize {
t.Fatalf("size = %d; want at least %d", size(0), blobSize)
}
sto.(*storage).nextPack()
_, err = blobserver.Receive(sto, br, b.Reader())
if err != nil {
t.Fatal(err)
}
sizePostDup := size(1)
if sizePostDup >= blobSize {
t.Fatalf("size(pack1) = %d; appeared to double-write.", sizePostDup)
}
os.Remove(sto.(*storage).filename(0))
_, err = blobserver.Receive(sto, br, b.Reader())
if err != nil {
t.Fatal(err)
}
sizePostDelete := size(1)
if sizePostDelete < blobSize {
t.Fatalf("after packfile delete + reupload, not big enough. want size of a blob")
}
}
示例8: ReceiveBlob
func (sto *condStorage) ReceiveBlob(br blob.Ref, source io.Reader) (sb blob.SizedRef, err error) {
destSto, overRead, err := sto.storageForReceive(source)
if err != nil {
return
}
if len(overRead) > 0 {
source = io.MultiReader(bytes.NewReader(overRead), source)
}
return blobserver.Receive(destSto, br, source)
}
示例9: ReceiveBlob
func (sto *replicaStorage) ReceiveBlob(b blob.Ref, source io.Reader) (_ blob.SizedRef, err error) {
nReplicas := len(sto.replicas)
rpipe, wpipe, writer := make([]*io.PipeReader, nReplicas), make([]*io.PipeWriter, nReplicas), make([]io.Writer, nReplicas)
for idx := range sto.replicas {
rpipe[idx], wpipe[idx] = io.Pipe()
writer[idx] = wpipe[idx]
// TODO: deal with slow/hung clients. this scheme of pipes +
// multiwriter (even with a bufio.Writer thrown in) isn't
// sufficient to guarantee forward progress. perhaps something
// like &MoveOrDieWriter{Writer: wpipe[idx], HeartbeatSec: 10}
}
upResult := make(chan sizedBlobAndError, nReplicas)
uploadToReplica := func(source io.Reader, dst blobserver.BlobReceiver) {
sb, err := blobserver.Receive(dst, b, source)
if err != nil {
io.Copy(ioutil.Discard, source)
}
upResult <- sizedBlobAndError{sb, err}
}
for idx, replica := range sto.replicas {
go uploadToReplica(rpipe[idx], replica)
}
size, err := io.Copy(io.MultiWriter(writer...), source)
if err != nil {
for i := range wpipe {
wpipe[i].CloseWithError(err)
}
return
}
for idx := range sto.replicas {
wpipe[idx].Close()
}
nSuccess, nFailures := 0, 0
for _ = range sto.replicas {
res := <-upResult
switch {
case res.err == nil && res.sb.Size == size:
nSuccess++
if nSuccess == sto.minWritesForSuccess {
return res.sb, nil
}
case res.err == nil:
nFailures++
err = fmt.Errorf("replica: upload shard reported size %d, expected %d", res.sb.Size, size)
default:
nFailures++
err = res.err
}
}
if nFailures > 0 {
log.Printf("replica: receiving blob, %d successes, %d failures; last error = %v",
nSuccess, nFailures, err)
}
return
}
示例10: faultIn
func (cf *CachingFetcher) faultIn(br blob.Ref) error {
_, err := cf.g.Do(br.String(), func() (interface{}, error) {
sblob, _, err := cf.sf.Fetch(br)
if err != nil {
return nil, err
}
defer sblob.Close()
_, err = blobserver.Receive(cf.c, br, sblob)
return nil, err
})
return err
}
示例11: signUpload
func (ph *PublishHandler) signUpload(jsonSign *signhandler.Handler, name string, bb *schema.Builder) (blob.Ref, error) {
signed, err := jsonSign.Sign(bb)
if err != nil {
return blob.Ref{}, fmt.Errorf("error signing %s: %v", name, err)
}
uh := client.NewUploadHandleFromString(signed)
_, err = blobserver.Receive(ph.Storage, uh.BlobRef, uh.Contents)
if err != nil {
return blob.Ref{}, fmt.Errorf("error uploading %s: %v", name, err)
}
return uh.BlobRef, nil
}
示例12: TestReceiveCorrupt
func TestReceiveCorrupt(t *testing.T) {
sto := new(test.Fetcher)
data := []byte("some blob")
br := blob.SHA1FromBytes(data)
data[0] = 'X' // corrupt it
_, err := blobserver.Receive(sto, br, bytes.NewReader(data))
if err != blobserver.ErrCorruptBlob {
t.Errorf("Receive = %v; want ErrCorruptBlob", err)
}
if len(sto.BlobrefStrings()) > 0 {
t.Errorf("nothing should be stored. Got %q", sto.BlobrefStrings())
}
}
示例13: TestDoubleReceiveFailingIndex
func TestDoubleReceiveFailingIndex(t *testing.T) {
sto, cleanup := newTempDiskpacked(t)
defer cleanup()
sto.(*storage).index = &failingIndex{KeyValue: sto.(*storage).index}
size := func(n int) int64 {
path := sto.(*storage).filename(n)
fi, err := os.Stat(path)
if err != nil {
t.Fatal(err)
}
return fi.Size()
}
const blobSize = 5 << 10
b := &test.Blob{Contents: strings.Repeat("a", blobSize)}
br := b.BlobRef()
_, err := blobserver.Receive(sto, br, b.Reader())
if err != nil {
if err != dummyErr {
t.Fatal(err)
}
t.Logf("dummy fail")
}
if size(0) >= blobSize {
t.Fatalf("size = %d; want zero (at most %d)", size(0), blobSize-1)
}
_, err = blobserver.Receive(sto, br, b.Reader())
if err != nil {
t.Fatal(err)
}
if size(0) < blobSize {
t.Fatalf("size = %d; want at least %d", size(0), blobSize)
}
}
示例14: mustReceive
func mustReceive(t *testing.T, dst blobserver.Storage, tb *test.Blob) blob.SizedRef {
tbRef := tb.BlobRef()
sb, err := blobserver.Receive(dst, tbRef, tb.Reader())
if err != nil {
t.Fatalf("Receive: %v", err)
}
if int(sb.Size) != len(tb.Contents) {
t.Fatalf("size = %d; want %d", sb.Size, len(tb.Contents))
}
if sb.Ref != tbRef {
t.Fatal("wrong blob received")
}
return sb
}
示例15: reindex
func (ix *Index) reindex(br blob.Ref) error {
bs := ix.BlobSource
if bs == nil {
return fmt.Errorf("index: can't re-index %v: no BlobSource", br)
}
rc, _, err := bs.Fetch(br)
if err != nil {
return fmt.Errorf("index: failed to fetch %v for reindexing: %v", br, err)
}
defer rc.Close()
if _, err := blobserver.Receive(ix, br, rc); err != nil {
return err
}
return nil
}