aboutsummaryrefslogtreecommitdiff
path: root/weed/util
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2019-12-06 22:20:59 -0800
committerChris Lu <chris.lu@gmail.com>2019-12-06 22:20:59 -0800
commitf81d43442b11b0471db00a77ad8bc9b462977474 (patch)
tree1d0ad3566947cd4c9e5ba3a6374490197bdf3c8b /weed/util
parentf38f90b7ea546373076c69d3b93069ea8fa46755 (diff)
downloadseaweedfs-f81d43442b11b0471db00a77ad8bc9b462977474.tar.xz
seaweedfs-f81d43442b11b0471db00a77ad8bc9b462977474.zip
filer: speed up filer.meta.save by parallelizing
Diffstat (limited to 'weed/util')
-rw-r--r--weed/util/queue.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/weed/util/queue.go b/weed/util/queue.go
new file mode 100644
index 000000000..31d9d1769
--- /dev/null
+++ b/weed/util/queue.go
@@ -0,0 +1,61 @@
+package util
+
+import "sync"
+
+type node struct {
+ data interface{}
+ next *node
+}
+
+type Queue struct {
+ head *node
+ tail *node
+ count int
+ sync.RWMutex
+}
+
+func NewQueue() *Queue {
+ q := &Queue{}
+ return q
+}
+
+func (q *Queue) Len() int {
+ q.RLock()
+ defer q.RUnlock()
+ return q.count
+}
+
+func (q *Queue) Enqueue(item interface{}) {
+ q.Lock()
+ defer q.Unlock()
+
+ n := &node{data: item}
+
+ if q.tail == nil {
+ q.tail = n
+ q.head = n
+ } else {
+ q.tail.next = n
+ q.tail = n
+ }
+ q.count++
+}
+
+func (q *Queue) Dequeue() interface{} {
+ q.Lock()
+ defer q.Unlock()
+
+ if q.head == nil {
+ return nil
+ }
+
+ n := q.head
+ q.head = n.next
+
+ if q.head == nil {
+ q.tail = nil
+ }
+ q.count--
+
+ return n.data
+} \ No newline at end of file