diff --git a/weed/filesys/page_writer/mem_chunk.go b/weed/filesys/page_writer/mem_chunk.go new file mode 100644 index 000000000..422240bd8 --- /dev/null +++ b/weed/filesys/page_writer/mem_chunk.go @@ -0,0 +1,64 @@ +package page_writer + +import ( + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/chrislusf/seaweedfs/weed/util/mem" +) + +var ( + _ = PageChunk(&MemChunk{}) +) + +type MemChunk struct { + buf []byte + usage *ChunkWrittenIntervalList + chunkSize int64 + logicChunkIndex LogicChunkIndex +} + +func NewMemChunk(logicChunkIndex LogicChunkIndex, chunkSize int64) *MemChunk { + return &MemChunk{ + logicChunkIndex: logicChunkIndex, + chunkSize: chunkSize, + buf: mem.Allocate(int(chunkSize)), + usage: newChunkWrittenIntervalList(), + } +} + +func (mc *MemChunk) FreeResource() { + mem.Free(mc.buf) +} + +func (mc *MemChunk) WriteDataAt(src []byte, offset int64) (n int) { + n = copy(mc.buf[offset:], src) + mc.usage.MarkWritten(offset, offset+int64(n)) + return +} + +func (mc *MemChunk) ReadDataAt(p []byte, off int64) (maxStop int64) { + memChunkBaseOffset := int64(mc.logicChunkIndex) * mc.chunkSize + for t := mc.usage.head.next; t != mc.usage.tail; t = t.next { + logicStart := max(off, int64(mc.logicChunkIndex)*mc.chunkSize+t.StartOffset) + logicStop := min(off+int64(len(p)), memChunkBaseOffset+t.stopOffset) + if logicStart < logicStop { + copy(p[logicStart-off:logicStop-off], mc.buf[logicStart-memChunkBaseOffset:logicStop-memChunkBaseOffset]) + maxStop = max(maxStop, logicStop) + } + } + return +} + +func (mc *MemChunk) IsComplete() bool { + return mc.usage.IsComplete(mc.chunkSize) +} + +func (mc *MemChunk) SaveContent(saveFn SaveToStorageFunc) { + if saveFn == nil { + return + } + for t := mc.usage.head.next; t != mc.usage.tail; t = t.next { + reader := util.NewBytesReader(mc.buf[t.StartOffset:t.stopOffset]) + saveFn(reader, int64(mc.logicChunkIndex)*mc.chunkSize+t.StartOffset, t.Size(), func() { + }) + } +} diff --git a/weed/filesys/page_writer/page_chunk.go b/weed/filesys/page_writer/page_chunk.go index 1c892ddb6..d1f3a5745 100644 --- a/weed/filesys/page_writer/page_chunk.go +++ b/weed/filesys/page_writer/page_chunk.go @@ -1,8 +1,6 @@ package page_writer import ( - "github.com/chrislusf/seaweedfs/weed/util" - "github.com/chrislusf/seaweedfs/weed/util/mem" "io" ) @@ -15,61 +13,3 @@ type PageChunk interface { IsComplete() bool SaveContent(saveFn SaveToStorageFunc) } - -var ( - _ = PageChunk(&MemChunk{}) -) - -type MemChunk struct { - buf []byte - usage *ChunkWrittenIntervalList - chunkSize int64 - logicChunkIndex LogicChunkIndex -} - -func NewMemChunk(logicChunkIndex LogicChunkIndex, chunkSize int64) *MemChunk { - return &MemChunk{ - logicChunkIndex: logicChunkIndex, - chunkSize: chunkSize, - buf: mem.Allocate(int(chunkSize)), - usage: newChunkWrittenIntervalList(), - } -} - -func (mc *MemChunk) FreeResource() { - mem.Free(mc.buf) -} - -func (mc *MemChunk) WriteDataAt(src []byte, offset int64) (n int) { - n = copy(mc.buf[offset:], src) - mc.usage.MarkWritten(offset, offset+int64(n)) - return -} - -func (mc *MemChunk) ReadDataAt(p []byte, off int64) (maxStop int64) { - memChunkBaseOffset := int64(mc.logicChunkIndex) * mc.chunkSize - for t := mc.usage.head.next; t != mc.usage.tail; t = t.next { - logicStart := max(off, int64(mc.logicChunkIndex)*mc.chunkSize+t.StartOffset) - logicStop := min(off+int64(len(p)), memChunkBaseOffset+t.stopOffset) - if logicStart < logicStop { - copy(p[logicStart-off:logicStop-off], mc.buf[logicStart-memChunkBaseOffset:logicStop-memChunkBaseOffset]) - maxStop = max(maxStop, logicStop) - } - } - return -} - -func (mc *MemChunk) IsComplete() bool { - return mc.usage.IsComplete(mc.chunkSize) -} - -func (mc *MemChunk) SaveContent(saveFn SaveToStorageFunc) { - if saveFn == nil { - return - } - for t := mc.usage.head.next; t != mc.usage.tail; t = t.next { - reader := util.NewBytesReader(mc.buf[t.StartOffset:t.stopOffset]) - saveFn(reader, int64(mc.logicChunkIndex)*mc.chunkSize+t.StartOffset, t.Size(), func() { - }) - } -}