From 6966972ec3887c2a0a61d022867bd35d340d7475 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:18:27 -0700 Subject: [PATCH 01/42] chore(deps): bump golang.org/x/image from 0.17.0 to 0.18.0 (#5719) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c38969845..65a3bdd12 100644 --- a/go.mod +++ b/go.mod @@ -105,7 +105,7 @@ require ( gocloud.dev/pubsub/rabbitpubsub v0.37.0 golang.org/x/crypto v0.24.0 // indirect golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 - golang.org/x/image v0.17.0 + golang.org/x/image v0.18.0 golang.org/x/net v0.26.0 golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sys v0.21.0 diff --git a/go.sum b/go.sum index ded1d28c1..25bc61927 100644 --- a/go.sum +++ b/go.sum @@ -1693,8 +1693,8 @@ golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeap golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.17.0 h1:nTRVVdajgB8zCMZVsViyzhnMKPwYeroEERRC64JuLco= -golang.org/x/image v0.17.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= +golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= From c7e8906ad2f8e55866e0e1392500ed5b9e51c574 Mon Sep 17 00:00:00 2001 From: Gregor Tudan Date: Thu, 27 Jun 2024 17:02:50 +0200 Subject: [PATCH 02/42] Helm-Chart: clean up image handling (#5720) Clean up the image computation to make it consistent with the values file --- k8s/charts/seaweedfs/templates/_helpers.tpl | 45 +++++++-------------- k8s/charts/seaweedfs/values.yaml | 13 +----- 2 files changed, 15 insertions(+), 43 deletions(-) diff --git a/k8s/charts/seaweedfs/templates/_helpers.tpl b/k8s/charts/seaweedfs/templates/_helpers.tpl index f6f7b8991..d8261eb32 100644 --- a/k8s/charts/seaweedfs/templates/_helpers.tpl +++ b/k8s/charts/seaweedfs/templates/_helpers.tpl @@ -49,25 +49,7 @@ Inject extra environment vars in the format key:value, if populated {{- $imageOverride := .Values.filer.imageOverride -}} {{- printf "%s" $imageOverride -}} {{- else -}} -{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}} -{{- $repositoryName := .Values.image.repository | toString -}} -{{- $name := .Values.global.imageName | toString -}} -{{- $tag := .Chart.AppVersion | toString -}} -{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}} -{{- end -}} -{{- end -}} - -{{/* Return the proper dbSchema image */}} -{{- define "filer.dbSchema.image" -}} -{{- if .Values.filer.dbSchema.imageOverride -}} -{{- $imageOverride := .Values.filer.dbSchema.imageOverride -}} -{{- printf "%s" $imageOverride -}} -{{- else -}} -{{- $registryName := default .Values.global.registry .Values.global.localRegistry | toString -}} -{{- $repositoryName := .Values.global.repository | toString -}} -{{- $name := .Values.filer.dbSchema.imageName | toString -}} -{{- $tag := .Values.filer.dbSchema.imageTag | toString -}} -{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}} +{{- include "common.image" . }} {{- end -}} {{- end -}} @@ -77,11 +59,7 @@ Inject extra environment vars in the format key:value, if populated {{- $imageOverride := .Values.master.imageOverride -}} {{- printf "%s" $imageOverride -}} {{- else -}} -{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}} -{{- $repositoryName := .Values.image.repository | toString -}} -{{- $name := .Values.global.imageName | toString -}} -{{- $tag := .Chart.AppVersion | toString -}} -{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}} +{{- include "common.image" . }} {{- end -}} {{- end -}} @@ -91,11 +69,7 @@ Inject extra environment vars in the format key:value, if populated {{- $imageOverride := .Values.s3.imageOverride -}} {{- printf "%s" $imageOverride -}} {{- else -}} -{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}} -{{- $repositoryName := .Values.image.repository | toString -}} -{{- $name := .Values.global.imageName | toString -}} -{{- $tag := .Chart.AppVersion | toString -}} -{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}} +{{- include "common.image" . }} {{- end -}} {{- end -}} @@ -105,11 +79,20 @@ Inject extra environment vars in the format key:value, if populated {{- $imageOverride := .Values.volume.imageOverride -}} {{- printf "%s" $imageOverride -}} {{- else -}} -{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}} +{{- include "common.image" . }} +{{- end -}} +{{- end -}} + +{{/* Computes the container image name for all components (if they are not overridden) */}} +{{- define "common.image" -}} +{{- $registryName := default .Values.image.registry .Values.global.registry | toString -}} {{- $repositoryName := .Values.image.repository | toString -}} {{- $name := .Values.global.imageName | toString -}} {{- $tag := .Chart.AppVersion | toString -}} -{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}} +{{- if $registryName -}} +{{- printf "%s/%s%s:%s" $registryName $repositoryName $name $tag -}} +{{- else -}} +{{- printf "%s%s:%s" $repositoryName $name $tag -}} {{- end -}} {{- end -}} diff --git a/k8s/charts/seaweedfs/values.yaml b/k8s/charts/seaweedfs/values.yaml index e275a90d3..53385779e 100644 --- a/k8s/charts/seaweedfs/values.yaml +++ b/k8s/charts/seaweedfs/values.yaml @@ -48,9 +48,6 @@ image: master: enabled: true - repository: null - imageName: null - imageTag: null imageOverride: null restartPolicy: null replicas: 1 @@ -256,9 +253,6 @@ master: volume: enabled: true - repository: null - imageName: null - imageTag: null imageOverride: null restartPolicy: null port: 8080 @@ -473,9 +467,6 @@ volume: filer: enabled: true - repository: null - imageName: null - imageTag: null imageOverride: null restartPolicy: null replicas: 1 @@ -740,9 +731,7 @@ filer: s3: enabled: false - repository: null - imageName: null - imageTag: null + imageOverride: null restartPolicy: null replicas: 1 bindAddress: 0.0.0.0 From a6a549547741d10375b5f71a6401de91b950db0a Mon Sep 17 00:00:00 2001 From: Gregor Tudan Date: Thu, 27 Jun 2024 17:04:57 +0200 Subject: [PATCH 03/42] Move cluster role to a separate template. (#5721) Move cluster role to a separate template, to allow disabling it without breaking the service account --- .../seaweedfs/templates/cluster-role.yaml | 35 +++++++++++++++++ .../seaweedfs/templates/service-account.yaml | 38 +------------------ 2 files changed, 36 insertions(+), 37 deletions(-) create mode 100644 k8s/charts/seaweedfs/templates/cluster-role.yaml diff --git a/k8s/charts/seaweedfs/templates/cluster-role.yaml b/k8s/charts/seaweedfs/templates/cluster-role.yaml new file mode 100644 index 000000000..154de0675 --- /dev/null +++ b/k8s/charts/seaweedfs/templates/cluster-role.yaml @@ -0,0 +1,35 @@ +{{- if .Values.global.createClusterRole }} +#hack for delete pod master after migration +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Values.global.serviceAccountName }}-rw-cr + labels: + app.kubernetes.io/name: {{ template "seaweedfs.name" . }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: system:serviceaccount:{{ .Values.global.serviceAccountName }}:default + labels: + app.kubernetes.io/name: {{ template "seaweedfs.name" . }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} +subjects: + - kind: ServiceAccount + name: {{ .Values.global.serviceAccountName }} + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ .Values.global.serviceAccountName }}-rw-cr +{{- end }} \ No newline at end of file diff --git a/k8s/charts/seaweedfs/templates/service-account.yaml b/k8s/charts/seaweedfs/templates/service-account.yaml index 56f18ac5b..a00c9f3f7 100644 --- a/k8s/charts/seaweedfs/templates/service-account.yaml +++ b/k8s/charts/seaweedfs/templates/service-account.yaml @@ -1,20 +1,3 @@ -{{- if .Values.global.createClusterRole }} -#hack for delete pod master after migration ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ .Values.global.serviceAccountName }}-rw-cr - labels: - app.kubernetes.io/name: {{ template "seaweedfs.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -rules: - - apiGroups: [""] - resources: ["pods"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] ---- apiVersion: v1 kind: ServiceAccount metadata: @@ -24,23 +7,4 @@ metadata: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: system:serviceaccount:{{ .Values.global.serviceAccountName }}:default - labels: - app.kubernetes.io/name: {{ template "seaweedfs.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -subjects: -- kind: ServiceAccount - name: {{ .Values.global.serviceAccountName }} - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ .Values.global.serviceAccountName }}-rw-cr -{{- end }} + app.kubernetes.io/instance: {{ .Release.Name }} \ No newline at end of file From 2514fd034b10b9c91f440168e62afed4b4e1464f Mon Sep 17 00:00:00 2001 From: chrislu Date: Thu, 27 Jun 2024 08:50:42 -0700 Subject: [PATCH 04/42] Create keepsec.png --- note/keepsec.png | Bin 0 -> 11827 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/keepsec.png diff --git a/note/keepsec.png b/note/keepsec.png new file mode 100644 index 0000000000000000000000000000000000000000..492a020c89f6b78a2da84bdf792a55879f6b1abc GIT binary patch literal 11827 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 literal 0 HcmV?d00001 From 5059a7a621e4e2c77a8552a5594372fd5ce824b8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 27 Jun 2024 08:50:51 -0700 Subject: [PATCH 05/42] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f6eb5b51a..0a4f2c728 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,8 @@ Your support will be really appreciated by me and other supporters! ### Gold Sponsors [![nodion](https://raw.githubusercontent.com/seaweedfs/seaweedfs/master/note/sponsor_nodion.png)](https://www.nodion.com) [![piknik](https://raw.githubusercontent.com/seaweedfs/seaweedfs/master/note/piknik.png)](https://www.piknik.com) -- VPS provided by [keepsec.ca](https://www.keepsec.ca/) +[![keepsec](https://raw.githubusercontent.com/seaweedfs/seaweedfs/master/note/keepsec.png)](https://www.keepsec.ca) + --- - [Download Binaries for different platforms](https://github.com/seaweedfs/seaweedfs/releases/latest) From 9868d5c22e92b2738105b5413967f2a7679ccbb6 Mon Sep 17 00:00:00 2001 From: chrislu Date: Thu, 27 Jun 2024 08:54:33 -0700 Subject: [PATCH 06/42] less height --- note/keepsec.png | Bin 11827 -> 12197 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/keepsec.png b/note/keepsec.png index 492a020c89f6b78a2da84bdf792a55879f6b1abc..39621c77d2484afde14929eea5b6f26134a2c6b3 100644 GIT binary patch delta 11749 zcmZX41yG*7wl(hV?!36WYjLNzYk}hK4-~iJ?(Xhx1&UML-Q6kvf9L%7&OLK)W|B;s56R&piJ&|8JW1|KR_l^B=~guY3 z631wmgi3(-QcXz>CdVhc_T-=ngxcJvPOA%M;^xMIX_SJ8Ij_Uh<8Ii8?iy_=y6kD) z1Ww)MnaHE>{5bF}(-K~o-71x``Q3o2au=nA?!Y2k-=+Dfzg_rT?+|(ddmHxm6N(K! z?@IBS46`7LNm*-tK5|S&vNe&b-+R(y<{0eu`eYj$@x8d0#b($19Fua=H-^!iklz>` zTeQGh1w!+&ab?M{C*e<&V0*GJzCY;fJX72%sDUi4dd{$HEN!0X7$ zcM*TdjtxW10|3)adxIM*yi@}l6BB3#GQx0cDv2Y%*$B+wh&A#>FRHDVqsGv^%00UTKp{8=FnmooA zi(dup&W^aF>Jz_EG(`)^4qR)ltUh*yCFb~~rTuE()+PsaNb{3=)03bs$VJ_;TYQWr zw9=?FBM^DW?>BsS={)3tY;2qxJUcn0TKJr#W%u5uWz2`e_x)K6s#*Ttx|NbJwAhBa zS^#073Hb|nv*Ll%WbT4+_&f64)zF6iyU;MkTM&LlRT_2cSK5oUfzh~U zUx~M>bZBs;UY7OZB6CWEUvy3^5W*Xai#~9kDN=ZvsOnZwQy|WjZHl~m+FzO9Tpse zZ+A-*CtVr0hE% z;~O2t?+9ZZR;`Wj%kutN9?z*%q}0^)0yJKYgFM)5D#OJ^y-0LMP>JjTv%^@61*bhD z$-tWO*yfugP3NO*13!Zv=_=^KW!OZ7%65|ptW|pG0fGVCNPcRNv6;?y7>dRcc2+n~ zG+|gb+B&Vi(WUmEeRipt=$vbI+8Oi~qdKthr6nF^)CcV<4>HJ@hHM4XFPFx=!f8mY zz~%URtZSj@$7DqJI_Jb^cKwR`yn}KuHxN;bKgW{UOp{m`oe`i$jWVJGFol>+bV{q*$QpvN~@XRT%tDUEMXd{@#dU8+B+nyx4oeKjIrK6^=vUEDXlqj`RvED0|KM zDI_UE#F=Jz!kgp`?$z-n(aD>J%{)27q9j2*%R4`gF;4VbA_XO)p?;EY0_>+VhUd|- zys4il=NonL(yYgi9!WyrLcTwws?mmC-?P2|8Ij+ZIjCLS>a%j1H$@3%CPT6Y{ABTw zjgd=Cy@c+94Bl37X}e31w=C;Rgc+=#kf$RL1>n<7ZVS5r>o5)caOid@ANNz z?1bV&E_H2s^PcgwLOSF{qg1p~N~z4H2b)`2L2&n*p2~Kn+<=h36~y5}vzvXRLQq%t z>6B|;a{loD9SCl7iBNP{+~%JtOq4|c=Z|jY#1|b4^g*s-aqM3E14!V!=Ti82iU8%k znYOC+m*2Xm1?$(|K&B7n9&QnJ@;4<^XN+K3_(TDCM!P~Ui?m%ZTJE7&QP4y>xrM@3 z`=&|)cOPrr?13R4?+@CtR)g6dYx;YwW}L$(vC^oS0G{Cic5?NwNgrBGd_yg;cr2wd zsVC5A2qD$V9JRp(@QRoh#VK^0@__@53Buk8h^SM+K*#ZApVWWdvi|F`4C&}nF4_1I zfCYt&C=y9)sEozNFdDgG^?owZzZ6;ZcWet{=Tp&+7Lx3s;()Uzu-t1V!VRaLjp4*n z|ExaOJV_+xuQ8sOaNdybFtjEkMAO2`&3LhWe@w$ce{x6|0J|}}RgpJzS2pxQQ$c4o zv|Enf4@u6&^O`7PuCiBw11~$*oNGM#J>5CYn*Rv5>=Sbe&E@yoW#xyFD;SW?96mte zI{U#qHI{a$x~S0Bzr6ndWjL?4scdUm+h)sRh_Te}$2#PnBvoB+ft#mS8!s!}Cn;Rs z;;Bb{VDUvC;AM6RJOA)|Iw&ZnpoE*CD}I9{3pqEI*O|^q zWs3_d?xy!V@Amk8`yfg5P!`uYIfq&($m6$@kYA+634is~_ska)Wp!XZmY4*C9Pcb- z0xK~1fgE~i>P=j?i>_gh(ha?Pr*8Du($Fv zWPI4_jhc7Ov;s(MO!X_ye9Skmjo>0zInC3lG*QkwDTCD??LL2SuwABN*iK#`ahf7zD7i#Wrl5F8WkFAtmx~D^lFt?vW=-{GuEU z07S^?4N?9)2H9@SckEN9-442>n**-h^CXBN3XO*0gG-kU`L!?Ud5uU!_`gf=r4|_% z^VYK8mX+dE1v$GT$h`DITKam0NXpuHM*{tAlM5AYzBQAMtYXe6fTZMWzY zu#1)9j9%8Jy2&0ytuDIGvYEaomE|gx15wm`4DDCJYb0Ke0Z93odN?dU1-LCgXv^zd zsz;{-!`+bRW5R^=Yhx%nk#Ko8MV#`KygjR(!ayww2}z7~@#@KfIi$Ru*)pe%ss%u~ zt?dSyhc(=vuL5=Bh0t1mvLgsa(2y!uIR1?0z^5D>O_PH@!97FcdOHx@VY^yE0Q>X7 zZ2PSR-VbheIMsNso=Lg!hTtS@>oW5~J&^IFR29|OZ`ve-xhY7C3U0^WV4X9uc%uns zg0zs+Z0FU@i1_h?V9_SAagjb;2!$HE38>?XL+7&AU%;>)W#-}@Ke<=$#Oc&L2oUjh zh|cse$J`ms=e&I=zb&#$Fvc@w0oHwJO*$0Z#s}=ZvDW#K&@o0|40b|R$uo02=t_pU z@CszW=OSf6D{*&?W#3o6IMRh$V4l{}3Q_wJ66wRw-U%xnXcmmOWo9Aku0%>A^HT405}2H2rKK0 ze6)%kKLbluM6NhMs$P_SrYDOf#~w6ptA7Fz1H(+TZ8g#7|GD1f?qw&80~#%@b`dvb z#<=+r%f@8Lo%Yyp_NoykR6!<2OSYb##34(Gi zgTj@0T4(kopoN%3cFb~uM`Xxz#rr7MG>cLhyFZAAcDwQ$#^`B%r7LG59#0$=n~Uo# znjq8u+0A?$fVr9TM=L;+!_81nL!THng_jf>5ALTg`upB#3cu9-ec|N4AWQ~^}Nl7#xf>m`o!a;w?`+7#c z;QufS^(c*Ws2xD2YWT$-eqcSd*ku&OS~qKELn}m%n&yHRKpG;Eoy+VVg+3s)1WN;n zhY!KvWiBi1P0y5zsGYE&#i_!D7g$=)&Evt_C-S%4dReM#ukx*$bo9-&XRn-@!#Ja6 zOKd?|Rpdb~0}z%1yal^DP8tHEofGZ^lAVZ?tP7}ydrE#%8b#6m;=}x$e;o8{R=rZD`8{y?dme>@0o> zPjNCr+$HgXKeDn*e>oQd!I2SK`Zg|^j-rUu>mPGafYT&_G6#)qa#L+TD;zCEU(!!7 zeX3Vykw|j-JBByVMN;Df)0U&yuG~vBn0Z8ES!Ov_T$s`Ud#3XtzEt7}D@jdm7j6{vBPXwO7Il78_@-@u*Ov3^yb!A>$WjGWrWU;j-sR`dtnLIE zr$}%!`Y;f){&(tE>sAq;hSKz;++&5us~HjxI>quDh&Z#e?bKqEO~L7^lSgN()G+*M zC+@#EgoT3AV9I+`wfu9R8n_S5o*gmxkX`G7S)qvWjWp@_J=6lJ7bpso(Xq4XIyOOo z7|kL5hMtL)=o2&TjjK|SN%RKYfx17-+(>Z4yDv%8$zVc}njb)mc{CZ^Xuk`7$8kEH zqEW}Pr+FTy{JTd{&tf*(8DC@cBlI@QmBmljrqnjT^JqpA``39`e5o8odt~)r8DYC3 z4jK+tkp~R8yFqd~cawLQ`R2Dw#)l`MPJ)rHHn#Ml!EmX2-y~)C)wqg7aMkvYnY}lz z{I!Sd$SiZL?PN41+<+e%#kP3G&bgtJ!N#}I%~I~sO*g;UyD|He2LS`+5qjf#5e+5S zMZ7V(z-4rtk`>GA+Ae$1PnN@0Avz)DX8Fk^E&Qy#G|LfD35_{c7?&hP1;|{$C4fV( zqU18QJ5~s{w<2#MkF`W>>!-{xkvks({u+v9ix}763nym&5w~h>klUOjy%#h&tVL^+ zU0e>GM<#&}Mcuao=-UI#G@4DVUqp1u69W?;bVLl>~4QUa4L@%N60aR%N2K&UE z7%NN1En&6|SaJ_Em0<3O zUxV%Be=uxP?xldlfS>il+YGYqM?zp5d;D^!&$&ew(MqdXYj+%8XZwi>i1;V&YZ(2qZdQLLo(a<7hn$CmD%ilzs2&z{Je-JF5nBpWsC?ccIXR4(mnPJ^K6n} zkS+0&S_hq^x+ew)hfzt(PBv05Ck*JFtL|oy)?OkQLn9#^!~+w%_%?~cBjFWp2>ZWq zf84KAKiBwZvTeUmf!NTE3^7S;tq zAOzLBmvC+qg%6Y)W9jTFLQ|#Nt_aUpL7G=v{=4=c@0c9bKprfoY&iLeIF;TGxz5cq zYd3xhZ9r>*9yn%l1++{^u@`do1chPg=-6JsveF9tcIcs*(og5B-O;<*6OV`ki^&Wk zg|E!ScGGd6_*y)`CrqL3)9RYFmAO8&#Krj8at#v49R-1z6Ok z=Ce{EC^DM-C=_*N_zqf^)Y*v!;pCAI2dc!A@RP5J{eP7#zBw+$9D1@m4EHfwF*K2X zXNh;|eK_E6^g3aT5XPmfzz@!^R=jZvBHH^-OS}ycrAm7VShV@WyX?}8itq056S8_x z^{`;Ff0HON>^-PKR(eVr=~m#O!B@Y?6K9Y~A?jauZ?nvEHWfdMQTA8)4KiY~5ec(K zFFgIJ@nsP$EAz6E7^#pXC=DsK)Dhe+lxCY6!LE(ydfxA@?bw&!Sq+?ZxyDH?uIC5V zlb6(cW+!zeVockI$+nPqwdgo>u*{#3uGoIfhwZjJQHVkg5u zKjh}7EZ=4@R2)ixV6SG2cFb~zJkx(I2pZH8!gcuKBd;6Nl8_70Qq@gG8}y~RvRN{^ zeEtl)gfp_Dvl~2E?ZJzLWL*SG2_2*s@-tMbPtCJM?n2TACAuTbi8ajGt(}YdkKn{% zkn9aDppeUgdiXMhBh-Kt)Ko+I!sO<+b24+GbX{CqW?0&hGh_`fBBHXwZzXlh^kQEi zw$M?^LixmT*?UFfXonGi)PuPEv3-KY5oXi?mJ^?C>JxTT@8I-nFt3CaspHf-(U_Xi zBhmH1;Sa%i=^MrE$U00Qo7)MNRE!eko!0&mAarfTNW3W*Ll}^`ix>hc&b$h-tO!Qm zgk2fmrf`D3;9!e#^o_{xd9V+Yk+w#N%&`ycCpUz{ccd#t6V=Tn1Tim8^l0plk6ONa z^o+-iss3UM`fevXki0B1Zb=+ZvSd-LjiB&M#A20#1h5~sJq-_=yByy zz`3Dgbs*HF;yWp}WPUAN$fYlC;c7?=>b&wPL9Hr}=_&&|TnYKl9dLSu>YwIBz69n7 zT(=4;5s@F1y;ok4WzXkw*1bnxQgc3$O9pdynNRY}Pu73Uppz2{yh=3e$rjZ~?MR-} z7pQYNGT@oGp`S8QPSk62v%D72Bs9_Q0Fl2Kh8mVb@~53yWoOZPxbak6u|A0)&vdtM zdcx!ib35dAuxd3Rao`Ll2uvZdIfN>Lc&OX3J%Xi2y?s%-z)_VRH1OK59}@Vz;XkS? z7HH>nty1s!zjhiydex1i{~in$j_;vGZl1!c3X{!hH5EOd_aKvL`wdSbB>?Y{1q7A; z5zCpiq&4_WTVyhAEU6>)e$BNYH6INbJEfQsc?x0HL|;SMubyE&>m^ILz&_z&#q;v^ zEjC)W=;FZUH=GYnZO~xqN#0+dR1KbES3T8teBcVTttdN2r|4~{jWnR(uFY&jX3%L* zu--Cz=ZHM=`?q`PSANtHI7eoXA0WkinZ%1+<2dV~$d!)C8`s~X_<#XpqADGc5P|ZbNhWe*K;|vwXn?66zBF$Rr;Q#s%`}q2HJYB& z?2GUO9qEJJR5m3yj{3&*ohYM{y7z${;V7rM$zrqVjS*|3^Nwx;%$GHC!60Al3h0Dq1Cw$Plv=<4 zs-MDAj*QjavnB3S)q(F87I(Cl%Wyz_NgQqLqb8&)kbju~+a!BUxkO8x8mjLGb<83v zxK(oTS6{tx-kNf`vOv|IGsgWVB zS2*YM+b`6H!G;U`v7;fHX9QmVMuTfsfwIos< zaP(8bcymi;NWNAYG(BAv zzq0Y_FJv-zR=Sd5pM)6wDrrygc8!CksN6BP(<70t?Cq+uQxQ6G!`QPiY|Jf=Dq`VmC?V3yCO(1mOMi$BI}WqnfJ~+iJ&gLu z*R#Ub;8C(aX7Xh16-xVR@5`xKzaNjrLS-K{su3UoM{>}G%$OF-^eX5THa&_yle}&3 z9&fAT?-OVVm+2AZGRu2}wl|idW=Y`5AUI4G!5!NYFuJEL)lnFpjTqPw-54kka*~0) zb1buf6<(AMKg++R5%t4D4K&P*`)LNep0`!D{KsQSr9d}bE)zr2d+q^ zJ*%!l82QP^)WVdt9D5zm=?P^kQM2<~^-(4qiKMb(YRfbXBtFISAbO642ak`h2*l}5 zYI!XdFd4H)o?KGY(w)P$1qQH&fOh?KQvrWsrJ#v!B*!j~WMhm8q9Vte0xqjv#G=Lv zjat8!t5THy)r>*rqh|;O2!p>t?N}+YbG;|}ilv*pFFmAbUE=@bYfDDnT@0985hH#fLeWHW4YxZa4y-&9r8RuPb4V@!-vWob+*5dzxYF|OOh`1-Ye$y891&5bNS zf2JNOnt5vpBCE(uGb4PJ4%eLp2%h?gQ%0qNJ6QBCSN!@@s^c<+jwUwZ$ila3%3^6} zius4ibbuhCmb&C7oH3=hXb9S-1u)d6m;_#kvvfl)`+LwSDvGYO9D6t%S(PGS3v6>p z#T8O6aFWg6jPZ{asZYr|n4l?K2?EOj%4qwM883d$Rncd$tg0$S1>E;}w4Ml_!T?e+ z7I`vSF@fE&m0PDMmseq0Jpq#~iq^bC;AlKQKELXC31kR)TBC|Xvm`O**N$_0lAadJnbJ)2Ne$XKe_1b5! z?UI3sFda5lZvWTd5#W$Y7D5>>DBQy(;`aao)QIC{c%VWT$)t^bw1c znK{^R|AGFP3J2R?JV)aUCNgAKJRL1g**oq(bhl)}q<_9tw3txj;w|4C93&_wNH<`| zf4v-IbF6qo$fgUqkWVJTlJ@`N*(BuenjTha+XCBI&_XfpTMJwxlqcWjlsD(%g~}AQ z(j|;x39*LQ{8*4oRem%au)^uLf#o2Aj1(|V6tX_P-`tI>xuFj zoNnX5_xntoKa8Ep@{a1Zq%%J*PbRH{oefB`{<(Oh0}3s43hUQGfU!a9wmN75n{F)~ zwsM-0`oVLZ#l6{w)v+aR7t%a+E`)s;y)m2r&m$@VFAC74F|pJrJSWDdQlL=zfx_x3 zQNb`lQTPjqXW!|jB$*u+`mTB#T-xBP$R$+37Jh_(51o2dART)S-Ctqc{WRKx5@qLi zPnuJ4m~OSqRqC?}M1tuNxPVe!*1~zS8EyX@VehJYtw$Lx^6jH;8f3u}OCm+X<(aw) zWJCz;ut6Z*G^R{gd-7}F5Acz2q6giV)^I0;*d`_voK4J{9WXdH*>Z6#8TI+ zcZQKd@$=Akq3`qq^!u4;dy3sTCUkN`P|bK2UbaBc*HevNKS%9)v6aXEN-+rP+r~fT zOEOBxoszU-Ut@rVXg?SuJgEGjIMp9>{(4ykTMaY!nV->__a=Cfr9{M7jw}`XZFmo5 z<67@>>hELaP0#YUX_dcwL_+l#XArV97qDKU)Ey`$=`TDe^t>SPV}m5%1w(2*lapA! z61oHQGj7`UJ1IjF}a=+Ko3g6i!%7Zgt{?*j4}m`z->{j)G1aNuiA>o2yDoS5S)Aj0hwD4 z<9paaaC=<>Z%hoxZCz@(X+`$hU%od@SP<_UEDOZSeLHhue~i|pGegWFheE5D<#p6B z?v=e2BSKbeWz6es+kJ+0N?p3aAH`3IT5e{l{e2jw38tEE_)7AW8`Uaj6F3!(FJKDz zhhzjf-)Xv`9=20B8;7Tzgyelz3##349(d4 zUun0(P3d=^5_1_G; ztkl3m`T_i0XSX}%P;?L(zX;5Skt0wSfg^=F$hud>agH6s>@;c|abH|x{s&i!RTmz9 zxKq-TyDdjK9RPQ*NRmrMVfT%?UxP|$$Tva%emmf@9QoTzf7`_CGTVJt4d$ey5uj=sDDN57!t7uK?PUS^#Ku z-qx5IaC_pK;;n75hh8^+ZP)i67&pqoYVIwU?^cQ|TSE+Clnr9@xu}VSC3BztiB|?E zKTbjGEhKp0{TX7hEtTHe^(SP$b$AT?Fe$Z`ZUR>8WO~5d!2?Zgipfjk?Xz$g)D0J=TH~Dui=05;ebVDZV7&dLo z4bo|>-TT|L$|dV!|I{~N@H@!pk?72~7beW!%4kUXhjAO__Wn4D z!a=6ukpN!b3NE8|kzS%ZJ8=$;4Gtzu$^!cnqNBt0v>rucPx3ip{e~;!RDyH$+ueEb z^>>mA)p;vQVuBjS>0sqoMVf_I$P?n!L7pWm=JIP2I=zzk>b9%93a;=$)6%j)4&uDML_0Gn}vKa-w4Vd+0yuJ+242>H-j`Nl#;$e z-ZzCQP&H|9jfGL&Z0-3Mp~)2R%a@J#4S%9BqNR2~(?*o%RF0{049}agHh8Kh8mB#} zm0wHBAlBaWY)>TJ_a071yZFnE#KmK^^R9*OS#1E3~1eJ_E4BkjtF;0w1e z$ckDoVmIm{+1w1wvDWdcDR1)E4~xlFK%{=w@5o~3lvNGox*t9lDjM&oBMmm zr}LKcV@JB4+ac{@H*z}vc@GY@Y*(_7G`jK?x*EX7e7ZAkiB*<2JU`W|p$NF2UPdJ? z(r9CP!Hj9(1`5W@e6I#S%WTb&u4w8r6_B-DXlq}qB@wwezN~|{GoAH6KGVk=pC zmeN#pvqcx2;mz+^_fj-G8|5=G7q4r3cfnRwBrH zvMK3Ho4H-H#e1gQcg7&t>**Ib2B%cNao&_@5fQ4^%oaT>5lmT8xn`#@eM~yx>>rZG z1e2nKb@gQok^15LK~B`sQXjHi8Xft<8J$sPboBmsm7pH&NwPilQ)|59TZsfIrGsET z@$p6I0U801I?yj0D+=A6C-;&g(xIlontN=Pm#d7Ua+XWgP5muew>uFK{7Tp+L6~M6 z!tizoEthGb&@F$in{Ad4J#kL-*_(6^=50dJQBFXfLbCZM!b;g6^<~x+0;Nxp_u2x{ zz`)P|LOKVTz<38;vl8N$IxNkTW|k1*TSd(V`dpp|Cgs)86bIz$mlO|&fTt8L+G|qN YnIbY|DvI`h{m_>Eq9j=(Zv5l_0ank0s{jB1 delta 11390 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 lMBZ$-8QQlvV2W?hBd%jhY6NWn+qyC2wFWBYl0 zVOSqFyPMVN(MYIE;njLce=0r!d^St^K1mTE9O3#xF*F@>Y8u>wtOC!(9d`i-RQAU8 z`2%#`Z@rs*CDLYR?4y&oKf&P%JRs(;;6GCR594DNy8|h%DPObQ05f{}h*MMBxol*e z<4V|So7#SX`Q?+GxH;Xsr$5KH*M6zIdDx#*YR&E_?K11PheyDAC|WVz)Z)p1kW75s*o?+;fh^k*aOy1?4)DzEXj1C zK6;;f8%2m&`e)AS=)*E;X;mzf0Heody{m+`DtV86G)NQ;dF2)K0^m1 z@E_%qS3AO=oK_w`D{&jY4a5rp`djclh|at{U9qm!H%@vK!^1mZ&_9y*KXDd#A#HdC z>6eCm+J6CK_F?AOq*Kf=$v4<~IuVzz$1zddhAR+TH2zz}f1MBO-^Mq~@8N&e-0lZT z_p+6Ai2S@U`uv>d&p?}Bk>^j;^DwYaqkS6~XK!$Y^_rasnT;&IZ1Yvj^v}pZ)eXcL zse$PBV7Hl-m&?VI_LVlWt8$P_=mO`blEx7#@@mJu5~7>2o3!)#ux{O3*ut0y1N6J{ zM(j*}X(d}+f3=87vHAk8#;kcH3Ts9jLSNJrLdteSeZQxJhnWN~M_MCqDMibJ9 z4&*2}%ytbOKhxraUx#6@lMWp8uKo8&FWhi#FY!ivv>qbQLrAQzbK363*x)t*A8UN! zC^&uz(&{>c(bU$>CN}?JBHYIQ=HBdw!4&L$ES>asf7iHnDe}1xN)wKxr!m$07Xag2 z=@gY4$>?>G83-Rs!R zpz{_Wf5tc^Ts(|_7c!6Yfoy$nSo=-mi6(+9>;pw-4$yx}d?HPjn#vRsaJ@Su` z0=o|iNGZ@A$Kv2Bq|s@3>HdjW%DYdxRSO?OH(J6ohe8*e@0;3jRnd1KjNBJv4_gQm zpN=cg-PH3i<<1Vxt#k2mSc)3>5?n-Dh_R0i4{uC{973Qp`!hdn3%PxXw59*cgWu1Zq;y=!m?#6-QuZ-xAF%^E*K4YZ+%B3KkFBEoj Date: Thu, 27 Jun 2024 09:00:31 -0700 Subject: [PATCH 07/42] adjust size --- note/keepsec.png | Bin 12197 -> 7989 bytes note/piknik.png | Bin 7335 -> 7584 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/note/keepsec.png b/note/keepsec.png index 39621c77d2484afde14929eea5b6f26134a2c6b3..14159dc7bcab43f0ad644b88c0ef80674ce6550a 100644 GIT binary patch delta 7153 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 delta 11394 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 CR(vS{ delta 6862 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 csB8gn#u+%`nHVa=|AV5GWXyyAAD)U2#sB~S From 4d0bf6ddd4caf2cd768d143c68dfdcf72fe933e9 Mon Sep 17 00:00:00 2001 From: Taehyung Lim Date: Sat, 29 Jun 2024 05:04:51 +0900 Subject: [PATCH 08/42] fixed fail to initialize existing ec volume when volume server has separate index dictory (#5723) --- weed/storage/disk_location.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/storage/disk_location.go b/weed/storage/disk_location.go index b7fa82197..9f61ad872 100644 --- a/weed/storage/disk_location.go +++ b/weed/storage/disk_location.go @@ -138,7 +138,7 @@ func (l *DiskLocation) loadExistingVolume(dirEntry os.DirEntry, needleMapKind Ne // skip if ec volumes exists if skipIfEcVolumesExists { - if util.FileExists(l.Directory + "/" + volumeName + ".ecx") { + if util.FileExists(l.IdxDirectory + "/" + volumeName + ".ecx") { return false } } From 00f87e5bb5b95f1568bcba4876d33e11e8eef1b1 Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 28 Jun 2024 14:54:39 -0700 Subject: [PATCH 09/42] remove unused --- weed/remote_storage/traverse_bfs.go | 62 ----------------------------- 1 file changed, 62 deletions(-) delete mode 100644 weed/remote_storage/traverse_bfs.go diff --git a/weed/remote_storage/traverse_bfs.go b/weed/remote_storage/traverse_bfs.go deleted file mode 100644 index 983555f6c..000000000 --- a/weed/remote_storage/traverse_bfs.go +++ /dev/null @@ -1,62 +0,0 @@ -package remote_storage - -import ( - "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" - "github.com/seaweedfs/seaweedfs/weed/util" - "sync" - "time" -) - -type ListDirectoryFunc func(parentDir util.FullPath, visitFn VisitFunc) error - -func TraverseBfs(listDirFn ListDirectoryFunc, parentPath util.FullPath, visitFn VisitFunc) (err error) { - K := 5 - - var dirQueueWg sync.WaitGroup - dirQueue := util.NewQueue() - dirQueueWg.Add(1) - dirQueue.Enqueue(parentPath) - var isTerminating bool - - for i := 0; i < K; i++ { - go func() { - for { - if isTerminating { - break - } - t := dirQueue.Dequeue() - if t == nil { - time.Sleep(329 * time.Millisecond) - continue - } - dir := t.(util.FullPath) - processErr := processOneDirectory(listDirFn, dir, visitFn, dirQueue, &dirQueueWg) - if processErr != nil { - err = processErr - } - dirQueueWg.Done() - } - }() - } - - dirQueueWg.Wait() - isTerminating = true - return - -} - -func processOneDirectory(listDirFn ListDirectoryFunc, parentPath util.FullPath, visitFn VisitFunc, dirQueue *util.Queue, dirQueueWg *sync.WaitGroup) error { - - return listDirFn(parentPath, func(dir string, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error { - if err := visitFn(dir, name, isDirectory, remoteEntry); err != nil { - return err - } - if !isDirectory { - return nil - } - dirQueueWg.Add(1) - dirQueue.Enqueue(parentPath.Child(name)) - return nil - }) - -} From c030cb3ce98701e266fa54031b70be805af6835b Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 28 Jun 2024 14:57:20 -0700 Subject: [PATCH 10/42] bootstrap filer from one peer --- other/java/client/src/main/proto/filer.proto | 12 + weed/filer/filer.go | 24 +- weed/pb/filer.proto | 12 + weed/pb/filer_pb/filer.pb.go | 1052 ++++++++++------- weed/pb/filer_pb/filer_client_bfs.go | 36 +- weed/pb/filer_pb/filer_grpc.pb.go | 68 +- .../server/filer_grpc_server_traverse_meta.go | 84 ++ .../filer_grpc_server_traverse_meta_test.go | 31 + weed/server/filer_server.go | 2 +- weed/util/queue.go | 30 +- 10 files changed, 865 insertions(+), 486 deletions(-) create mode 100644 weed/server/filer_grpc_server_traverse_meta.go create mode 100644 weed/server/filer_grpc_server_traverse_meta_test.go diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index b0829163c..fa37703b2 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -54,6 +54,9 @@ service SeaweedFiler { rpc GetFilerConfiguration (GetFilerConfigurationRequest) returns (GetFilerConfigurationResponse) { } + rpc TraverseBfsMetadata (TraverseBfsMetadataRequest) returns (stream TraverseBfsMetadataResponse) { + } + rpc SubscribeMetadata (SubscribeMetadataRequest) returns (stream SubscribeMetadataResponse) { } @@ -360,6 +363,15 @@ message SubscribeMetadataResponse { int64 ts_ns = 3; } +message TraverseBfsMetadataRequest { + string directory = 1; + repeated string excluded_prefixes = 2; +} +message TraverseBfsMetadataResponse { + string directory = 1; + Entry entry = 2; +} + message LogEntry { int64 ts_ns = 1; int32 partition_key_hash = 2; diff --git a/weed/filer/filer.go b/weed/filer/filer.go index 016bfc8fa..80be0b88e 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -78,7 +78,7 @@ func NewFiler(masters pb.ServerDiscovery, grpcDialOption grpc.DialOption, filerH return f } -func (f *Filer) MaybeBootstrapFromPeers(self pb.ServerAddress, existingNodes []*master_pb.ClusterNodeUpdate, snapshotTime time.Time) (err error) { +func (f *Filer) MaybeBootstrapFromOnePeer(self pb.ServerAddress, existingNodes []*master_pb.ClusterNodeUpdate, snapshotTime time.Time) (err error) { if len(existingNodes) == 0 { return } @@ -91,25 +91,13 @@ func (f *Filer) MaybeBootstrapFromPeers(self pb.ServerAddress, existingNodes []* } glog.V(0).Infof("bootstrap from %v clientId:%d", earliestNode.Address, f.UniqueFilerId) - f.UniqueFilerEpoch++ - - metadataFollowOption := &pb.MetadataFollowOption{ - ClientName: "bootstrap", - ClientId: f.UniqueFilerId, - ClientEpoch: f.UniqueFilerEpoch, - SelfSignature: f.Signature, - PathPrefix: "/", - AdditionalPathPrefixes: nil, - DirectoriesToWatch: nil, - StartTsNs: 0, - StopTsNs: snapshotTime.UnixNano(), - EventErrorType: pb.FatalOnError, - } - err = pb.FollowMetadata(pb.ServerAddress(earliestNode.Address), f.GrpcDialOption, metadataFollowOption, func(resp *filer_pb.SubscribeMetadataResponse) error { - return Replay(f.Store, resp) + return pb.WithFilerClient(false, f.UniqueFilerId, pb.ServerAddress(earliestNode.Address), f.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + return filer_pb.StreamBfs(client, "/", snapshotTime.UnixNano(), func(parentPath util.FullPath, entry *filer_pb.Entry) error { + return f.Store.InsertEntry(context.Background(), FromPbEntry(string(parentPath), entry)) + }) }) - return + } func (f *Filer) AggregateFromPeers(self pb.ServerAddress, existingNodes []*master_pb.ClusterNodeUpdate, startFrom time.Time) { diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index b0829163c..fa37703b2 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -54,6 +54,9 @@ service SeaweedFiler { rpc GetFilerConfiguration (GetFilerConfigurationRequest) returns (GetFilerConfigurationResponse) { } + rpc TraverseBfsMetadata (TraverseBfsMetadataRequest) returns (stream TraverseBfsMetadataResponse) { + } + rpc SubscribeMetadata (SubscribeMetadataRequest) returns (stream SubscribeMetadataResponse) { } @@ -360,6 +363,15 @@ message SubscribeMetadataResponse { int64 ts_ns = 3; } +message TraverseBfsMetadataRequest { + string directory = 1; + repeated string excluded_prefixes = 2; +} +message TraverseBfsMetadataResponse { + string directory = 1; + Entry entry = 2; +} + message LogEntry { int64 ts_ns = 1; int32 partition_key_hash = 2; diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 617c13c55..2ba6136e9 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -2973,6 +2973,116 @@ func (x *SubscribeMetadataResponse) GetTsNs() int64 { return 0 } +type TraverseBfsMetadataRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Directory string `protobuf:"bytes,1,opt,name=directory,proto3" json:"directory,omitempty"` + ExcludedPrefixes []string `protobuf:"bytes,2,rep,name=excluded_prefixes,json=excludedPrefixes,proto3" json:"excluded_prefixes,omitempty"` +} + +func (x *TraverseBfsMetadataRequest) Reset() { + *x = TraverseBfsMetadataRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TraverseBfsMetadataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TraverseBfsMetadataRequest) ProtoMessage() {} + +func (x *TraverseBfsMetadataRequest) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TraverseBfsMetadataRequest.ProtoReflect.Descriptor instead. +func (*TraverseBfsMetadataRequest) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{43} +} + +func (x *TraverseBfsMetadataRequest) GetDirectory() string { + if x != nil { + return x.Directory + } + return "" +} + +func (x *TraverseBfsMetadataRequest) GetExcludedPrefixes() []string { + if x != nil { + return x.ExcludedPrefixes + } + return nil +} + +type TraverseBfsMetadataResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Directory string `protobuf:"bytes,1,opt,name=directory,proto3" json:"directory,omitempty"` + Entry *Entry `protobuf:"bytes,2,opt,name=entry,proto3" json:"entry,omitempty"` +} + +func (x *TraverseBfsMetadataResponse) Reset() { + *x = TraverseBfsMetadataResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TraverseBfsMetadataResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TraverseBfsMetadataResponse) ProtoMessage() {} + +func (x *TraverseBfsMetadataResponse) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TraverseBfsMetadataResponse.ProtoReflect.Descriptor instead. +func (*TraverseBfsMetadataResponse) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{44} +} + +func (x *TraverseBfsMetadataResponse) GetDirectory() string { + if x != nil { + return x.Directory + } + return "" +} + +func (x *TraverseBfsMetadataResponse) GetEntry() *Entry { + if x != nil { + return x.Entry + } + return nil +} + type LogEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2987,7 +3097,7 @@ type LogEntry struct { func (x *LogEntry) Reset() { *x = LogEntry{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[43] + mi := &file_filer_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3000,7 +3110,7 @@ func (x *LogEntry) String() string { func (*LogEntry) ProtoMessage() {} func (x *LogEntry) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[43] + mi := &file_filer_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3013,7 +3123,7 @@ func (x *LogEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use LogEntry.ProtoReflect.Descriptor instead. func (*LogEntry) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{43} + return file_filer_proto_rawDescGZIP(), []int{45} } func (x *LogEntry) GetTsNs() int64 { @@ -3057,7 +3167,7 @@ type KeepConnectedRequest struct { func (x *KeepConnectedRequest) Reset() { *x = KeepConnectedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[44] + mi := &file_filer_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3070,7 +3180,7 @@ func (x *KeepConnectedRequest) String() string { func (*KeepConnectedRequest) ProtoMessage() {} func (x *KeepConnectedRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[44] + mi := &file_filer_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3083,7 +3193,7 @@ func (x *KeepConnectedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeepConnectedRequest.ProtoReflect.Descriptor instead. func (*KeepConnectedRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{44} + return file_filer_proto_rawDescGZIP(), []int{46} } func (x *KeepConnectedRequest) GetName() string { @@ -3116,7 +3226,7 @@ type KeepConnectedResponse struct { func (x *KeepConnectedResponse) Reset() { *x = KeepConnectedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[45] + mi := &file_filer_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3129,7 +3239,7 @@ func (x *KeepConnectedResponse) String() string { func (*KeepConnectedResponse) ProtoMessage() {} func (x *KeepConnectedResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[45] + mi := &file_filer_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3142,7 +3252,7 @@ func (x *KeepConnectedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KeepConnectedResponse.ProtoReflect.Descriptor instead. func (*KeepConnectedResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{45} + return file_filer_proto_rawDescGZIP(), []int{47} } type LocateBrokerRequest struct { @@ -3156,7 +3266,7 @@ type LocateBrokerRequest struct { func (x *LocateBrokerRequest) Reset() { *x = LocateBrokerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[46] + mi := &file_filer_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3169,7 +3279,7 @@ func (x *LocateBrokerRequest) String() string { func (*LocateBrokerRequest) ProtoMessage() {} func (x *LocateBrokerRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[46] + mi := &file_filer_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3182,7 +3292,7 @@ func (x *LocateBrokerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LocateBrokerRequest.ProtoReflect.Descriptor instead. func (*LocateBrokerRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{46} + return file_filer_proto_rawDescGZIP(), []int{48} } func (x *LocateBrokerRequest) GetResource() string { @@ -3204,7 +3314,7 @@ type LocateBrokerResponse struct { func (x *LocateBrokerResponse) Reset() { *x = LocateBrokerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[47] + mi := &file_filer_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3217,7 +3327,7 @@ func (x *LocateBrokerResponse) String() string { func (*LocateBrokerResponse) ProtoMessage() {} func (x *LocateBrokerResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[47] + mi := &file_filer_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3230,7 +3340,7 @@ func (x *LocateBrokerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LocateBrokerResponse.ProtoReflect.Descriptor instead. func (*LocateBrokerResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{47} + return file_filer_proto_rawDescGZIP(), []int{49} } func (x *LocateBrokerResponse) GetFound() bool { @@ -3261,7 +3371,7 @@ type KvGetRequest struct { func (x *KvGetRequest) Reset() { *x = KvGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[48] + mi := &file_filer_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3274,7 +3384,7 @@ func (x *KvGetRequest) String() string { func (*KvGetRequest) ProtoMessage() {} func (x *KvGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[48] + mi := &file_filer_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3287,7 +3397,7 @@ func (x *KvGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KvGetRequest.ProtoReflect.Descriptor instead. func (*KvGetRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{48} + return file_filer_proto_rawDescGZIP(), []int{50} } func (x *KvGetRequest) GetKey() []byte { @@ -3309,7 +3419,7 @@ type KvGetResponse struct { func (x *KvGetResponse) Reset() { *x = KvGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[49] + mi := &file_filer_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3322,7 +3432,7 @@ func (x *KvGetResponse) String() string { func (*KvGetResponse) ProtoMessage() {} func (x *KvGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[49] + mi := &file_filer_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3335,7 +3445,7 @@ func (x *KvGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KvGetResponse.ProtoReflect.Descriptor instead. func (*KvGetResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{49} + return file_filer_proto_rawDescGZIP(), []int{51} } func (x *KvGetResponse) GetValue() []byte { @@ -3364,7 +3474,7 @@ type KvPutRequest struct { func (x *KvPutRequest) Reset() { *x = KvPutRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[50] + mi := &file_filer_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3377,7 +3487,7 @@ func (x *KvPutRequest) String() string { func (*KvPutRequest) ProtoMessage() {} func (x *KvPutRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[50] + mi := &file_filer_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3390,7 +3500,7 @@ func (x *KvPutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KvPutRequest.ProtoReflect.Descriptor instead. func (*KvPutRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{50} + return file_filer_proto_rawDescGZIP(), []int{52} } func (x *KvPutRequest) GetKey() []byte { @@ -3418,7 +3528,7 @@ type KvPutResponse struct { func (x *KvPutResponse) Reset() { *x = KvPutResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3431,7 +3541,7 @@ func (x *KvPutResponse) String() string { func (*KvPutResponse) ProtoMessage() {} func (x *KvPutResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3444,7 +3554,7 @@ func (x *KvPutResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KvPutResponse.ProtoReflect.Descriptor instead. func (*KvPutResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{51} + return file_filer_proto_rawDescGZIP(), []int{53} } func (x *KvPutResponse) GetError() string { @@ -3469,7 +3579,7 @@ type FilerConf struct { func (x *FilerConf) Reset() { *x = FilerConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[52] + mi := &file_filer_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3482,7 +3592,7 @@ func (x *FilerConf) String() string { func (*FilerConf) ProtoMessage() {} func (x *FilerConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[52] + mi := &file_filer_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3495,7 +3605,7 @@ func (x *FilerConf) ProtoReflect() protoreflect.Message { // Deprecated: Use FilerConf.ProtoReflect.Descriptor instead. func (*FilerConf) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{52} + return file_filer_proto_rawDescGZIP(), []int{54} } func (x *FilerConf) GetVersion() int32 { @@ -3527,7 +3637,7 @@ type CacheRemoteObjectToLocalClusterRequest struct { func (x *CacheRemoteObjectToLocalClusterRequest) Reset() { *x = CacheRemoteObjectToLocalClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[53] + mi := &file_filer_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3540,7 +3650,7 @@ func (x *CacheRemoteObjectToLocalClusterRequest) String() string { func (*CacheRemoteObjectToLocalClusterRequest) ProtoMessage() {} func (x *CacheRemoteObjectToLocalClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[53] + mi := &file_filer_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3553,7 +3663,7 @@ func (x *CacheRemoteObjectToLocalClusterRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use CacheRemoteObjectToLocalClusterRequest.ProtoReflect.Descriptor instead. func (*CacheRemoteObjectToLocalClusterRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{53} + return file_filer_proto_rawDescGZIP(), []int{55} } func (x *CacheRemoteObjectToLocalClusterRequest) GetDirectory() string { @@ -3581,7 +3691,7 @@ type CacheRemoteObjectToLocalClusterResponse struct { func (x *CacheRemoteObjectToLocalClusterResponse) Reset() { *x = CacheRemoteObjectToLocalClusterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3594,7 +3704,7 @@ func (x *CacheRemoteObjectToLocalClusterResponse) String() string { func (*CacheRemoteObjectToLocalClusterResponse) ProtoMessage() {} func (x *CacheRemoteObjectToLocalClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3607,7 +3717,7 @@ func (x *CacheRemoteObjectToLocalClusterResponse) ProtoReflect() protoreflect.Me // Deprecated: Use CacheRemoteObjectToLocalClusterResponse.ProtoReflect.Descriptor instead. func (*CacheRemoteObjectToLocalClusterResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{54} + return file_filer_proto_rawDescGZIP(), []int{56} } func (x *CacheRemoteObjectToLocalClusterResponse) GetEntry() *Entry { @@ -3635,7 +3745,7 @@ type LockRequest struct { func (x *LockRequest) Reset() { *x = LockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[55] + mi := &file_filer_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3648,7 +3758,7 @@ func (x *LockRequest) String() string { func (*LockRequest) ProtoMessage() {} func (x *LockRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[55] + mi := &file_filer_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3661,7 +3771,7 @@ func (x *LockRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LockRequest.ProtoReflect.Descriptor instead. func (*LockRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{55} + return file_filer_proto_rawDescGZIP(), []int{57} } func (x *LockRequest) GetName() string { @@ -3713,7 +3823,7 @@ type LockResponse struct { func (x *LockResponse) Reset() { *x = LockResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[56] + mi := &file_filer_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3726,7 +3836,7 @@ func (x *LockResponse) String() string { func (*LockResponse) ProtoMessage() {} func (x *LockResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[56] + mi := &file_filer_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3739,7 +3849,7 @@ func (x *LockResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LockResponse.ProtoReflect.Descriptor instead. func (*LockResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{56} + return file_filer_proto_rawDescGZIP(), []int{58} } func (x *LockResponse) GetRenewToken() string { @@ -3783,7 +3893,7 @@ type UnlockRequest struct { func (x *UnlockRequest) Reset() { *x = UnlockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[57] + mi := &file_filer_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3796,7 +3906,7 @@ func (x *UnlockRequest) String() string { func (*UnlockRequest) ProtoMessage() {} func (x *UnlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[57] + mi := &file_filer_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3809,7 +3919,7 @@ func (x *UnlockRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnlockRequest.ProtoReflect.Descriptor instead. func (*UnlockRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{57} + return file_filer_proto_rawDescGZIP(), []int{59} } func (x *UnlockRequest) GetName() string { @@ -3845,7 +3955,7 @@ type UnlockResponse struct { func (x *UnlockResponse) Reset() { *x = UnlockResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[58] + mi := &file_filer_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3858,7 +3968,7 @@ func (x *UnlockResponse) String() string { func (*UnlockResponse) ProtoMessage() {} func (x *UnlockResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[58] + mi := &file_filer_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3871,7 +3981,7 @@ func (x *UnlockResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnlockResponse.ProtoReflect.Descriptor instead. func (*UnlockResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{58} + return file_filer_proto_rawDescGZIP(), []int{60} } func (x *UnlockResponse) GetError() string { @@ -3900,7 +4010,7 @@ type FindLockOwnerRequest struct { func (x *FindLockOwnerRequest) Reset() { *x = FindLockOwnerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[59] + mi := &file_filer_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3913,7 +4023,7 @@ func (x *FindLockOwnerRequest) String() string { func (*FindLockOwnerRequest) ProtoMessage() {} func (x *FindLockOwnerRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[59] + mi := &file_filer_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3926,7 +4036,7 @@ func (x *FindLockOwnerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindLockOwnerRequest.ProtoReflect.Descriptor instead. func (*FindLockOwnerRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{59} + return file_filer_proto_rawDescGZIP(), []int{61} } func (x *FindLockOwnerRequest) GetName() string { @@ -3954,7 +4064,7 @@ type FindLockOwnerResponse struct { func (x *FindLockOwnerResponse) Reset() { *x = FindLockOwnerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[60] + mi := &file_filer_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3967,7 +4077,7 @@ func (x *FindLockOwnerResponse) String() string { func (*FindLockOwnerResponse) ProtoMessage() {} func (x *FindLockOwnerResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[60] + mi := &file_filer_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3980,7 +4090,7 @@ func (x *FindLockOwnerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindLockOwnerResponse.ProtoReflect.Descriptor instead. func (*FindLockOwnerResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{60} + return file_filer_proto_rawDescGZIP(), []int{62} } func (x *FindLockOwnerResponse) GetOwner() string { @@ -4004,7 +4114,7 @@ type Lock struct { func (x *Lock) Reset() { *x = Lock{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[61] + mi := &file_filer_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4017,7 +4127,7 @@ func (x *Lock) String() string { func (*Lock) ProtoMessage() {} func (x *Lock) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[61] + mi := &file_filer_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4030,7 +4140,7 @@ func (x *Lock) ProtoReflect() protoreflect.Message { // Deprecated: Use Lock.ProtoReflect.Descriptor instead. func (*Lock) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{61} + return file_filer_proto_rawDescGZIP(), []int{63} } func (x *Lock) GetName() string { @@ -4072,7 +4182,7 @@ type TransferLocksRequest struct { func (x *TransferLocksRequest) Reset() { *x = TransferLocksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[62] + mi := &file_filer_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4085,7 +4195,7 @@ func (x *TransferLocksRequest) String() string { func (*TransferLocksRequest) ProtoMessage() {} func (x *TransferLocksRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[62] + mi := &file_filer_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4098,7 +4208,7 @@ func (x *TransferLocksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TransferLocksRequest.ProtoReflect.Descriptor instead. func (*TransferLocksRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{62} + return file_filer_proto_rawDescGZIP(), []int{64} } func (x *TransferLocksRequest) GetLocks() []*Lock { @@ -4117,7 +4227,7 @@ type TransferLocksResponse struct { func (x *TransferLocksResponse) Reset() { *x = TransferLocksResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[63] + mi := &file_filer_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4130,7 +4240,7 @@ func (x *TransferLocksResponse) String() string { func (*TransferLocksResponse) ProtoMessage() {} func (x *TransferLocksResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[63] + mi := &file_filer_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4143,7 +4253,7 @@ func (x *TransferLocksResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TransferLocksResponse.ProtoReflect.Descriptor instead. func (*TransferLocksResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{63} + return file_filer_proto_rawDescGZIP(), []int{65} } // if found, send the exact address @@ -4160,7 +4270,7 @@ type LocateBrokerResponse_Resource struct { func (x *LocateBrokerResponse_Resource) Reset() { *x = LocateBrokerResponse_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[66] + mi := &file_filer_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4173,7 +4283,7 @@ func (x *LocateBrokerResponse_Resource) String() string { func (*LocateBrokerResponse_Resource) ProtoMessage() {} func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[66] + mi := &file_filer_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4186,7 +4296,7 @@ func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { // Deprecated: Use LocateBrokerResponse_Resource.ProtoReflect.Descriptor instead. func (*LocateBrokerResponse_Resource) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{47, 0} + return file_filer_proto_rawDescGZIP(), []int{49, 0} } func (x *LocateBrokerResponse_Resource) GetGrpcAddresses() string { @@ -4226,7 +4336,7 @@ type FilerConf_PathConf struct { func (x *FilerConf_PathConf) Reset() { *x = FilerConf_PathConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[67] + mi := &file_filer_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4239,7 +4349,7 @@ func (x *FilerConf_PathConf) String() string { func (*FilerConf_PathConf) ProtoMessage() {} func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[67] + mi := &file_filer_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4252,7 +4362,7 @@ func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { // Deprecated: Use FilerConf_PathConf.ProtoReflect.Descriptor instead. func (*FilerConf_PathConf) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{52, 0} + return file_filer_proto_rawDescGZIP(), []int{54, 0} } func (x *FilerConf_PathConf) GetLocationPrefix() string { @@ -4756,280 +4866,299 @@ var file_filer_proto_rawDesc = []byte{ 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x73, 0x0a, 0x08, 0x4c, - 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, 0x12, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x22, 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, - 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, - 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, - 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, - 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0xa4, 0x04, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xc0, 0x03, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, - 0x6e, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, - 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, - 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, - 0x6e, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, - 0x77, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, - 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x11, 0x6d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5a, 0x0a, 0x26, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x27, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x9b, 0x01, 0x0a, 0x0b, 0x4c, 0x6f, 0x63, 0x6b, 0x52, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x67, 0x0a, 0x1a, 0x54, + 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x42, 0x66, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x65, 0x73, 0x22, 0x62, 0x0a, 0x1b, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x42, 0x66, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x73, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x65, 0x0a, + 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, + 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, + 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, + 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, + 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, 0x75, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa4, + 0x04, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x2e, 0x50, + 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0xc0, 0x03, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x12, + 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x73, 0x79, + 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x12, + 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1f, 0x0a, 0x0b, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, + 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2f, + 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x6d, 0x61, + 0x78, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, + 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5a, 0x0a, 0x26, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x50, 0x0a, 0x27, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x9b, 0x01, 0x0a, 0x0b, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x6b, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x22, 0x91, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5f, 0x0a, 0x0d, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x54, 0x6f, 0x4c, 0x6f, - 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x22, 0x91, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6e, 0x65, - 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x6f, - 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x64, - 0x54, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5f, 0x0a, 0x0d, 0x55, 0x6e, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, - 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x69, 0x73, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x22, 0x41, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x22, 0x45, 0x0a, 0x14, - 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x4d, 0x6f, - 0x76, 0x65, 0x64, 0x22, 0x2d, 0x0a, 0x15, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x22, 0x75, 0x0a, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x22, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x41, - 0x74, 0x4e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x3c, 0x0a, 0x14, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x24, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, - 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x32, 0x8f, 0x10, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, - 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, - 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, + 0x73, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, + 0x73, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x22, 0x41, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x19, + 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x22, 0x45, 0x0a, 0x14, 0x46, 0x69, 0x6e, + 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x4d, 0x6f, 0x76, 0x65, 0x64, + 0x22, 0x2d, 0x0a, 0x15, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, + 0x75, 0x0a, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, + 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0d, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x41, 0x74, 0x4e, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x3c, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, + 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xf7, 0x10, + 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, + 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, + 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x04, 0x50, - 0x69, 0x6e, 0x67, 0x12, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, + 0x12, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, + 0x13, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x42, 0x66, 0x73, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x42, 0x66, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x42, 0x66, + 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, - 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x88, 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3a, + 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, + 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, + 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, - 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x12, - 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x48, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x55, - 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x46, 0x69, - 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, - 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x12, - 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, - 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, - 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, + 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x64, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x17, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, + 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x52, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, + 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, + 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, + 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, + 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5044,7 +5173,7 @@ func file_filer_proto_rawDescGZIP() []byte { return file_filer_proto_rawDescData } -var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 68) +var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 70) var file_filer_proto_goTypes = []interface{}{ (*LookupDirectoryEntryRequest)(nil), // 0: filer_pb.LookupDirectoryEntryRequest (*LookupDirectoryEntryResponse)(nil), // 1: filer_pb.LookupDirectoryEntryResponse @@ -5089,38 +5218,40 @@ var file_filer_proto_goTypes = []interface{}{ (*GetFilerConfigurationResponse)(nil), // 40: filer_pb.GetFilerConfigurationResponse (*SubscribeMetadataRequest)(nil), // 41: filer_pb.SubscribeMetadataRequest (*SubscribeMetadataResponse)(nil), // 42: filer_pb.SubscribeMetadataResponse - (*LogEntry)(nil), // 43: filer_pb.LogEntry - (*KeepConnectedRequest)(nil), // 44: filer_pb.KeepConnectedRequest - (*KeepConnectedResponse)(nil), // 45: filer_pb.KeepConnectedResponse - (*LocateBrokerRequest)(nil), // 46: filer_pb.LocateBrokerRequest - (*LocateBrokerResponse)(nil), // 47: filer_pb.LocateBrokerResponse - (*KvGetRequest)(nil), // 48: filer_pb.KvGetRequest - (*KvGetResponse)(nil), // 49: filer_pb.KvGetResponse - (*KvPutRequest)(nil), // 50: filer_pb.KvPutRequest - (*KvPutResponse)(nil), // 51: filer_pb.KvPutResponse - (*FilerConf)(nil), // 52: filer_pb.FilerConf - (*CacheRemoteObjectToLocalClusterRequest)(nil), // 53: filer_pb.CacheRemoteObjectToLocalClusterRequest - (*CacheRemoteObjectToLocalClusterResponse)(nil), // 54: filer_pb.CacheRemoteObjectToLocalClusterResponse - (*LockRequest)(nil), // 55: filer_pb.LockRequest - (*LockResponse)(nil), // 56: filer_pb.LockResponse - (*UnlockRequest)(nil), // 57: filer_pb.UnlockRequest - (*UnlockResponse)(nil), // 58: filer_pb.UnlockResponse - (*FindLockOwnerRequest)(nil), // 59: filer_pb.FindLockOwnerRequest - (*FindLockOwnerResponse)(nil), // 60: filer_pb.FindLockOwnerResponse - (*Lock)(nil), // 61: filer_pb.Lock - (*TransferLocksRequest)(nil), // 62: filer_pb.TransferLocksRequest - (*TransferLocksResponse)(nil), // 63: filer_pb.TransferLocksResponse - nil, // 64: filer_pb.Entry.ExtendedEntry - nil, // 65: filer_pb.LookupVolumeResponse.LocationsMapEntry - (*LocateBrokerResponse_Resource)(nil), // 66: filer_pb.LocateBrokerResponse.Resource - (*FilerConf_PathConf)(nil), // 67: filer_pb.FilerConf.PathConf + (*TraverseBfsMetadataRequest)(nil), // 43: filer_pb.TraverseBfsMetadataRequest + (*TraverseBfsMetadataResponse)(nil), // 44: filer_pb.TraverseBfsMetadataResponse + (*LogEntry)(nil), // 45: filer_pb.LogEntry + (*KeepConnectedRequest)(nil), // 46: filer_pb.KeepConnectedRequest + (*KeepConnectedResponse)(nil), // 47: filer_pb.KeepConnectedResponse + (*LocateBrokerRequest)(nil), // 48: filer_pb.LocateBrokerRequest + (*LocateBrokerResponse)(nil), // 49: filer_pb.LocateBrokerResponse + (*KvGetRequest)(nil), // 50: filer_pb.KvGetRequest + (*KvGetResponse)(nil), // 51: filer_pb.KvGetResponse + (*KvPutRequest)(nil), // 52: filer_pb.KvPutRequest + (*KvPutResponse)(nil), // 53: filer_pb.KvPutResponse + (*FilerConf)(nil), // 54: filer_pb.FilerConf + (*CacheRemoteObjectToLocalClusterRequest)(nil), // 55: filer_pb.CacheRemoteObjectToLocalClusterRequest + (*CacheRemoteObjectToLocalClusterResponse)(nil), // 56: filer_pb.CacheRemoteObjectToLocalClusterResponse + (*LockRequest)(nil), // 57: filer_pb.LockRequest + (*LockResponse)(nil), // 58: filer_pb.LockResponse + (*UnlockRequest)(nil), // 59: filer_pb.UnlockRequest + (*UnlockResponse)(nil), // 60: filer_pb.UnlockResponse + (*FindLockOwnerRequest)(nil), // 61: filer_pb.FindLockOwnerRequest + (*FindLockOwnerResponse)(nil), // 62: filer_pb.FindLockOwnerResponse + (*Lock)(nil), // 63: filer_pb.Lock + (*TransferLocksRequest)(nil), // 64: filer_pb.TransferLocksRequest + (*TransferLocksResponse)(nil), // 65: filer_pb.TransferLocksResponse + nil, // 66: filer_pb.Entry.ExtendedEntry + nil, // 67: filer_pb.LookupVolumeResponse.LocationsMapEntry + (*LocateBrokerResponse_Resource)(nil), // 68: filer_pb.LocateBrokerResponse.Resource + (*FilerConf_PathConf)(nil), // 69: filer_pb.FilerConf.PathConf } var file_filer_proto_depIdxs = []int32{ 5, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry 5, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry 8, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk 11, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes - 64, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry + 66, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry 4, // 5: filer_pb.Entry.remote_entry:type_name -> filer_pb.RemoteEntry 5, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry 5, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry @@ -5134,67 +5265,70 @@ var file_filer_proto_depIdxs = []int32{ 7, // 15: filer_pb.StreamRenameEntryResponse.event_notification:type_name -> filer_pb.EventNotification 28, // 16: filer_pb.AssignVolumeResponse.location:type_name -> filer_pb.Location 28, // 17: filer_pb.Locations.locations:type_name -> filer_pb.Location - 65, // 18: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry + 67, // 18: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry 30, // 19: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection 7, // 20: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification - 66, // 21: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource - 67, // 22: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf - 5, // 23: filer_pb.CacheRemoteObjectToLocalClusterResponse.entry:type_name -> filer_pb.Entry - 61, // 24: filer_pb.TransferLocksRequest.locks:type_name -> filer_pb.Lock - 27, // 25: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations - 0, // 26: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest - 2, // 27: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest - 12, // 28: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest - 14, // 29: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest - 16, // 30: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest - 18, // 31: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest - 20, // 32: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest - 22, // 33: filer_pb.SeaweedFiler.StreamRenameEntry:input_type -> filer_pb.StreamRenameEntryRequest - 24, // 34: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest - 26, // 35: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest - 31, // 36: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest - 33, // 37: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest - 35, // 38: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest - 37, // 39: filer_pb.SeaweedFiler.Ping:input_type -> filer_pb.PingRequest - 39, // 40: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest - 41, // 41: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 41, // 42: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 48, // 43: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest - 50, // 44: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest - 53, // 45: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:input_type -> filer_pb.CacheRemoteObjectToLocalClusterRequest - 55, // 46: filer_pb.SeaweedFiler.DistributedLock:input_type -> filer_pb.LockRequest - 57, // 47: filer_pb.SeaweedFiler.DistributedUnlock:input_type -> filer_pb.UnlockRequest - 59, // 48: filer_pb.SeaweedFiler.FindLockOwner:input_type -> filer_pb.FindLockOwnerRequest - 62, // 49: filer_pb.SeaweedFiler.TransferLocks:input_type -> filer_pb.TransferLocksRequest - 1, // 50: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse - 3, // 51: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse - 13, // 52: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse - 15, // 53: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse - 17, // 54: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse - 19, // 55: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse - 21, // 56: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse - 23, // 57: filer_pb.SeaweedFiler.StreamRenameEntry:output_type -> filer_pb.StreamRenameEntryResponse - 25, // 58: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse - 29, // 59: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse - 32, // 60: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse - 34, // 61: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse - 36, // 62: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse - 38, // 63: filer_pb.SeaweedFiler.Ping:output_type -> filer_pb.PingResponse - 40, // 64: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse - 42, // 65: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 42, // 66: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 49, // 67: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse - 51, // 68: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse - 54, // 69: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:output_type -> filer_pb.CacheRemoteObjectToLocalClusterResponse - 56, // 70: filer_pb.SeaweedFiler.DistributedLock:output_type -> filer_pb.LockResponse - 58, // 71: filer_pb.SeaweedFiler.DistributedUnlock:output_type -> filer_pb.UnlockResponse - 60, // 72: filer_pb.SeaweedFiler.FindLockOwner:output_type -> filer_pb.FindLockOwnerResponse - 63, // 73: filer_pb.SeaweedFiler.TransferLocks:output_type -> filer_pb.TransferLocksResponse - 50, // [50:74] is the sub-list for method output_type - 26, // [26:50] is the sub-list for method input_type - 26, // [26:26] is the sub-list for extension type_name - 26, // [26:26] is the sub-list for extension extendee - 0, // [0:26] is the sub-list for field type_name + 5, // 21: filer_pb.TraverseBfsMetadataResponse.entry:type_name -> filer_pb.Entry + 68, // 22: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource + 69, // 23: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf + 5, // 24: filer_pb.CacheRemoteObjectToLocalClusterResponse.entry:type_name -> filer_pb.Entry + 63, // 25: filer_pb.TransferLocksRequest.locks:type_name -> filer_pb.Lock + 27, // 26: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations + 0, // 27: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest + 2, // 28: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest + 12, // 29: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest + 14, // 30: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest + 16, // 31: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest + 18, // 32: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest + 20, // 33: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest + 22, // 34: filer_pb.SeaweedFiler.StreamRenameEntry:input_type -> filer_pb.StreamRenameEntryRequest + 24, // 35: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest + 26, // 36: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest + 31, // 37: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest + 33, // 38: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest + 35, // 39: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest + 37, // 40: filer_pb.SeaweedFiler.Ping:input_type -> filer_pb.PingRequest + 39, // 41: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest + 43, // 42: filer_pb.SeaweedFiler.TraverseBfsMetadata:input_type -> filer_pb.TraverseBfsMetadataRequest + 41, // 43: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 41, // 44: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 50, // 45: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest + 52, // 46: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest + 55, // 47: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:input_type -> filer_pb.CacheRemoteObjectToLocalClusterRequest + 57, // 48: filer_pb.SeaweedFiler.DistributedLock:input_type -> filer_pb.LockRequest + 59, // 49: filer_pb.SeaweedFiler.DistributedUnlock:input_type -> filer_pb.UnlockRequest + 61, // 50: filer_pb.SeaweedFiler.FindLockOwner:input_type -> filer_pb.FindLockOwnerRequest + 64, // 51: filer_pb.SeaweedFiler.TransferLocks:input_type -> filer_pb.TransferLocksRequest + 1, // 52: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse + 3, // 53: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse + 13, // 54: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse + 15, // 55: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse + 17, // 56: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse + 19, // 57: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse + 21, // 58: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse + 23, // 59: filer_pb.SeaweedFiler.StreamRenameEntry:output_type -> filer_pb.StreamRenameEntryResponse + 25, // 60: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse + 29, // 61: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse + 32, // 62: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse + 34, // 63: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse + 36, // 64: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse + 38, // 65: filer_pb.SeaweedFiler.Ping:output_type -> filer_pb.PingResponse + 40, // 66: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse + 44, // 67: filer_pb.SeaweedFiler.TraverseBfsMetadata:output_type -> filer_pb.TraverseBfsMetadataResponse + 42, // 68: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 42, // 69: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 51, // 70: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse + 53, // 71: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse + 56, // 72: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:output_type -> filer_pb.CacheRemoteObjectToLocalClusterResponse + 58, // 73: filer_pb.SeaweedFiler.DistributedLock:output_type -> filer_pb.LockResponse + 60, // 74: filer_pb.SeaweedFiler.DistributedUnlock:output_type -> filer_pb.UnlockResponse + 62, // 75: filer_pb.SeaweedFiler.FindLockOwner:output_type -> filer_pb.FindLockOwnerResponse + 65, // 76: filer_pb.SeaweedFiler.TransferLocks:output_type -> filer_pb.TransferLocksResponse + 52, // [52:77] is the sub-list for method output_type + 27, // [27:52] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_filer_proto_init() } @@ -5720,7 +5854,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogEntry); i { + switch v := v.(*TraverseBfsMetadataRequest); i { case 0: return &v.state case 1: @@ -5732,7 +5866,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeepConnectedRequest); i { + switch v := v.(*TraverseBfsMetadataResponse); i { case 0: return &v.state case 1: @@ -5744,7 +5878,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeepConnectedResponse); i { + switch v := v.(*LogEntry); i { case 0: return &v.state case 1: @@ -5756,7 +5890,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LocateBrokerRequest); i { + switch v := v.(*KeepConnectedRequest); i { case 0: return &v.state case 1: @@ -5768,7 +5902,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LocateBrokerResponse); i { + switch v := v.(*KeepConnectedResponse); i { case 0: return &v.state case 1: @@ -5780,7 +5914,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvGetRequest); i { + switch v := v.(*LocateBrokerRequest); i { case 0: return &v.state case 1: @@ -5792,7 +5926,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvGetResponse); i { + switch v := v.(*LocateBrokerResponse); i { case 0: return &v.state case 1: @@ -5804,7 +5938,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvPutRequest); i { + switch v := v.(*KvGetRequest); i { case 0: return &v.state case 1: @@ -5816,7 +5950,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvPutResponse); i { + switch v := v.(*KvGetResponse); i { case 0: return &v.state case 1: @@ -5828,7 +5962,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilerConf); i { + switch v := v.(*KvPutRequest); i { case 0: return &v.state case 1: @@ -5840,7 +5974,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CacheRemoteObjectToLocalClusterRequest); i { + switch v := v.(*KvPutResponse); i { case 0: return &v.state case 1: @@ -5852,7 +5986,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CacheRemoteObjectToLocalClusterResponse); i { + switch v := v.(*FilerConf); i { case 0: return &v.state case 1: @@ -5864,7 +5998,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LockRequest); i { + switch v := v.(*CacheRemoteObjectToLocalClusterRequest); i { case 0: return &v.state case 1: @@ -5876,7 +6010,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LockResponse); i { + switch v := v.(*CacheRemoteObjectToLocalClusterResponse); i { case 0: return &v.state case 1: @@ -5888,7 +6022,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnlockRequest); i { + switch v := v.(*LockRequest); i { case 0: return &v.state case 1: @@ -5900,7 +6034,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnlockResponse); i { + switch v := v.(*LockResponse); i { case 0: return &v.state case 1: @@ -5912,7 +6046,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindLockOwnerRequest); i { + switch v := v.(*UnlockRequest); i { case 0: return &v.state case 1: @@ -5924,7 +6058,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindLockOwnerResponse); i { + switch v := v.(*UnlockResponse); i { case 0: return &v.state case 1: @@ -5936,7 +6070,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Lock); i { + switch v := v.(*FindLockOwnerRequest); i { case 0: return &v.state case 1: @@ -5948,7 +6082,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferLocksRequest); i { + switch v := v.(*FindLockOwnerResponse); i { case 0: return &v.state case 1: @@ -5960,6 +6094,30 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Lock); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransferLocksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransferLocksResponse); i { case 0: return &v.state @@ -5971,7 +6129,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LocateBrokerResponse_Resource); i { case 0: return &v.state @@ -5983,7 +6141,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilerConf_PathConf); i { case 0: return &v.state @@ -6002,7 +6160,7 @@ func file_filer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_filer_proto_rawDesc, NumEnums: 0, - NumMessages: 68, + NumMessages: 70, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/pb/filer_pb/filer_client_bfs.go b/weed/pb/filer_pb/filer_client_bfs.go index cb9367a7d..046920940 100644 --- a/weed/pb/filer_pb/filer_client_bfs.go +++ b/weed/pb/filer_pb/filer_client_bfs.go @@ -1,7 +1,10 @@ package filer_pb import ( + "context" "fmt" + "github.com/seaweedfs/seaweedfs/weed/glog" + "io" "sync" "time" @@ -12,7 +15,7 @@ func TraverseBfs(filerClient FilerClient, parentPath util.FullPath, fn func(pare K := 5 var jobQueueWg sync.WaitGroup - queue := util.NewQueue() + queue := util.NewQueue[util.FullPath]() jobQueueWg.Add(1) queue.Enqueue(parentPath) terminates := make([]chan bool, K) @@ -26,11 +29,11 @@ func TraverseBfs(filerClient FilerClient, parentPath util.FullPath, fn func(pare return default: t := queue.Dequeue() - if t == nil { + if t == "" { time.Sleep(329 * time.Millisecond) continue } - dir := t.(util.FullPath) + dir := t processErr := processOneDirectory(filerClient, dir, queue, &jobQueueWg, fn) if processErr != nil { err = processErr @@ -47,7 +50,7 @@ func TraverseBfs(filerClient FilerClient, parentPath util.FullPath, fn func(pare return } -func processOneDirectory(filerClient FilerClient, parentPath util.FullPath, queue *util.Queue, jobQueueWg *sync.WaitGroup, fn func(parentPath util.FullPath, entry *Entry)) (err error) { +func processOneDirectory(filerClient FilerClient, parentPath util.FullPath, queue *util.Queue[util.FullPath], jobQueueWg *sync.WaitGroup, fn func(parentPath util.FullPath, entry *Entry)) (err error) { return ReadDirAllEntries(filerClient, parentPath, "", func(entry *Entry, isLast bool) error { @@ -65,3 +68,28 @@ func processOneDirectory(filerClient FilerClient, parentPath util.FullPath, queu }) } + +func StreamBfs(client SeaweedFilerClient, dir util.FullPath, olderThanTsNs int64, fn func(parentPath util.FullPath, entry *Entry)error) (err error) { + glog.V(0).Infof("TraverseBfsMetadata %v if before %v", dir, time.Unix(0, olderThanTsNs)) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + stream, err := client.TraverseBfsMetadata(ctx, &TraverseBfsMetadataRequest{ + Directory: string(dir), + }) + if err != nil { + return fmt.Errorf("traverse bfs metadata: %v", err) + } + for { + resp, err := stream.Recv() + if err != nil { + if err == io.EOF { + break + } + return fmt.Errorf("traverse bfs metadata: %v", err) + } + if err := fn(util.FullPath(resp.Directory), resp.Entry); err != nil { + return err + } + } + return nil +} diff --git a/weed/pb/filer_pb/filer_grpc.pb.go b/weed/pb/filer_pb/filer_grpc.pb.go index ae1564f43..87b8de33d 100644 --- a/weed/pb/filer_pb/filer_grpc.pb.go +++ b/weed/pb/filer_pb/filer_grpc.pb.go @@ -34,6 +34,7 @@ const ( SeaweedFiler_Statistics_FullMethodName = "/filer_pb.SeaweedFiler/Statistics" SeaweedFiler_Ping_FullMethodName = "/filer_pb.SeaweedFiler/Ping" SeaweedFiler_GetFilerConfiguration_FullMethodName = "/filer_pb.SeaweedFiler/GetFilerConfiguration" + SeaweedFiler_TraverseBfsMetadata_FullMethodName = "/filer_pb.SeaweedFiler/TraverseBfsMetadata" SeaweedFiler_SubscribeMetadata_FullMethodName = "/filer_pb.SeaweedFiler/SubscribeMetadata" SeaweedFiler_SubscribeLocalMetadata_FullMethodName = "/filer_pb.SeaweedFiler/SubscribeLocalMetadata" SeaweedFiler_KvGet_FullMethodName = "/filer_pb.SeaweedFiler/KvGet" @@ -64,6 +65,7 @@ type SeaweedFilerClient interface { Statistics(ctx context.Context, in *StatisticsRequest, opts ...grpc.CallOption) (*StatisticsResponse, error) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) GetFilerConfiguration(ctx context.Context, in *GetFilerConfigurationRequest, opts ...grpc.CallOption) (*GetFilerConfigurationResponse, error) + TraverseBfsMetadata(ctx context.Context, in *TraverseBfsMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_TraverseBfsMetadataClient, error) SubscribeMetadata(ctx context.Context, in *SubscribeMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_SubscribeMetadataClient, error) SubscribeLocalMetadata(ctx context.Context, in *SubscribeMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_SubscribeLocalMetadataClient, error) KvGet(ctx context.Context, in *KvGetRequest, opts ...grpc.CallOption) (*KvGetResponse, error) @@ -265,8 +267,40 @@ func (c *seaweedFilerClient) GetFilerConfiguration(ctx context.Context, in *GetF return out, nil } +func (c *seaweedFilerClient) TraverseBfsMetadata(ctx context.Context, in *TraverseBfsMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_TraverseBfsMetadataClient, error) { + stream, err := c.cc.NewStream(ctx, &SeaweedFiler_ServiceDesc.Streams[2], SeaweedFiler_TraverseBfsMetadata_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &seaweedFilerTraverseBfsMetadataClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type SeaweedFiler_TraverseBfsMetadataClient interface { + Recv() (*TraverseBfsMetadataResponse, error) + grpc.ClientStream +} + +type seaweedFilerTraverseBfsMetadataClient struct { + grpc.ClientStream +} + +func (x *seaweedFilerTraverseBfsMetadataClient) Recv() (*TraverseBfsMetadataResponse, error) { + m := new(TraverseBfsMetadataResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *seaweedFilerClient) SubscribeMetadata(ctx context.Context, in *SubscribeMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_SubscribeMetadataClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedFiler_ServiceDesc.Streams[2], SeaweedFiler_SubscribeMetadata_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SeaweedFiler_ServiceDesc.Streams[3], SeaweedFiler_SubscribeMetadata_FullMethodName, opts...) if err != nil { return nil, err } @@ -298,7 +332,7 @@ func (x *seaweedFilerSubscribeMetadataClient) Recv() (*SubscribeMetadataResponse } func (c *seaweedFilerClient) SubscribeLocalMetadata(ctx context.Context, in *SubscribeMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_SubscribeLocalMetadataClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedFiler_ServiceDesc.Streams[3], SeaweedFiler_SubscribeLocalMetadata_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SeaweedFiler_ServiceDesc.Streams[4], SeaweedFiler_SubscribeLocalMetadata_FullMethodName, opts...) if err != nil { return nil, err } @@ -411,6 +445,7 @@ type SeaweedFilerServer interface { Statistics(context.Context, *StatisticsRequest) (*StatisticsResponse, error) Ping(context.Context, *PingRequest) (*PingResponse, error) GetFilerConfiguration(context.Context, *GetFilerConfigurationRequest) (*GetFilerConfigurationResponse, error) + TraverseBfsMetadata(*TraverseBfsMetadataRequest, SeaweedFiler_TraverseBfsMetadataServer) error SubscribeMetadata(*SubscribeMetadataRequest, SeaweedFiler_SubscribeMetadataServer) error SubscribeLocalMetadata(*SubscribeMetadataRequest, SeaweedFiler_SubscribeLocalMetadataServer) error KvGet(context.Context, *KvGetRequest) (*KvGetResponse, error) @@ -473,6 +508,9 @@ func (UnimplementedSeaweedFilerServer) Ping(context.Context, *PingRequest) (*Pin func (UnimplementedSeaweedFilerServer) GetFilerConfiguration(context.Context, *GetFilerConfigurationRequest) (*GetFilerConfigurationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFilerConfiguration not implemented") } +func (UnimplementedSeaweedFilerServer) TraverseBfsMetadata(*TraverseBfsMetadataRequest, SeaweedFiler_TraverseBfsMetadataServer) error { + return status.Errorf(codes.Unimplemented, "method TraverseBfsMetadata not implemented") +} func (UnimplementedSeaweedFilerServer) SubscribeMetadata(*SubscribeMetadataRequest, SeaweedFiler_SubscribeMetadataServer) error { return status.Errorf(codes.Unimplemented, "method SubscribeMetadata not implemented") } @@ -789,6 +827,27 @@ func _SeaweedFiler_GetFilerConfiguration_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } +func _SeaweedFiler_TraverseBfsMetadata_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(TraverseBfsMetadataRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(SeaweedFilerServer).TraverseBfsMetadata(m, &seaweedFilerTraverseBfsMetadataServer{stream}) +} + +type SeaweedFiler_TraverseBfsMetadataServer interface { + Send(*TraverseBfsMetadataResponse) error + grpc.ServerStream +} + +type seaweedFilerTraverseBfsMetadataServer struct { + grpc.ServerStream +} + +func (x *seaweedFilerTraverseBfsMetadataServer) Send(m *TraverseBfsMetadataResponse) error { + return x.ServerStream.SendMsg(m) +} + func _SeaweedFiler_SubscribeMetadata_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(SubscribeMetadataRequest) if err := stream.RecvMsg(m); err != nil { @@ -1056,6 +1115,11 @@ var SeaweedFiler_ServiceDesc = grpc.ServiceDesc{ Handler: _SeaweedFiler_StreamRenameEntry_Handler, ServerStreams: true, }, + { + StreamName: "TraverseBfsMetadata", + Handler: _SeaweedFiler_TraverseBfsMetadata_Handler, + ServerStreams: true, + }, { StreamName: "SubscribeMetadata", Handler: _SeaweedFiler_SubscribeMetadata_Handler, diff --git a/weed/server/filer_grpc_server_traverse_meta.go b/weed/server/filer_grpc_server_traverse_meta.go new file mode 100644 index 000000000..4a924f065 --- /dev/null +++ b/weed/server/filer_grpc_server_traverse_meta.go @@ -0,0 +1,84 @@ +package weed_server + +import ( + "context" + "fmt" + "github.com/seaweedfs/seaweedfs/weed/filer" + "github.com/seaweedfs/seaweedfs/weed/glog" + "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" + "github.com/seaweedfs/seaweedfs/weed/util" + "github.com/viant/ptrie" +) + +func (fs *FilerServer) TraverseBfsMetadata(req *filer_pb.TraverseBfsMetadataRequest, stream filer_pb.SeaweedFiler_TraverseBfsMetadataServer) error { + + glog.V(0).Infof("TraverseBfsMetadata %v", req) + + excludedTrie := ptrie.New[bool]() + for _, excluded := range req.ExcludedPrefixes { + excludedTrie.Put([]byte(excluded), true) + } + + ctx := stream.Context() + + queue := util.NewQueue[*filer.Entry]() + dirEntry, err := fs.filer.FindEntry(ctx, util.FullPath(req.Directory)) + if err != nil { + return fmt.Errorf("find dir %s: %v", req.Directory, err) + } + queue.Enqueue(dirEntry) + + for item := queue.Dequeue(); item != nil; item = queue.Dequeue() { + if excludedTrie.MatchPrefix([]byte(item.FullPath), func(key []byte, value bool) bool { + return true + }) { + // println("excluded", item.FullPath) + continue + } + parent, _ := item.FullPath.DirAndName() + if err := stream.Send(&filer_pb.TraverseBfsMetadataResponse{ + Directory: parent, + Entry: item.ToProtoEntry(), + }); err != nil { + return fmt.Errorf("send traverse bfs metadata response: %v", err) + } + + if !item.IsDirectory() { + continue + } + + if err := fs.iterateDirectory(ctx, item.FullPath, func(entry *filer.Entry) error { + queue.Enqueue(entry) + return nil + }); err != nil { + return err + } + } + + return nil +} + +func (fs *FilerServer) iterateDirectory(ctx context.Context, dirPath util.FullPath, fn func(entry *filer.Entry) error) (err error) { + var lastFileName string + var listErr error + for { + var hasEntries bool + lastFileName, listErr = fs.filer.StreamListDirectoryEntries(ctx, dirPath, lastFileName, false, 1024, "", "", "", func(entry *filer.Entry) bool { + hasEntries = true + if fnErr := fn(entry); fnErr != nil { + err = fnErr + return false + } + return true + }) + if listErr != nil { + return listErr + } + if err != nil { + return err + } + if !hasEntries { + return nil + } + } +} diff --git a/weed/server/filer_grpc_server_traverse_meta_test.go b/weed/server/filer_grpc_server_traverse_meta_test.go new file mode 100644 index 000000000..72f8a916e --- /dev/null +++ b/weed/server/filer_grpc_server_traverse_meta_test.go @@ -0,0 +1,31 @@ +package weed_server + +import ( + "github.com/stretchr/testify/assert" + "github.com/viant/ptrie" + "testing" +) + +func TestPtrie(t *testing.T) { + b := []byte("/topics/abc/dev") + excludedTrie := ptrie.New[bool]() + excludedTrie.Put([]byte("/topics/abc/d"), true) + excludedTrie.Put([]byte("/topics/abc"), true) + + assert.True(t, excludedTrie.MatchPrefix(b, func(key []byte, value bool) bool { + println("matched1", string(key)) + return true + })) + + assert.True(t, excludedTrie.MatchAll(b, func(key []byte, value bool) bool { + println("matched2", string(key)) + return true + })) + + assert.False(t, excludedTrie.MatchAll([]byte("/topics/ab"), func(key []byte, value bool) bool { + println("matched3", string(key)) + return true + })) + + assert.False(t, excludedTrie.Has(b)) +} diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 0b7254c0d..7bc1b361c 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -203,7 +203,7 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) } if isFresh { glog.V(0).Infof("%s bootstrap from peers %+v", option.Host, existingNodes) - if err := fs.filer.MaybeBootstrapFromPeers(option.Host, existingNodes, startFromTime); err != nil { + if err := fs.filer.MaybeBootstrapFromOnePeer(option.Host, existingNodes, startFromTime); err != nil { glog.Fatalf("%s bootstrap from %+v: %v", option.Host, existingNodes, err) } } diff --git a/weed/util/queue.go b/weed/util/queue.go index 1e6211e0d..1437fe8be 100644 --- a/weed/util/queue.go +++ b/weed/util/queue.go @@ -1,35 +1,37 @@ package util -import "sync" +import ( + "sync" +) -type node struct { - data interface{} - next *node +type node[T any]struct { + data T + next *node[T] } -type Queue struct { - head *node - tail *node +type Queue[T any] struct { + head *node[T] + tail *node[T] count int sync.RWMutex } -func NewQueue() *Queue { - q := &Queue{} +func NewQueue[T any]() *Queue[T] { + q := &Queue[T]{} return q } -func (q *Queue) Len() int { +func (q *Queue[T]) Len() int { q.RLock() defer q.RUnlock() return q.count } -func (q *Queue) Enqueue(item interface{}) { +func (q *Queue[T]) Enqueue(item T) { q.Lock() defer q.Unlock() - n := &node{data: item} + n := &node[T]{data: item} if q.tail == nil { q.tail = n @@ -41,12 +43,12 @@ func (q *Queue) Enqueue(item interface{}) { q.count++ } -func (q *Queue) Dequeue() interface{} { +func (q *Queue[T]) Dequeue() (result T) { q.Lock() defer q.Unlock() if q.head == nil { - return nil + return } n := q.head From d8dfadb617c5ab0b782f6bf746d48abf5800705d Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 28 Jun 2024 15:02:46 -0700 Subject: [PATCH 11/42] ParallelProcessDirectoryStructure need to use this for simpler parallel processing --- weed/filer/meta_replay.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/weed/filer/meta_replay.go b/weed/filer/meta_replay.go index 51c4e6987..0432e17de 100644 --- a/weed/filer/meta_replay.go +++ b/weed/filer/meta_replay.go @@ -2,6 +2,7 @@ package filer import ( "context" + "sync" "github.com/seaweedfs/seaweedfs/weed/glog" "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" @@ -35,3 +36,40 @@ func Replay(filerStore FilerStore, resp *filer_pb.SubscribeMetadataResponse) err return nil } + + +// ParallelProcessDirectoryStructure processes each entry in parallel, and also ensure parent directories are processed first. +// This also assumes the parent directories are in the entryChan already. +func ParallelProcessDirectoryStructure(entryChan chan *Entry, concurrency int, eachEntryFn func(entry *Entry)(error)) (firstErr error) { + + executors := util.NewLimitedConcurrentExecutor(concurrency) + + var wg sync.WaitGroup + for entry := range entryChan { + wg.Add(1) + if entry.IsDirectory() { + func() { + defer wg.Done() + if err := eachEntryFn(entry); err != nil { + if firstErr == nil { + firstErr = err + } + } + }() + } else { + executors.Execute(func() { + defer wg.Done() + if err := eachEntryFn(entry); err != nil { + if firstErr == nil { + firstErr = err + } + } + }) + } + if firstErr != nil { + break + } + } + wg.Wait() + return +} From e99eee8ed930802a09509828d43163531b8bd6f2 Mon Sep 17 00:00:00 2001 From: Reddysekhar Gaduputi Date: Sat, 29 Jun 2024 22:02:12 +0530 Subject: [PATCH 12/42] [Helm chart] Remove createClusterRole dependency from serviceAccount usage from filer statefulset (#5724) * Remove createClusterRole dependency from serviceAccount usage from filer statefulset * Add automountServiceAccountToken option for service account. --- k8s/charts/seaweedfs/templates/filer-statefulset.yaml | 2 -- k8s/charts/seaweedfs/templates/service-account.yaml | 3 ++- k8s/charts/seaweedfs/values.yaml | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/k8s/charts/seaweedfs/templates/filer-statefulset.yaml b/k8s/charts/seaweedfs/templates/filer-statefulset.yaml index 1e27c1840..881c4868a 100644 --- a/k8s/charts/seaweedfs/templates/filer-statefulset.yaml +++ b/k8s/charts/seaweedfs/templates/filer-statefulset.yaml @@ -56,9 +56,7 @@ spec: {{ tpl .Values.filer.tolerations . | nindent 8 | trim }} {{- end }} {{- include "seaweedfs.imagePullSecrets" . | nindent 6 }} - {{- if .Values.global.createClusterRole }} serviceAccountName: {{ .Values.filer.serviceAccountName | default .Values.global.serviceAccountName | quote }} # for deleting statefulset pods after migration - {{- end }} terminationGracePeriodSeconds: 60 {{- if .Values.filer.priorityClassName }} priorityClassName: {{ .Values.filer.priorityClassName | quote }} diff --git a/k8s/charts/seaweedfs/templates/service-account.yaml b/k8s/charts/seaweedfs/templates/service-account.yaml index a00c9f3f7..429158a27 100644 --- a/k8s/charts/seaweedfs/templates/service-account.yaml +++ b/k8s/charts/seaweedfs/templates/service-account.yaml @@ -7,4 +7,5 @@ metadata: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} \ No newline at end of file + app.kubernetes.io/instance: {{ .Release.Name }} +automountServiceAccountToken: {{ .Values.global.automountServiceAccountToken }} \ No newline at end of file diff --git a/k8s/charts/seaweedfs/values.yaml b/k8s/charts/seaweedfs/values.yaml index 53385779e..585272db4 100644 --- a/k8s/charts/seaweedfs/values.yaml +++ b/k8s/charts/seaweedfs/values.yaml @@ -19,6 +19,7 @@ global: filerRead: false # we will use this serviceAccountName for all ClusterRoles/ClusterRoleBindings serviceAccountName: "seaweedfs" + automountServiceAccountToken: true certificates: alphacrds: false monitoring: From fbe1316c921d3d5479c03e55e9759038e786b8a1 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 30 Jun 2024 23:08:49 -0700 Subject: [PATCH 13/42] 3.69 --- k8s/charts/seaweedfs/Chart.yaml | 2 +- weed/util/constants.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/k8s/charts/seaweedfs/Chart.yaml b/k8s/charts/seaweedfs/Chart.yaml index 515c08f0a..155c9a883 100644 --- a/k8s/charts/seaweedfs/Chart.yaml +++ b/k8s/charts/seaweedfs/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "3.68" +appVersion: "3.69" # Dev note: Trigger a helm chart release by `git tag -a helm-` version: 4.0.0 diff --git a/weed/util/constants.go b/weed/util/constants.go index 09f813e5b..12d96fea0 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -7,7 +7,7 @@ import ( const HttpStatusCancelled = 499 var ( - VERSION_NUMBER = fmt.Sprintf("%.02f", 3.68) + VERSION_NUMBER = fmt.Sprintf("%.02f", 3.69) VERSION = sizeLimit + " " + VERSION_NUMBER COMMIT = "" ) From ac6fd36c06f9cd6740cb2ff7e97c1ba92d55bf2c Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 30 Jun 2024 23:16:54 -0700 Subject: [PATCH 14/42] using fixed bootstrap from peer filer --- weed/command/filer.go | 3 --- weed/command/server.go | 1 - weed/server/filer_server.go | 4 ---- 3 files changed, 8 deletions(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index 877c4b5d5..1d8a6c4b8 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -63,7 +63,6 @@ type FilerOptions struct { diskType *string allowedOrigins *string exposeDirectoryData *bool - joinExistingFiler *bool } func init() { @@ -96,7 +95,6 @@ func init() { f.diskType = cmdFiler.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") f.allowedOrigins = cmdFiler.Flag.String("allowedOrigins", "*", "comma separated list of allowed origins") f.exposeDirectoryData = cmdFiler.Flag.Bool("exposeDirectoryData", true, "whether to return directory metadata and content in Filer UI") - f.joinExistingFiler = cmdFiler.Flag.Bool("joinExistingFiler", false, "enable if new filer wants to join existing cluster") // start s3 on filer filerStartS3 = cmdFiler.Flag.Bool("s3", false, "whether to start S3 gateway") @@ -264,7 +262,6 @@ func (fo *FilerOptions) startFiler() { DownloadMaxBytesPs: int64(*fo.downloadMaxMBps) * 1024 * 1024, DiskType: *fo.diskType, AllowedOrigins: strings.Split(*fo.allowedOrigins, ","), - JoinExistingFiler: *fo.joinExistingFiler, }) if nfs_err != nil { glog.Fatalf("Filer startup error: %v", nfs_err) diff --git a/weed/command/server.go b/weed/command/server.go index 41b9d0761..87a5defe2 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -119,7 +119,6 @@ func init() { filerOptions.downloadMaxMBps = cmdServer.Flag.Int("filer.downloadMaxMBps", 0, "download max speed for each download request, in MB per second") filerOptions.diskType = cmdServer.Flag.String("filer.disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") filerOptions.exposeDirectoryData = cmdServer.Flag.Bool("filer.exposeDirectoryData", true, "expose directory data via filer. If false, filer UI will be innaccessible.") - filerOptions.joinExistingFiler = cmdServer.Flag.Bool("filer.joinExistingFiler", false, "enable if new filer wants to join existing cluster") serverOptions.v.port = cmdServer.Flag.Int("volume.port", 8080, "volume server http listen port") serverOptions.v.portGrpc = cmdServer.Flag.Int("volume.port.grpc", 0, "volume server grpc listen port") diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 7bc1b361c..ee052579c 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -74,7 +74,6 @@ type FilerOption struct { DiskType string AllowedOrigins []string ExposeDirectoryData bool - JoinExistingFiler bool } type FilerServer struct { @@ -198,9 +197,6 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) existingNodes := fs.filer.ListExistingPeerUpdates(context.Background()) startFromTime := time.Now().Add(-filer.LogFlushInterval) - if option.JoinExistingFiler { - startFromTime = time.Time{} - } if isFresh { glog.V(0).Infof("%s bootstrap from peers %+v", option.Host, existingNodes) if err := fs.filer.MaybeBootstrapFromOnePeer(option.Host, existingNodes, startFromTime); err != nil { From 0fdf7eca48892b5c6d12c1c96563755945331f16 Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 1 Jul 2024 00:54:37 -0700 Subject: [PATCH 15/42] avoid possible nil case during other error cases --- weed/filer/filerstore_wrapper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index d3beaba89..48e2a636d 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -182,7 +182,7 @@ func (fsw *FilerStoreWrapper) DeleteEntry(ctx context.Context, fp util.FullPath) }() existingEntry, findErr := fsw.FindEntry(ctx, fp) - if findErr == filer_pb.ErrNotFound { + if findErr == filer_pb.ErrNotFound || existingEntry == nil { return nil } if len(existingEntry.HardLinkId) != 0 { From 5ffacbb6eacaad6ea9558d18f9c62be2a3c4e18f Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:00:39 +0500 Subject: [PATCH 16/42] refactor all methods strings to const (#5726) --- .../bench_filer_upload/bench_filer_upload.go | 2 +- .../stress_filer_upload.go | 2 +- weed/command/master.go | 6 +- weed/iamapi/iamapi_server.go | 2 +- weed/iamapi/iamapi_test.go | 2 +- weed/operation/chunked_file.go | 2 +- weed/operation/upload_content.go | 2 +- weed/s3api/auto_signature_v4_test.go | 18 ++-- weed/s3api/s3api_object_handlers.go | 2 +- weed/s3api/s3api_object_handlers_put.go | 2 +- weed/s3api/s3api_server.go | 96 +++++++++---------- weed/server/common.go | 2 +- weed/server/filer_server_handlers_read.go | 2 +- .../filer_server_handlers_write_autochunk.go | 2 +- weed/server/volume_server_handlers_read.go | 8 +- weed/shell/command_fs_merge_volumes.go | 2 +- weed/storage/needle/needle_parse_upload.go | 2 +- weed/util/http_util.go | 14 +-- 18 files changed, 84 insertions(+), 84 deletions(-) diff --git a/unmaintained/stress_filer_upload/bench_filer_upload/bench_filer_upload.go b/unmaintained/stress_filer_upload/bench_filer_upload/bench_filer_upload.go index 1767b04b2..7700a6dce 100644 --- a/unmaintained/stress_filer_upload/bench_filer_upload/bench_filer_upload.go +++ b/unmaintained/stress_filer_upload/bench_filer_upload/bench_filer_upload.go @@ -115,7 +115,7 @@ func uploadFileToFiler(client *http.Client, data []byte, filename, destination s uri := destination + filename - request, err := http.NewRequest("POST", uri, body) + request, err := http.NewRequest(http.MethodPost, uri, body) request.Header.Set("Content-Type", writer.FormDataContentType()) // request.Close = true // can not use this, which do not reuse http connection, impacting filer->volume also. diff --git a/unmaintained/stress_filer_upload/stress_filer_upload_actual/stress_filer_upload.go b/unmaintained/stress_filer_upload/stress_filer_upload_actual/stress_filer_upload.go index afcd51917..c8d36053b 100644 --- a/unmaintained/stress_filer_upload/stress_filer_upload_actual/stress_filer_upload.go +++ b/unmaintained/stress_filer_upload/stress_filer_upload_actual/stress_filer_upload.go @@ -130,7 +130,7 @@ func uploadFileToFiler(client *http.Client, filename, destination string) (size uri := destination + file.Name() - request, err := http.NewRequest("POST", uri, body) + request, err := http.NewRequest(http.MethodPost, uri, body) request.Header.Set("Content-Type", writer.FormDataContentType()) resp, err := client.Do(request) diff --git a/weed/command/master.go b/weed/command/master.go index f80d8faeb..dbd11e60d 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -180,10 +180,10 @@ func startMaster(masterOption MasterOptions, masterWhiteList []string) { } } ms.SetRaftServer(raftServer) - r.HandleFunc("/cluster/status", raftServer.StatusHandler).Methods("GET") - r.HandleFunc("/cluster/healthz", raftServer.HealthzHandler).Methods("GET", "HEAD") + r.HandleFunc("/cluster/status", raftServer.StatusHandler).Methods(http.MethodGet) + r.HandleFunc("/cluster/healthz", raftServer.HealthzHandler).Methods(http.MethodGet, http.MethodHead) if *masterOption.raftHashicorp { - r.HandleFunc("/raft/stats", raftServer.StatsRaftHandler).Methods("GET") + r.HandleFunc("/raft/stats", raftServer.StatsRaftHandler).Methods(http.MethodGet) } // starting grpc server grpcPort := *masterOption.portGrpc diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index 3a4fb914e..d1575a14e 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -72,7 +72,7 @@ func (iama *IamApiServer) registerRouter(router *mux.Router) { // ListBuckets // apiRouter.Methods("GET").Path("/").HandlerFunc(track(s3a.iam.Auth(s3a.ListBucketsHandler, ACTION_ADMIN), "LIST")) - apiRouter.Methods("POST").Path("/").HandlerFunc(iama.iam.Auth(iama.DoActions, ACTION_ADMIN)) + apiRouter.Methods(http.MethodPost).Path("/").HandlerFunc(iama.iam.Auth(iama.DoActions, ACTION_ADMIN)) // // NotFound apiRouter.NotFoundHandler = http.HandlerFunc(s3err.NotFoundHandler) diff --git a/weed/iamapi/iamapi_test.go b/weed/iamapi/iamapi_test.go index efd74a059..f32e1ac51 100644 --- a/weed/iamapi/iamapi_test.go +++ b/weed/iamapi/iamapi_test.go @@ -189,7 +189,7 @@ func TestDeleteUser(t *testing.T) { func executeRequest(req *http.Request, v interface{}) (*httptest.ResponseRecorder, error) { rr := httptest.NewRecorder() apiRouter := mux.NewRouter().SkipClean(true) - apiRouter.Path("/").Methods("POST").HandlerFunc(ias.DoActions) + apiRouter.Path("/").Methods(http.MethodPost).HandlerFunc(ias.DoActions) apiRouter.ServeHTTP(rr, req) return rr, xml.Unmarshal(rr.Body.Bytes(), &v) } diff --git a/weed/operation/chunked_file.go b/weed/operation/chunked_file.go index c451420fe..02faf9904 100644 --- a/weed/operation/chunked_file.go +++ b/weed/operation/chunked_file.go @@ -95,7 +95,7 @@ func (cm *ChunkManifest) DeleteChunks(masterFn GetMasterFn, usePublicUrl bool, g } func readChunkNeedle(fileUrl string, w io.Writer, offset int64, jwt string) (written int64, e error) { - req, err := http.NewRequest("GET", fileUrl, nil) + req, err := http.NewRequest(http.MethodGet, fileUrl, nil) if err != nil { return written, err } diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index a1df07d7e..6c6aec1b5 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -325,7 +325,7 @@ func upload_content(fillBufferFunction func(w io.Writer) error, originalDataSize } else { reqReader = bytes.NewReader(option.BytesBuffer.Bytes()) } - req, postErr := http.NewRequest("POST", option.UploadUrl, reqReader) + req, postErr := http.NewRequest(http.MethodPost, option.UploadUrl, reqReader) if postErr != nil { glog.V(1).Infof("create upload request %s: %v", option.UploadUrl, postErr) return nil, fmt.Errorf("create upload request %s: %v", option.UploadUrl, postErr) diff --git a/weed/s3api/auto_signature_v4_test.go b/weed/s3api/auto_signature_v4_test.go index 6ff67b5bf..bb67c35c2 100644 --- a/weed/s3api/auto_signature_v4_test.go +++ b/weed/s3api/auto_signature_v4_test.go @@ -43,7 +43,7 @@ func TestIsRequestPresignedSignatureV4(t *testing.T) { for i, testCase := range testCases { // creating an input HTTP request. // Only the query parameters are relevant for this particular test. - inputReq, err := http.NewRequest("GET", "http://example.com", nil) + inputReq, err := http.NewRequest(http.MethodGet, "http://example.com", nil) if err != nil { t.Fatalf("Error initializing input HTTP request: %v", err) } @@ -85,9 +85,9 @@ func TestIsReqAuthenticated(t *testing.T) { s3Error s3err.ErrorCode }{ // When request is unsigned, access denied is returned. - {mustNewRequest("GET", "http://127.0.0.1:9000", 0, nil, t), s3err.ErrAccessDenied}, + {mustNewRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), s3err.ErrAccessDenied}, // When request is properly signed, error is none. - {mustNewSignedRequest("GET", "http://127.0.0.1:9000", 0, nil, t), s3err.ErrNone}, + {mustNewSignedRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), s3err.ErrNone}, } // Validates all testcases. @@ -117,8 +117,8 @@ func TestCheckaAnonymousRequestAuthType(t *testing.T) { ErrCode s3err.ErrorCode Action Action }{ - {Request: mustNewRequest("GET", "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrNone, Action: s3_constants.ACTION_READ}, - {Request: mustNewRequest("PUT", "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrAccessDenied, Action: s3_constants.ACTION_WRITE}, + {Request: mustNewRequest(http.MethodGet, "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrNone, Action: s3_constants.ACTION_READ}, + {Request: mustNewRequest(http.MethodPut, "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrAccessDenied, Action: s3_constants.ACTION_WRITE}, } for i, testCase := range testCases { _, s3Error := iam.authRequest(testCase.Request, testCase.Action) @@ -155,9 +155,9 @@ func TestCheckAdminRequestAuthType(t *testing.T) { Request *http.Request ErrCode s3err.ErrorCode }{ - {Request: mustNewRequest("GET", "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrAccessDenied}, - {Request: mustNewSignedRequest("GET", "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone}, - {Request: mustNewPresignedRequest(iam, "GET", "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone}, + {Request: mustNewRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrAccessDenied}, + {Request: mustNewSignedRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone}, + {Request: mustNewPresignedRequest(iam, http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone}, } for i, testCase := range testCases { if _, s3Error := iam.reqSignatureV4Verify(testCase.Request); s3Error != testCase.ErrCode { @@ -214,7 +214,7 @@ func mustNewPresignedRequest(iam *IdentityAccessManagement, method string, urlSt // Returns new HTTP request object. func newTestRequest(method, urlStr string, contentLength int64, body io.ReadSeeker) (*http.Request, error) { if method == "" { - method = "POST" + method = http.MethodPost } // Save for subsequent use diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 1d58af8bc..517a55856 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -143,7 +143,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des return } - if r.Method == "DELETE" { + if r.Method == http.MethodDelete { if resp.StatusCode == http.StatusNotFound { // this is normal responseStatusCode := responseFn(resp, w) diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index 49d385afc..0f8743a30 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -110,7 +110,7 @@ func (s3a *S3ApiServer) putToFiler(r *http.Request, uploadUrl string, dataReader hash := md5.New() var body = io.TeeReader(dataReader, hash) - proxyReq, err := http.NewRequest("PUT", uploadUrl, body) + proxyReq, err := http.NewRequest(http.MethodPut, uploadUrl, body) if err != nil { glog.Errorf("NewRequest %s: %v", uploadUrl, err) diff --git a/weed/s3api/s3api_server.go b/weed/s3api/s3api_server.go index 9422318ce..5e46c1459 100644 --- a/weed/s3api/s3api_server.go +++ b/weed/s3api/s3api_server.go @@ -109,9 +109,9 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) { apiRouter := router.PathPrefix("/").Subrouter() // Readiness Probe - apiRouter.Methods("GET").Path("/status").HandlerFunc(s3a.StatusHandler) + apiRouter.Methods(http.MethodGet).Path("/status").HandlerFunc(s3a.StatusHandler) - apiRouter.Methods("OPTIONS").HandlerFunc( + apiRouter.Methods(http.MethodOptions).HandlerFunc( func(w http.ResponseWriter, r *http.Request) { origin := r.Header.Get("Origin") if origin != "" { @@ -161,135 +161,135 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) { // objects with query // CopyObjectPart - bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", `.*?(\/|%2F).*?`).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") + bucket.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", `.*?(\/|%2F).*?`).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") // PutObjectPart - bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") + bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") // CompleteMultipartUpload - bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CompleteMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploadId", "{uploadId:.*}") + bucket.Methods(http.MethodPost).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CompleteMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploadId", "{uploadId:.*}") // NewMultipartUpload - bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.NewMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploads", "") + bucket.Methods(http.MethodPost).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.NewMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploads", "") // AbortMultipartUpload - bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.AbortMultipartUploadHandler, ACTION_WRITE)), "DELETE")).Queries("uploadId", "{uploadId:.*}") + bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.AbortMultipartUploadHandler, ACTION_WRITE)), "DELETE")).Queries("uploadId", "{uploadId:.*}") // ListObjectParts - bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectPartsHandler, ACTION_READ)), "GET")).Queries("uploadId", "{uploadId:.*}") + bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectPartsHandler, ACTION_READ)), "GET")).Queries("uploadId", "{uploadId:.*}") // ListMultipartUploads - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListMultipartUploadsHandler, ACTION_READ)), "GET")).Queries("uploads", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListMultipartUploadsHandler, ACTION_READ)), "GET")).Queries("uploads", "") // GetObjectTagging - bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectTaggingHandler, ACTION_READ)), "GET")).Queries("tagging", "") + bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectTaggingHandler, ACTION_READ)), "GET")).Queries("tagging", "") // PutObjectTagging - bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectTaggingHandler, ACTION_TAGGING)), "PUT")).Queries("tagging", "") + bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectTaggingHandler, ACTION_TAGGING)), "PUT")).Queries("tagging", "") // DeleteObjectTagging - bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectTaggingHandler, ACTION_TAGGING)), "DELETE")).Queries("tagging", "") + bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectTaggingHandler, ACTION_TAGGING)), "DELETE")).Queries("tagging", "") // PutObjectACL - bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") + bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") // PutObjectRetention - bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectRetentionHandler, ACTION_WRITE)), "PUT")).Queries("retention", "") + bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectRetentionHandler, ACTION_WRITE)), "PUT")).Queries("retention", "") // PutObjectLegalHold - bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLegalHoldHandler, ACTION_WRITE)), "PUT")).Queries("legal-hold", "") + bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLegalHoldHandler, ACTION_WRITE)), "PUT")).Queries("legal-hold", "") // PutObjectLockConfiguration - bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLockConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("object-lock", "") + bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLockConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("object-lock", "") // GetObjectACL - bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") + bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") // objects with query // raw objects // HeadObject - bucket.Methods("HEAD").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadObjectHandler, ACTION_READ)), "GET")) + bucket.Methods(http.MethodHead).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadObjectHandler, ACTION_READ)), "GET")) // GetObject, but directory listing is not supported - bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectHandler, ACTION_READ)), "GET")) + bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectHandler, ACTION_READ)), "GET")) // CopyObject - bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectHandler, ACTION_WRITE)), "COPY")) + bucket.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectHandler, ACTION_WRITE)), "COPY")) // PutObject - bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectHandler, ACTION_WRITE)), "PUT")) + bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectHandler, ACTION_WRITE)), "PUT")) // DeleteObject - bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectHandler, ACTION_WRITE)), "DELETE")) + bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectHandler, ACTION_WRITE)), "DELETE")) // raw objects // buckets with query // DeleteMultipleObjects - bucket.Methods("POST").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteMultipleObjectsHandler, ACTION_WRITE)), "DELETE")).Queries("delete", "") + bucket.Methods(http.MethodPost).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteMultipleObjectsHandler, ACTION_WRITE)), "DELETE")).Queries("delete", "") // GetBucketACL - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "") // PutBucketACL - bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") + bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "") // GetBucketPolicy - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketPolicyHandler, ACTION_READ)), "GET")).Queries("policy", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketPolicyHandler, ACTION_READ)), "GET")).Queries("policy", "") // PutBucketPolicy - bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketPolicyHandler, ACTION_WRITE)), "PUT")).Queries("policy", "") + bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketPolicyHandler, ACTION_WRITE)), "PUT")).Queries("policy", "") // DeleteBucketPolicy - bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketPolicyHandler, ACTION_WRITE)), "DELETE")).Queries("policy", "") + bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketPolicyHandler, ACTION_WRITE)), "DELETE")).Queries("policy", "") // GetBucketCors - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketCorsHandler, ACTION_READ)), "GET")).Queries("cors", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketCorsHandler, ACTION_READ)), "GET")).Queries("cors", "") // PutBucketCors - bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketCorsHandler, ACTION_WRITE)), "PUT")).Queries("cors", "") + bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketCorsHandler, ACTION_WRITE)), "PUT")).Queries("cors", "") // DeleteBucketCors - bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketCorsHandler, ACTION_WRITE)), "DELETE")).Queries("cors", "") + bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketCorsHandler, ACTION_WRITE)), "DELETE")).Queries("cors", "") // GetBucketLifecycleConfiguration - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLifecycleConfigurationHandler, ACTION_READ)), "GET")).Queries("lifecycle", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLifecycleConfigurationHandler, ACTION_READ)), "GET")).Queries("lifecycle", "") // PutBucketLifecycleConfiguration - bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketLifecycleConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("lifecycle", "") + bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketLifecycleConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("lifecycle", "") // DeleteBucketLifecycleConfiguration - bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketLifecycleHandler, ACTION_WRITE)), "DELETE")).Queries("lifecycle", "") + bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketLifecycleHandler, ACTION_WRITE)), "DELETE")).Queries("lifecycle", "") // GetBucketLocation - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLocationHandler, ACTION_READ)), "GET")).Queries("location", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLocationHandler, ACTION_READ)), "GET")).Queries("location", "") // GetBucketRequestPayment - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketRequestPaymentHandler, ACTION_READ)), "GET")).Queries("requestPayment", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketRequestPaymentHandler, ACTION_READ)), "GET")).Queries("requestPayment", "") // GetBucketVersioning - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketVersioningHandler, ACTION_READ)), "GET")).Queries("versioning", "") - bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketVersioningHandler, ACTION_WRITE)), "PUT")).Queries("versioning", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketVersioningHandler, ACTION_READ)), "GET")).Queries("versioning", "") + bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketVersioningHandler, ACTION_WRITE)), "PUT")).Queries("versioning", "") // ListObjectsV2 - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV2Handler, ACTION_LIST)), "LIST")).Queries("list-type", "2") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV2Handler, ACTION_LIST)), "LIST")).Queries("list-type", "2") // buckets with query // PutBucketOwnershipControls - bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.PutBucketOwnershipControls, ACTION_ADMIN), "PUT")).Queries("ownershipControls", "") + bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.PutBucketOwnershipControls, ACTION_ADMIN), "PUT")).Queries("ownershipControls", "") //GetBucketOwnershipControls - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.GetBucketOwnershipControls, ACTION_READ), "GET")).Queries("ownershipControls", "") + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.GetBucketOwnershipControls, ACTION_READ), "GET")).Queries("ownershipControls", "") //DeleteBucketOwnershipControls - bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.DeleteBucketOwnershipControls, ACTION_ADMIN), "DELETE")).Queries("ownershipControls", "") + bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.DeleteBucketOwnershipControls, ACTION_ADMIN), "DELETE")).Queries("ownershipControls", "") // raw buckets // PostPolicy - bucket.Methods("POST").HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PostPolicyBucketHandler, ACTION_WRITE)), "POST")) + bucket.Methods(http.MethodPost).HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PostPolicyBucketHandler, ACTION_WRITE)), "POST")) // HeadBucket - bucket.Methods("HEAD").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadBucketHandler, ACTION_READ)), "GET")) + bucket.Methods(http.MethodHead).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadBucketHandler, ACTION_READ)), "GET")) // PutBucket - bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketHandler, ACTION_ADMIN)), "PUT")) + bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketHandler, ACTION_ADMIN)), "PUT")) // DeleteBucket - bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketHandler, ACTION_DELETE_BUCKET)), "DELETE")) + bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketHandler, ACTION_DELETE_BUCKET)), "DELETE")) // ListObjectsV1 (Legacy) - bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV1Handler, ACTION_LIST)), "LIST")) + bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV1Handler, ACTION_LIST)), "LIST")) // raw buckets } // ListBuckets - apiRouter.Methods("GET").Path("/").HandlerFunc(track(s3a.ListBucketsHandler, "LIST")) + apiRouter.Methods(http.MethodGet).Path("/").HandlerFunc(track(s3a.ListBucketsHandler, "LIST")) // NotFound apiRouter.NotFoundHandler = http.HandlerFunc(s3err.NotFoundHandler) diff --git a/weed/server/common.go b/weed/server/common.go index 57a073169..7be2f8a76 100644 --- a/weed/server/common.go +++ b/weed/server/common.go @@ -127,7 +127,7 @@ func debug(params ...interface{}) { func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterFn operation.GetMasterFn, grpcDialOption grpc.DialOption) { m := make(map[string]interface{}) - if r.Method != "POST" { + if r.Method != http.MethodPost { writeJsonError(w, r, http.StatusMethodNotAllowed, errors.New("Only submit via POST!")) return } diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 94e8e4fed..a02e6c2c1 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -226,7 +226,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) AdjustPassthroughHeaders(w, r, filename) totalSize := int64(entry.Size()) - if r.Method == "HEAD" { + if r.Method == http.MethodHead { w.Header().Set("Content-Length", strconv.FormatInt(totalSize, 10)) return } diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 2698e2209..039bad523 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -39,7 +39,7 @@ func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r * var reply *FilerPostResult var err error var md5bytes []byte - if r.Method == "POST" { + if r.Method == http.MethodPost { if r.Header.Get("Content-Type") == "" && strings.HasSuffix(r.URL.Path, "/") { reply, err = fs.mkdir(ctx, w, r, so) } else { diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index a7f8e9147..ccbd42054 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -84,7 +84,7 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) u, _ := url.Parse(util.NormalizeUrl(lookupResult.Locations[0].Url)) r.URL.Host = u.Host r.URL.Scheme = u.Scheme - request, err := http.NewRequest("GET", r.URL.String(), nil) + request, err := http.NewRequest(http.MethodGet, r.URL.String(), nil) if err != nil { glog.V(0).Infof("failed to instance http request of url %s: %v", r.URL.String(), err) InternalError(w) @@ -253,7 +253,7 @@ func shouldAttemptStreamWrite(hasLocalVolume bool, ext string, r *http.Request) if len(ext) > 0 { ext = strings.ToLower(ext) } - if r.Method == "HEAD" { + if r.Method == http.MethodHead { return true, true } _, _, _, shouldResize := shouldResizeImages(ext, r) @@ -379,7 +379,7 @@ func writeResponseContent(filename, mimeType string, rs io.ReadSeeker, w http.Re AdjustPassthroughHeaders(w, r, filename) - if r.Method == "HEAD" { + if r.Method == http.MethodHead { w.Header().Set("Content-Length", strconv.FormatInt(totalSize, 10)) return nil } @@ -408,7 +408,7 @@ func (vs *VolumeServer) streamWriteResponseContent(filename string, mimeType str w.Header().Set("Accept-Ranges", "bytes") AdjustPassthroughHeaders(w, r, filename) - if r.Method == "HEAD" { + if r.Method == http.MethodHead { w.Header().Set("Content-Length", strconv.FormatInt(totalSize, 10)) return } diff --git a/weed/shell/command_fs_merge_volumes.go b/weed/shell/command_fs_merge_volumes.go index 4a6048a43..f6d55c616 100644 --- a/weed/shell/command_fs_merge_volumes.go +++ b/weed/shell/command_fs_merge_volumes.go @@ -342,7 +342,7 @@ func moveChunk(chunk *filer_pb.FileChunk, toVolumeId needle.VolumeId, masterClie func readUrl(fileUrl string) (*http.Response, io.ReadCloser, error) { - req, err := http.NewRequest("GET", fileUrl, nil) + req, err := http.NewRequest(http.MethodGet, fileUrl, nil) if err != nil { return nil, nil, err } diff --git a/weed/storage/needle/needle_parse_upload.go b/weed/storage/needle/needle_parse_upload.go index b512c16a2..28de27910 100644 --- a/weed/storage/needle/needle_parse_upload.go +++ b/weed/storage/needle/needle_parse_upload.go @@ -43,7 +43,7 @@ func ParseUpload(r *http.Request, sizeLimit int64, bytesBuffer *bytes.Buffer) (p } } - if r.Method == "POST" { + if r.Method == http.MethodPost { contentType := r.Header.Get("Content-Type") // If content-type is explicitly set, upload the file without parsing form-data diff --git a/weed/util/http_util.go b/weed/util/http_util.go index 6f6a17008..837b3ccb6 100644 --- a/weed/util/http_util.go +++ b/weed/util/http_util.go @@ -57,7 +57,7 @@ func Get(url string) ([]byte, bool, error) { } func GetAuthenticated(url, jwt string) ([]byte, bool, error) { - request, err := http.NewRequest("GET", url, nil) + request, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, true, err } @@ -112,7 +112,7 @@ func maybeAddAuth(req *http.Request, jwt string) { } func Delete(url string, jwt string) error { - req, err := http.NewRequest("DELETE", url, nil) + req, err := http.NewRequest(http.MethodDelete, url, nil) maybeAddAuth(req, jwt) if err != nil { return err @@ -140,7 +140,7 @@ func Delete(url string, jwt string) error { } func DeleteProxied(url string, jwt string) (body []byte, httpStatus int, err error) { - req, err := http.NewRequest("DELETE", url, nil) + req, err := http.NewRequest(http.MethodDelete, url, nil) maybeAddAuth(req, jwt) if err != nil { return @@ -194,7 +194,7 @@ func GetUrlStream(url string, values url.Values, readFn func(io.Reader) error) e } func DownloadFile(fileUrl string, jwt string) (filename string, header http.Header, resp *http.Response, e error) { - req, err := http.NewRequest("GET", fileUrl, nil) + req, err := http.NewRequest(http.MethodGet, fileUrl, nil) if err != nil { return "", nil, nil, err } @@ -239,7 +239,7 @@ func ReadUrl(fileUrl string, cipherKey []byte, isContentCompressed bool, isFullC return int64(n), err } - req, err := http.NewRequest("GET", fileUrl, nil) + req, err := http.NewRequest(http.MethodGet, fileUrl, nil) if err != nil { return 0, err } @@ -310,7 +310,7 @@ func ReadUrlAsStreamAuthenticated(fileUrl, jwt string, cipherKey []byte, isConte return readEncryptedUrl(fileUrl, jwt, cipherKey, isContentGzipped, isFullChunk, offset, size, fn) } - req, err := http.NewRequest("GET", fileUrl, nil) + req, err := http.NewRequest(http.MethodGet, fileUrl, nil) maybeAddAuth(req, jwt) if err != nil { return false, err @@ -391,7 +391,7 @@ func readEncryptedUrl(fileUrl, jwt string, cipherKey []byte, isContentCompressed func ReadUrlAsReaderCloser(fileUrl string, jwt string, rangeHeader string) (*http.Response, io.ReadCloser, error) { - req, err := http.NewRequest("GET", fileUrl, nil) + req, err := http.NewRequest(http.MethodGet, fileUrl, nil) if err != nil { return nil, nil, err } From 55e7b174e1ab5fc508c08d6a859a2c8ee66536a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:09:41 -0700 Subject: [PATCH 17/42] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.27.2 to 1.30.1 (#5734) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 65a3bdd12..022c86fa6 100644 --- a/go.mod +++ b/go.mod @@ -130,7 +130,7 @@ require ( github.com/Jille/raft-grpc-transport v1.5.0 github.com/arangodb/go-driver v1.6.2 github.com/armon/go-metrics v0.4.1 - github.com/aws/aws-sdk-go-v2 v1.27.2 + github.com/aws/aws-sdk-go-v2 v1.30.1 github.com/aws/aws-sdk-go-v2/config v1.27.16 github.com/aws/aws-sdk-go-v2/credentials v1.17.18 github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1 @@ -200,7 +200,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 // indirect - github.com/aws/smithy-go v1.20.2 // indirect + github.com/aws/smithy-go v1.20.3 // indirect github.com/boltdb/bolt v1.3.1 // indirect github.com/bradenaw/juniper v0.15.2 // indirect github.com/buengese/sgzip v0.1.1 // indirect diff --git a/go.sum b/go.sum index 25bc61927..21e293254 100644 --- a/go.sum +++ b/go.sum @@ -631,8 +631,8 @@ github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/aws/aws-sdk-go v1.54.2 h1:Wo6AVWcleNHrYa48YzfYz60hzxGRqsJrK5s/qePe+3I= github.com/aws/aws-sdk-go v1.54.2/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.27.2 h1:pLsTXqX93rimAOZG2FIYraDQstZaaGVVN4tNw65v0h8= -github.com/aws/aws-sdk-go-v2 v1.27.2/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2 v1.30.1 h1:4y/5Dvfrhd1MxRDD77SrfsDaj8kUkkljU7XE83NPV+o= +github.com/aws/aws-sdk-go-v2 v1.30.1/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= @@ -669,8 +669,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 h1:iXjh3uaH3vsVcnyZX7MqCoCf github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5/go.mod h1:5ZXesEuy/QcO0WUnt+4sDkxhdXRHTu2yG0uCSH8B6os= github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 h1:M/1u4HBpwLuMtjlxuI2y6HoVLzF5e2mfxHCg7ZVMYmk= github.com/aws/aws-sdk-go-v2/service/sts v1.28.12/go.mod h1:kcfd+eTdEi/40FIbLq4Hif3XMXnl5b/+t/KTfLt9xIk= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE= +github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From 76a6a68c4f2a7760787188746082401a47da1206 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:10:09 -0700 Subject: [PATCH 18/42] chore(deps): bump docker/build-push-action from 6.1.0 to 6.2.0 (#5729) --- .github/workflows/container_dev.yml | 2 +- .github/workflows/container_latest.yml | 2 +- .github/workflows/container_release1.yml | 2 +- .github/workflows/container_release2.yml | 2 +- .github/workflows/container_release3.yml | 2 +- .github/workflows/container_release4.yml | 2 +- .github/workflows/container_release5.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/container_dev.yml b/.github/workflows/container_dev.yml index f8a4555f9..2a0b368c5 100644 --- a/.github/workflows/container_dev.yml +++ b/.github/workflows/container_dev.yml @@ -56,7 +56,7 @@ jobs: password: ${{ secrets.GHCR_TOKEN }} - name: Build - uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v2 + uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_latest.yml b/.github/workflows/container_latest.yml index 19329d4d8..03f7666e5 100644 --- a/.github/workflows/container_latest.yml +++ b/.github/workflows/container_latest.yml @@ -57,7 +57,7 @@ jobs: password: ${{ secrets.GHCR_TOKEN }} - name: Build - uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v2 + uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release1.yml b/.github/workflows/container_release1.yml index 868c2a080..43e3d619c 100644 --- a/.github/workflows/container_release1.yml +++ b/.github/workflows/container_release1.yml @@ -47,7 +47,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v2 + uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release2.yml b/.github/workflows/container_release2.yml index 243e65ad3..1d4de4053 100644 --- a/.github/workflows/container_release2.yml +++ b/.github/workflows/container_release2.yml @@ -48,7 +48,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v2 + uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release3.yml b/.github/workflows/container_release3.yml index 4d7572ca5..c293da7be 100644 --- a/.github/workflows/container_release3.yml +++ b/.github/workflows/container_release3.yml @@ -48,7 +48,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v2 + uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release4.yml b/.github/workflows/container_release4.yml index 667ac398a..3c5161c39 100644 --- a/.github/workflows/container_release4.yml +++ b/.github/workflows/container_release4.yml @@ -47,7 +47,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v2 + uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release5.yml b/.github/workflows/container_release5.yml index 66a8bd626..a4022a72a 100644 --- a/.github/workflows/container_release5.yml +++ b/.github/workflows/container_release5.yml @@ -47,7 +47,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v2 + uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} From c08489d18beac600c0269823a25c76f9b16dd4dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:23:33 -0700 Subject: [PATCH 19/42] chore(deps): bump github.com/aws/aws-sdk-go from 1.54.2 to 1.54.13 (#5737) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 022c86fa6..5e7a179c7 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/Azure/azure-pipeline-go v0.2.3 github.com/Azure/azure-storage-blob-go v0.15.0 github.com/Shopify/sarama v1.38.1 - github.com/aws/aws-sdk-go v1.54.2 + github.com/aws/aws-sdk-go v1.54.13 github.com/beorn7/perks v1.0.1 // indirect github.com/bwmarrin/snowflake v0.3.0 github.com/cenkalti/backoff/v4 v4.3.0 diff --git a/go.sum b/go.sum index 21e293254..bcfcf171c 100644 --- a/go.sum +++ b/go.sum @@ -629,8 +629,8 @@ github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQh github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/aws/aws-sdk-go v1.54.2 h1:Wo6AVWcleNHrYa48YzfYz60hzxGRqsJrK5s/qePe+3I= -github.com/aws/aws-sdk-go v1.54.2/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.54.13 h1:zpCuiG+/mFdDY/klKJvmSioAZWk45F4rLGq0JWVAAzk= +github.com/aws/aws-sdk-go v1.54.13/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.30.1 h1:4y/5Dvfrhd1MxRDD77SrfsDaj8kUkkljU7XE83NPV+o= github.com/aws/aws-sdk-go-v2 v1.30.1/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= From 861073b54841b27cde2bfc5956dc0c3bdc9075d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:26:05 -0700 Subject: [PATCH 20/42] chore(deps): bump golang.org/x/tools from 0.21.1-0.20240508182429-e35e4ccd0d2d to 0.22.0 (#5733) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 5e7a179c7..4038ce7bf 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sys v0.21.0 golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d + golang.org/x/tools v0.22.0 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.184.0 google.golang.org/genproto v0.0.0-20240604185151-ef581f913117 // indirect @@ -324,7 +324,7 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.18.0 // indirect golang.org/x/term v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 // indirect diff --git a/go.sum b/go.sum index bcfcf171c..632c71799 100644 --- a/go.sum +++ b/go.sum @@ -1726,8 +1726,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2068,8 +2068,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 0c080251b86b876602267378f8d3f99e294ac68f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:26:19 -0700 Subject: [PATCH 21/42] chore(deps): bump github.com/schollz/progressbar/v3 from 3.14.3 to 3.14.4 (#5731) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4038ce7bf..95d752352 100644 --- a/go.mod +++ b/go.mod @@ -147,7 +147,7 @@ require ( github.com/rabbitmq/amqp091-go v1.10.0 github.com/rclone/rclone v1.66.0 github.com/rdleal/intervalst v1.4.0 - github.com/schollz/progressbar/v3 v3.14.3 + github.com/schollz/progressbar/v3 v3.14.4 github.com/shirou/gopsutil/v3 v3.24.5 github.com/tikv/client-go/v2 v2.0.7 github.com/ydb-platform/ydb-go-sdk-auth-environ v0.4.2 diff --git a/go.sum b/go.sum index 632c71799..da1d95295 100644 --- a/go.sum +++ b/go.sum @@ -1410,8 +1410,8 @@ github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6ke github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/schollz/progressbar/v3 v3.14.3 h1:oOuWW19ka12wxYU1XblR4n16wF/2Y1dBLMarMo6p4xU= -github.com/schollz/progressbar/v3 v3.14.3/go.mod h1:aT3UQ7yGm+2ZjeXPqsjTenwL3ddUiuZ0kfQ/2tHlyNI= +github.com/schollz/progressbar/v3 v3.14.4 h1:W9ZrDSJk7eqmQhd3uxFNNcTr0QL+xuGNI9dEMrw0r74= +github.com/schollz/progressbar/v3 v3.14.4/go.mod h1:aT3UQ7yGm+2ZjeXPqsjTenwL3ddUiuZ0kfQ/2tHlyNI= github.com/seaweedfs/goexif v1.0.3 h1:ve/OjI7dxPW8X9YQsv3JuVMaxEyF9Rvfd04ouL+Bz30= github.com/seaweedfs/goexif v1.0.3/go.mod h1:Oni780Z236sXpIQzk1XoJlTwqrJ02smEin9zQeff7Fk= github.com/seaweedfs/raft v1.1.3 h1:5B6hgneQ7IuU4Ceom/f6QUt8pEeqjcsRo+IxlyPZCws= From f9eedc9c72176e5425409d58adc7cf2adddd0d4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:26:38 -0700 Subject: [PATCH 22/42] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.55.1 to 1.58.0 (#5738) --- go.mod | 18 +++++++++--------- go.sum | 36 ++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 95d752352..4940fbc6a 100644 --- a/go.mod +++ b/go.mod @@ -133,7 +133,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.30.1 github.com/aws/aws-sdk-go-v2/config v1.27.16 github.com/aws/aws-sdk-go-v2/credentials v1.17.18 - github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1 + github.com/aws/aws-sdk-go-v2/service/s3 v1.58.0 github.com/cognusion/imaging v1.0.1 github.com/fluent/fluent-logger-golang v1.9.0 github.com/getsentry/sentry-go v0.28.1 @@ -185,16 +185,16 @@ require ( github.com/andybalholm/brotli v1.1.0 // indirect github.com/andybalholm/cascadia v1.3.2 // indirect github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.13 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.13 // indirect github.com/aws/aws-sdk-go-v2/service/sns v1.29.2 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.31.2 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 // indirect diff --git a/go.sum b/go.sum index da1d95295..3817faa82 100644 --- a/go.sum +++ b/go.sum @@ -633,32 +633,32 @@ github.com/aws/aws-sdk-go v1.54.13 h1:zpCuiG+/mFdDY/klKJvmSioAZWk45F4rLGq0JWVAAz github.com/aws/aws-sdk-go v1.54.13/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.30.1 h1:4y/5Dvfrhd1MxRDD77SrfsDaj8kUkkljU7XE83NPV+o= github.com/aws/aws-sdk-go-v2 v1.30.1/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM= github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= github.com/aws/aws-sdk-go-v2/credentials v1.17.18 h1:D/ALDWqK4JdY3OFgA2thcPO1c9aYTT5STS/CvnkqY1c= github.com/aws/aws-sdk-go-v2/credentials v1.17.18/go.mod h1:JuitCWq+F5QGUrmMPsk945rop6bB57jdscu+Glozdnc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 h1:dDgptDO9dxeFkXy+tEgVkzSClHZje/6JkPW5aZyEvrQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5/go.mod h1:gjvE2KBUgUQhcv89jqxrIxH9GaKs1JbZzWejj/DaHGA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 h1:cy8ahBJuhtM8GTTSyOkfy6WVPV1IE+SS5/wfXUYuulw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9/go.mod h1:CZBXGLaJnEZI6EVNcPd7a6B5IC5cA/GkRWtu9fp3S6Y= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 h1:A4SYk07ef04+vxZToz9LWvAXl9LW0NClpPpMsi31cz0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9/go.mod h1:5jJcHuwDagxN+ErjQ3PU3ocf6Ylc/p9x+BLO/+X4iXw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.13 h1:5SAoZ4jYpGH4721ZNoS1znQrhOfZinOhc4XuTXx/nVc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.13/go.mod h1:+rdA6ZLpaSeM7tSg/B0IEDinCIBJGmW8rKDFkYpP04g= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.13 h1:WIijqeaAO7TYFLbhsZmi2rgLEAtWOC1LhxCAVTJlSKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.13/go.mod h1:i+kbfa76PQbWw/ULoWnp51EYVWH4ENln76fLQE3lXT8= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9 h1:vHyZxoLVOgrI8GqX7OMHLXp4YYoxeEsrjweXKpye+ds= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9/go.mod h1:z9VXZsWA2BvZNH1dT0ToUYwMu/CR9Skkj/TBX+mceZw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11 h1:4vt9Sspk59EZyHCAEMaktHKiq0C09noRTQorXD/qV+s= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11/go.mod h1:5jHR79Tv+Ccq6rwYh+W7Nptmw++WiFafMfR42XhwNl8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 h1:o4T+fKxA3gTMcluBNZZXE9DNaMkJuUL1O3mffCUjoJo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11/go.mod h1:84oZdJ+VjuJKs9v1UTC9NaodRZRseOXCTgku+vQJWR8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9 h1:TE2i0A9ErH1YfRSvXfCr2SQwfnqsoJT9nPQ9kj0lkxM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9/go.mod h1:9TzXX3MehQNGPwCZ3ka4CpwQsoAMWSF48/b+De9rfVM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1 h1:UAxBuh0/8sFJk1qOkvOKewP5sWeWaTPDknbQz0ZkDm0= -github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1/go.mod h1:hWjsYGjVuqCgfoveVcVFPXIWgz0aByzwaxKlN1StKcM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.13 h1:THZJJ6TU/FOiM7DZFnisYV9d49oxXWUzsVIMTuf3VNU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.13/go.mod h1:VISUTg6n+uBaYIWPBaIG0jk7mbBxm7DUqBtU2cUDDWI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.15 h1:2jyRZ9rVIMisyQRnhSS/SqlckveoxXneIumECVFP91Y= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.15/go.mod h1:bDRG3m382v1KJBk1cKz7wIajg87/61EiiymEyfLvAe0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.15 h1:I9zMeF107l0rJrpnHpjEiiTSCKYAIw8mALiXcPsGBiA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.15/go.mod h1:9xWJ3Q/S6Ojusz1UIkfycgD1mGirJfLLKqq3LPT7WN8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.13 h1:Eq2THzHt6P41mpjS2sUzz/3dJYFRqdWZ+vQaEMm98EM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.13/go.mod h1:FgwTca6puegxgCInYwGjmd4tB9195Dd6LCuA+8MjpWw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.58.0 h1:4rhV0Hn+bf8IAIUphRX1moBcEvKJipCPmswMCl6Q5mw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.58.0/go.mod h1:hdV0NTYd0RwV4FvNKhKUNbPLZoq9CTr/lke+3I7aCAI= github.com/aws/aws-sdk-go-v2/service/sns v1.29.2 h1:kHm1SYs/NkxZpKINc4zOXOLJHVMzKtU4d7FlAMtDm50= github.com/aws/aws-sdk-go-v2/service/sns v1.29.2/go.mod h1:ZIs7/BaYel9NODoYa8PW39o15SFAXDEb4DxOG2It15U= github.com/aws/aws-sdk-go-v2/service/sqs v1.31.2 h1:A9ihuyTKpS8Z1ou/D4ETfOEFMyokA6JjRsgXWTiHvCk= From 69003d0e906e098cf6db11da05d915d0718a5eba Mon Sep 17 00:00:00 2001 From: chrislu Date: Tue, 2 Jul 2024 21:36:01 -0700 Subject: [PATCH 23/42] directory can paginate --- weed/server/filer_ui/filer.html | 3 ++- weed/server/filer_ui/templates.go | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/weed/server/filer_ui/filer.html b/weed/server/filer_ui/filer.html index 28425f180..95de799d8 100644 --- a/weed/server/filer_ui/filer.html +++ b/weed/server/filer_ui/filer.html @@ -116,13 +116,14 @@ {{ else }} {{ $path := .Path }} + {{ $limit := .Limit }} {{ $showDirDel := .ShowDirectoryDelete }} {{ range $entry_index, $entry := .Entries }}
{{ if $entry.IsDirectory }}   - + {{ $entry.Name }} {{ else }} diff --git a/weed/server/filer_ui/templates.go b/weed/server/filer_ui/templates.go index f9ef064bc..4a1822d7e 100644 --- a/weed/server/filer_ui/templates.go +++ b/weed/server/filer_ui/templates.go @@ -9,9 +9,15 @@ import ( ) func printpath(parts ...string) string { - concat := strings.Join(parts, "") - escaped := url.PathEscape(concat) - return strings.ReplaceAll(escaped, "%2F", "/") + var escapedParts []string + for _, p := range parts { + if len(p) == 1 { + escapedParts = append(escapedParts, p) + } else { + escapedParts = append(escapedParts, url.PathEscape(p)) + } + } + return strings.Join(escapedParts, "") } var funcMap = template.FuncMap{ From 761a1555de2a114a525ddf1c30435f13bab76c84 Mon Sep 17 00:00:00 2001 From: chrislu Date: Tue, 2 Jul 2024 23:55:40 -0700 Subject: [PATCH 24/42] fix ordering --- weed/server/filer_ui/filer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/server/filer_ui/filer.html b/weed/server/filer_ui/filer.html index 95de799d8..149d57647 100644 --- a/weed/server/filer_ui/filer.html +++ b/weed/server/filer_ui/filer.html @@ -99,7 +99,7 @@ {{ range $entry := .Breadcrumbs }}
  • {{ $entry.Name }} -
  • + {{ end }} From 62c29b2398fcdccfff57d433b14e18e1a249b0ab Mon Sep 17 00:00:00 2001 From: chrislu Date: Tue, 2 Jul 2024 23:55:48 -0700 Subject: [PATCH 25/42] Revert "directory can paginate" This reverts commit 69003d0e906e098cf6db11da05d915d0718a5eba. --- weed/server/filer_ui/filer.html | 3 +-- weed/server/filer_ui/templates.go | 12 +++--------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/weed/server/filer_ui/filer.html b/weed/server/filer_ui/filer.html index 149d57647..fa5cdd4e8 100644 --- a/weed/server/filer_ui/filer.html +++ b/weed/server/filer_ui/filer.html @@ -116,14 +116,13 @@ {{ else }} {{ $path := .Path }} - {{ $limit := .Limit }} {{ $showDirDel := .ShowDirectoryDelete }} {{ range $entry_index, $entry := .Entries }}
    {{ if $entry.IsDirectory }}   - + {{ $entry.Name }} {{ else }} diff --git a/weed/server/filer_ui/templates.go b/weed/server/filer_ui/templates.go index 4a1822d7e..f9ef064bc 100644 --- a/weed/server/filer_ui/templates.go +++ b/weed/server/filer_ui/templates.go @@ -9,15 +9,9 @@ import ( ) func printpath(parts ...string) string { - var escapedParts []string - for _, p := range parts { - if len(p) == 1 { - escapedParts = append(escapedParts, p) - } else { - escapedParts = append(escapedParts, url.PathEscape(p)) - } - } - return strings.Join(escapedParts, "") + concat := strings.Join(parts, "") + escaped := url.PathEscape(concat) + return strings.ReplaceAll(escaped, "%2F", "/") } var funcMap = template.FuncMap{ From 8943a572d8c742fd1d095623dc4cda0ea49e026c Mon Sep 17 00:00:00 2001 From: chrislu Date: Wed, 3 Jul 2024 09:50:47 -0700 Subject: [PATCH 26/42] log error message --- weed/command/filer_meta_backup.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/command/filer_meta_backup.go b/weed/command/filer_meta_backup.go index 87623cf4e..c47ccbd0c 100644 --- a/weed/command/filer_meta_backup.go +++ b/weed/command/filer_meta_backup.go @@ -63,9 +63,9 @@ func runFilerMetaBackup(cmd *Command, args []string) bool { v.SetConfigFile(*metaBackup.backupFilerConfig) if err := v.ReadInConfig(); err != nil { // Handle errors reading the config file - glog.Fatalf("Failed to load %s file.\nPlease use this command to generate the a %s.toml file\n"+ + glog.Fatalf("Failed to load %s file: %v\nPlease use this command to generate the a %s.toml file\n"+ " weed scaffold -config=%s -output=.\n\n\n", - *metaBackup.backupFilerConfig, "backup_filer", "filer") + *metaBackup.backupFilerConfig, err, "backup_filer", "filer") } if err := metaBackup.initStore(v); err != nil { From 7ee1f520a4b1b200fa7ff71e9d22dff903ae59a4 Mon Sep 17 00:00:00 2001 From: rhysm Date: Thu, 4 Jul 2024 10:51:25 +1200 Subject: [PATCH 27/42] volume.tier.upload: Fix deleting replicated volumes (#5743) Co-authored-by: Rhys M --- weed/shell/command_volume_tier_upload.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/weed/shell/command_volume_tier_upload.go b/weed/shell/command_volume_tier_upload.go index 6932317ab..cb805b0cf 100644 --- a/weed/shell/command_volume_tier_upload.go +++ b/weed/shell/command_volume_tier_upload.go @@ -113,11 +113,14 @@ func doVolumeTierUpload(commandEnv *CommandEnv, writer io.Writer, collection str return fmt.Errorf("copy dat file for volume %d on %s to %s: %v", vid, existingLocations[0].Url, dest, err) } + if keepLocalDatFile { + return nil + } // now the first replica has the .idx and .vif files. // ask replicas on other volume server to delete its own local copy for i, location := range existingLocations { if i == 0 { - break + continue } fmt.Printf("delete volume %d from %s\n", vid, location.Url) err = deleteVolume(commandEnv.option.GrpcDialOption, vid, location.ServerAddress(), false) From 7c06306857feb2ef90452460735ad9c253c47f35 Mon Sep 17 00:00:00 2001 From: chrislu Date: Wed, 3 Jul 2024 17:40:55 -0700 Subject: [PATCH 28/42] fix breadcrumb --- weed/server/filer_ui/breadcrumb.go | 3 + weed/server/filer_ui/breadcrumb_test.go | 74 +++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 weed/server/filer_ui/breadcrumb_test.go diff --git a/weed/server/filer_ui/breadcrumb.go b/weed/server/filer_ui/breadcrumb.go index abb6cce9a..638638196 100644 --- a/weed/server/filer_ui/breadcrumb.go +++ b/weed/server/filer_ui/breadcrumb.go @@ -13,6 +13,9 @@ type Breadcrumb struct { func ToBreadcrumb(fullpath string) (crumbs []Breadcrumb) { parts := strings.Split(fullpath, "/") + if fullpath == "/" { + parts = []string{""} + } for i := 0; i < len(parts); i++ { name := parts[i] diff --git a/weed/server/filer_ui/breadcrumb_test.go b/weed/server/filer_ui/breadcrumb_test.go new file mode 100644 index 000000000..aac3c7de6 --- /dev/null +++ b/weed/server/filer_ui/breadcrumb_test.go @@ -0,0 +1,74 @@ +package filer_ui + +import ( + "reflect" + "testing" +) + +func TestToBreadcrumb(t *testing.T) { + type args struct { + fullpath string + } + tests := []struct { + name string + args args + wantCrumbs []Breadcrumb + }{ + { + name: "test1", + args: args{ + fullpath: "/", + }, + wantCrumbs: []Breadcrumb{ + { + Name: "/", + Link: "/", + }, + }, + }, + { + name: "test2", + args: args{ + fullpath: "/abc", + }, + wantCrumbs: []Breadcrumb{ + { + Name: "/", + Link: "/", + }, + { + Name: "abc", + Link: "/abc/", + }, + }, + }, + { + name: "test3", + args: args{ + fullpath: "/abc/def", + }, + wantCrumbs: []Breadcrumb{ + { + Name: "/", + Link: "/", + }, + { + Name: "abc", + Link: "/abc/", + }, + { + Name: "def", + Link: "/abc/def/", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if gotCrumbs := ToBreadcrumb(tt.args.fullpath); !reflect.DeepEqual(gotCrumbs, tt.wantCrumbs) { + t.Errorf("ToBreadcrumb() = %v, want %v", gotCrumbs, tt.wantCrumbs) + } + }) + } +} From f77eee667df234ff0cdc98195f04b58e5d3a4110 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.com> Date: Thu, 4 Jul 2024 23:00:41 +0500 Subject: [PATCH 29/42] add s3test for sql (#5718) * add s3test for sql * fix test test_bucket_listv2_delimiter_basic for s3 * fix action s3tests * regen s3 api xsd * rm minor s3 test test_bucket_listv2_fetchowner_defaultempty * add docs * without xmlns --- .github/workflows/s3tests.yml | 90 +- weed/s3api/AmazonS3.xsd | 1 + weed/s3api/README.txt | 8 +- weed/s3api/s3api_bucket_handlers.go | 24 +- weed/s3api/s3api_bucket_handlers_test.go | 29 +- weed/s3api/s3api_object_handlers.go | 42 +- weed/s3api/s3api_object_handlers_list.go | 122 +- weed/s3api/s3api_object_handlers_list_test.go | 2 +- weed/s3api/s3api_xsd_generated.go | 1066 ++++++++++++----- weed/s3api/s3api_xsd_generated_helper.go | 10 + .../filer_server_handlers_write_autochunk.go | 11 +- 11 files changed, 1037 insertions(+), 368 deletions(-) create mode 100644 weed/s3api/s3api_xsd_generated_helper.go diff --git a/.github/workflows/s3tests.yml b/.github/workflows/s3tests.yml index 866f2d888..f7f762fc1 100644 --- a/.github/workflows/s3tests.yml +++ b/.github/workflows/s3tests.yml @@ -34,7 +34,7 @@ jobs: go-version-file: 'go.mod' id: go - - name: Run Ceph S3 tests + - name: Run Ceph S3 tests with KV store timeout-minutes: 15 env: S3TEST_CONF: /__w/seaweedfs/seaweedfs/docker/compose/s3tests.conf @@ -43,17 +43,21 @@ jobs: cd /__w/seaweedfs/seaweedfs/weed go install -buildvcs=false set -x - nohup weed -v 0 server -filer -filer.maxMB=64 -s3 -ip.bind 0.0.0.0 \ + weed -v 0 server -filer -filer.maxMB=64 -s3 -ip.bind 0.0.0.0 \ -master.raftHashicorp -master.electionTimeout 1s -master.volumeSizeLimitMB=1024 \ -volume.max=100 -volume.preStopSeconds=1 -s3.port=8000 -metricsPort=9324 \ -s3.allowEmptyFolder=false -s3.allowDeleteBucketNotEmpty=true -s3.config=../docker/compose/s3.json & + pid=$! sleep 10 cd /s3-tests + sed -i "s/assert prefixes == \['foo%2B1\/', 'foo\/', 'quux%20ab\/'\]/assert prefixes == \['foo\/', 'foo%2B1\/', 'quux%20ab\/'\]/" s3tests_boto3/functional/test_s3.py tox -- \ s3tests_boto3/functional/test_s3.py::test_bucket_list_empty \ s3tests_boto3/functional/test_s3.py::test_bucket_list_distinct \ s3tests_boto3/functional/test_s3.py::test_bucket_list_many \ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_many \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_basic \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_encoding_basic \ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix \ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_ends_with_delimiter \ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_alt \ @@ -94,6 +98,7 @@ jobs: s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_zero \ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_none \ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_empty \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken_empty \ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken \ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_both_continuationtoken_startafter \ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_unreadable \ @@ -198,3 +203,84 @@ jobs: s3tests_boto3/functional/test_s3.py::test_lifecycle_set \ s3tests_boto3/functional/test_s3.py::test_lifecycle_get \ s3tests_boto3/functional/test_s3.py::test_lifecycle_set_filter + kill -9 $pid || true + + - name: Run Ceph S3 tests with SQL store + timeout-minutes: 15 + env: + S3TEST_CONF: /__w/seaweedfs/seaweedfs/docker/compose/s3tests.conf + shell: bash + run: | + cd /__w/seaweedfs/seaweedfs/weed + go install -tags "sqlite" -buildvcs=false + export WEED_LEVELDB2_ENABLED="false" WEED_SQLITE_ENABLED="true" WEED_SQLITE_DBFILE="./filer.db" + set -x + weed -v 0 server -filer -filer.maxMB=64 -s3 -ip.bind 0.0.0.0 \ + -master.raftHashicorp -master.electionTimeout 1s -master.volumeSizeLimitMB=1024 \ + -volume.max=100 -volume.preStopSeconds=1 -s3.port=8000 -metricsPort=9324 \ + -s3.allowEmptyFolder=false -s3.allowDeleteBucketNotEmpty=true -s3.config=../docker/compose/s3.json & + pid=$! + sleep 10 + cd /s3-tests + sed -i "s/assert prefixes == \['foo%2B1\/', 'foo\/', 'quux%20ab\/'\]/assert prefixes == \['foo\/', 'foo%2B1\/', 'quux%20ab\/'\]/" s3tests_boto3/functional/test_s3.py + tox -- \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_empty \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_distinct \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_many \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_many \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_basic \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_encoding_basic \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_ends_with_delimiter \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_alt \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_underscore \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_percentage \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_whitespace \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_dot \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_unreadable \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_empty \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_none \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_basic \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_basic \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_alt \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_alt \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_prefix_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_prefix_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_delimiter_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_delimiter_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_prefix_delimiter_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_fetchowner_notempty \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_basic \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_basic \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_alt \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_alt \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_empty \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_empty \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_none \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_none \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_not_exist \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_unreadable \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_unreadable \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_one \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_one \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_zero \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_zero \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_none \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_empty \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken_empty \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_both_continuationtoken_startafter \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_unreadable \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_unreadable \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_not_in_list \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_not_in_list \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_after_list \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_after_list \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_objects_anonymous_fail \ + s3tests_boto3/functional/test_s3.py::test_bucket_listv2_objects_anonymous_fail \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_long_name \ + s3tests_boto3/functional/test_s3.py::test_bucket_list_special_prefix + kill -9 $pid || true diff --git a/weed/s3api/AmazonS3.xsd b/weed/s3api/AmazonS3.xsd index 8016a6a83..8a0136b44 100644 --- a/weed/s3api/AmazonS3.xsd +++ b/weed/s3api/AmazonS3.xsd @@ -525,6 +525,7 @@ + diff --git a/weed/s3api/README.txt b/weed/s3api/README.txt index 10a18ff4d..f7eb1988a 100644 --- a/weed/s3api/README.txt +++ b/weed/s3api/README.txt @@ -1,7 +1,7 @@ see https://blog.aqwari.net/xml-schema-go/ 1. go get aqwari.net/xml/cmd/xsdgen -2. xsdgen -o s3api_xsd_generated.go -pkg s3api AmazonS3.xsd - - - +2. Add EncodingType element for ListBucketResult in AmazonS3.xsd +3. xsdgen -o s3api_xsd_generated.go -pkg s3api AmazonS3.xsd +4. Remove empty Grantee struct in s3api_xsd_generated.go +5. Remove xmlns: sed s'/http:\/\/s3.amazonaws.com\/doc\/2006-03-01\/\ //' s3api_xsd_generated.go diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go index 12d2c0432..e3fa778a5 100644 --- a/weed/s3api/s3api_bucket_handlers.go +++ b/weed/s3api/s3api_bucket_handlers.go @@ -28,12 +28,6 @@ import ( "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" ) -type ListAllMyBucketsResult struct { - XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListAllMyBucketsResult"` - Owner *s3.Owner - Buckets []*s3.Bucket `xml:"Buckets>Bucket"` -} - func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Request) { glog.V(3).Infof("ListBucketsHandler") @@ -59,25 +53,25 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques identityId := r.Header.Get(s3_constants.AmzIdentityId) - var buckets []*s3.Bucket + var listBuckets ListAllMyBucketsList for _, entry := range entries { if entry.IsDirectory { if identity != nil && !identity.canDo(s3_constants.ACTION_LIST, entry.Name, "") { continue } - buckets = append(buckets, &s3.Bucket{ - Name: aws.String(entry.Name), - CreationDate: aws.Time(time.Unix(entry.Attributes.Crtime, 0).UTC()), + listBuckets.Bucket = append(listBuckets.Bucket, ListAllMyBucketsEntry{ + Name: entry.Name, + CreationDate: time.Unix(entry.Attributes.Crtime, 0).UTC(), }) } } response = ListAllMyBucketsResult{ - Owner: &s3.Owner{ - ID: aws.String(identityId), - DisplayName: aws.String(identityId), + Owner: CanonicalUser{ + ID: identityId, + DisplayName: identityId, }, - Buckets: buckets, + Buckets: listBuckets, } writeSuccessResponseXML(w, r, response) @@ -487,7 +481,7 @@ func (s3a *S3ApiServer) DeleteBucketLifecycleHandler(w http.ResponseWriter, r *h // GetBucketLocationHandler Get bucket location // https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html func (s3a *S3ApiServer) GetBucketLocationHandler(w http.ResponseWriter, r *http.Request) { - writeSuccessResponseXML(w, r, LocationConstraint{}) + writeSuccessResponseXML(w, r, CreateBucketConfiguration{}) } // GetBucketRequestPaymentHandler Get bucket location diff --git a/weed/s3api/s3api_bucket_handlers_test.go b/weed/s3api/s3api_bucket_handlers_test.go index 1cff45aa0..2c8a3ae2c 100644 --- a/weed/s3api/s3api_bucket_handlers_test.go +++ b/weed/s3api/s3api_bucket_handlers_test.go @@ -4,37 +4,34 @@ import ( "github.com/seaweedfs/seaweedfs/weed/s3api/s3err" "testing" "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/s3" ) func TestListBucketsHandler(t *testing.T) { expected := ` -2011-04-09T12:34:49Ztest12011-02-09T12:34:49Ztest2` +test12011-04-09T12:34:49Ztest22011-02-09T12:34:49Z` var response ListAllMyBucketsResult - var buckets []*s3.Bucket - buckets = append(buckets, &s3.Bucket{ - Name: aws.String("test1"), - CreationDate: aws.Time(time.Date(2011, 4, 9, 12, 34, 49, 0, time.UTC)), + var bucketsList ListAllMyBucketsList + bucketsList.Bucket = append(bucketsList.Bucket, ListAllMyBucketsEntry{ + Name: "test1", + CreationDate: time.Date(2011, 4, 9, 12, 34, 49, 0, time.UTC), }) - buckets = append(buckets, &s3.Bucket{ - Name: aws.String("test2"), - CreationDate: aws.Time(time.Date(2011, 2, 9, 12, 34, 49, 0, time.UTC)), + bucketsList.Bucket = append(bucketsList.Bucket, ListAllMyBucketsEntry{ + Name: "test2", + CreationDate: time.Date(2011, 2, 9, 12, 34, 49, 0, time.UTC), }) response = ListAllMyBucketsResult{ - Owner: &s3.Owner{ - ID: aws.String(""), - DisplayName: aws.String(""), + Owner: CanonicalUser{ + ID: "", + DisplayName: "", }, - Buckets: buckets, + Buckets: bucketsList, } encoded := string(s3err.EncodeXMLResponse(response)) if encoded != expected { - t.Errorf("unexpected output: %s\nexpecting:%s", encoded, expected) + t.Errorf("unexpected output:%s\nexpecting:%s", encoded, expected) } } diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 517a55856..ff7e92304 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -3,6 +3,8 @@ package s3api import ( "bytes" "fmt" + "github.com/seaweedfs/seaweedfs/weed/filer" + "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" "io" "net/http" "net/url" @@ -35,10 +37,17 @@ func urlEscapeObject(object string) string { return "/" + t } +func entryUrlEncode(dir string, entry string, encodingTypeUrl bool) (dirName string, entryName string, prefix string) { + if !encodingTypeUrl { + return dir, entry, entry + } + return urlPathEscape(dir), url.QueryEscape(entry), urlPathEscape(entry) +} + func urlPathEscape(object string) string { var escapedParts []string for _, part := range strings.Split(object, "/") { - escapedParts = append(escapedParts, url.PathEscape(part)) + escapedParts = append(escapedParts, strings.ReplaceAll(url.PathEscape(part), "+", "%2B")) } return strings.Join(escapedParts, "/") } @@ -63,6 +72,37 @@ func removeDuplicateSlashes(object string) string { return result.String() } +func newListEntry(entry *filer_pb.Entry, key string, dir string, name string, bucketPrefix string, fetchOwner bool, isDirectory bool, encodingTypeUrl bool) (listEntry ListEntry) { + storageClass := "STANDARD" + if v, ok := entry.Extended[s3_constants.AmzStorageClass]; ok { + storageClass = string(v) + } + keyFormat := "%s/%s" + if isDirectory { + keyFormat += "/" + } + if key == "" { + key = fmt.Sprintf(keyFormat, dir, name)[len(bucketPrefix):] + } + if encodingTypeUrl { + key = urlPathEscape(key) + } + listEntry = ListEntry{ + Key: key, + LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(), + ETag: "\"" + filer.ETag(entry) + "\"", + Size: int64(filer.FileSize(entry)), + StorageClass: StorageClass(storageClass), + } + if fetchOwner { + listEntry.Owner = CanonicalUser{ + ID: fmt.Sprintf("%x", entry.Attributes.Uid), + DisplayName: entry.Attributes.UserName, + } + } + return listEntry +} + func (s3a *S3ApiServer) toFilerUrl(bucket, object string) string { object = urlPathEscape(removeDuplicateSlashes(object)) destUrl := fmt.Sprintf("http://%s%s/%s%s", diff --git a/weed/s3api/s3api_object_handlers_list.go b/weed/s3api/s3api_object_handlers_list.go index 38e7f6fef..27d18800c 100644 --- a/weed/s3api/s3api_object_handlers_list.go +++ b/weed/s3api/s3api_object_handlers_list.go @@ -4,33 +4,44 @@ import ( "context" "encoding/xml" "fmt" + "github.com/aws/aws-sdk-go/service/s3" "github.com/seaweedfs/seaweedfs/weed/glog" + "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" "github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants" + "github.com/seaweedfs/seaweedfs/weed/s3api/s3err" "io" "net/http" "net/url" "strconv" "strings" - "time" - - "github.com/seaweedfs/seaweedfs/weed/filer" - "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" - "github.com/seaweedfs/seaweedfs/weed/s3api/s3err" ) +type OptionalString struct { + string + set bool +} + +func (o OptionalString) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error { + if !o.set { + return nil + } + return e.EncodeElement(o.string, startElement) +} + type ListBucketResultV2 struct { - XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResult"` - Name string `xml:"Name"` - Prefix string `xml:"Prefix"` - MaxKeys int `xml:"MaxKeys"` - Delimiter string `xml:"Delimiter,omitempty"` - IsTruncated bool `xml:"IsTruncated"` - Contents []ListEntry `xml:"Contents,omitempty"` - CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"` - ContinuationToken string `xml:"ContinuationToken,omitempty"` - NextContinuationToken string `xml:"NextContinuationToken,omitempty"` - KeyCount int `xml:"KeyCount"` - StartAfter string `xml:"StartAfter,omitempty"` + XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResult"` + Name string `xml:"Name"` + Prefix string `xml:"Prefix"` + MaxKeys uint16 `xml:"MaxKeys"` + Delimiter string `xml:"Delimiter,omitempty"` + IsTruncated bool `xml:"IsTruncated"` + Contents []ListEntry `xml:"Contents,omitempty"` + CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"` + ContinuationToken OptionalString `xml:"ContinuationToken,omitempty"` + NextContinuationToken string `xml:"NextContinuationToken,omitempty"` + EncodingType string `xml:"EncodingType,omitempty"` + KeyCount int `xml:"KeyCount"` + StartAfter string `xml:"StartAfter,omitempty"` } func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Request) { @@ -41,19 +52,19 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ bucket, _ := s3_constants.GetBucketAndObject(r) glog.V(3).Infof("ListObjectsV2Handler %s", bucket) - originalPrefix, continuationToken, startAfter, delimiter, _, maxKeys := getListObjectsV2Args(r.URL.Query()) + originalPrefix, startAfter, delimiter, continuationToken, encodingTypeUrl, fetchOwner, maxKeys := getListObjectsV2Args(r.URL.Query()) if maxKeys < 0 { s3err.WriteErrorResponse(w, r, s3err.ErrInvalidMaxKeys) return } - marker := continuationToken - if continuationToken == "" { + marker := continuationToken.string + if !continuationToken.set { marker = startAfter } - response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter) + response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter, encodingTypeUrl, fetchOwner) if err != nil { s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) @@ -68,7 +79,6 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ } responseV2 := &ListBucketResultV2{ - XMLName: response.XMLName, Name: response.Name, CommonPrefixes: response.CommonPrefixes, Contents: response.Contents, @@ -76,11 +86,14 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ Delimiter: response.Delimiter, IsTruncated: response.IsTruncated, KeyCount: len(response.Contents) + len(response.CommonPrefixes), - MaxKeys: response.MaxKeys, + MaxKeys: uint16(response.MaxKeys), NextContinuationToken: response.NextMarker, Prefix: response.Prefix, StartAfter: startAfter, } + if encodingTypeUrl { + responseV2.EncodingType = s3.EncodingTypeUrl + } writeSuccessResponseXML(w, r, responseV2) } @@ -93,14 +106,13 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ bucket, _ := s3_constants.GetBucketAndObject(r) glog.V(3).Infof("ListObjectsV1Handler %s", bucket) - originalPrefix, marker, delimiter, maxKeys := getListObjectsV1Args(r.URL.Query()) + originalPrefix, marker, delimiter, encodingTypeUrl, maxKeys := getListObjectsV1Args(r.URL.Query()) if maxKeys < 0 { s3err.WriteErrorResponse(w, r, s3err.ErrInvalidMaxKeys) return } - - response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter) + response, err := s3a.listFilerEntries(bucket, originalPrefix, uint16(maxKeys), marker, delimiter, encodingTypeUrl, true) if err != nil { s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) @@ -117,7 +129,7 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ writeSuccessResponseXML(w, r, response) } -func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, maxKeys int, originalMarker string, delimiter string) (response ListBucketResult, err error) { +func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, maxKeys uint16, originalMarker string, delimiter string, encodingTypeUrl bool, fetchOwner bool) (response ListBucketResult, err error) { // convert full path prefix into directory name and prefix for entry name requestDir, prefix, marker := normalizePrefixMarker(originalPrefix, originalMarker) bucketPrefix := fmt.Sprintf("%s/%s/", s3a.option.BucketsPath, bucket) @@ -141,23 +153,15 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m empty := true nextMarker, doErr = s3a.doListFilerEntries(client, reqDir, prefix, cursor, marker, delimiter, false, func(dir string, entry *filer_pb.Entry) { empty = false + dirName, entryName, prefixName := entryUrlEncode(dir, entry.Name, encodingTypeUrl) if entry.IsDirectory { if entry.IsDirectoryKeyObject() { - contents = append(contents, ListEntry{ - Key: fmt.Sprintf("%s/%s/", dir, entry.Name)[len(bucketPrefix):], - LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(), - ETag: "\"" + filer.ETag(entry) + "\"", - Owner: CanonicalUser{ - ID: fmt.Sprintf("%x", entry.Attributes.Uid), - DisplayName: entry.Attributes.UserName, - }, - StorageClass: "STANDARD", - }) + contents = append(contents, newListEntry(entry, "", dirName, entryName, bucketPrefix, fetchOwner, true, false)) cursor.maxKeys-- // https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html } else if delimiter == "/" { // A response can contain CommonPrefixes only if you specify a delimiter. commonPrefixes = append(commonPrefixes, PrefixEntry{ - Prefix: fmt.Sprintf("%s/%s/", dir, entry.Name)[len(bucketPrefix):], + Prefix: fmt.Sprintf("%s/%s/", dirName, prefixName)[len(bucketPrefix):], }) //All of the keys (up to 1,000) rolled up into a common prefix count as a single return when calculating the number of returns. cursor.maxKeys-- @@ -195,21 +199,7 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m } } if !delimiterFound { - storageClass := "STANDARD" - if v, ok := entry.Extended[s3_constants.AmzStorageClass]; ok { - storageClass = string(v) - } - contents = append(contents, ListEntry{ - Key: fmt.Sprintf("%s/%s", dir, entry.Name)[len(bucketPrefix):], - LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(), - ETag: "\"" + filer.ETag(entry) + "\"", - Size: int64(filer.FileSize(entry)), - Owner: CanonicalUser{ - ID: fmt.Sprintf("%x", entry.Attributes.Uid), - DisplayName: entry.Attributes.UserName, - }, - StorageClass: StorageClass(storageClass), - }) + contents = append(contents, newListEntry(entry, "", dirName, entryName, bucketPrefix, fetchOwner, false, false)) cursor.maxKeys-- } } @@ -237,13 +227,17 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m Prefix: originalPrefix, Marker: originalMarker, NextMarker: nextMarker, - MaxKeys: maxKeys, + MaxKeys: int(maxKeys), Delimiter: delimiter, IsTruncated: cursor.isTruncated, Contents: contents, CommonPrefixes: commonPrefixes, } - + if encodingTypeUrl { + // Todo used for pass test_bucket_listv2_encoding_basic + // sort.Slice(response.CommonPrefixes, func(i, j int) bool { return response.CommonPrefixes[i].Prefix < response.CommonPrefixes[j].Prefix }) + response.EncodingType = s3.EncodingTypeUrl + } return nil }) @@ -251,7 +245,7 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m } type ListingCursor struct { - maxKeys int + maxKeys uint16 isTruncated bool prefixEndsOnDelimiter bool } @@ -434,13 +428,16 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d return } -func getListObjectsV2Args(values url.Values) (prefix, token, startAfter, delimiter string, fetchOwner bool, maxkeys int) { +func getListObjectsV2Args(values url.Values) (prefix, startAfter, delimiter string, token OptionalString, encodingTypeUrl bool, fetchOwner bool, maxkeys uint16) { prefix = values.Get("prefix") - token = values.Get("continuation-token") + token = OptionalString{set: values.Has("continuation-token"), string: values.Get("continuation-token")} startAfter = values.Get("start-after") delimiter = values.Get("delimiter") + encodingTypeUrl = values.Get("encoding-type") == s3.EncodingTypeUrl if values.Get("max-keys") != "" { - maxkeys, _ = strconv.Atoi(values.Get("max-keys")) + if maxKeys, err := strconv.ParseUint(values.Get("max-keys"), 10, 16); err == nil { + maxkeys = uint16(maxKeys) + } } else { maxkeys = maxObjectListSizeLimit } @@ -448,12 +445,15 @@ func getListObjectsV2Args(values url.Values) (prefix, token, startAfter, delimit return } -func getListObjectsV1Args(values url.Values) (prefix, marker, delimiter string, maxkeys int) { +func getListObjectsV1Args(values url.Values) (prefix, marker, delimiter string, encodingTypeUrl bool, maxkeys int16) { prefix = values.Get("prefix") marker = values.Get("marker") delimiter = values.Get("delimiter") + encodingTypeUrl = values.Get("encoding-type") == "url" if values.Get("max-keys") != "" { - maxkeys, _ = strconv.Atoi(values.Get("max-keys")) + if maxKeys, err := strconv.ParseInt(values.Get("max-keys"), 10, 16); err == nil { + maxkeys = int16(maxKeys) + } } else { maxkeys = maxObjectListSizeLimit } diff --git a/weed/s3api/s3api_object_handlers_list_test.go b/weed/s3api/s3api_object_handlers_list_test.go index 6974c5567..3295c2fca 100644 --- a/weed/s3api/s3api_object_handlers_list_test.go +++ b/weed/s3api/s3api_object_handlers_list_test.go @@ -12,7 +12,7 @@ func TestListObjectsHandler(t *testing.T) { // https://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html expected := ` -test_container1000false1.zip"4397da7a7649e8085de9916c240e8166"123456765a011niqo39cdf8ec533ec3d1ccaafsa932STANDARD2011-04-09T12:34:49Z` +test_container1000false1.zip"4397da7a7649e8085de9916c240e8166"123456765a011niqo39cdf8ec533ec3d1ccaafsa932STANDARD2011-04-09T12:34:49Z` response := ListBucketResult{ Name: "test_container", diff --git a/weed/s3api/s3api_xsd_generated.go b/weed/s3api/s3api_xsd_generated.go index dd6a32ff2..f883287d5 100644 --- a/weed/s3api/s3api_xsd_generated.go +++ b/weed/s3api/s3api_xsd_generated.go @@ -1,3 +1,5 @@ +// Code generated by xsdgen. DO NOT EDIT. + package s3api import ( @@ -17,11 +19,546 @@ type AccessControlPolicy struct { } type AmazonCustomerByEmail struct { - EmailAddress string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ EmailAddress"` + EmailAddress string `xml:"EmailAddress"` +} + +type Anon1 struct { + Bucket string `xml:"Bucket"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon1) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon1 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon1) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon1 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon10 struct { +} + +type Anon11 struct { + Bucket string `xml:"Bucket"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon11) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon11 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon11) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon11 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon12 struct { +} + +type Anon13 struct { + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + GetMetadata bool `xml:"GetMetadata"` + GetData bool `xml:"GetData"` + InlineData bool `xml:"InlineData"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon13) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon13 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon13) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon13 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon14 struct { + GetObjectResponse GetObjectResult `xml:"GetObjectResponse"` +} + +type Anon15 struct { + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + GetMetadata bool `xml:"GetMetadata"` + GetData bool `xml:"GetData"` + InlineData bool `xml:"InlineData"` + ByteRangeStart int64 `xml:"ByteRangeStart,omitempty"` + ByteRangeEnd int64 `xml:"ByteRangeEnd,omitempty"` + IfModifiedSince time.Time `xml:"IfModifiedSince,omitempty"` + IfUnmodifiedSince time.Time `xml:"IfUnmodifiedSince,omitempty"` + IfMatch []string `xml:"IfMatch,omitempty"` + IfNoneMatch []string `xml:"IfNoneMatch,omitempty"` + ReturnCompleteObjectOnConditionFailure bool `xml:"ReturnCompleteObjectOnConditionFailure,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon15) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon15 + var layout struct { + *T + IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"` + IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.IfModifiedSince = (*xsdDateTime)(&layout.T.IfModifiedSince) + layout.IfUnmodifiedSince = (*xsdDateTime)(&layout.T.IfUnmodifiedSince) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon15) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon15 + var overlay struct { + *T + IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"` + IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.IfModifiedSince = (*xsdDateTime)(&overlay.T.IfModifiedSince) + overlay.IfUnmodifiedSince = (*xsdDateTime)(&overlay.T.IfUnmodifiedSince) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon16 struct { + GetObjectResponse GetObjectResult `xml:"GetObjectResponse"` +} + +type Anon17 struct { + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + ContentLength int64 `xml:"ContentLength"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + StorageClass StorageClass `xml:"StorageClass,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon17) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon17 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon17) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon17 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon18 struct { + PutObjectResponse PutObjectResult `xml:"PutObjectResponse"` +} + +type Anon19 struct { + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + Data []byte `xml:"Data"` + ContentLength int64 `xml:"ContentLength"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + StorageClass StorageClass `xml:"StorageClass,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon19) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon19 + var layout struct { + *T + Data *xsdBase64Binary `xml:"Data"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Data = (*xsdBase64Binary)(&layout.T.Data) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon19) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon19 + var overlay struct { + *T + Data *xsdBase64Binary `xml:"Data"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Data = (*xsdBase64Binary)(&overlay.T.Data) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon2 struct { + GetBucketLoggingStatusResponse BucketLoggingStatus `xml:"GetBucketLoggingStatusResponse"` +} + +type Anon20 struct { + PutObjectInlineResponse PutObjectResult `xml:"PutObjectInlineResponse"` +} + +type Anon21 struct { + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon21) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon21 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon21) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon21 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon22 struct { + DeleteObjectResponse Status `xml:"DeleteObjectResponse"` +} + +type Anon23 struct { + Bucket string `xml:"Bucket"` + Prefix string `xml:"Prefix,omitempty"` + Marker string `xml:"Marker,omitempty"` + MaxKeys int `xml:"MaxKeys,omitempty"` + Delimiter string `xml:"Delimiter,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon23) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon23 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon23) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon23 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon24 struct { + ListBucketResponse ListBucketResult `xml:"ListBucketResponse"` +} + +type Anon25 struct { + ListVersionsResponse ListVersionsResult `xml:"ListVersionsResponse"` +} + +type Anon26 struct { + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` +} + +func (t *Anon26) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon26 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon26) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon26 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon27 struct { + ListAllMyBucketsResponse ListAllMyBucketsResult `xml:"ListAllMyBucketsResponse"` +} + +type Anon28 struct { + Location string `xml:"Location"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + ETag string `xml:"ETag"` +} + +type Anon29 struct { + SourceBucket string `xml:"SourceBucket"` + SourceKey string `xml:"SourceKey"` + DestinationBucket string `xml:"DestinationBucket"` + DestinationKey string `xml:"DestinationKey"` + MetadataDirective MetadataDirective `xml:"MetadataDirective,omitempty"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + CopySourceIfModifiedSince time.Time `xml:"CopySourceIfModifiedSince,omitempty"` + CopySourceIfUnmodifiedSince time.Time `xml:"CopySourceIfUnmodifiedSince,omitempty"` + CopySourceIfMatch []string `xml:"CopySourceIfMatch,omitempty"` + CopySourceIfNoneMatch []string `xml:"CopySourceIfNoneMatch,omitempty"` + StorageClass StorageClass `xml:"StorageClass,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon29) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon29 + var layout struct { + *T + CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"` + CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.CopySourceIfModifiedSince = (*xsdDateTime)(&layout.T.CopySourceIfModifiedSince) + layout.CopySourceIfUnmodifiedSince = (*xsdDateTime)(&layout.T.CopySourceIfUnmodifiedSince) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon29) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon29 + var overlay struct { + *T + CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"` + CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.CopySourceIfModifiedSince = (*xsdDateTime)(&overlay.T.CopySourceIfModifiedSince) + overlay.CopySourceIfUnmodifiedSince = (*xsdDateTime)(&overlay.T.CopySourceIfUnmodifiedSince) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon3 struct { + Bucket string `xml:"Bucket"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` + BucketLoggingStatus BucketLoggingStatus `xml:"BucketLoggingStatus"` +} + +func (t *Anon3) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon3 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon3) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon3 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon30 struct { + CopyObjectResult CopyObjectResult `xml:"CopyObjectResult"` +} + +type Anon4 struct { +} + +type Anon5 struct { + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon5) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon5 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon5) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon5 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon6 struct { + GetObjectAccessControlPolicyResponse AccessControlPolicy `xml:"GetObjectAccessControlPolicyResponse"` +} + +type Anon7 struct { + Bucket string `xml:"Bucket"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon7) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon7 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon7) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon7 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) +} + +type Anon8 struct { + GetBucketAccessControlPolicyResponse AccessControlPolicy `xml:"GetBucketAccessControlPolicyResponse"` +} + +type Anon9 struct { + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + AccessControlList AccessControlList `xml:"AccessControlList"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` +} + +func (t *Anon9) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + type T Anon9 + var layout struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + layout.T = (*T)(t) + layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) + return e.EncodeElement(layout, start) +} +func (t *Anon9) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + type T Anon9 + var overlay struct { + *T + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` + } + overlay.T = (*T)(t) + overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) + return d.DecodeElement(&overlay, &start) } type BucketLoggingStatus struct { - LoggingEnabled LoggingSettings `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LoggingEnabled,omitempty"` + LoggingEnabled LoggingSettings `xml:"LoggingEnabled,omitempty"` } type CanonicalUser struct { @@ -30,31 +567,31 @@ type CanonicalUser struct { } type CopyObject struct { - SourceBucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ SourceBucket"` - SourceKey string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ SourceKey"` - DestinationBucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DestinationBucket"` - DestinationKey string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DestinationKey"` - MetadataDirective MetadataDirective `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MetadataDirective,omitempty"` - Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"` - AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"` - CopySourceIfModifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfModifiedSince,omitempty"` - CopySourceIfUnmodifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfUnmodifiedSince,omitempty"` - CopySourceIfMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfMatch,omitempty"` - CopySourceIfNoneMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfNoneMatch,omitempty"` - StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass,omitempty"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + SourceBucket string `xml:"SourceBucket"` + SourceKey string `xml:"SourceKey"` + DestinationBucket string `xml:"DestinationBucket"` + DestinationKey string `xml:"DestinationKey"` + MetadataDirective MetadataDirective `xml:"MetadataDirective,omitempty"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + CopySourceIfModifiedSince time.Time `xml:"CopySourceIfModifiedSince,omitempty"` + CopySourceIfUnmodifiedSince time.Time `xml:"CopySourceIfUnmodifiedSince,omitempty"` + CopySourceIfMatch []string `xml:"CopySourceIfMatch,omitempty"` + CopySourceIfNoneMatch []string `xml:"CopySourceIfNoneMatch,omitempty"` + StorageClass StorageClass `xml:"StorageClass,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *CopyObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T CopyObject var layout struct { *T - CopySourceIfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfModifiedSince,omitempty"` - CopySourceIfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfUnmodifiedSince,omitempty"` - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"` + CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.CopySourceIfModifiedSince = (*xsdDateTime)(&layout.T.CopySourceIfModifiedSince) @@ -66,9 +603,9 @@ func (t *CopyObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error type T CopyObject var overlay struct { *T - CopySourceIfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfModifiedSince,omitempty"` - CopySourceIfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfUnmodifiedSince,omitempty"` - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"` + CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.CopySourceIfModifiedSince = (*xsdDateTime)(&overlay.T.CopySourceIfModifiedSince) @@ -78,19 +615,19 @@ func (t *CopyObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error } type CopyObjectResponse struct { - CopyObjectResult CopyObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopyObjectResult"` + CopyObjectResult CopyObjectResult `xml:"CopyObjectResult"` } type CopyObjectResult struct { - LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` - ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"` + LastModified time.Time `xml:"LastModified"` + ETag string `xml:"ETag"` } func (t *CopyObjectResult) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T CopyObjectResult var layout struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } layout.T = (*T)(t) layout.LastModified = (*xsdDateTime)(&layout.T.LastModified) @@ -100,7 +637,7 @@ func (t *CopyObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) type T CopyObjectResult var overlay struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } overlay.T = (*T)(t) overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified) @@ -108,18 +645,18 @@ func (t *CopyObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) } type CreateBucket struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` + Bucket string `xml:"Bucket"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` } func (t *CreateBucket) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T CreateBucket var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -129,7 +666,7 @@ func (t *CreateBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro type T CreateBucket var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -137,30 +674,30 @@ func (t *CreateBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro } type CreateBucketConfiguration struct { - LocationConstraint string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LocationConstraint"` + LocationConstraint string `xml:"LocationConstraint"` } type CreateBucketResponse struct { - CreateBucketReturn CreateBucketResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CreateBucketReturn"` + CreateBucketReturn CreateBucketResult `xml:"CreateBucketReturn"` } type CreateBucketResult struct { - BucketName string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ BucketName"` + BucketName string `xml:"BucketName"` } type DeleteBucket struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *DeleteBucket) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T DeleteBucket var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -170,7 +707,7 @@ func (t *DeleteBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro type T DeleteBucket var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -178,22 +715,22 @@ func (t *DeleteBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro } type DeleteBucketResponse struct { - DeleteBucketResponse Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DeleteBucketResponse"` + DeleteBucketResponse Status `xml:"DeleteBucketResponse"` } type DeleteMarkerEntry struct { - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - VersionId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ VersionId"` - IsLatest bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IsLatest"` - LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` - Owner CanonicalUser `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Owner,omitempty"` + Key string `xml:"Key"` + VersionId string `xml:"VersionId"` + IsLatest bool `xml:"IsLatest"` + LastModified time.Time `xml:"LastModified"` + Owner CanonicalUser `xml:"Owner,omitempty"` } func (t *DeleteMarkerEntry) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T DeleteMarkerEntry var layout struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } layout.T = (*T)(t) layout.LastModified = (*xsdDateTime)(&layout.T.LastModified) @@ -203,7 +740,7 @@ func (t *DeleteMarkerEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) type T DeleteMarkerEntry var overlay struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } overlay.T = (*T)(t) overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified) @@ -211,19 +748,19 @@ func (t *DeleteMarkerEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) } type DeleteObject struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *DeleteObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T DeleteObject var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -233,7 +770,7 @@ func (t *DeleteObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro type T DeleteObject var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -241,22 +778,22 @@ func (t *DeleteObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro } type DeleteObjectResponse struct { - DeleteObjectResponse Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DeleteObjectResponse"` + DeleteObjectResponse Status `xml:"DeleteObjectResponse"` } type GetBucketAccessControlPolicy struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *GetBucketAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T GetBucketAccessControlPolicy var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -266,7 +803,7 @@ func (t *GetBucketAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St type T GetBucketAccessControlPolicy var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -274,22 +811,22 @@ func (t *GetBucketAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St } type GetBucketAccessControlPolicyResponse struct { - GetBucketAccessControlPolicyResponse AccessControlPolicy `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetBucketAccessControlPolicyResponse"` + GetBucketAccessControlPolicyResponse AccessControlPolicy `xml:"GetBucketAccessControlPolicyResponse"` } type GetBucketLoggingStatus struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *GetBucketLoggingStatus) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T GetBucketLoggingStatus var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -299,7 +836,7 @@ func (t *GetBucketLoggingStatus) UnmarshalXML(d *xml.Decoder, start xml.StartEle type T GetBucketLoggingStatus var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -307,26 +844,26 @@ func (t *GetBucketLoggingStatus) UnmarshalXML(d *xml.Decoder, start xml.StartEle } type GetBucketLoggingStatusResponse struct { - GetBucketLoggingStatusResponse BucketLoggingStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetBucketLoggingStatusResponse"` + GetBucketLoggingStatusResponse BucketLoggingStatus `xml:"GetBucketLoggingStatusResponse"` } type GetObject struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - GetMetadata bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetMetadata"` - GetData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetData"` - InlineData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ InlineData"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + GetMetadata bool `xml:"GetMetadata"` + GetData bool `xml:"GetData"` + InlineData bool `xml:"InlineData"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *GetObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T GetObject var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -336,7 +873,7 @@ func (t *GetObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { type T GetObject var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -344,19 +881,19 @@ func (t *GetObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { } type GetObjectAccessControlPolicy struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *GetObjectAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T GetObjectAccessControlPolicy var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -366,7 +903,7 @@ func (t *GetObjectAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St type T GetObjectAccessControlPolicy var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -374,35 +911,35 @@ func (t *GetObjectAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St } type GetObjectAccessControlPolicyResponse struct { - GetObjectAccessControlPolicyResponse AccessControlPolicy `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetObjectAccessControlPolicyResponse"` + GetObjectAccessControlPolicyResponse AccessControlPolicy `xml:"GetObjectAccessControlPolicyResponse"` } type GetObjectExtended struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - GetMetadata bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetMetadata"` - GetData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetData"` - InlineData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ InlineData"` - ByteRangeStart int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ByteRangeStart,omitempty"` - ByteRangeEnd int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ByteRangeEnd,omitempty"` - IfModifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfModifiedSince,omitempty"` - IfUnmodifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfUnmodifiedSince,omitempty"` - IfMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfMatch,omitempty"` - IfNoneMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfNoneMatch,omitempty"` - ReturnCompleteObjectOnConditionFailure bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ReturnCompleteObjectOnConditionFailure,omitempty"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + GetMetadata bool `xml:"GetMetadata"` + GetData bool `xml:"GetData"` + InlineData bool `xml:"InlineData"` + ByteRangeStart int64 `xml:"ByteRangeStart,omitempty"` + ByteRangeEnd int64 `xml:"ByteRangeEnd,omitempty"` + IfModifiedSince time.Time `xml:"IfModifiedSince,omitempty"` + IfUnmodifiedSince time.Time `xml:"IfUnmodifiedSince,omitempty"` + IfMatch []string `xml:"IfMatch,omitempty"` + IfNoneMatch []string `xml:"IfNoneMatch,omitempty"` + ReturnCompleteObjectOnConditionFailure bool `xml:"ReturnCompleteObjectOnConditionFailure,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *GetObjectExtended) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T GetObjectExtended var layout struct { *T - IfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfModifiedSince,omitempty"` - IfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfUnmodifiedSince,omitempty"` - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"` + IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.IfModifiedSince = (*xsdDateTime)(&layout.T.IfModifiedSince) @@ -414,9 +951,9 @@ func (t *GetObjectExtended) UnmarshalXML(d *xml.Decoder, start xml.StartElement) type T GetObjectExtended var overlay struct { *T - IfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfModifiedSince,omitempty"` - IfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfUnmodifiedSince,omitempty"` - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"` + IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.IfModifiedSince = (*xsdDateTime)(&overlay.T.IfModifiedSince) @@ -426,27 +963,27 @@ func (t *GetObjectExtended) UnmarshalXML(d *xml.Decoder, start xml.StartElement) } type GetObjectExtendedResponse struct { - GetObjectResponse GetObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetObjectResponse"` + GetObjectResponse GetObjectResult `xml:"GetObjectResponse"` } type GetObjectResponse struct { - GetObjectResponse GetObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetObjectResponse"` + GetObjectResponse GetObjectResult `xml:"GetObjectResponse"` } type GetObjectResult struct { - Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"` - Data []byte `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data,omitempty"` - LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` - ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"` - Status Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Status"` + Status Status `xml:"Status"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + Data []byte `xml:"Data,omitempty"` + LastModified time.Time `xml:"LastModified"` + ETag string `xml:"ETag"` } func (t *GetObjectResult) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T GetObjectResult var layout struct { *T - Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data,omitempty"` - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + Data *xsdBase64Binary `xml:"Data,omitempty"` + LastModified *xsdDateTime `xml:"LastModified"` } layout.T = (*T)(t) layout.Data = (*xsdBase64Binary)(&layout.T.Data) @@ -457,8 +994,8 @@ func (t *GetObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e type T GetObjectResult var overlay struct { *T - Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data,omitempty"` - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + Data *xsdBase64Binary `xml:"Data,omitempty"` + LastModified *xsdDateTime `xml:"LastModified"` } overlay.T = (*T)(t) overlay.Data = (*xsdBase64Binary)(&overlay.T.Data) @@ -471,30 +1008,21 @@ type Grant struct { Permission Permission `xml:"Permission"` } -type Grantee struct { - XMLNS string `xml:"xmlns:xsi,attr"` - XMLXSI string `xml:"xsi:type,attr"` - Type string `xml:"Type"` - ID string `xml:"ID,omitempty"` - DisplayName string `xml:"DisplayName,omitempty"` - URI string `xml:"URI,omitempty"` -} - type Group struct { - URI string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ URI"` + URI string `xml:"URI"` } type ListAllMyBuckets struct { - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` } func (t *ListAllMyBuckets) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T ListAllMyBuckets var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -504,7 +1032,7 @@ func (t *ListAllMyBuckets) UnmarshalXML(d *xml.Decoder, start xml.StartElement) type T ListAllMyBuckets var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -542,26 +1070,31 @@ type ListAllMyBucketsList struct { } type ListAllMyBucketsResponse struct { - ListAllMyBucketsResponse ListAllMyBucketsResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListAllMyBucketsResponse"` + ListAllMyBucketsResponse ListAllMyBucketsResult `xml:"ListAllMyBucketsResponse"` +} + +type ListAllMyBucketsResult struct { + Owner CanonicalUser `xml:"Owner"` + Buckets ListAllMyBucketsList `xml:"Buckets"` } type ListBucket struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Prefix string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Prefix,omitempty"` - Marker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Marker,omitempty"` - MaxKeys int `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MaxKeys,omitempty"` - Delimiter string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Delimiter,omitempty"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Prefix string `xml:"Prefix,omitempty"` + Marker string `xml:"Marker,omitempty"` + MaxKeys int `xml:"MaxKeys,omitempty"` + Delimiter string `xml:"Delimiter,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *ListBucket) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T ListBucket var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -571,7 +1104,7 @@ func (t *ListBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error type T ListBucket var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -579,11 +1112,10 @@ func (t *ListBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error } type ListBucketResponse struct { - ListBucketResponse ListBucketResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResponse"` + ListBucketResponse ListBucketResult `xml:"ListBucketResponse"` } type ListBucketResult struct { - XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResult"` Metadata []MetadataEntry `xml:"Metadata,omitempty"` Name string `xml:"Name"` Prefix string `xml:"Prefix"` @@ -594,6 +1126,7 @@ type ListBucketResult struct { IsTruncated bool `xml:"IsTruncated"` Contents []ListEntry `xml:"Contents,omitempty"` CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"` + EncodingType string `xml:"EncodingType"` } type ListEntry struct { @@ -627,48 +1160,44 @@ func (t *ListEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { } type ListVersionsResponse struct { - ListVersionsResponse ListVersionsResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListVersionsResponse"` + ListVersionsResponse ListVersionsResult `xml:"ListVersionsResponse"` } type ListVersionsResult struct { - Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"` - Name string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Name"` - Prefix string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Prefix"` - KeyMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ KeyMarker"` - VersionIdMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ VersionIdMarker"` - NextKeyMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ NextKeyMarker,omitempty"` - NextVersionIdMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ NextVersionIdMarker,omitempty"` - MaxKeys int `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MaxKeys"` - Delimiter string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Delimiter,omitempty"` - IsTruncated bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IsTruncated"` - Version VersionEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Version"` - DeleteMarker DeleteMarkerEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DeleteMarker"` - CommonPrefixes []PrefixEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CommonPrefixes,omitempty"` -} - -type LocationConstraint struct { - LocationConstraint string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LocationConstraint"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + Name string `xml:"Name"` + Prefix string `xml:"Prefix"` + KeyMarker string `xml:"KeyMarker"` + VersionIdMarker string `xml:"VersionIdMarker"` + NextKeyMarker string `xml:"NextKeyMarker,omitempty"` + NextVersionIdMarker string `xml:"NextVersionIdMarker,omitempty"` + MaxKeys int `xml:"MaxKeys"` + Delimiter string `xml:"Delimiter,omitempty"` + IsTruncated bool `xml:"IsTruncated"` + Version VersionEntry `xml:"Version,omitempty"` + DeleteMarker DeleteMarkerEntry `xml:"DeleteMarker,omitempty"` + CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"` } type LoggingSettings struct { - TargetBucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TargetBucket"` - TargetPrefix string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TargetPrefix"` - TargetGrants AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TargetGrants,omitempty"` + TargetBucket string `xml:"TargetBucket"` + TargetPrefix string `xml:"TargetPrefix"` + TargetGrants AccessControlList `xml:"TargetGrants,omitempty"` } // May be one of COPY, REPLACE type MetadataDirective string type MetadataEntry struct { - Name string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Name"` - Value string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Value"` + Name string `xml:"Name"` + Value string `xml:"Value"` } // May be one of Enabled, Disabled type MfaDeleteStatus string type NotificationConfiguration struct { - TopicConfiguration []TopicConfiguration `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TopicConfiguration,omitempty"` + TopicConfiguration []TopicConfiguration `xml:"TopicConfiguration,omitempty"` } // May be one of BucketOwner, Requester @@ -678,10 +1207,10 @@ type Payer string type Permission string type PostResponse struct { - Location string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Location"` - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"` + Location string `xml:"Location"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + ETag string `xml:"ETag"` } type PrefixEntry struct { @@ -689,23 +1218,23 @@ type PrefixEntry struct { } type PutObject struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"` - ContentLength int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ContentLength"` - AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"` - StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass,omitempty"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + ContentLength int64 `xml:"ContentLength"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + StorageClass StorageClass `xml:"StorageClass,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *PutObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T PutObject var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -715,7 +1244,7 @@ func (t *PutObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { type T PutObject var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -723,25 +1252,25 @@ func (t *PutObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { } type PutObjectInline struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"` - Data []byte `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data"` - ContentLength int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ContentLength"` - AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"` - StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass,omitempty"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + Metadata []MetadataEntry `xml:"Metadata,omitempty"` + Data []byte `xml:"Data"` + ContentLength int64 `xml:"ContentLength"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + StorageClass StorageClass `xml:"StorageClass,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *PutObjectInline) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T PutObjectInline var layout struct { *T - Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data"` - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Data *xsdBase64Binary `xml:"Data"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Data = (*xsdBase64Binary)(&layout.T.Data) @@ -752,8 +1281,8 @@ func (t *PutObjectInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e type T PutObjectInline var overlay struct { *T - Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data"` - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Data *xsdBase64Binary `xml:"Data"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Data = (*xsdBase64Binary)(&overlay.T.Data) @@ -762,23 +1291,23 @@ func (t *PutObjectInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e } type PutObjectInlineResponse struct { - PutObjectInlineResponse PutObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ PutObjectInlineResponse"` + PutObjectInlineResponse PutObjectResult `xml:"PutObjectInlineResponse"` } type PutObjectResponse struct { - PutObjectResponse PutObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ PutObjectResponse"` + PutObjectResponse PutObjectResult `xml:"PutObjectResponse"` } type PutObjectResult struct { - ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"` - LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + ETag string `xml:"ETag"` + LastModified time.Time `xml:"LastModified"` } func (t *PutObjectResult) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T PutObjectResult var layout struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } layout.T = (*T)(t) layout.LastModified = (*xsdDateTime)(&layout.T.LastModified) @@ -788,7 +1317,7 @@ func (t *PutObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e type T PutObjectResult var overlay struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } overlay.T = (*T)(t) overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified) @@ -796,27 +1325,27 @@ func (t *PutObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e } type RequestPaymentConfiguration struct { - Payer Payer `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Payer"` + Payer Payer `xml:"Payer"` } type Result struct { - Status Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Status"` + Status Status `xml:"Status"` } type SetBucketAccessControlPolicy struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + AccessControlList AccessControlList `xml:"AccessControlList,omitempty"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *SetBucketAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T SetBucketAccessControlPolicy var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -826,7 +1355,7 @@ func (t *SetBucketAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St type T SetBucketAccessControlPolicy var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -837,19 +1366,19 @@ type SetBucketAccessControlPolicyResponse struct { } type SetBucketLoggingStatus struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` - BucketLoggingStatus BucketLoggingStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ BucketLoggingStatus"` + Bucket string `xml:"Bucket"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` + BucketLoggingStatus BucketLoggingStatus `xml:"BucketLoggingStatus"` } func (t *SetBucketLoggingStatus) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T SetBucketLoggingStatus var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -859,7 +1388,7 @@ func (t *SetBucketLoggingStatus) UnmarshalXML(d *xml.Decoder, start xml.StartEle type T SetBucketLoggingStatus var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -870,20 +1399,20 @@ type SetBucketLoggingStatusResponse struct { } type SetObjectAccessControlPolicy struct { - Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"` - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList"` - AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"` - Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` - Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"` - Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + AccessControlList AccessControlList `xml:"AccessControlList"` + AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"` + Timestamp time.Time `xml:"Timestamp,omitempty"` + Signature string `xml:"Signature,omitempty"` + Credential string `xml:"Credential,omitempty"` } func (t *SetObjectAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T SetObjectAccessControlPolicy var layout struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } layout.T = (*T)(t) layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp) @@ -893,7 +1422,7 @@ func (t *SetObjectAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St type T SetObjectAccessControlPolicy var overlay struct { *T - Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"` + Timestamp *xsdDateTime `xml:"Timestamp,omitempty"` } overlay.T = (*T)(t) overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp) @@ -904,37 +1433,37 @@ type SetObjectAccessControlPolicyResponse struct { } type Status struct { - Code int `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Code"` - Description string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Description"` + Code int `xml:"Code"` + Description string `xml:"Description"` } // May be one of STANDARD, REDUCED_REDUNDANCY, GLACIER, UNKNOWN type StorageClass string type TopicConfiguration struct { - Topic string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Topic"` - Event []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Event"` + Topic string `xml:"Topic"` + Event []string `xml:"Event"` } type User struct { } type VersionEntry struct { - Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"` - VersionId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ VersionId"` - IsLatest bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IsLatest"` - LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` - ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"` - Size int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Size"` - Owner CanonicalUser `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Owner,omitempty"` - StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass"` + Key string `xml:"Key"` + VersionId string `xml:"VersionId"` + IsLatest bool `xml:"IsLatest"` + LastModified time.Time `xml:"LastModified"` + ETag string `xml:"ETag"` + Size int64 `xml:"Size"` + Owner CanonicalUser `xml:"Owner,omitempty"` + StorageClass StorageClass `xml:"StorageClass"` } func (t *VersionEntry) MarshalXML(e *xml.Encoder, start xml.StartElement) error { type T VersionEntry var layout struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } layout.T = (*T)(t) layout.LastModified = (*xsdDateTime)(&layout.T.LastModified) @@ -944,7 +1473,7 @@ func (t *VersionEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro type T VersionEntry var overlay struct { *T - LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"` + LastModified *xsdDateTime `xml:"LastModified"` } overlay.T = (*T)(t) overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified) @@ -952,8 +1481,8 @@ func (t *VersionEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro } type VersioningConfiguration struct { - Status VersioningStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Status,omitempty"` - MfaDelete MfaDeleteStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MfaDelete,omitempty"` + Status VersioningStatus `xml:"Status,omitempty"` + MfaDelete MfaDeleteStatus `xml:"MfaDelete,omitempty"` } // May be one of Enabled, Suspended @@ -976,10 +1505,10 @@ func (b xsdBase64Binary) MarshalText() ([]byte, error) { type xsdDateTime time.Time func (t *xsdDateTime) UnmarshalText(text []byte) error { - return _unmarshalTime(text, (*time.Time)(t), s3TimeFormat) + return _unmarshalTime(text, (*time.Time)(t), "2006-01-02T15:04:05.999999999") } func (t xsdDateTime) MarshalText() ([]byte, error) { - return []byte((time.Time)(t).Format(s3TimeFormat)), nil + return _marshalTime((time.Time)(t), "2006-01-02T15:04:05.999999999") } func (t xsdDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error { if (time.Time)(t).IsZero() { @@ -1006,3 +1535,6 @@ func _unmarshalTime(text []byte, t *time.Time, format string) (err error) { } return err } +func _marshalTime(t time.Time, format string) ([]byte, error) { + return []byte(t.Format(format + "Z07:00")), nil +} diff --git a/weed/s3api/s3api_xsd_generated_helper.go b/weed/s3api/s3api_xsd_generated_helper.go new file mode 100644 index 000000000..24cdd2289 --- /dev/null +++ b/weed/s3api/s3api_xsd_generated_helper.go @@ -0,0 +1,10 @@ +package s3api + +type Grantee struct { + XMLNS string `xml:"xmlns:xsi,attr"` + XMLXSI string `xml:"xsi:type,attr"` + Type string `xml:"Type"` + ID string `xml:"ID,omitempty"` + DisplayName string `xml:"DisplayName,omitempty"` + URI string `xml:"URI,omitempty"` +} diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 039bad523..029fbb7c9 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -148,6 +148,10 @@ func skipCheckParentDirEntry(r *http.Request) bool { return r.URL.Query().Get("skipCheckParentDir") == "true" } +func isS3Request(r *http.Request) bool { + return r.Header.Get(s3_constants.AmzAuthType) != "" || r.Header.Get("X-Amz-Date") != "" +} + func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileName string, contentType string, so *operation.StorageOption, md5bytes []byte, fileChunks []*filer_pb.FileChunk, chunkOffset int64, content []byte) (filerResult *FilerPostResult, replyerr error) { // detect file mode @@ -266,7 +270,12 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa } } - if dbErr := fs.filer.CreateEntry(ctx, entry, false, false, nil, skipCheckParentDirEntry(r), so.MaxFileNameLength); dbErr != nil { + dbErr := fs.filer.CreateEntry(ctx, entry, false, false, nil, skipCheckParentDirEntry(r), so.MaxFileNameLength) + // In test_bucket_listv2_delimiter_basic, the valid object key is the parent folder + if dbErr != nil && strings.HasSuffix(dbErr.Error(), " is a file") && isS3Request(r) { + dbErr = fs.filer.CreateEntry(ctx, entry, false, false, nil, true, so.MaxFileNameLength) + } + if dbErr != nil { replyerr = dbErr filerResult.Error = dbErr.Error() glog.V(0).Infof("failing to write %s to filer server : %v", path, dbErr) From 114ac39917bf03a0e7a07fe62d7373d936ff4b4e Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 7 Jul 2024 23:43:38 -0700 Subject: [PATCH 30/42] add a simple test --- weed/util/queue_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 weed/util/queue_test.go diff --git a/weed/util/queue_test.go b/weed/util/queue_test.go new file mode 100644 index 000000000..a79552893 --- /dev/null +++ b/weed/util/queue_test.go @@ -0,0 +1,22 @@ +package util + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestNewQueue(t *testing.T) { + + q := NewQueue[int]() + + for i := 0; i < 10; i++ { + q.Enqueue(i) + } + + assert.Equal(t, q.Len(), 10) + + for i := 0; i < 10; i++ { + assert.Equal(t, q.Dequeue(), i) + } + +} From d29fccc521184707adcc7d5d6c11ea4247e824fd Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 7 Jul 2024 23:44:23 -0700 Subject: [PATCH 31/42] skip checking if it is the root directory --- weed/filer/filerstore_wrapper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index 48e2a636d..9c448edfd 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -85,7 +85,7 @@ func (fsw *FilerStoreWrapper) AddPathSpecificStore(path string, storeId string, func (fsw *FilerStoreWrapper) getActualStore(path util.FullPath) (store FilerStore) { store = fsw.defaultStore - if path == "/" { + if path == "/" || path == "//" { return } var storeId string From f3d708d3b6de535b92785b73c34c39e5932f1e8b Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 7 Jul 2024 23:44:32 -0700 Subject: [PATCH 32/42] add a test case --- weed/server/filer_ui/breadcrumb_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/weed/server/filer_ui/breadcrumb_test.go b/weed/server/filer_ui/breadcrumb_test.go index aac3c7de6..6e42541cb 100644 --- a/weed/server/filer_ui/breadcrumb_test.go +++ b/weed/server/filer_ui/breadcrumb_test.go @@ -14,6 +14,18 @@ func TestToBreadcrumb(t *testing.T) { args args wantCrumbs []Breadcrumb }{ + { + name: "empty", + args: args{ + fullpath: "", + }, + wantCrumbs: []Breadcrumb{ + { + Name: "/", + Link: "/", + }, + }, + }, { name: "test1", args: args{ From b7928fcab6e535a7faf691778c089bf98d77ab4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:20:06 -0700 Subject: [PATCH 33/42] chore(deps): bump github.com/linxGnu/grocksdb from 1.9.1 to 1.9.2 (#5750) Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.9.1 to 1.9.2. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.9.1...v1.9.2) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4940fbc6a..5534b6763 100644 --- a/go.mod +++ b/go.mod @@ -57,7 +57,7 @@ require ( github.com/klauspost/reedsolomon v1.12.1 github.com/kurin/blazer v0.5.3 github.com/lib/pq v1.10.9 - github.com/linxGnu/grocksdb v1.9.1 + github.com/linxGnu/grocksdb v1.9.2 github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-ieproxy v0.0.11 // indirect diff --git a/go.sum b/go.sum index 3817faa82..c9fb6e58e 100644 --- a/go.sum +++ b/go.sum @@ -1197,8 +1197,8 @@ github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linxGnu/grocksdb v1.9.1 h1:LmwuHzsWglxJrIES9jvS2O1xTPD2nnKYhAQDx5dIyRo= -github.com/linxGnu/grocksdb v1.9.1/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/linxGnu/grocksdb v1.9.2 h1:O3mzvO0wuzQ9mtlHbDrShixyVjVbmuqTjFrzlf43wZ8= +github.com/linxGnu/grocksdb v1.9.2/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= From 86cc7efc3e05e8f3ff54f69887ba23e50ef750ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:20:21 -0700 Subject: [PATCH 34/42] chore(deps): bump google.golang.org/grpc/security/advancedtls from 0.0.0-20240621202332-c8568c99b8c5 to 1.0.0 (#5751) chore(deps): bump google.golang.org/grpc/security/advancedtls Bumps [google.golang.org/grpc/security/advancedtls](https://github.com/grpc/grpc-go) from 0.0.0-20240621202332-c8568c99b8c5 to 1.0.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/commits/v1.0.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc/security/advancedtls dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5534b6763..49ee84f55 100644 --- a/go.mod +++ b/go.mod @@ -155,7 +155,7 @@ require ( go.etcd.io/etcd/client/pkg/v3 v3.5.14 go.uber.org/atomic v1.11.0 golang.org/x/sync v0.7.0 - google.golang.org/grpc/security/advancedtls v0.0.0-20240621202332-c8568c99b8c5 + google.golang.org/grpc/security/advancedtls v1.0.0 ) require ( diff --git a/go.sum b/go.sum index c9fb6e58e..5aaf6ebaa 100644 --- a/go.sum +++ b/go.sum @@ -2329,8 +2329,8 @@ google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLp google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/examples v0.0.0-20201112215255-90f1b3ee835b h1:NuxyvVZoDfHZwYW9LD4GJiF5/nhiSyP4/InTrvw9Ibk= google.golang.org/grpc/examples v0.0.0-20201112215255-90f1b3ee835b/go.mod h1:IBqQ7wSUJ2Ep09a8rMWFsg4fmI2r38zwsq8a0GgxXpM= -google.golang.org/grpc/security/advancedtls v0.0.0-20240621202332-c8568c99b8c5 h1:nb5wBcvZPlwv70pMujKk7HouNePQu5Hx4f318Ano8uA= -google.golang.org/grpc/security/advancedtls v0.0.0-20240621202332-c8568c99b8c5/go.mod h1:o+s4go+e1PJ2AjuQMY5hU82W7lDlefjJA6FqEHRVHWk= +google.golang.org/grpc/security/advancedtls v1.0.0 h1:/KQ7VP/1bs53/aopk9QhuPyFAp9Dm9Ejix3lzYkCrDA= +google.golang.org/grpc/security/advancedtls v1.0.0/go.mod h1:o+s4go+e1PJ2AjuQMY5hU82W7lDlefjJA6FqEHRVHWk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 862a820b35789eaffda596ba2b795fa933467309 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:20:38 -0700 Subject: [PATCH 35/42] chore(deps): bump golang.org/x/tools from 0.22.0 to 0.23.0 (#5752) Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.22.0 to 0.23.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.22.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/tools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 49ee84f55..eeab50165 100644 --- a/go.mod +++ b/go.mod @@ -103,14 +103,14 @@ require ( gocloud.dev v0.37.0 gocloud.dev/pubsub/natspubsub v0.37.0 gocloud.dev/pubsub/rabbitpubsub v0.37.0 - golang.org/x/crypto v0.24.0 // indirect + golang.org/x/crypto v0.25.0 // indirect golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 golang.org/x/image v0.18.0 - golang.org/x/net v0.26.0 + golang.org/x/net v0.27.0 golang.org/x/oauth2 v0.21.0 // indirect - golang.org/x/sys v0.21.0 + golang.org/x/sys v0.22.0 golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.22.0 + golang.org/x/tools v0.23.0 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.184.0 google.golang.org/genproto v0.0.0-20240604185151-ef581f913117 // indirect @@ -324,8 +324,8 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/term v0.21.0 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/term v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect diff --git a/go.sum b/go.sum index 5aaf6ebaa..a064e0424 100644 --- a/go.sum +++ b/go.sum @@ -1661,8 +1661,8 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1726,8 +1726,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1800,8 +1800,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1953,8 +1953,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1969,8 +1969,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2068,8 +2068,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From e5c0c24db07d440a595c3f3b3412614f60575439 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:20:49 -0700 Subject: [PATCH 36/42] chore(deps): bump google.golang.org/api from 0.184.0 to 0.187.0 (#5753) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.184.0 to 0.187.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.184.0...v0.187.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 28 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index eeab50165..0a4df6971 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/google/btree v1.1.2 github.com/google/uuid v1.6.0 github.com/google/wire v0.6.0 // indirect - github.com/googleapis/gax-go/v2 v2.12.4 // indirect + github.com/googleapis/gax-go/v2 v2.12.5 // indirect github.com/gorilla/mux v1.8.1 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -112,8 +112,8 @@ require ( golang.org/x/text v0.16.0 // indirect golang.org/x/tools v0.23.0 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/api v0.184.0 - google.golang.org/genproto v0.0.0-20240604185151-ef581f913117 // indirect + google.golang.org/api v0.187.0 + google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect google.golang.org/grpc v1.64.0 google.golang.org/protobuf v1.34.2 gopkg.in/inf.v0 v0.9.1 // indirect @@ -159,7 +159,7 @@ require ( ) require ( - cloud.google.com/go/auth v0.5.1 // indirect + cloud.google.com/go/auth v0.6.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.8 // indirect @@ -327,8 +327,8 @@ require ( golang.org/x/mod v0.19.0 // indirect golang.org/x/term v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/validator.v2 v2.0.1 // indirect diff --git a/go.sum b/go.sum index a064e0424..63861d9b0 100644 --- a/go.sum +++ b/go.sum @@ -84,8 +84,8 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw= -cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s= +cloud.google.com/go/auth v0.6.1 h1:T0Zw1XM5c1GlpN2HYr2s+m3vr1p2wy+8VN+Z1FKxW38= +cloud.google.com/go/auth v0.6.1/go.mod h1:eFHG7zDzbXHKmjJddFG/rBlcGp6t25SwRUiEQSlO4x4= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= @@ -288,8 +288,8 @@ cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxs cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.17.1 h1:5k0wXqkxL+YcXd4viQzTqCgzzVKKxzgrK+rCZJytEQs= -cloud.google.com/go/kms v1.17.1/go.mod h1:DCMnCF/apA6fZk5Cj4XsD979OyHAqFasPuA5Sd0kGlQ= +cloud.google.com/go/kms v1.18.0 h1:pqNdaVmZJFP+i8OVLocjfpdTWETTYa20FWOegSCdrRo= +cloud.google.com/go/kms v1.18.0/go.mod h1:DyRBeWD/pYBMeyiaXFa/DGNyxMDL3TslIKb8o/JkLkw= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= @@ -1041,8 +1041,8 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= +github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= @@ -2143,8 +2143,8 @@ google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.184.0 h1:dmEdk6ZkJNXy1JcDhn/ou0ZUq7n9zropG2/tR4z+RDg= -google.golang.org/api v0.184.0/go.mod h1:CeDTtUEiYENAf8PPG5VZW2yNp2VM3VWbCeTioAZBTBA= +google.golang.org/api v0.187.0 h1:Mxs7VATVC2v7CY+7Xwm4ndkX71hpElcvx0D1Ji/p1eo= +google.golang.org/api v0.187.0/go.mod h1:KIHlTc4x7N7gKKuVsdmfBXN13yEEWXWFURWY6SBp2gk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2278,12 +2278,12 @@ google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20240604185151-ef581f913117 h1:HCZ6DlkKtCDAtD8ForECsY3tKuaR+p4R3grlK80uCCc= -google.golang.org/genproto v0.0.0-20240604185151-ef581f913117/go.mod h1:lesfX/+9iA+3OdqeCpoDddJaNxVB1AB6tD7EfqMmprc= -google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 h1:QW9+G6Fir4VcRXVH8x3LilNAb6cxBGLa6+GM4hRwexE= -google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3/go.mod h1:kdrSS/OiLkPrNUpzD4aHgCq2rVuC/YRxok32HXZ4vRE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d h1:PksQg4dV6Sem3/HkBX+Ltq8T0ke0PKIRBNBatoDTVls= +google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:s7iA721uChleev562UJO2OYB0PPT9CMFjV+Ce7VJH5M= +google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 h1:MuYw1wJzT+ZkybKfaOXKp5hJiZDn2iHaXRw0mRYdHSc= +google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4/go.mod h1:px9SlOOZBg1wM1zdnr8jEL4CNGUBZ+ZKYtNPApNQc4c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= From 9bd8ee1134d6373e034e7829a3781fc5bce72a77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:21:01 -0700 Subject: [PATCH 37/42] chore(deps): bump modernc.org/sqlite from 1.30.0 to 1.30.1 (#5754) Bumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.30.0 to 1.30.1. - [Commits](https://gitlab.com/cznic/sqlite/compare/v1.30.0...v1.30.1) --- updated-dependencies: - dependency-name: modernc.org/sqlite dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 0a4df6971..51366715f 100644 --- a/go.mod +++ b/go.mod @@ -118,10 +118,10 @@ require ( google.golang.org/protobuf v1.34.2 gopkg.in/inf.v0 v0.9.1 // indirect modernc.org/b v1.0.0 // indirect - modernc.org/libc v1.50.9 // indirect + modernc.org/libc v1.52.1 // indirect modernc.org/mathutil v1.6.0 modernc.org/memory v1.8.0 // indirect - modernc.org/sqlite v1.30.0 + modernc.org/sqlite v1.30.1 modernc.org/strutil v1.2.0 modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index 63861d9b0..a93c033df 100644 --- a/go.sum +++ b/go.sum @@ -2404,8 +2404,8 @@ modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWs modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v4 v4.17.8 h1:yyWBf2ipA0Y9GGz/MmCmi3EFpKgeS7ICrAFes+suEbs= -modernc.org/ccgo/v4 v4.17.8/go.mod h1:buJnJ6Fn0tyAdP/dqePbrrvLyr6qslFfTbFrCuaYvtA= +modernc.org/ccgo/v4 v4.17.10 h1:6wrtRozgrhCxieCeJh85QsxkX/2FFrT9hdaWPlbn4Zo= +modernc.org/ccgo/v4 v4.17.10/go.mod h1:0NBHgsqTTpm9cA5z2ccErvGZmtntSM9qD2kFAs6pjXM= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= @@ -2421,8 +2421,8 @@ modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.50.9 h1:hIWf1uz55lorXQhfoEoezdUHjxzuO6ceshET/yWjSjk= -modernc.org/libc v1.50.9/go.mod h1:15P6ublJ9FJR8YQCGy8DeQ2Uwur7iW9Hserr/T3OFZE= +modernc.org/libc v1.52.1 h1:uau0VoiT5hnR+SpoWekCKbLqm7v6dhRL3hI+NQhgN3M= +modernc.org/libc v1.52.1/go.mod h1:HR4nVzFDSDizP620zcMCgjb1/8xk2lg5p/8yjfGv1IQ= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= @@ -2440,8 +2440,8 @@ modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.30.0 h1:8YhPUs/HTnlEgErn/jSYQTwHN/ex8CjHHjg+K9iG7LM= -modernc.org/sqlite v1.30.0/go.mod h1:cgkTARJ9ugeXSNaLBPK3CqbOe7Ec7ZhWPoMFGldEYEw= +modernc.org/sqlite v1.30.1 h1:YFhPVfu2iIgUf9kuA1CR7iiHdcEEsI2i+yjRYHscyxk= +modernc.org/sqlite v1.30.1/go.mod h1:DUmsiWQDaAvU4abhc/N+djlom/L2o8f7gZ95RCvyoLU= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= From 71d6b716e1d6b461fbb1b24e4d61e217958a5ef4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:21:13 -0700 Subject: [PATCH 38/42] chore(deps): bump docker/setup-qemu-action from 3.0.0 to 3.1.0 (#5755) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/68827325e0b33c7199eb31dd4e31fbe9023e06e3...5927c834f5b4fdf503fca6f4c7eccda82949e1ee) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/container_dev.yml | 2 +- .github/workflows/container_latest.yml | 2 +- .github/workflows/container_release1.yml | 2 +- .github/workflows/container_release2.yml | 2 +- .github/workflows/container_release3.yml | 2 +- .github/workflows/container_release4.yml | 2 +- .github/workflows/container_release5.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/container_dev.yml b/.github/workflows/container_dev.yml index 2a0b368c5..3129deebf 100644 --- a/.github/workflows/container_dev.yml +++ b/.github/workflows/container_dev.yml @@ -33,7 +33,7 @@ jobs: org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v1 + uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 diff --git a/.github/workflows/container_latest.yml b/.github/workflows/container_latest.yml index 03f7666e5..bec705a09 100644 --- a/.github/workflows/container_latest.yml +++ b/.github/workflows/container_latest.yml @@ -34,7 +34,7 @@ jobs: org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v1 + uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 diff --git a/.github/workflows/container_release1.yml b/.github/workflows/container_release1.yml index 43e3d619c..ff3a7ba78 100644 --- a/.github/workflows/container_release1.yml +++ b/.github/workflows/container_release1.yml @@ -34,7 +34,7 @@ jobs: org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v1 + uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 diff --git a/.github/workflows/container_release2.yml b/.github/workflows/container_release2.yml index 1d4de4053..fa9726384 100644 --- a/.github/workflows/container_release2.yml +++ b/.github/workflows/container_release2.yml @@ -35,7 +35,7 @@ jobs: org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v1 + uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 diff --git a/.github/workflows/container_release3.yml b/.github/workflows/container_release3.yml index c293da7be..14d9dbb09 100644 --- a/.github/workflows/container_release3.yml +++ b/.github/workflows/container_release3.yml @@ -35,7 +35,7 @@ jobs: org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v1 + uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 diff --git a/.github/workflows/container_release4.yml b/.github/workflows/container_release4.yml index 3c5161c39..8b8e1d3dc 100644 --- a/.github/workflows/container_release4.yml +++ b/.github/workflows/container_release4.yml @@ -34,7 +34,7 @@ jobs: org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v1 + uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 diff --git a/.github/workflows/container_release5.yml b/.github/workflows/container_release5.yml index a4022a72a..e31a52708 100644 --- a/.github/workflows/container_release5.yml +++ b/.github/workflows/container_release5.yml @@ -34,7 +34,7 @@ jobs: org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v1 + uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 From fd529045b604394fa39a63f0b4e201a3ef29647d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:21:25 -0700 Subject: [PATCH 39/42] chore(deps): bump docker/setup-buildx-action from 3.3.0 to 3.4.0 (#5756) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/d70bba72b1f3fd22344832f00baa16ece964efeb...4fd812986e6c8c2a69e18311145f9371337f27d4) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/container_dev.yml | 2 +- .github/workflows/container_latest.yml | 2 +- .github/workflows/container_release1.yml | 2 +- .github/workflows/container_release2.yml | 2 +- .github/workflows/container_release3.yml | 2 +- .github/workflows/container_release4.yml | 2 +- .github/workflows/container_release5.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/container_dev.yml b/.github/workflows/container_dev.yml index 3129deebf..1a1a9be2a 100644 --- a/.github/workflows/container_dev.yml +++ b/.github/workflows/container_dev.yml @@ -36,7 +36,7 @@ jobs: uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 + uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 with: buildkitd-flags: "--debug" - diff --git a/.github/workflows/container_latest.yml b/.github/workflows/container_latest.yml index bec705a09..1fab171d1 100644 --- a/.github/workflows/container_latest.yml +++ b/.github/workflows/container_latest.yml @@ -37,7 +37,7 @@ jobs: uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 + uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 with: buildkitd-flags: "--debug" - diff --git a/.github/workflows/container_release1.yml b/.github/workflows/container_release1.yml index ff3a7ba78..ca20f9c0f 100644 --- a/.github/workflows/container_release1.yml +++ b/.github/workflows/container_release1.yml @@ -37,7 +37,7 @@ jobs: uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 + uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 - name: Login to Docker Hub if: github.event_name != 'pull_request' diff --git a/.github/workflows/container_release2.yml b/.github/workflows/container_release2.yml index fa9726384..725b192e3 100644 --- a/.github/workflows/container_release2.yml +++ b/.github/workflows/container_release2.yml @@ -38,7 +38,7 @@ jobs: uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 + uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 - name: Login to Docker Hub if: github.event_name != 'pull_request' diff --git a/.github/workflows/container_release3.yml b/.github/workflows/container_release3.yml index 14d9dbb09..10a576bd6 100644 --- a/.github/workflows/container_release3.yml +++ b/.github/workflows/container_release3.yml @@ -38,7 +38,7 @@ jobs: uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 + uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 - name: Login to Docker Hub if: github.event_name != 'pull_request' diff --git a/.github/workflows/container_release4.yml b/.github/workflows/container_release4.yml index 8b8e1d3dc..e3d25e2c9 100644 --- a/.github/workflows/container_release4.yml +++ b/.github/workflows/container_release4.yml @@ -37,7 +37,7 @@ jobs: uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 + uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 - name: Login to Docker Hub if: github.event_name != 'pull_request' diff --git a/.github/workflows/container_release5.yml b/.github/workflows/container_release5.yml index e31a52708..fe5120ef3 100644 --- a/.github/workflows/container_release5.yml +++ b/.github/workflows/container_release5.yml @@ -37,7 +37,7 @@ jobs: uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v1 + uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 - name: Login to Docker Hub if: github.event_name != 'pull_request' From e8c50e65b39f60a0e4b1d61bf32b125a224b8f70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:21:37 -0700 Subject: [PATCH 40/42] chore(deps): bump docker/build-push-action from 6.2.0 to 6.3.0 (#5757) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.2.0 to 6.3.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/15560696de535e4014efeff63c48f16952e52dd1...1a162644f9a7e87d8f4b053101d1d9a712edc18c) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/container_dev.yml | 2 +- .github/workflows/container_latest.yml | 2 +- .github/workflows/container_release1.yml | 2 +- .github/workflows/container_release2.yml | 2 +- .github/workflows/container_release3.yml | 2 +- .github/workflows/container_release4.yml | 2 +- .github/workflows/container_release5.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/container_dev.yml b/.github/workflows/container_dev.yml index 1a1a9be2a..f14778c0d 100644 --- a/.github/workflows/container_dev.yml +++ b/.github/workflows/container_dev.yml @@ -56,7 +56,7 @@ jobs: password: ${{ secrets.GHCR_TOKEN }} - name: Build - uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 + uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_latest.yml b/.github/workflows/container_latest.yml index 1fab171d1..8e25c42b0 100644 --- a/.github/workflows/container_latest.yml +++ b/.github/workflows/container_latest.yml @@ -57,7 +57,7 @@ jobs: password: ${{ secrets.GHCR_TOKEN }} - name: Build - uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 + uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release1.yml b/.github/workflows/container_release1.yml index ca20f9c0f..59b19c65b 100644 --- a/.github/workflows/container_release1.yml +++ b/.github/workflows/container_release1.yml @@ -47,7 +47,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 + uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release2.yml b/.github/workflows/container_release2.yml index 725b192e3..95e5522c2 100644 --- a/.github/workflows/container_release2.yml +++ b/.github/workflows/container_release2.yml @@ -48,7 +48,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 + uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release3.yml b/.github/workflows/container_release3.yml index 10a576bd6..55a1ad740 100644 --- a/.github/workflows/container_release3.yml +++ b/.github/workflows/container_release3.yml @@ -48,7 +48,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 + uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release4.yml b/.github/workflows/container_release4.yml index e3d25e2c9..30b513758 100644 --- a/.github/workflows/container_release4.yml +++ b/.github/workflows/container_release4.yml @@ -47,7 +47,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 + uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} diff --git a/.github/workflows/container_release5.yml b/.github/workflows/container_release5.yml index fe5120ef3..07b9f8b15 100644 --- a/.github/workflows/container_release5.yml +++ b/.github/workflows/container_release5.yml @@ -47,7 +47,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Build - uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1 # v2 + uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v2 with: context: ./docker push: ${{ github.event_name != 'pull_request' }} From f618121e63f6897e88e4c7f6b5df1f6c8f98f105 Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 8 Jul 2024 10:20:07 -0700 Subject: [PATCH 41/42] Fix S3 deletion in deep folders, and names with empty spaces fix https://github.com/seaweedfs/seaweedfs/issues/5748 --- weed/s3api/s3api_object_handlers_delete.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/weed/s3api/s3api_object_handlers_delete.go b/weed/s3api/s3api_object_handlers_delete.go index 580578593..de05081b7 100644 --- a/weed/s3api/s3api_object_handlers_delete.go +++ b/weed/s3api/s3api_object_handlers_delete.go @@ -27,11 +27,12 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque bucket, object := s3_constants.GetBucketAndObject(r) glog.V(3).Infof("DeleteObjectHandler %s %s", bucket, object) - object = urlPathEscape(removeDuplicateSlashes(object)) + target := util.FullPath(fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object)) + dir, name := target.DirAndName() s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - err := doDeleteEntry(client, s3a.option.BucketsPath+"/"+bucket, object, true, false) + err := doDeleteEntry(client, dir, name, true, false) if err != nil { // skip deletion error, usually the file is not found return nil From b8121e4b24b5f5f36928541e0ecf3ab5fc292c87 Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 8 Jul 2024 11:10:41 -0700 Subject: [PATCH 42/42] simplify --- weed/s3api/s3api_object_handlers_delete.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/weed/s3api/s3api_object_handlers_delete.go b/weed/s3api/s3api_object_handlers_delete.go index de05081b7..43849bb07 100644 --- a/weed/s3api/s3api_object_handlers_delete.go +++ b/weed/s3api/s3api_object_handlers_delete.go @@ -43,11 +43,8 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque } directoriesWithDeletion := make(map[string]int) - lastSeparator := strings.LastIndex(object, "/") - if lastSeparator > 0 { - parentDirectoryPath := fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object[:lastSeparator]) - directoriesWithDeletion[parentDirectoryPath]++ - + if strings.LastIndex(object, "/") > 0 { + directoriesWithDeletion[dir]++ // purge empty folders, only checking folders with deletions for len(directoriesWithDeletion) > 0 { directoriesWithDeletion = s3a.doDeleteEmptyDirectories(client, directoriesWithDeletion)