1
0
Fork 0
mirror of https://github.com/chrislusf/seaweedfs synced 2025-06-29 16:22:46 +02:00
seaweedfs/weed/storage/needle/README.md

8.7 KiB

Needle Layout Format

This document describes the binary layout of the Needle structure as used in SeaweedFS storage, for all supported versions (v1, v2, v3).

A Needle represents a file or data blob stored in a volume file. The layout determines how the Needle is serialized to disk for efficient storage and retrieval.


Common Field Sizes

Field Size (bytes)
Cookie 4
NeedleId 8
Size 4
DataSize 4
Flags 1
NameSize 1
MimeSize 1
LastModified 5
Ttl 2
PairsSize 2
Checksum 4
Timestamp 8

Needle Layouts by Version

Version 1

Offset Field Size (bytes) Description
0 Cookie 4 Random number to mitigate brute force lookups
4 Id 8 Needle ID
12 Size 4 Length of Data
16 Data N File data (N = Size)
16+N Checksum 4 CRC32 of Data
20+N Padding 0-7 To align to 8 bytes

Version 2

Offset Field Size (bytes) Description
0 Cookie 4 Random number
4 Id 8 Needle ID
12 Size 4 Total size of the following fields
16 DataSize 4 Length of Data (N)
20 Data N File data
20+N Flags 1 Bit flags
21+N NameSize 1 (opt) Optional, if present
22+N Name M (opt) Optional, if present (M = NameSize)
... MimeSize 1 (opt) Optional, if present
... Mime K (opt) Optional, if present (K = MimeSize)
... LastModified 5 (opt) Optional, if present
... Ttl 2 (opt) Optional, if present
... PairsSize 2 (opt) Optional, if present
... Pairs P (opt) Optional, if present (P = PairsSize)
... Checksum 4 CRC32
... Padding 0-7 To align to 8 bytes

Version 3

Offset Field Size (bytes) Description
0 Cookie 4 Random number
4 Id 8 Needle ID
12 Size 4 Total size of the following fields
16 DataSize 4 Length of Data (N)
20 Data N File data
20+N Flags 1 Bit flags
21+N NameSize 1 (opt) Optional, if present
22+N Name M (opt) Optional, if present (M = NameSize)
... MimeSize 1 (opt) Optional, if present
... Mime K (opt) Optional, if present (K = MimeSize)
... LastModified 5 (opt) Optional, if present
... Ttl 2 (opt) Optional, if present
... PairsSize 2 (opt) Optional, if present
... Pairs P (opt) Optional, if present (P = PairsSize)
... Checksum 4 CRC32
... Timestamp 8 Append time in nanoseconds
... Padding 0-7 To align to 8 bytes
  • Offsets marked with ... depend on the presence and size of previous optional fields.
  • Fields marked (opt) are optional and only present if the corresponding size or flag is non-zero.
  • N = DataSize, M = NameSize, K = MimeSize, P = PairsSize.

Field Explanations

  • Cookie: 4 bytes, random value for security.
  • Id: 8 bytes, unique identifier for the Needle.
  • Size: 4 bytes, total size of the Needle data section (not including header, checksum, timestamp, or padding).
  • DataSize: 4 bytes, length of the Data field.
  • Data: File data (variable length).
  • Flags: 1 byte, bit flags for Needle properties.
  • NameSize/Name: 1 byte + variable, optional file name.
  • MimeSize/Mime: 1 byte + variable, optional MIME type.
  • LastModified: 5 bytes, optional last modified timestamp.
  • Ttl: 2 bytes, optional time-to-live.
  • PairsSize/Pairs: 2 bytes + variable, optional key-value pairs.
  • Checksum: 4 bytes, CRC32 checksum of the Needle data.
  • Timestamp: 8 bytes, append time (only in v3).
  • Padding: 0-7 bytes, to align the total Needle size to 8 bytes.

Version Comparison Table

Field v1 v2 v3
Cookie
Id
Size
DataSize
Data
Flags
NameSize/Name
MimeSize/Mime
LastModified
Ttl
PairsSize/Pairs
Checksum
Timestamp
Padding

Flags Field Details

The Flags field (present in v2 and v3) is a bitmask that encodes several boolean properties of the Needle. Each bit has a specific meaning:

Bit Value Name Meaning
0x01 FlagIsCompressed Data is compressed (isCompressed)
0x02 FlagHasName Name field is present (NameSize/Name)
0x04 FlagHasMime Mime field is present (MimeSize/Mime)
0x08 FlagHasLastModifiedDate LastModified field is present
0x10 FlagHasTtl Ttl field is present
0x20 FlagHasPairs Pairs field is present (PairsSize/Pairs)
0x80 FlagIsChunkManifest Data is a chunk manifest (for large files)
  • If a flag is set, the corresponding field(s) will appear in the Needle layout at the appropriate position.
  • The Flags field is always present in v2 and v3, immediately after the Data field.

Optional Fields

  • Fields marked as optional in the layout tables are only present if the corresponding flag in the Flags field is set (except for Name/Mime/Pairs, which also depend on their size fields being non-zero).
  • The order of optional fields is fixed and matches the order of their flags.

Special Notes

  • isCompressed: If set, the Data field is compressed (typically using gzip). This is indicated by the lowest bit (0x01) in the Flags byte.
  • isChunkManifest: If set, the Data field contains a manifest describing chunks of a large file, not raw file data.
  • All multi-byte fields are stored in big-endian order.
  • Padding is always added at the end to align the total Needle size to 8 bytes.
  • N = DataSize, M = NameSize, K = MimeSize, P = PairsSize in the layout tables above.

For more details, see the implementation in the corresponding Go files in this directory.