Browse code

Merge pull request #37675 from cpuguy83/unused_logging_code

Remove now unused multireader.

Sebastiaan van Stijn authored on 2018/08/21 06:12:38
Showing 2 changed files
1 1
deleted file mode 100644
... ...
@@ -1,212 +0,0 @@
1
-package multireader // import "github.com/docker/docker/daemon/logger/loggerutils/multireader"
2
-
3
-import (
4
-	"bytes"
5
-	"fmt"
6
-	"io"
7
-	"os"
8
-)
9
-
10
-type pos struct {
11
-	idx    int
12
-	offset int64
13
-}
14
-
15
-type multiReadSeeker struct {
16
-	readers []io.ReadSeeker
17
-	pos     *pos
18
-	posIdx  map[io.ReadSeeker]int
19
-}
20
-
21
-func (r *multiReadSeeker) Seek(offset int64, whence int) (int64, error) {
22
-	var tmpOffset int64
23
-	switch whence {
24
-	case os.SEEK_SET:
25
-		for i, rdr := range r.readers {
26
-			// get size of the current reader
27
-			s, err := rdr.Seek(0, os.SEEK_END)
28
-			if err != nil {
29
-				return -1, err
30
-			}
31
-
32
-			if offset > tmpOffset+s {
33
-				if i == len(r.readers)-1 {
34
-					rdrOffset := s + (offset - tmpOffset)
35
-					if _, err := rdr.Seek(rdrOffset, os.SEEK_SET); err != nil {
36
-						return -1, err
37
-					}
38
-					r.pos = &pos{i, rdrOffset}
39
-					return offset, nil
40
-				}
41
-
42
-				tmpOffset += s
43
-				continue
44
-			}
45
-
46
-			rdrOffset := offset - tmpOffset
47
-			idx := i
48
-
49
-			if _, err := rdr.Seek(rdrOffset, os.SEEK_SET); err != nil {
50
-				return -1, err
51
-			}
52
-			// make sure all following readers are at 0
53
-			for _, rdr := range r.readers[i+1:] {
54
-				rdr.Seek(0, os.SEEK_SET)
55
-			}
56
-
57
-			if rdrOffset == s && i != len(r.readers)-1 {
58
-				idx++
59
-				rdrOffset = 0
60
-			}
61
-			r.pos = &pos{idx, rdrOffset}
62
-			return offset, nil
63
-		}
64
-	case os.SEEK_END:
65
-		for _, rdr := range r.readers {
66
-			s, err := rdr.Seek(0, os.SEEK_END)
67
-			if err != nil {
68
-				return -1, err
69
-			}
70
-			tmpOffset += s
71
-		}
72
-		if _, err := r.Seek(tmpOffset+offset, os.SEEK_SET); err != nil {
73
-			return -1, err
74
-		}
75
-		return tmpOffset + offset, nil
76
-	case os.SEEK_CUR:
77
-		if r.pos == nil {
78
-			return r.Seek(offset, os.SEEK_SET)
79
-		}
80
-		// Just return the current offset
81
-		if offset == 0 {
82
-			return r.getCurOffset()
83
-		}
84
-
85
-		curOffset, err := r.getCurOffset()
86
-		if err != nil {
87
-			return -1, err
88
-		}
89
-		rdr, rdrOffset, err := r.getReaderForOffset(curOffset + offset)
90
-		if err != nil {
91
-			return -1, err
92
-		}
93
-
94
-		r.pos = &pos{r.posIdx[rdr], rdrOffset}
95
-		return curOffset + offset, nil
96
-	default:
97
-		return -1, fmt.Errorf("Invalid whence: %d", whence)
98
-	}
99
-
100
-	return -1, fmt.Errorf("Error seeking for whence: %d, offset: %d", whence, offset)
101
-}
102
-
103
-func (r *multiReadSeeker) getReaderForOffset(offset int64) (io.ReadSeeker, int64, error) {
104
-
105
-	var offsetTo int64
106
-
107
-	for _, rdr := range r.readers {
108
-		size, err := getReadSeekerSize(rdr)
109
-		if err != nil {
110
-			return nil, -1, err
111
-		}
112
-		if offsetTo+size > offset {
113
-			return rdr, offset - offsetTo, nil
114
-		}
115
-		if rdr == r.readers[len(r.readers)-1] {
116
-			return rdr, offsetTo + offset, nil
117
-		}
118
-		offsetTo += size
119
-	}
120
-
121
-	return nil, 0, nil
122
-}
123
-
124
-func (r *multiReadSeeker) getCurOffset() (int64, error) {
125
-	var totalSize int64
126
-	for _, rdr := range r.readers[:r.pos.idx+1] {
127
-		if r.posIdx[rdr] == r.pos.idx {
128
-			totalSize += r.pos.offset
129
-			break
130
-		}
131
-
132
-		size, err := getReadSeekerSize(rdr)
133
-		if err != nil {
134
-			return -1, fmt.Errorf("error getting seeker size: %v", err)
135
-		}
136
-		totalSize += size
137
-	}
138
-	return totalSize, nil
139
-}
140
-
141
-func (r *multiReadSeeker) Read(b []byte) (int, error) {
142
-	if r.pos == nil {
143
-		// make sure all readers are at 0
144
-		r.Seek(0, os.SEEK_SET)
145
-	}
146
-
147
-	bLen := int64(len(b))
148
-	buf := bytes.NewBuffer(nil)
149
-	var rdr io.ReadSeeker
150
-
151
-	for _, rdr = range r.readers[r.pos.idx:] {
152
-		readBytes, err := io.CopyN(buf, rdr, bLen)
153
-		if err != nil && err != io.EOF {
154
-			return -1, err
155
-		}
156
-		bLen -= readBytes
157
-
158
-		if bLen == 0 {
159
-			break
160
-		}
161
-	}
162
-
163
-	rdrPos, err := rdr.Seek(0, os.SEEK_CUR)
164
-	if err != nil {
165
-		return -1, err
166
-	}
167
-	r.pos = &pos{r.posIdx[rdr], rdrPos}
168
-	return buf.Read(b)
169
-}
170
-
171
-func getReadSeekerSize(rdr io.ReadSeeker) (int64, error) {
172
-	// save the current position
173
-	pos, err := rdr.Seek(0, os.SEEK_CUR)
174
-	if err != nil {
175
-		return -1, err
176
-	}
177
-
178
-	// get the size
179
-	size, err := rdr.Seek(0, os.SEEK_END)
180
-	if err != nil {
181
-		return -1, err
182
-	}
183
-
184
-	// reset the position
185
-	if _, err := rdr.Seek(pos, os.SEEK_SET); err != nil {
186
-		return -1, err
187
-	}
188
-	return size, nil
189
-}
190
-
191
-// MultiReadSeeker returns a ReadSeeker that's the logical concatenation of the provided
192
-// input readseekers. After calling this method the initial position is set to the
193
-// beginning of the first ReadSeeker. At the end of a ReadSeeker, Read always advances
194
-// to the beginning of the next ReadSeeker and returns EOF at the end of the last ReadSeeker.
195
-// Seek can be used over the sum of lengths of all readseekers.
196
-//
197
-// When a MultiReadSeeker is used, no Read and Seek operations should be made on
198
-// its ReadSeeker components. Also, users should make no assumption on the state
199
-// of individual readseekers while the MultiReadSeeker is used.
200
-func MultiReadSeeker(readers ...io.ReadSeeker) io.ReadSeeker {
201
-	if len(readers) == 1 {
202
-		return readers[0]
203
-	}
204
-	idx := make(map[io.ReadSeeker]int)
205
-	for i, rdr := range readers {
206
-		idx[rdr] = i
207
-	}
208
-	return &multiReadSeeker{
209
-		readers: readers,
210
-		posIdx:  idx,
211
-	}
212
-}
213 1
deleted file mode 100644
... ...
@@ -1,225 +0,0 @@
1
-package multireader // import "github.com/docker/docker/daemon/logger/loggerutils/multireader"
2
-
3
-import (
4
-	"bytes"
5
-	"encoding/binary"
6
-	"fmt"
7
-	"io"
8
-	"io/ioutil"
9
-	"os"
10
-	"strings"
11
-	"testing"
12
-)
13
-
14
-func TestMultiReadSeekerReadAll(t *testing.T) {
15
-	str := "hello world"
16
-	s1 := strings.NewReader(str + " 1")
17
-	s2 := strings.NewReader(str + " 2")
18
-	s3 := strings.NewReader(str + " 3")
19
-	mr := MultiReadSeeker(s1, s2, s3)
20
-
21
-	expectedSize := int64(s1.Len() + s2.Len() + s3.Len())
22
-
23
-	b, err := ioutil.ReadAll(mr)
24
-	if err != nil {
25
-		t.Fatal(err)
26
-	}
27
-
28
-	expected := "hello world 1hello world 2hello world 3"
29
-	if string(b) != expected {
30
-		t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
31
-	}
32
-
33
-	size, err := mr.Seek(0, os.SEEK_END)
34
-	if err != nil {
35
-		t.Fatal(err)
36
-	}
37
-	if size != expectedSize {
38
-		t.Fatalf("reader size does not match, got %d, expected %d", size, expectedSize)
39
-	}
40
-
41
-	// Reset the position and read again
42
-	pos, err := mr.Seek(0, os.SEEK_SET)
43
-	if err != nil {
44
-		t.Fatal(err)
45
-	}
46
-	if pos != 0 {
47
-		t.Fatalf("expected position to be set to 0, got %d", pos)
48
-	}
49
-
50
-	b, err = ioutil.ReadAll(mr)
51
-	if err != nil {
52
-		t.Fatal(err)
53
-	}
54
-
55
-	if string(b) != expected {
56
-		t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
57
-	}
58
-
59
-	// The positions of some readers are not 0
60
-	s1.Seek(0, os.SEEK_SET)
61
-	s2.Seek(0, os.SEEK_END)
62
-	s3.Seek(0, os.SEEK_SET)
63
-	mr = MultiReadSeeker(s1, s2, s3)
64
-	b, err = ioutil.ReadAll(mr)
65
-	if err != nil {
66
-		t.Fatal(err)
67
-	}
68
-
69
-	if string(b) != expected {
70
-		t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
71
-	}
72
-}
73
-
74
-func TestMultiReadSeekerReadEach(t *testing.T) {
75
-	str := "hello world"
76
-	s1 := strings.NewReader(str + " 1")
77
-	s2 := strings.NewReader(str + " 2")
78
-	s3 := strings.NewReader(str + " 3")
79
-	mr := MultiReadSeeker(s1, s2, s3)
80
-
81
-	var totalBytes int64
82
-	for i, s := range []*strings.Reader{s1, s2, s3} {
83
-		sLen := int64(s.Len())
84
-		buf := make([]byte, s.Len())
85
-		expected := []byte(fmt.Sprintf("%s %d", str, i+1))
86
-
87
-		if _, err := mr.Read(buf); err != nil && err != io.EOF {
88
-			t.Fatal(err)
89
-		}
90
-
91
-		if !bytes.Equal(buf, expected) {
92
-			t.Fatalf("expected %q to be %q", string(buf), string(expected))
93
-		}
94
-
95
-		pos, err := mr.Seek(0, os.SEEK_CUR)
96
-		if err != nil {
97
-			t.Fatalf("iteration: %d, error: %v", i+1, err)
98
-		}
99
-
100
-		// check that the total bytes read is the current position of the seeker
101
-		totalBytes += sLen
102
-		if pos != totalBytes {
103
-			t.Fatalf("expected current position to be: %d, got: %d, iteration: %d", totalBytes, pos, i+1)
104
-		}
105
-
106
-		// This tests not only that SEEK_SET and SEEK_CUR give the same values, but that the next iteration is in the expected position as well
107
-		newPos, err := mr.Seek(pos, os.SEEK_SET)
108
-		if err != nil {
109
-			t.Fatal(err)
110
-		}
111
-		if newPos != pos {
112
-			t.Fatalf("expected to get same position when calling SEEK_SET with value from SEEK_CUR, cur: %d, set: %d", pos, newPos)
113
-		}
114
-	}
115
-}
116
-
117
-func TestMultiReadSeekerReadSpanningChunks(t *testing.T) {
118
-	str := "hello world"
119
-	s1 := strings.NewReader(str + " 1")
120
-	s2 := strings.NewReader(str + " 2")
121
-	s3 := strings.NewReader(str + " 3")
122
-	mr := MultiReadSeeker(s1, s2, s3)
123
-
124
-	buf := make([]byte, s1.Len()+3)
125
-	_, err := mr.Read(buf)
126
-	if err != nil {
127
-		t.Fatal(err)
128
-	}
129
-
130
-	// expected is the contents of s1 + 3 bytes from s2, ie, the `hel` at the end of this string
131
-	expected := "hello world 1hel"
132
-	if string(buf) != expected {
133
-		t.Fatalf("expected %s to be %s", string(buf), expected)
134
-	}
135
-}
136
-
137
-func TestMultiReadSeekerNegativeSeek(t *testing.T) {
138
-	str := "hello world"
139
-	s1 := strings.NewReader(str + " 1")
140
-	s2 := strings.NewReader(str + " 2")
141
-	s3 := strings.NewReader(str + " 3")
142
-	mr := MultiReadSeeker(s1, s2, s3)
143
-
144
-	s1Len := s1.Len()
145
-	s2Len := s2.Len()
146
-	s3Len := s3.Len()
147
-
148
-	s, err := mr.Seek(int64(-1*s3.Len()), os.SEEK_END)
149
-	if err != nil {
150
-		t.Fatal(err)
151
-	}
152
-	if s != int64(s1Len+s2Len) {
153
-		t.Fatalf("expected %d to be %d", s, s1.Len()+s2.Len())
154
-	}
155
-
156
-	buf := make([]byte, s3Len)
157
-	if _, err := mr.Read(buf); err != nil && err != io.EOF {
158
-		t.Fatal(err)
159
-	}
160
-	expected := fmt.Sprintf("%s %d", str, 3)
161
-	if string(buf) != fmt.Sprintf("%s %d", str, 3) {
162
-		t.Fatalf("expected %q to be %q", string(buf), expected)
163
-	}
164
-}
165
-
166
-func TestMultiReadSeekerCurAfterSet(t *testing.T) {
167
-	str := "hello world"
168
-	s1 := strings.NewReader(str + " 1")
169
-	s2 := strings.NewReader(str + " 2")
170
-	s3 := strings.NewReader(str + " 3")
171
-	mr := MultiReadSeeker(s1, s2, s3)
172
-
173
-	mid := int64(s1.Len() + s2.Len()/2)
174
-
175
-	size, err := mr.Seek(mid, os.SEEK_SET)
176
-	if err != nil {
177
-		t.Fatal(err)
178
-	}
179
-	if size != mid {
180
-		t.Fatalf("reader size does not match, got %d, expected %d", size, mid)
181
-	}
182
-
183
-	size, err = mr.Seek(3, os.SEEK_CUR)
184
-	if err != nil {
185
-		t.Fatal(err)
186
-	}
187
-	if size != mid+3 {
188
-		t.Fatalf("reader size does not match, got %d, expected %d", size, mid+3)
189
-	}
190
-	size, err = mr.Seek(5, os.SEEK_CUR)
191
-	if err != nil {
192
-		t.Fatal(err)
193
-	}
194
-	if size != mid+8 {
195
-		t.Fatalf("reader size does not match, got %d, expected %d", size, mid+8)
196
-	}
197
-
198
-	size, err = mr.Seek(10, os.SEEK_CUR)
199
-	if err != nil {
200
-		t.Fatal(err)
201
-	}
202
-	if size != mid+18 {
203
-		t.Fatalf("reader size does not match, got %d, expected %d", size, mid+18)
204
-	}
205
-}
206
-
207
-func TestMultiReadSeekerSmallReads(t *testing.T) {
208
-	var readers []io.ReadSeeker
209
-	for i := 0; i < 10; i++ {
210
-		integer := make([]byte, 4)
211
-		binary.BigEndian.PutUint32(integer, uint32(i))
212
-		readers = append(readers, bytes.NewReader(integer))
213
-	}
214
-
215
-	reader := MultiReadSeeker(readers...)
216
-	for i := 0; i < 10; i++ {
217
-		var integer uint32
218
-		if err := binary.Read(reader, binary.BigEndian, &integer); err != nil {
219
-			t.Fatalf("Read from NewMultiReadSeeker failed: %v", err)
220
-		}
221
-		if uint32(i) != integer {
222
-			t.Fatalf("Read wrong value from NewMultiReadSeeker: %d != %d", i, integer)
223
-		}
224
-	}
225
-}