move to github.com/seaweedfs/seaweedfs

chrislu 2022-07-29 01:40:03 -07:00
parent 140455fa85
commit 0d8bd95030
32 changed files with 77 additions and 80 deletions

@ -54,7 +54,7 @@ remove_bucket: newbucket3
# Presigned URL
If [authentication](https://github.com/chrislusf/seaweedfs/wiki/Amazon-S3-API#authentication) is enabled, the url is not accessible without proper credentials. But you can presign a url and access it.
If [authentication](https://github.com/seaweedfs/seaweedfs/wiki/Amazon-S3-API#authentication) is enabled, the url is not accessible without proper credentials. But you can presign a url and access it.
```
@ -65,4 +65,4 @@ http://localhost:8333/newbucket/t.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Cre
# access the url
$ curl "http://localhost:8333/newbucket/t.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=some_access_key1%2F20200726%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200726T161749Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=e0cc153209e414ca8168661f57827aa03ab84e7041ef9270ff639bcc519d24f5"
```
```

@ -1,6 +1,6 @@
# Installation
See [AWS-CLI-with-SeaweedFS](https://github.com/chrislusf/seaweedfs/wiki/AWS-CLI-with-SeaweedFS#installation)
See [AWS-CLI-with-SeaweedFS](https://github.com/seaweedfs/seaweedfs/wiki/AWS-CLI-with-SeaweedFS#installation)
# Execute commands

@ -26,7 +26,7 @@ This will add 1 physical volume when existing volumes are full. If using replica
fs.configure -locationPrefix=/buckets/ -replication=001 -volumeGrowthCount=2 -apply
```
See https://github.com/chrislusf/seaweedfs/wiki/Path-Specific-Configuration
See https://github.com/seaweedfs/seaweedfs/wiki/Path-Specific-Configuration
# Supported APIs
@ -251,4 +251,4 @@ uploading new files).** This is configured by setting
With both configurations (gRPC and JWT), it is possible to have Filer
and S3 communicate in fully authenticated fashion; so Filer will reject
any unauthenticated communication.
any unauthenticated communication.

@ -1,6 +1,6 @@
# Deprecated
This feature is replace by https://github.com/chrislusf/seaweedfs/wiki/Filer-Active-Active-cross-cluster-continuous-synchronization
This feature is replace by https://github.com/seaweedfs/seaweedfs/wiki/Filer-Active-Active-cross-cluster-continuous-synchronization
# Architecture
@ -96,4 +96,4 @@ Please read the source.filer and sink.filer configurations carefully and make su
The `weed filer.replicate` only replicates files that have been updated. If there are already a lot of files, very likely you would need to copy them too.
To do this, use `echo 'fs.meta.notify' | weed shell`, which will iterate all files and generate one "file creation" event for each file to the message queue. Thus, all files will be replicated.
To do this, use `echo 'fs.meta.notify' | weed shell`, which will iterate all files and generate one "file creation" event for each file to the message queue. Thus, all files will be replicated.

@ -34,11 +34,11 @@ Name | Author | Language
[Julia SeaweedFS Client](https://github.com/lawless-m/SeaweedFSClient.jl) | Lawless-m | Julia
## GRPC APIs
SeaweedFS uses GRPC internally. You can use them too. Just check https://github.com/chrislusf/seaweedfs/tree/master/weed/pb for the proto files.
SeaweedFS uses GRPC internally. You can use them too. Just check https://github.com/seaweedfs/seaweedfs/tree/master/weed/pb for the proto files.
When developing HDFS compatible file system, which allows replacing HDFS with SeaweedFS, a Java implementation of the GRPC client API is developed.
* Java GRPC client Source code: https://github.com/chrislusf/seaweedfs/tree/master/other/java/client
* Java GRPC client Source code: https://github.com/seaweedfs/seaweedfs/tree/master/other/java/client
* Java GRPC client Maven Repo: https://mvnrepository.com/artifact/com.github.chrislusf/seaweedfs-client
## Projects using SeaweedFS

@ -8,9 +8,9 @@
> file in SeaweedFS will also become a file in the cloud storage provider.
> - This is useful in case you want to use the files inside the cloud provider's infrastructure.
> - However, this does **not support file encryption** in any way (obviously), as the files are put to Cloud Storage as is.
> 2) [Tiered Storage with Cloud Tier](https://github.com/chrislusf/seaweedfs/wiki/Cloud-Tier)
> 2) [Tiered Storage with Cloud Tier](https://github.com/seaweedfs/seaweedfs/wiki/Cloud-Tier)
> - In this mode, seaweedFS **moves full volume files to the cloud storage provider**, so files which are 1 GB (in our case) big.
> - This mode supports [Filer Data Encryption](https://github.com/chrislusf/seaweedfs/wiki/Filer-Data-Encryption) transparently.
> - This mode supports [Filer Data Encryption](https://github.com/seaweedfs/seaweedfs/wiki/Filer-Data-Encryption) transparently.
> - The chunk files uploaded to the cloud provider are not usable outside of SeaweedFS.
@ -141,4 +141,3 @@ SeaweedFS Cloud Drive has these unique characteristics:
* You may need to access cloud data by HDFS, or HTTP, or S3 API, or WebDav, or FUSE Mount.
* With SeaweedFS Cloud Drive
* Multiple ways to access remote storage.

@ -1,7 +1,7 @@
## Motivation
> NOTE: SeaweedFS provides **two mechanisms** to use cloud storage:
> 1) [SeaweedFS Cloud Drive](https://github.com/chrislusf/seaweedfs/wiki/Cloud-Drive-Benefits)
> 1) [SeaweedFS Cloud Drive](https://github.com/seaweedfs/seaweedfs/wiki/Cloud-Drive-Benefits)
> - in this case, you can **mount** an S3 bucket to the Seaweedfs file system (in the filer), and access the remote files
> through SeaweedFS. Effectively, SeaweedFS caches the files from the cloud storage.
> - In this mode, the file structure in cloud store is exactly matching the SeaweedFS structure - so every
@ -10,7 +10,7 @@
> - However, this does **not support file encryption** in any way (obviously), as the files are put to Cloud Storage as is.
> 2) **Tiered Storage with Cloud Tier** (**<== You are here**)
> - In this mode, seaweedFS **moves full volume files to the cloud storage provider**, so files which are 1 GB (in our case) big.
> - This mode supports [Filer Data Encryption](https://github.com/chrislusf/seaweedfs/wiki/Filer-Data-Encryption) transparently.
> - This mode supports [Filer Data Encryption](https://github.com/seaweedfs/seaweedfs/wiki/Filer-Data-Encryption) transparently.
> - The chunk files uploaded to the cloud provider are not usable outside of SeaweedFS.

@ -3,7 +3,7 @@ It is fairly easy if you need to store filer metadata with other data store.
Let's use "yourstore" as the chosen name.
Here are the steps:
1. Add a package under github.com/chrislusf/seaweedfs/weed/filer/yourstore
1. Add a package under github.com/seaweedfs/seaweedfs/weed/filer/yourstore
2. Implement the filer.FilerStore interface
```
package filer
@ -45,21 +45,21 @@ func init() {
filer2.Stores = append(filer2.Stores, &YourStore{})
}
```
4. Load yourstore. Just import it in github.com/chrislusf/seaweedfs/weed/server/filer_server.go
4. Load yourstore. Just import it in github.com/seaweedfs/seaweedfs/weed/server/filer_server.go
```
import (
"net/http"
"strconv"
"github.com/chrislusf/seaweedfs/weed/filer"
_ "github.com/chrislusf/seaweedfs/weed/filer/cassandra"
_ "github.com/chrislusf/seaweedfs/weed/filer/leveldb"
_ "github.com/chrislusf/seaweedfs/weed/filer/mysql"
_ "github.com/chrislusf/seaweedfs/weed/filer/postgres"
_ "github.com/chrislusf/seaweedfs/weed/filer/redis"
_ "github.com/chrislusf/seaweedfs/weed/filer/yourstore"
"github.com/seaweedfs/seaweedfs/weed/filer"
_ "github.com/seaweedfs/seaweedfs/weed/filer/cassandra"
_ "github.com/seaweedfs/seaweedfs/weed/filer/leveldb"
_ "github.com/seaweedfs/seaweedfs/weed/filer/mysql"
_ "github.com/seaweedfs/seaweedfs/weed/filer/postgres"
_ "github.com/seaweedfs/seaweedfs/weed/filer/redis"
_ "github.com/seaweedfs/seaweedfs/weed/filer/yourstore"
// ^^ add here
"github.com/chrislusf/seaweedfs/weed/security"
"github.com/chrislusf/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/security"
"github.com/seaweedfs/seaweedfs/weed/glog"
)
```
5. Send a pull request!

@ -10,7 +10,7 @@ This is a really good guideline on how to setup minikube: https://thenewstack.io
# Steps
The default docker image is based on alpine Linux which causes issues with the DNS addon in Minikubes (see https://github.com/chrislusf/seaweedfs/issues/474). To get around this problem, I rebuilt the docker image from "scratch".
The default docker image is based on alpine Linux which causes issues with the DNS addon in Minikubes (see https://github.com/seaweedfs/seaweedfs/issues/474). To get around this problem, I rebuilt the docker image from "scratch".
To do this I added (or modified) the following files to the local repository:
@ -40,8 +40,8 @@ The script uses the docker file to build my image. Note the followings:
```
#!/bin/sh
go get github.com/chrislusf/seaweedfs/weed/...
CGO_ENABLED=0 GOOS=linux go build github.com/chrislusf/seaweedfs/weed
go get github.com/seaweedfs/seaweedfs/weed/...
CGO_ENABLED=0 GOOS=linux go build github.com/seaweedfs/seaweedfs/weed
docker build -t weed:latest -f ./Dockerfile .
docker tag weed:latest 192.168.42.23:80/weed:latest
docker push 192.168.42.23:80/weed:latest

@ -22,7 +22,7 @@ The downside:
Side Note:
* The 10+4 can be easily adjusted via `DataShardsCount` and `ParityShardsCount` in
https://github.com/chrislusf/seaweedfs/blob/master/weed/storage/erasure_coding/ec_encoder.go#L17
https://github.com/seaweedfs/seaweedfs/blob/master/weed/storage/erasure_coding/ec_encoder.go#L17
* If you are considering these enterprise-level customizations, please consider supporting SeaweedFS first.
## Architecture
@ -189,4 +189,4 @@ Percentage of the requests served within a certain time (ms)
98% 6.4 ms
99% 7.7 ms
100% 40.1 ms
```
```

4
FAQ.md

@ -6,7 +6,7 @@ SeaweedFS has web dashboards for its different services:
* Volume server dashboards can be accessed on `http://hostname:port/ui/index.html`.
For example: `http://localhost:8080/ui/index.html`
Also see [#275](https://github.com/chrislusf/seaweedfs/issues/275).
Also see [#275](https://github.com/seaweedfs/seaweedfs/issues/275).
### Does it support xxx language?
If using `weed filer`, just send one HTTP POST to write, or one HTTP GET to read.
@ -54,7 +54,7 @@ It is also important to leave some disk space for a couple of volume size, so th
If one volume has large number of small files, the memory usage would be high in order to keep each entry in memory or in leveldb.
To reduce memory usage, one way is to convert the older volumes into [Erasure-Coded volumes](https://github.com/chrislusf/seaweedfs/wiki/Erasure-Coding-for-warm-storage), which are read only. The volume server can will sort the index and store it as a sorted index file (with extension `.sdx`). So looking up one entry costs a binary search within the sorted index file, instead of O(1) memory lookup.
To reduce memory usage, one way is to convert the older volumes into [Erasure-Coded volumes](https://github.com/seaweedfs/seaweedfs/wiki/Erasure-Coding-for-warm-storage), which are read only. The volume server can will sort the index and store it as a sorted index file (with extension `.sdx`). So looking up one entry costs a binary search within the sorted index file, instead of O(1) memory lookup.
### How to configure volumes larger than 30GB?

@ -87,7 +87,7 @@ filer ---- mount1
#### Mount directory on host from docker-compose
If docker compose is being used to manage the server (eg. https://github.com/chrislusf/seaweedfs/wiki/Getting-Started#with-compose)
If docker compose is being used to manage the server (eg. https://github.com/seaweedfs/seaweedfs/wiki/Getting-Started#with-compose)
it's possible to mount a directory on the host with docker privileged mode like so:
```
mount_1:
@ -280,7 +280,7 @@ From https://github.com/osxfuse/osxfuse/issues/358
> FUSE needs to register a virtual device for exchanging messages between the kernel and the actual file system implementation running in user space. The number of available device slots is limited by macOS. So if you are using other software like VMware, VirtualBox, TunTap, Intel HAXM, ..., that eat up all free device slots, FUSE will not be able to register its virtual device.
### Samba share mounted folder ###
From https://github.com/chrislusf/seaweedfs/issues/936
From https://github.com/seaweedfs/seaweedfs/issues/936
The issue is with samba.conf. If you see NT_STATUS_ACCESS_DENIED error, try to add `force user` and `force group` to your samba.conf file.
```
[profiles]

@ -81,7 +81,7 @@ The gRPC API is also open to public and can support many other languages.
Here is an example, in Java:
https://github.com/chrislusf/seaweedfs/blob/master/other/java/examples/src/main/java/com/seaweedfs/examples/WatchFiles.java
https://github.com/seaweedfs/seaweedfs/blob/master/other/java/examples/src/main/java/com/seaweedfs/examples/WatchFiles.java
To subscribe the meta data changes:
| Parameter | Meaning |
@ -102,7 +102,7 @@ Basically there are four types of events to handle:
This is based on Filer gRPC API. You should be able to easily implement it in your own language.
https://github.com/chrislusf/seaweedfs/blob/master/weed/pb/filer.proto#L52
https://github.com/seaweedfs/seaweedfs/blob/master/weed/pb/filer.proto#L52
# Possible Use Cases

@ -21,5 +21,4 @@ Another side is, with GDPR, companies are required to "forget" customer data aft
### Encryption Algorithm
The encryption is through AES256-GCM https://en.wikipedia.org/wiki/Galois/Counter_Mode
There is one randomly generated cipher key of 256 bits for each file chunk. The cipher code is here https://github.com/chrislusf/seaweedfs/blob/master/weed/util/cipher.go
There is one randomly generated cipher key of 256 bits for each file chunk. The cipher code is here https://github.com/seaweedfs/seaweedfs/blob/master/weed/util/cipher.go

@ -3,7 +3,7 @@ On filer, there is a `/topics/.system/log` folder, it stores all filer metadata
## Metadata Event Format
The events are stored in files organized by timestamp, `yyyy-MM-dd/hh-mm.segment`.
The events are encoded by protobuf, defined in https://github.com/chrislusf/seaweedfs/blob/master/weed/pb/filer.proto . The related sections are:
The events are encoded by protobuf, defined in https://github.com/seaweedfs/seaweedfs/blob/master/weed/pb/filer.proto . The related sections are:
```
service SeaweedFiler {
rpc SubscribeMetadata (SubscribeMetadataRequest) returns (stream SubscribeMetadataResponse) {
@ -41,7 +41,7 @@ The ondisk file is a repeated bytes of the following format:
The `LogEntry.data` stores serialized `SubscribeMetadataResponse`
## Read Metadata Events
The events can be read by any program as files. One example is here: https://github.com/chrislusf/seaweedfs/blob/master/unmaintained/see_log_entry/see_log_entry.go
The events can be read by any program as files. One example is here: https://github.com/seaweedfs/seaweedfs/blob/master/unmaintained/see_log_entry/see_log_entry.go
## Subscribe to Metadata

@ -270,11 +270,11 @@ The patterns are case-sensitive and support wildcard characters '*' and '?'.
// recursively delete everything, ignoring any recursive error
> curl -X DELETE http://localhost:8888/path/to/dir?recursive=true&ignoreRecursiveError=true
// For Experts Only: remove filer directories only, without removing data chunks.
// see https://github.com/chrislusf/seaweedfs/pull/1153
// see https://github.com/seaweedfs/seaweedfs/pull/1153
> curl -X DELETE http://localhost:8888/path/to?recursive=true&skipChunkDeletion=true
```
| Parameter | Description | Default |
| ---- | -- | -- |
| recursive | if "recursive=true", recursively delete all files and folders | filer recursive_delete option from filer.toml |
| ignoreRecursiveError | if "ignoreRecursiveError=true", ignore errors in recursive mode | false |
| skipChunkDeletion | if "skipChunkDeletion=true", do not delete file chunks on volume servers | false |
| skipChunkDeletion | if "skipChunkDeletion=true", do not delete file chunks on volume servers | false |

@ -2,7 +2,7 @@
The Filer Store persists all file metadata and directory information.
| Filer Store Name | Lookup | number of entries in a folder | Scalability | Directory Renaming | TTL | [Fast Bucket Deletion](https://github.com/chrislusf/seaweedfs/wiki/S3-API-FAQ#how-to-speed-up-bucket-deletion) |Note |
| Filer Store Name | Lookup | number of entries in a folder | Scalability | Directory Renaming | TTL | [Fast Bucket Deletion](https://github.com/seaweedfs/seaweedfs/wiki/S3-API-FAQ#how-to-speed-up-bucket-deletion) |Note |
| ---------------- | -- | -- | -- | -- | -- | -- | -- |
| memory | O(1) | limited by memory | Local, Fast | | Yes| | for testing only, no persistent storage |
| leveldb | O(logN)| unlimited | Local, Very Fast | | Yes| | Default, fairly scalable |
@ -13,8 +13,8 @@ The Filer Store persists all file metadata and directory information.
| Mongodb | O(logN)| unlimited | Local or Distributed, Fast | | Yes| | Easy to manage |
| Arangodb | O(logN)| unlimited | Local or Distributed, Fast | | Native| Yes | Easy to manage; Scalable |
| YDB | O(logN)| unlimited | Local or Distributed, Fast |Atomic| Native| Yes | Easy to manage; True elastic Scalability; High Availability. Need to manually build. |
| [Redis2](https://github.com/chrislusf/seaweedfs/wiki/Filer-Redis-Setup)| O(1) | limited | Local or Distributed, Fastest ||Native| | one directory's children are stored in one key~value entry |
| [Redis3](https://github.com/chrislusf/seaweedfs/wiki/Filer-Redis-Setup)| O(1) | unlimited | Local or Distributed, Fastest ||Native| | one directory's children are spread into multiple key~value entries |
| [Redis2](https://github.com/seaweedfs/seaweedfs/wiki/Filer-Redis-Setup)| O(1) | limited | Local or Distributed, Fastest ||Native| | one directory's children are stored in one key~value entry |
| [Redis3](https://github.com/seaweedfs/seaweedfs/wiki/Filer-Redis-Setup)| O(1) | unlimited | Local or Distributed, Fastest ||Native| | one directory's children are spread into multiple key~value entries |
| Cassandra | O(logN)| unlimited | Local or Distributed, Very Fast||Native| | |
| MySql | O(logN)| unlimited | Local or Distributed, Fast |Atomic| Yes| | Easy to manage |
| MySql2 | O(logN)| unlimited | Local or Distributed, Fast |Atomic| Yes| Yes| Easy to manage |

@ -2,7 +2,7 @@
## Installing SeaweedFS
Download the latest official release from https://github.com/chrislusf/seaweedfs/releases.
Download the latest official release from https://github.com/seaweedfs/seaweedfs/releases.
Decompress the downloaded file. You will only find one executable file, either "weed" on most systems or "weed.exe" on windows.
@ -92,7 +92,7 @@ docker-compose -f docker/seaweedfs-compose.yml -p seaweedfs up
You can use image "chrislusf/seaweedfs" or build your own with [dockerfile][] in the root of repo.
[dockerfile]: https://github.com/chrislusf/seaweedfs/blob/master/docker/Dockerfile
[dockerfile]: https://github.com/seaweedfs/seaweedfs/blob/master/docker/Dockerfile
### Using pre-built Docker image
@ -118,7 +118,7 @@ curl "http://$IP:9333/cluster/status?pretty=y"
Make a local copy of seaweedfs from github
```bash
git clone https://github.com/chrislusf/seaweedfs.git
git clone https://github.com/seaweedfs/seaweedfs.git
```
Minimal Image (~19.6 MB)

@ -4,16 +4,16 @@ SeaweedFS excels on small files and has no issue to store large files. Now it is
# Build SeaweedFS Hadoop Client Jar
```
$cd $GOPATH/src/github.com/chrislusf/seaweedfs/other/java/client
$cd $GOPATH/src/github.com/seaweedfs/seaweedfs/other/java/client
$ mvn install
# build for hadoop2
$cd $GOPATH/src/github.com/chrislusf/seaweedfs/other/java/hdfs2
$cd $GOPATH/src/github.com/seaweedfs/seaweedfs/other/java/hdfs2
$ mvn package
$ ls -al target/seaweedfs-hadoop2-client-3.13.jar
# build for hadoop3
$cd $GOPATH/src/github.com/chrislusf/seaweedfs/other/java/hdfs3
$cd $GOPATH/src/github.com/seaweedfs/seaweedfs/other/java/hdfs3
$ mvn package
$ ls -al target/seaweedfs-hadoop3-client-3.13.jar

@ -8,7 +8,7 @@ To support large files, SeaweedFS supports these two kinds of files:
This piece of code shows the json file structure:
https://github.com/chrislusf/seaweedfs/blob/master/weed/operation/chunked_file.go#L24
https://github.com/seaweedfs/seaweedfs/blob/master/weed/operation/chunked_file.go#L24
```
type ChunkInfo struct {
@ -158,4 +158,4 @@ There are no particular limit in terms of chunk file size. Each chunk size does
## weed filer and weed mount
The filer server and the FUSE implementation that uses filer server are automatically chunking large files into smaller chunks.
The list of chunks are stored in filer storage, and managed by filer or weed mount client.
The list of chunks are stored in filer storage, and managed by filer or weed mount client.

@ -134,7 +134,7 @@ will also generate a "pictures" collection and a "documents" collection if they
Actually, the actual data files have the collection name as the prefix, e.g., "pictures_1.dat", "documents_3.dat".
If you need to delete them later see https://github.com/chrislusf/seaweedfs/wiki/Master-Server-API#delete-collection
If you need to delete them later see https://github.com/seaweedfs/seaweedfs/wiki/Master-Server-API#delete-collection
## Logging

@ -14,7 +14,7 @@ We will use 2 servers. Server 1 will host master, 2x volumes (2 disks, one volum
# todo: use 2 step build process, copy over weed binary to fresh container (do not need curl and tar at runtime)
FROM alpine
RUN apk update && apk add wget tar
RUN wget https://github.com/chrislusf/seaweedfs/releases/download/3.13/linux_amd64_large_disk.tar.gz
RUN wget https://github.com/seaweedfs/seaweedfs/releases/download/3.13/linux_amd64_large_disk.tar.gz
RUN tar -xf linux_amd64_large_disk.tar.gz
RUN chmod +x weed
RUN mv weed /usr/bin/
@ -52,7 +52,7 @@ services:
```
5. `docker-compose up` on both servers and check that the master sees the volume
6. Follow [security guide](https://github.com/chrislusf/seaweedfs/wiki/Security-Configuration) to add secrets and certs. Scaffold `security.toml` file and generate certs, in this example, all certs are in `certs/` folder. Update `docker-compose.yml` of master server:
6. Follow [security guide](https://github.com/seaweedfs/seaweedfs/wiki/Security-Configuration) to add secrets and certs. Scaffold `security.toml` file and generate certs, in this example, all certs are in `certs/` folder. Update `docker-compose.yml` of master server:
```yml
version: '3.7'
services:

@ -5,7 +5,7 @@ Here are some tests on one single computer. However, if you need more performanc
# Test with Warp
https://github.com/minio/warp
Warp is a more complete test suite. It needs identity access management. So you would need to configure authentication info with `weed s3 -conf=...` or `weed filer -s3 -s3.conf=...`. See https://github.com/chrislusf/seaweedfs/wiki/Amazon-S3-API#authentication
Warp is a more complete test suite. It needs identity access management. So you would need to configure authentication info with `weed s3 -conf=...` or `weed filer -s3 -s3.conf=...`. See https://github.com/seaweedfs/seaweedfs/wiki/Amazon-S3-API#authentication
Here is the results from my local laptop written to an external SSD via USB 3.1:
@ -172,4 +172,4 @@ benchmark$ hsbench -a accesstoken -s secret -z 4K -d 10 -t 10 -b 10 -u http://l
2020/11/17 20:06:20 Running Loop 0 BUCKET DELETE TEST
2020/11/17 20:06:21 Loop: 0, Int: TOTAL, Dur(s): 0.4, Mode: BDEL, Ops: 10, MB/s: 0.00, IO/s: 24, Lat(ms): [ min: 371.6, avg: 407.9, 99%: 421.6, max: 421.6 ], Slowdowns: 0
benchmark$
```
```

@ -2,7 +2,7 @@
## Can not upload due to "no free volumes left"
The symptom is similar to https://github.com/chrislusf/seaweedfs/issues/1631 where the logs show
The symptom is similar to https://github.com/seaweedfs/seaweedfs/issues/1631 where the logs show
```
Nov 20 18:49:37 s2375.j weed[31818]: E1120 18:49:37 31818 filer_server_handlers_write.go:42] failing to assign a file id: rpc error: code = Unknown desc = No free volumes left!
Nov 20 18:49:37 s2375.j weed[31818]: I1120 18:49:37 31818 common.go:53] response method:PUT URL:/buckets/dev-passport-video-recordings/02342a46-7435-b698-2437-c778db34ef59.mp4 with httpStatus:500 and JSON:{"error":"rpc error: code = Unknown desc = No free volumes left!"}
@ -24,14 +24,14 @@ This will add 1 physical volume when existing volumes are full. If using replica
fs.configure -locationPrefix=/buckets/ -replication=001 -volumeGrowthCount=2 -apply
```
See https://github.com/chrislusf/seaweedfs/wiki/Path-Specific-Configuration
See https://github.com/seaweedfs/seaweedfs/wiki/Path-Specific-Configuration
## How to speed up bucket deletion?
One common unexpected problem is the deletion can be slow. To delete a file, we need to delete the file content on the volume servers and delete the file entry from the filer store. It is almost the same amount of work as adding a file. If there are millions of files, it can take a long time to delete.
When you need to create large buckets and delete them often, you may choose `leveldb3` as the filer store, or any other stores that supports **Fast Bucket Deletion** in https://github.com/chrislusf/seaweedfs/wiki/Filer-Stores
When you need to create large buckets and delete them often, you may choose `leveldb3` as the filer store, or any other stores that supports **Fast Bucket Deletion** in https://github.com/seaweedfs/seaweedfs/wiki/Filer-Stores
`leveldb3` can automatically create a separate LevelDB instance for each bucket.
So bucket deletion is as simple as deleting the LevelDB instance files and the collection of volume files.
@ -50,4 +50,4 @@ Example using rclone:
rclone lsf seaweedfs:my-bucket/dir
```
If the directory `dir` exists in `my-bucket`, the orphaned metadata will be cleaned up. Note that due to slight API usage differences, `rclone ls` does not trigger cleanup, but `rclone lsf` will.
If the directory `dir` exists in `my-bucket`, the orphaned metadata will be cleaned up. Note that due to slight API usage differences, `rclone ls` does not trigger cleanup, but `rclone lsf` will.

@ -2,12 +2,12 @@ There are a few external Java libraries available. But actually SeaweedFS alread
Here is an SeaweedFS Java API implementation refactored out of the existing code.
https://github.com/chrislusf/seaweedfs/tree/master/other/java/examples/src/main/java/com/seaweedfs/examples
https://github.com/seaweedfs/seaweedfs/tree/master/other/java/examples/src/main/java/com/seaweedfs/examples
# Build Java Client Jar
```
$cd $GOPATH/src/github.com/chrislusf/seaweedfs/other/java/client
$cd $GOPATH/src/github.com/seaweedfs/seaweedfs/other/java/client
$ mvn install
```
@ -131,4 +131,4 @@ Sometimes you may need to go deeper. For example, change modification time `mtim
// save the new entry
entryBuilder.setAttributes(attrBuilder);
filerClient.updateEntry("/some/dir", entryBuilder.build());
```
```

@ -82,8 +82,8 @@ To enable JWT-based access control for the Filer,
If `jwt.filer_signing.key` is configured: When sending upload/update/delete HTTP operations to a filer server, the request header `Authorization` should be the JWT string (`Authorization: Bearer [JwtToken]`). The operation is authorized after the filer validates the JWT with `jwt.filer_signing.key`.
The JwtToken can be generated by calling `security.GenJwtForFilerServer(signingKey SigningKey, expiresAfterSec int)` in `github.com/chrislusf/seaweedfs/weed/security` package.
https://github.com/chrislusf/seaweedfs/blob/9b941773805400c520558d83aed633adc821988c/weed/security/jwt.go#L53
The JwtToken can be generated by calling `security.GenJwtForFilerServer(signingKey SigningKey, expiresAfterSec int)` in `github.com/seaweedfs/seaweedfs/weed/security` package.
https://github.com/seaweedfs/seaweedfs/blob/9b941773805400c520558d83aed633adc821988c/weed/security/jwt.go#L53
If `jwt.filer_signing.read.key` is configured: When sending GET or HEAD requests to a filer server, the request header `Authorization` should be the JWT string (`Authorization: Bearer [JwtToken]`). The operation is authorized after the filer validates the JWT with `jwt.filer_signing.read.key`.

@ -41,10 +41,10 @@ And then you can configure your Prometheus to crawl them periodically.
# Dashboard
The dashboard is shared at https://github.com/chrislusf/seaweedfs/blob/master/other/metrics/grafana_seaweedfs.json
The dashboard is shared at https://github.com/seaweedfs/seaweedfs/blob/master/other/metrics/grafana_seaweedfs.json
If you modify the dashboard, please share your revisions.
## Example Dashboard
![](https://pbs.twimg.com/media/ET7tiEcUMAIet9M?format=jpg&name=large)
![](https://pbs.twimg.com/media/ET7tiEcUMAIet9M?format=jpg&name=large)

@ -35,7 +35,7 @@ Example (within the weed shell):
fs.configure -locationPrefix=/buckets/ssd_ -disk=ssd -apply
```
https://github.com/chrislusf/seaweedfs/wiki/Path-Specific-Configuration
https://github.com/seaweedfs/seaweedfs/wiki/Path-Specific-Configuration
# Custom Tags

@ -39,7 +39,7 @@ curl -H "Content-Type:image/png" -F file=@myImage.png http://127.0.0.1:8080/5,27
The simple way is to front all master and volume servers with firewall.
The following white list option is deprecated. Please follow https://github.com/chrislusf/seaweedfs/wiki/Security-Overview
The following white list option is deprecated. Please follow https://github.com/seaweedfs/seaweedfs/wiki/Security-Overview
A white list option can be used. Only traffic from the white list IP addresses have write permission.
@ -103,4 +103,4 @@ weed volume -dir=/tmp/vol1/ -mserver="localhost:9334" -ip="localhost" -port=8081
weed volume -dir=/tmp/vol2/ -mserver="localhost:9334" -ip="localhost" -port=8082
```
so we finished moving data of localhost:8083 to localhost:8081/localhost:8082
so we finished moving data of localhost:8083 to localhost:8081/localhost:8082

@ -29,7 +29,7 @@ curl -F file=@/home/chris/myphoto.jpg http://127.0.0.1:8080/3,01637037d6
{"size": 43234}
```
The size returned is the size stored on SeaweedFS, sometimes the file is automatically gzipped based on the file extension or mime type [(see when compression will be applied automatically)](https://github.com/chrislusf/seaweedfs/blob/c42b95c596f762dcca2bc9c7e7a918ab8ca8b206/weed/util/compression.go#L111).
The size returned is the size stored on SeaweedFS, sometimes the file is automatically gzipped based on the file extension or mime type [(see when compression will be applied automatically)](https://github.com/seaweedfs/seaweedfs/blob/c42b95c596f762dcca2bc9c7e7a918ab8ca8b206/weed/util/compression.go#L111).
| URL Parameter | Description | Default |
| ---- | -- | -- |
@ -150,4 +150,3 @@ curl "http://localhost:8080/status?pretty=y"
]
}
```

@ -37,8 +37,8 @@ And modify the configuration at runtime:
1. change the spark-defaults.conf
```
spark.driver.extraClassPath=/Users/chris/go/src/github.com/chrislusf/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.executor.extraClassPath=/Users/chris/go/src/github.com/chrislusf/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.driver.extraClassPath=/Users/chris/go/src/github.com/seaweedfs/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.executor.extraClassPath=/Users/chris/go/src/github.com/seaweedfs/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.hadoop.fs.seaweedfs.impl=seaweed.hdfs.SeaweedFileSystem
```
@ -81,8 +81,8 @@ spark.history.fs.cleaner.enabled=true
spark.history.fs.logDirectory=seaweedfs://localhost:8888/spark2-history/
spark.eventLog.dir=seaweedfs://localhost:8888/spark2-history/
spark.driver.extraClassPath=/Users/chris/go/src/github.com/chrislusf/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.executor.extraClassPath=/Users/chris/go/src/github.com/chrislusf/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.driver.extraClassPath=/Users/chris/go/src/github.com/seaweedfs/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.executor.extraClassPath=/Users/chris/go/src/github.com/seaweedfs/seaweedfs/other/java/hdfs2/target/seaweedfs-hadoop2-client-3.13.jar
spark.hadoop.fs.seaweedfs.impl=seaweed.hdfs.SeaweedFileSystem
spark.hadoop.fs.defaultFS=seaweedfs://localhost:8888
```

@ -127,6 +127,6 @@ docker run \
"fs.configure -locationPrefix=/buckets/foo -volumeGrowthCount=3 -replication=002 -apply"
```
Here `shell` selects the [Docker image entrypoint](https://github.com/chrislusf/seaweedfs/blob/master/docker/entrypoint.sh#L60-L64).
Here `shell` selects the [Docker image entrypoint](https://github.com/seaweedfs/seaweedfs/blob/master/docker/entrypoint.sh#L60-L64).
The arguments are `fs.configure -locationPrefix=/buckets/foo -volumeGrowthCount=3 -replication=002 -apply`
The arguments are `fs.configure -locationPrefix=/buckets/foo -volumeGrowthCount=3 -replication=002 -apply`