aboutsummaryrefslogtreecommitdiff
path: root/weed-fs/src/pkg/sequence/sequence.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2012-09-03 15:41:24 -0700
committerChris Lu <chris.lu@gmail.com>2012-09-03 15:41:24 -0700
commit09542d82b422242216c7f717f22aaf2b73d65b72 (patch)
tree03ba8ff133a9776683141b6961ad15217d203f90 /weed-fs/src/pkg/sequence/sequence.go
parentcdd64a8099534e8c1716014a751308f9795dd7fc (diff)
downloadseaweedfs-09542d82b422242216c7f717f22aaf2b73d65b72.tar.xz
seaweedfs-09542d82b422242216c7f717f22aaf2b73d65b72.zip
refactoring, clean up, v0.17
Diffstat (limited to 'weed-fs/src/pkg/sequence/sequence.go')
-rw-r--r--weed-fs/src/pkg/sequence/sequence.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/weed-fs/src/pkg/sequence/sequence.go b/weed-fs/src/pkg/sequence/sequence.go
new file mode 100644
index 000000000..bfdf1b368
--- /dev/null
+++ b/weed-fs/src/pkg/sequence/sequence.go
@@ -0,0 +1,71 @@
+package sequence
+
+import (
+ "encoding/gob"
+ "os"
+ "path"
+ "sync"
+ "log"
+)
+
+const (
+ FileIdSaveInterval = 10000
+)
+
+type Sequencer interface {
+ NextFileId(count int) (uint64, int)
+}
+type SequencerImpl struct {
+ dir string
+ fileName string
+
+ volumeLock sync.Mutex
+ sequenceLock sync.Mutex
+
+ FileIdSequence uint64
+ fileIdCounter uint64
+}
+
+func NewSequencer(dirname string, filename string) (m *SequencerImpl) {
+ m = &SequencerImpl{dir: dirname, fileName: filename}
+
+ seqFile, se := os.OpenFile(path.Join(m.dir, m.fileName+".seq"), os.O_RDONLY, 0644)
+ if se != nil {
+ m.FileIdSequence = FileIdSaveInterval
+ log.Println("Setting file id sequence", m.FileIdSequence)
+ } else {
+ decoder := gob.NewDecoder(seqFile)
+ defer seqFile.Close()
+ decoder.Decode(&m.FileIdSequence)
+ log.Println("Loading file id sequence", m.FileIdSequence, "=>", m.FileIdSequence+FileIdSaveInterval)
+ //in case the server stops between intervals
+ m.FileIdSequence += FileIdSaveInterval
+ }
+ return
+}
+
+//count should be 1 or more
+func (m *SequencerImpl) NextFileId(count int) (uint64, int) {
+ if count <= 0 {
+ return 0, 0
+ }
+ m.sequenceLock.Lock()
+ defer m.sequenceLock.Unlock()
+ if m.fileIdCounter < uint64(count) {
+ m.fileIdCounter = FileIdSaveInterval
+ m.FileIdSequence += FileIdSaveInterval
+ m.saveSequence()
+ }
+ m.fileIdCounter = m.fileIdCounter - uint64(count)
+ return m.FileIdSequence - m.fileIdCounter, count
+}
+func (m *SequencerImpl) saveSequence() {
+ log.Println("Saving file id sequence", m.FileIdSequence, "to", path.Join(m.dir, m.fileName+".seq"))
+ seqFile, e := os.OpenFile(path.Join(m.dir, m.fileName+".seq"), os.O_CREATE|os.O_WRONLY, 0644)
+ if e != nil {
+ log.Fatalf("Sequence File Save [ERROR] %s\n", e)
+ }
+ defer seqFile.Close()
+ encoder := gob.NewEncoder(seqFile)
+ encoder.Encode(m.FileIdSequence)
+}