-
Notifications
You must be signed in to change notification settings - Fork 457
/
Copy pathsummary_token.go
72 lines (65 loc) · 2.82 KB
/
summary_token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright (c) 2017 Uber Technologies, Inc
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE
package msgpack
import (
"gopkg.in/vmihailenco/msgpack.v2"
)
// IndexSummaryToken can be used, along with the summaries file buffer, to
// quickly retrieve the ID or index file offset of an index summary entry.
// It's structured such that the ID and Index file offset can be retrieved
// quickly, while only requiring 64-bits of memory per entry.
type IndexSummaryToken struct {
// The offset into the underlying byte array at which the bytes for the ID begin
idStartOffset uint32
// The length of the bytes for the ID
idLength uint32
}
// ID returns the ID that the metadata corresponds to
func (m IndexSummaryToken) ID(buf []byte) []byte {
idStart := m.idStartOffset
idEnd := idStart + m.idLength
return buf[idStart:idEnd]
}
// IndexOffset returns the offset in the index file for the series that the
// metadata corresponds to. The buf, stream, and decoder arguments are passed in
// so that the IndexSummaryToken struct can be kept small, as well as
// so that the caller can have control over re-use and allocations.
func (m IndexSummaryToken) IndexOffset(
buf []byte, stream DecoderStream, msgpackDecoder *msgpack.Decoder) (int64, error) {
idStart := m.idStartOffset
idEnd := idStart + m.idLength
indexOffsetStart := int(idEnd)
stream.Reset(buf[indexOffsetStart:])
msgpackDecoder.Reset(stream)
indexOffset, err := msgpackDecoder.DecodeInt64()
// Should never happen, either something is really wrong with the code or
// the file on disk was corrupted
if err != nil {
return -1, err
}
return indexOffset, nil
}
// NewIndexSummaryToken returns a new IndexSummaryToken
func NewIndexSummaryToken(idStartOffset, idLength uint32) IndexSummaryToken {
return IndexSummaryToken{
idStartOffset: idStartOffset,
idLength: idLength,
}
}