aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/needle/async_request.go
diff options
context:
space:
mode:
authorzhangsong <zhangsong@cloudwalk.cn>2020-05-03 19:22:45 +0800
committerzhangsong <zhangsong@cloudwalk.cn>2020-05-04 17:39:44 +0800
commitf9e8702bb4146045e34643086eaeeae63ce6127c (patch)
treee5eca32b2a4a49551cdfae1d8371d529324461be /weed/storage/needle/async_request.go
parent78422c2f694c124da13c6289ad3ce8c31d33e38a (diff)
downloadseaweedfs-f9e8702bb4146045e34643086eaeeae63ce6127c.tar.xz
seaweedfs-f9e8702bb4146045e34643086eaeeae63ce6127c.zip
use async write to persistent file to disk - part1
Diffstat (limited to 'weed/storage/needle/async_request.go')
-rw-r--r--weed/storage/needle/async_request.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/weed/storage/needle/async_request.go b/weed/storage/needle/async_request.go
new file mode 100644
index 000000000..259419115
--- /dev/null
+++ b/weed/storage/needle/async_request.go
@@ -0,0 +1,55 @@
+package needle
+
+type AsyncRequest struct {
+ N *Needle
+ IsWriteRequest bool
+ ActualSize int64
+ Fsync bool
+ offset uint64
+ size uint64
+ doneChan chan interface{}
+ isUnchanged bool
+ err error
+}
+
+func NewAsyncRequest(n *Needle, isWriteRequest bool, fsync bool) *AsyncRequest {
+ return &AsyncRequest{
+ offset: 0,
+ size: 0,
+ ActualSize: 0,
+ doneChan: make(chan interface{}),
+ N: n,
+ isUnchanged: false,
+ IsWriteRequest: isWriteRequest,
+ Fsync: fsync,
+ err: nil,
+ }
+}
+
+func (r *AsyncRequest) WaitComplete() (uint64, uint64, bool, error) {
+ <-r.doneChan
+ return r.offset, r.size, r.isUnchanged, r.err
+}
+
+func (r *AsyncRequest) Complete(offset uint64, size uint64, isUnchanged bool, err error) {
+ r.offset = offset
+ r.size = size
+ r.isUnchanged = isUnchanged
+ r.err = err
+ close(r.doneChan)
+}
+
+func (r *AsyncRequest) UpdateResult(offset uint64, size uint64, isUnchanged bool, err error) {
+ r.offset = offset
+ r.size = size
+ r.isUnchanged = isUnchanged
+ r.err = err
+}
+
+func (r *AsyncRequest) Submit() {
+ close(r.doneChan)
+}
+
+func (r *AsyncRequest) IsSucceed() bool {
+ return r.err == nil
+}