@@ -8,11 +8,13 @@ import (
8
8
"cloud.google.com/go/storage"
9
9
)
10
10
11
+ // GCSFile represents a file in an GCS bucket.
12
+ //
13
+ //nolint:revive // gcs.GCSFile is repetitive. A better name could have been chosen, but it's too late as it's already exported.
11
14
type GCSFile struct {
12
15
conn gcsClient
13
16
writer * storage.Writer
14
17
name string
15
- offset int64
16
18
logger Logger
17
19
metrics Metrics
18
20
size int64
@@ -22,95 +24,127 @@ type GCSFile struct {
22
24
isDir bool
23
25
}
24
26
27
+ var (
28
+ ErrNilGCSFileBody = errors .New ("GCS file body is nil" )
29
+ ErrSeekNotSupported = errors .New ("seek not supported on GCSFile" )
30
+ ErrReadAtNotSupported = errors .New ("readAt not supported on GCSFile" )
31
+ ErrWriteAtNotSupported = errors .New ("writeAt not supported on GCSFile (read-only)" )
32
+ )
33
+
34
+ const (
35
+ msgWriterClosed = "Writer closed successfully"
36
+ msgReaderClosed = "Reader closed successfully"
37
+ )
38
+
25
39
// ====== File interface methods ======
26
40
27
- func (g * GCSFile ) Read (p []byte ) (int , error ) {
28
- if g .body == nil {
29
- return 0 , errors . New ( "GCS file body is nil" )
41
+ func (f * GCSFile ) Read (p []byte ) (int , error ) {
42
+ if f .body == nil {
43
+ return 0 , ErrNilGCSFileBody
30
44
}
31
- return g .body .Read (p )
45
+
46
+ return f .body .Read (p )
32
47
}
33
- func (g * GCSFile ) Write (p []byte ) (int , error ) {
34
- bucketName := getBucketName (g .name )
48
+ func (f * GCSFile ) Write (p []byte ) (int , error ) {
49
+ bucketName := getBucketName (f .name )
35
50
36
51
var msg string
37
52
38
53
st := statusErr
39
54
40
- defer g .sendOperationStats (& FileLog {
55
+ defer f .sendOperationStats (& FileLog {
41
56
Operation : "WRITE" ,
42
57
Location : getLocation (bucketName ),
43
58
Status : & st ,
44
59
Message : & msg ,
45
60
}, time .Now ())
46
61
47
- n , err := g .writer .Write (p )
62
+ n , err := f .writer .Write (p )
63
+
48
64
if err != nil {
49
- g .logger .Errorf ("failed to write: %v" , err )
65
+ f .logger .Errorf ("failed to write: %v" , err )
50
66
msg = err .Error ()
67
+
51
68
return n , err
52
69
}
70
+
53
71
st = statusSuccess
54
72
msg = "Write successful"
55
- return n , nil
73
+ f . logger . Logf ( msg )
56
74
75
+ return n , nil
57
76
}
58
77
59
- func (g * GCSFile ) Close () error {
60
- bucketName := getBucketName (g .name )
78
+ func (f * GCSFile ) Close () error {
79
+ bucketName := getBucketName (f .name )
80
+
61
81
var msg string
82
+
62
83
st := statusErr
63
84
64
- defer g .sendOperationStats (& FileLog {
85
+ defer f .sendOperationStats (& FileLog {
65
86
Operation : "CLOSE" ,
66
87
Location : getLocation (bucketName ),
67
88
Status : & st ,
68
89
Message : & msg ,
69
90
}, time .Now ())
70
91
71
- if g .writer != nil {
72
- err := g .writer .Close ()
92
+ if f .writer != nil {
93
+ err := f .writer .Close ()
73
94
if err != nil {
74
95
msg = err .Error ()
75
96
return err
76
97
}
98
+
77
99
st = statusSuccess
78
- msg = "Writer closed successfully"
100
+
101
+ msg = msgWriterClosed
102
+
103
+ f .logger .Logf (msg )
104
+
79
105
return nil
80
106
}
81
107
82
- if g .body != nil {
83
- err := g .body .Close ()
108
+ if f .body != nil {
109
+ err := f .body .Close ()
84
110
if err != nil {
85
111
msg = err .Error ()
86
112
return err
87
113
}
114
+
88
115
st = statusSuccess
89
- msg = "Reader closed successfully"
116
+
117
+ msg = msgReaderClosed
118
+
119
+ f .logger .Logf (msgReaderClosed )
120
+
90
121
return nil
91
122
}
123
+
92
124
st = statusSuccess
93
- msg = "Writer closed successfully"
125
+
126
+ msg = msgWriterClosed
127
+
94
128
return nil
95
129
}
96
130
97
- func (g * GCSFile ) Seek (offset int64 , whence int ) (int64 , error ) {
131
+ func (* GCSFile ) Seek (_ int64 , _ int ) (int64 , error ) {
98
132
// Not supported: Seek requires reopening with range.
99
- return 0 , errors . New ( "Seek not supported on GCSFile" )
133
+ return 0 , ErrSeekNotSupported
100
134
}
101
135
102
- func (g * GCSFile ) ReadAt (_ []byte , _ int64 ) (int , error ) {
103
- return 0 , errors . New ( "ReadAt not supported on GCSFile" )
136
+ func (* GCSFile ) ReadAt (_ []byte , _ int64 ) (int , error ) {
137
+ return 0 , ErrReadAtNotSupported
104
138
}
105
139
106
- func (g * GCSFile ) WriteAt (_ []byte , _ int64 ) (int , error ) {
107
- return 0 , errors . New ( "WriteAt not supported on GCSFile (read-only)" )
140
+ func (* GCSFile ) WriteAt (_ []byte , _ int64 ) (int , error ) {
141
+ return 0 , ErrWriteAtNotSupported
108
142
}
109
143
110
- func (g * GCSFile ) sendOperationStats (fl * FileLog , startTime time.Time ) {
144
+ func (f * GCSFile ) sendOperationStats (fl * FileLog , startTime time.Time ) {
111
145
duration := time .Since (startTime ).Microseconds ()
112
146
113
147
fl .Duration = duration
114
148
115
- g .logger .Debug (fl )
149
+ f .logger .Debug (fl )
116
150
}
0 commit comments