mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-25 08:05:17 +00:00
66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
|
// Copyright 2023 The LevelDB-Go and Pebble Authors. All rights reserved. Use
|
||
|
// of this source code is governed by a BSD-style license that can be found in
|
||
|
// the LICENSE file.
|
||
|
|
||
|
package objstorageprovider
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
|
||
|
"github.com/cockroachdb/pebble/objstorage"
|
||
|
)
|
||
|
|
||
|
// NewRemoteWritable creates an objstorage.Writable out of an io.WriteCloser.
|
||
|
func NewRemoteWritable(obj io.WriteCloser) objstorage.Writable {
|
||
|
return &sharedWritable{storageWriter: obj}
|
||
|
}
|
||
|
|
||
|
// sharedWritable is a very simple implementation of Writable on top of the
|
||
|
// WriteCloser returned by remote.Storage.CreateObject.
|
||
|
type sharedWritable struct {
|
||
|
// Either both p and meta must be unset / zero values, or both must be set.
|
||
|
// The case where both are unset is true only in tests.
|
||
|
p *provider
|
||
|
meta objstorage.ObjectMetadata
|
||
|
storageWriter io.WriteCloser
|
||
|
}
|
||
|
|
||
|
var _ objstorage.Writable = (*sharedWritable)(nil)
|
||
|
|
||
|
// Write is part of the Writable interface.
|
||
|
func (w *sharedWritable) Write(p []byte) error {
|
||
|
_, err := w.storageWriter.Write(p)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Finish is part of the Writable interface.
|
||
|
func (w *sharedWritable) Finish() error {
|
||
|
err := w.storageWriter.Close()
|
||
|
w.storageWriter = nil
|
||
|
if err != nil {
|
||
|
w.Abort()
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Create the marker object.
|
||
|
if w.p != nil {
|
||
|
if err := w.p.sharedCreateRef(w.meta); err != nil {
|
||
|
w.Abort()
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Abort is part of the Writable interface.
|
||
|
func (w *sharedWritable) Abort() {
|
||
|
if w.storageWriter != nil {
|
||
|
_ = w.storageWriter.Close()
|
||
|
w.storageWriter = nil
|
||
|
}
|
||
|
if w.p != nil {
|
||
|
w.p.removeMetadata(w.meta.DiskFileNum)
|
||
|
}
|
||
|
// TODO(radu): delete the object if it was created.
|
||
|
}
|