diff --git a/dfdaemon/seed/manager.go b/dfdaemon/seed/manager.go new file mode 100644 index 000000000..9e435e2b6 --- /dev/null +++ b/dfdaemon/seed/manager.go @@ -0,0 +1,53 @@ +/* + * Copyright The Dragonfly Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package seed + +import "time" + +// Manager is an interface which manages the seeds. +type Manager interface { + // Register a seed. + Register(key string, info BaseInfo) (Seed, error) + + // UnRegister seed by key. + UnRegister(key string) error + + // RefreshExpireTime refreshes expire time of seed. + RefreshExpireTime(key string, expireTimeDur time.Duration) error + + // NotifyExpired get the expired chan of seed, it will be notified if seed expired. + NotifyExpired(key string) (<-chan struct{}, error) + + // Prefetch will add seed to the prefetch list, and then prefetch by the concurrent limit. + Prefetch(key string, perDownloadSize int64) (<-chan struct{}, error) + + // GetPrefetchResult should be called after notify by prefetch chan. + GetPrefetchResult(key string) (PreFetchResult, error) + + // SetPrefetchLimit limits the concurrency of prefetching seed. + // Default is defaultDownloadConcurrency. + SetConcurrentLimit(limit int) (validLimit int) + + // Get gets the seed by key. + Get(key string) (Seed, error) + + // List lists the seeds. + List() ([]Seed, error) + + // Stop stops the SeedManager. + Stop() +} diff --git a/dfdaemon/seed/seed.go b/dfdaemon/seed/seed.go new file mode 100644 index 000000000..9d923c8fa --- /dev/null +++ b/dfdaemon/seed/seed.go @@ -0,0 +1,53 @@ +/* + * Copyright The Dragonfly Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package seed + +import "io" + +// Seed describes the seed file which represents the resource file defined by taskUrl. +type Seed interface { + // Prefetch will start to download seed file to local cache. + Prefetch(perDownloadSize int64) (<-chan struct{}, error) + + // GetPrefetchResult should be called after notify by prefetch chan. + GetPrefetchResult() (PreFetchResult, error) + + // Delete will delete the local cache and release the resource. + Delete() error + + // Download providers the range download, if local cache of seed do not include the range, + // it will download the range data from rss and reply to request. + Download(off int64, size int64) (io.ReadCloser, error) + + // stop the internal loop and release execution resource. + Stop() + + // GetFullSize gets the full size of seed file. + GetFullSize() int64 + + // GetStatus gets the status of seed file. + GetStatus() string + + // GetURL gets the url of seed file. + GetURL() string + + // GetHeaders gets the headers of seed file. + GetHeaders() map[string][]string + + // GetHeaders gets the taskID of seed file. + GetTaskID() string +} diff --git a/dfdaemon/seed/types.go b/dfdaemon/seed/types.go new file mode 100644 index 000000000..1ba8f7567 --- /dev/null +++ b/dfdaemon/seed/types.go @@ -0,0 +1,56 @@ +/* + * Copyright The Dragonfly Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package seed + +import ( + "time" +) + +// BaseInfo describes the base info of seed. +type BaseInfo struct { + // the url of seed file. + URL string + + // the taskID of seed file. + TaskID string + + // the header of seed file. + Header map[string][]string + + // URL may contains some changeful query parameters such as authentication parameters. Dragonfly will + // filter these parameter via 'filter'. The usage of it is that different URL may generate the same + // download url. + Filters []string + + // the full length of seed file. + FullLength int64 + + // Seed will download data from rss which is divided by blocks. + // And block size is defined by BlockOrder. It should be limited [10, 31]. + BlockOrder uint32 + + // expire time duration of seed file. + ExpireTimeDur time.Duration +} + +// PreFetchResult shows the result of prefetch. +type PreFetchResult struct { + Success bool + Err error + // if canceled, caller need not to do other. + Canceled bool +}