@@ -44,8 +44,9 @@ type QueueSettings struct {
4444 NumConsumers int `mapstructure:"num_consumers"`
4545 // QueueSize is the maximum number of batches allowed in queue at a given time.
4646 QueueSize int `mapstructure:"queue_size"`
47- // PersistentStorageEnabled describes whether persistence via a file storage extension is enabled
48- PersistentStorageEnabled bool `mapstructure:"persistent_storage_enabled"`
47+ // StorageID if not empty, enables the persistent storage and uses the component specified
48+ // as a storage extension for the persistent queue
49+ StorageID * config.ComponentID `mapstructure:"storage"`
4950}
5051
5152// NewDefaultQueueSettings returns the default settings for QueueSettings.
@@ -57,8 +58,7 @@ func NewDefaultQueueSettings() QueueSettings {
5758 // This is a pretty decent value for production.
5859 // User should calculate this from the perspective of how many seconds to buffer in case of a backend outage,
5960 // multiply that by the number of requests per seconds.
60- QueueSize : 5000 ,
61- PersistentStorageEnabled : false ,
61+ QueueSize : 5000 ,
6262 }
6363}
6464
@@ -76,8 +76,8 @@ func (qCfg *QueueSettings) Validate() error {
7676}
7777
7878var (
79- errNoStorageClient = errors .New ("no storage client extension found" )
80- errMultipleStorageClients = errors .New ("multiple storage extensions found " )
79+ errNoStorageClient = errors .New ("no storage client extension found" )
80+ errWrongExtensionType = errors .New ("requested extension is not a storage extension " )
8181)
8282
8383type queuedRetrySender struct {
@@ -120,46 +120,55 @@ func newQueuedRetrySender(id config.ComponentID, signal config.DataType, qCfg Qu
120120 onTemporaryFailure : qrs .onTemporaryFailure ,
121121 }
122122
123- if ! qCfg .PersistentStorageEnabled {
123+ if qCfg .StorageID == nil {
124124 qrs .queue = internal .NewBoundedMemoryQueue (qrs .cfg .QueueSize , func (item interface {}) {})
125125 }
126126 // The Persistent Queue is initialized separately as it needs extra information about the component
127127
128128 return qrs
129129}
130130
131- func getStorageClient (ctx context.Context , host component.Host , id config.ComponentID , signal config.DataType ) (* storage.Client , error ) {
132- var storageExtension storage.Extension
133- for _ , ext := range host .GetExtensions () {
134- if se , ok := ext .(storage.Extension ); ok {
135- if storageExtension != nil {
136- return nil , errMultipleStorageClients
131+ func (qCfg * QueueSettings ) getStorageExtension (logger * zap.Logger , extensions map [config.ComponentID ]component.Extension ) (storage.Extension , error ) {
132+ if qCfg .StorageID != nil {
133+ if ext , found := extensions [* qCfg .StorageID ]; found {
134+ if storageExt , ok := ext .(storage.Extension ); ok {
135+ return storageExt , nil
137136 }
138- storageExtension = se
137+ return nil , errWrongExtensionType
138+ } else {
139+ return nil , errNoStorageClient
139140 }
140141 }
141142
142- if storageExtension == nil {
143+ return nil , nil
144+ }
145+
146+ func (qCfg * QueueSettings ) toStorageClient (ctx context.Context , logger * zap.Logger , host component.Host , ownerID config.ComponentID , signal config.DataType ) (storage.Client , error ) {
147+ extension , err := qCfg .getStorageExtension (logger , host .GetExtensions ())
148+ if err != nil {
149+ return nil , err
150+ }
151+ if extension == nil {
143152 return nil , errNoStorageClient
144153 }
145154
146- client , err := storageExtension .GetClient (ctx , component .KindExporter , id , string (signal ))
155+ client , err := extension .GetClient (ctx , component .KindExporter , ownerID , string (signal ))
147156 if err != nil {
148157 return nil , err
149158 }
150159
151- return & client , err
160+ return client , err
152161}
153162
154163// initializePersistentQueue uses extra information for initialization available from component.Host
155164func (qrs * queuedRetrySender ) initializePersistentQueue (ctx context.Context , host component.Host ) error {
156- if qrs .cfg .PersistentStorageEnabled {
157- storageClient , err := getStorageClient (ctx , host , qrs .id , qrs .signal )
165+ if qrs .cfg .StorageID != nil {
166+ storageClient , err := qrs . cfg . toStorageClient (ctx , qrs . logger , host , qrs .id , qrs .signal )
158167 if err != nil {
159168 return err
160169 }
161170
162- qrs .queue = internal .NewPersistentQueue (ctx , qrs .fullName , qrs .signal , qrs .cfg .QueueSize , qrs .logger , * storageClient , qrs .requestUnmarshaler )
171+ qrs .queue = internal .NewPersistentQueue (ctx , qrs .fullName , qrs .signal , qrs .cfg .QueueSize , qrs .logger , storageClient , qrs .requestUnmarshaler )
163172
164173 // TODO: this can be further exposed as a config param rather than relying on a type of queue
165174 qrs .requeuingEnabled = true
0 commit comments