Repository: fluid-cloudnative/fluid
Pull request #3982 (2024-04-26 07:22:33)

Support to configure the cache size of vineyard fuse
### Ⅰ. Describe what this PR does

Part of https://github.com/fluid-cloudnative/fluid/pull/3749


fluid-e2e-bot[bot]: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please assign ronggu for approval by writing `/assign @ronggu` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/fluid-cloudnative/fluid/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["ronggu"]} -->
fluid-e2e-bot[bot]: Hi @dashanji. Thanks for your PR.

I'm waiting for a [fluid-cloudnative](https://github.com/orgs/fluid-cloudnative/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://github.com/orgs/fluid-cloudnative/people) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [3 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [19.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [3 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [19.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [19.6% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [19.8% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [3 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [19.9% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [3 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [19.9% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982)


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3982?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 64.35%. Comparing base [(`d542001`)](https://app.codecov.io/gh/fluid-cloudnative/fluid/commit/d542001ae4a039563271e8d37eb9a6c594b23880?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) to head [(`b45eb4b`)](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3982?dropdown=coverage&src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).
> Report is 1 commits behind head on master.


<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##           master    #3982      +/-   ##
==========================================
+ Coverage   64.33%   64.35%   +0.02%     
==========================================
  Files         477      477              
  Lines       28444    28456      +12     
==========================================
+ Hits        18300    18314      +14     
+ Misses       7968     7967       -1     
+ Partials     2176     2175       -1     
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3982?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).

cheyang: @TrafalgarZZZ Please also take a look. Thanks.
sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [3 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3982&resolutions=WONTFIX)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3982&resolved=false&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [11.3% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3982&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3982)



Patch:
diff --git a/api/v1alpha1/openapi_generated.go b/api/v1alpha1/openapi_generated.go
index b45c5488..9819695e 100644
--- a/api/v1alpha1/openapi_generated.go
+++ b/api/v1alpha1/openapi_generated.go
@@ -120,11 +120,11 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.TieredStore":                schema_fluid_cloudnative_fluid_api_v1alpha1_TieredStore(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.User":                       schema_fluid_cloudnative_fluid_api_v1alpha1_User(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VersionSpec":                schema_fluid_cloudnative_fluid_api_v1alpha1_VersionSpec(ref),
+		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardClientSocketSpec":   schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardClientSocketSpec(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardCompTemplateSpec":   schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardCompTemplateSpec(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardRuntime":            schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntime(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardRuntimeList":        schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntimeList(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardRuntimeSpec":        schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntimeSpec(ref),
-		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardSockSpec":           schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardSockSpec(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.VolumeSource":               schema_fluid_cloudnative_fluid_api_v1alpha1_VolumeSource(ref),
 		"github.com/fluid-cloudnative/fluid/api/v1alpha1.WaitingStatus":              schema_fluid_cloudnative_fluid_api_v1alpha1_WaitingStatus(ref),
 	}
@@ -6497,6 +6497,102 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VersionSpec(ref common.Referenc
 	}
 }
 
+func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardClientSocketSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "VineyardClientSocketSpec holds the configurations for vineyard client socket",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"image": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Image for Vineyard Fuse Default is `vineyardcloudnative/vineyard-fluid-fuse`",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"imageTag": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Image Tag for Vineyard Fuse Default is `v0.21.5`",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"imagePullPolicy": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Image pull policy for Vineyard Fuse Default is `IfNotPresent` Available values are `Always`, `IfNotPresent`, `Never`",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"env": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Environment variables that will be used by Vineyard Fuse. Default is not set.",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+					"cleanPolicy": {
+						SchemaProps: spec.SchemaProps{
+							Description: "CleanPolicy decides when to clean Vineyard Fuse pods. Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted OnDemand cleans fuse pod once th fuse pod on some node is not needed OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted Defaults to OnRuntimeDeleted",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"resources": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Resources contains the resource requirements and limits for the Vineyard Fuse. Default is not set.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("k8s.io/api/core/v1.ResourceRequirements"),
+						},
+					},
+					"networkMode": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Whether to use hostnetwork or not Default is HostNetwork",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"podMetadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata"),
+						},
+					},
+					"options": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Options for configuring vineyardd parameters. Supported options are as follows.\n  reserve_memory: (Bool) Whether to reserving enough physical memory pages for vineyardd.\n                  Default is true.\n  allocator: (String) The allocator used by vineyardd, could be \"dlmalloc\" or \"mimalloc\".\n             Default is \"dlmalloc\".\n  compression: (Bool) Compress before migration or spilling.\n               Default is true.\n  coredump: (Bool) Enable coredump core dump when been aborted.\n            Default is false.\n  meta_timeout: (Int) Timeout period before waiting the metadata service to be ready, in seconds\n\t\t\t\t   Default is 60.\n  etcd_endpoint: (String) The endpoint of etcd.\n                 Default is same as the etcd endpoint of vineyard worker.\n  etcd_prefix: (String) Metadata path prefix in etcd.\n               Default is \"/vineyard\".\n  size: (String) shared memory size for vineyardd.\n                 1024M, 1024000, 1G, or 1Gi.\n                 Default is \"0\", which means no cache.\n                 When the size is not set to \"0\", it should be greater than the 2048 bytes(2K).\n  spill_path: (String) Path to spill temporary files, if not set, spilling will be disabled.\n              Default is \"\".\n  spill_lower_rate: (Double) The lower rate of memory usage to trigger spilling.\n\t\t\t\t\t   Default is 0.3.\n  spill_upper_rate: (Double) The upper rate of memory usage to stop spilling.\n\t\t\t\t\t   Default is 0.8.\nDefault is as follows. fuse:\n  options:\n    size: \"0\"\n    etcd_endpoint: \"http://{{Name}}-master-0.{{Name}}-master.{{Namespace}}:{{EtcdClientPort}}\"\n\t   etcd_prefix: \"/vineyard\"",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "k8s.io/api/core/v1.ResourceRequirements"},
+	}
+}
+
 func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardCompTemplateSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -6767,7 +6863,7 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntimeSpec(ref common.
 						SchemaProps: spec.SchemaProps{
 							Description: "Fuse holds the configurations for Vineyard client socket. Note that the \"Fuse\" here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available. Applications can connect to the vineyard runtime components through IPC or RPC. IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC. If the socket file is not mounted, the connection will fall back to RPC.",
 							Default:     map[string]interface{}{},
-							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardSockSpec"),
+							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardClientSocketSpec"),
 						},
 					},
 					"tieredstore": {
@@ -6809,87 +6905,7 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntimeSpec(ref common.
 			},
 		},
 		Dependencies: []string{
-			"github.com/fluid-cloudnative/fluid/api/v1alpha1.MasterSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "github.com/fluid-cloudnative/fluid/api/v1alpha1.TieredStore", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardCompTemplateSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardSockSpec", "k8s.io/api/core/v1.Volume"},
-	}
-}
-
-func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardSockSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
-	return common.OpenAPIDefinition{
-		Schema: spec.Schema{
-			SchemaProps: spec.SchemaProps{
-				Description: "VineyardSockSpec holds the configurations for vineyard client socket",
-				Type:        []string{"object"},
-				Properties: map[string]spec.Schema{
-					"image": {
-						SchemaProps: spec.SchemaProps{
-							Description: "Image for Vineyard Fuse Default is `vineyardcloudnative/vineyard-fluid-fuse`",
-							Type:        []string{"string"},
-							Format:      "",
-						},
-					},
-					"imageTag": {
-						SchemaProps: spec.SchemaProps{
-							Description: "Image Tag for Vineyard Fuse Default is `v0.21.5`",
-							Type:        []string{"string"},
-							Format:      "",
-						},
-					},
-					"imagePullPolicy": {
-						SchemaProps: spec.SchemaProps{
-							Description: "Image pull policy for Vineyard Fuse Default is `IfNotPresent` Available values are `Always`, `IfNotPresent`, `Never`",
-							Type:        []string{"string"},
-							Format:      "",
-						},
-					},
-					"env": {
-						SchemaProps: spec.SchemaProps{
-							Description: "Environment variables that will be used by Vineyard Fuse. Default is not set.",
-							Type:        []string{"object"},
-							AdditionalProperties: &spec.SchemaOrBool{
-								Allows: true,
-								Schema: &spec.Schema{
-									SchemaProps: spec.SchemaProps{
-										Default: "",
-										Type:    []string{"string"},
-										Format:  "",
-									},
-								},
-							},
-						},
-					},
-					"cleanPolicy": {
-						SchemaProps: spec.SchemaProps{
-							Description: "CleanPolicy decides when to clean Vineyard Fuse pods. Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted OnDemand cleans fuse pod once th fuse pod on some node is not needed OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted Defaults to OnRuntimeDeleted",
-							Type:        []string{"string"},
-							Format:      "",
-						},
-					},
-					"resources": {
-						SchemaProps: spec.SchemaProps{
-							Description: "Resources contains the resource requirements and limits for the Vineyard Fuse. Default is not set.",
-							Default:     map[string]interface{}{},
-							Ref:         ref("k8s.io/api/core/v1.ResourceRequirements"),
-						},
-					},
-					"networkMode": {
-						SchemaProps: spec.SchemaProps{
-							Description: "Whether to use hostnetwork or not Default is HostNetwork",
-							Type:        []string{"string"},
-							Format:      "",
-						},
-					},
-					"podMetadata": {
-						SchemaProps: spec.SchemaProps{
-							Description: "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
-							Default:     map[string]interface{}{},
-							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata"),
-						},
-					},
-				},
-			},
-		},
-		Dependencies: []string{
-			"github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "k8s.io/api/core/v1.ResourceRequirements"},
+			"github.com/fluid-cloudnative/fluid/api/v1alpha1.MasterSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "github.com/fluid-cloudnative/fluid/api/v1alpha1.TieredStore", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardClientSocketSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardCompTemplateSpec", "k8s.io/api/core/v1.Volume"},
 	}
 }
 
diff --git a/api/v1alpha1/swagger.json b/api/v1alpha1/swagger.json
index e159aa0d..0b1a3e35 100644
--- a/api/v1alpha1/swagger.json
+++ b/api/v1alpha1/swagger.json
@@ -3604,6 +3604,58 @@
         }
       }
     },
+    ".VineyardClientSocketSpec": {
+      "description": "VineyardClientSocketSpec holds the configurations for vineyard client socket",
+      "type": "object",
+      "properties": {
+        "cleanPolicy": {
+          "description": "CleanPolicy decides when to clean Vineyard Fuse pods. Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted OnDemand cleans fuse pod once th fuse pod on some node is not needed OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted Defaults to OnRuntimeDeleted",
+          "type": "string"
+        },
+        "env": {
+          "description": "Environment variables that will be used by Vineyard Fuse. Default is not set.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string",
+            "default": ""
+          }
+        },
+        "image": {
+          "description": "Image for Vineyard Fuse Default is `vineyardcloudnative/vineyard-fluid-fuse`",
+          "type": "string"
+        },
+        "imagePullPolicy": {
+          "description": "Image pull policy for Vineyard Fuse Default is `IfNotPresent` Available values are `Always`, `IfNotPresent`, `Never`",
+          "type": "string"
+        },
+        "imageTag": {
+          "description": "Image Tag for Vineyard Fuse Default is `v0.21.5`",
+          "type": "string"
+        },
+        "networkMode": {
+          "description": "Whether to use hostnetwork or not Default is HostNetwork",
+          "type": "string"
+        },
+        "options": {
+          "description": "Options for configuring vineyardd parameters. Supported options are as follows.\n  reserve_memory: (Bool) Whether to reserving enough physical memory pages for vineyardd.\n                  Default is true.\n  allocator: (String) The allocator used by vineyardd, could be \"dlmalloc\" or \"mimalloc\".\n             Default is \"dlmalloc\".\n  compression: (Bool) Compress before migration or spilling.\n               Default is true.\n  coredump: (Bool) Enable coredump core dump when been aborted.\n            Default is false.\n  meta_timeout: (Int) Timeout period before waiting the metadata service to be ready, in seconds\n\t\t\t\t   Default is 60.\n  etcd_endpoint: (String) The endpoint of etcd.\n                 Default is same as the etcd endpoint of vineyard worker.\n  etcd_prefix: (String) Metadata path prefix in etcd.\n               Default is \"/vineyard\".\n  size: (String) shared memory size for vineyardd.\n                 1024M, 1024000, 1G, or 1Gi.\n                 Default is \"0\", which means no cache.\n                 When the size is not set to \"0\", it should be greater than the 2048 bytes(2K).\n  spill_path: (String) Path to spill temporary files, if not set, spilling will be disabled.\n              Default is \"\".\n  spill_lower_rate: (Double) The lower rate of memory usage to trigger spilling.\n\t\t\t\t\t   Default is 0.3.\n  spill_upper_rate: (Double) The upper rate of memory usage to stop spilling.\n\t\t\t\t\t   Default is 0.8.\nDefault is as follows. fuse:\n  options:\n    size: \"0\"\n    etcd_endpoint: \"http://{{Name}}-master-0.{{Name}}-master.{{Namespace}}:{{EtcdClientPort}}\"\n\t   etcd_prefix: \"/vineyard\"",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string",
+            "default": ""
+          }
+        },
+        "podMetadata": {
+          "description": "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
+          "default": {},
+          "$ref": "#/definitions/.PodMetadata"
+        },
+        "resources": {
+          "description": "Resources contains the resource requirements and limits for the Vineyard Fuse. Default is not set.",
+          "default": {},
+          "$ref": "#/definitions/v1.ResourceRequirements"
+        }
+      }
+    },
     ".VineyardCompTemplateSpec": {
       "description": "VineyardCompTemplateSpec is the common configurations for vineyard components including Master and Worker.",
       "type": "object",
@@ -3747,7 +3799,7 @@
         "fuse": {
           "description": "Fuse holds the configurations for Vineyard client socket. Note that the \"Fuse\" here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available. Applications can connect to the vineyard runtime components through IPC or RPC. IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC. If the socket file is not mounted, the connection will fall back to RPC.",
           "default": {},
-          "$ref": "#/definitions/.VineyardSockSpec"
+          "$ref": "#/definitions/.VineyardClientSocketSpec"
         },
         "master": {
           "description": "Master holds the configurations for Vineyard Master component Represents the Etcd component in Vineyard",
@@ -3784,50 +3836,6 @@
         }
       }
     },
-    ".VineyardSockSpec": {
-      "description": "VineyardSockSpec holds the configurations for vineyard client socket",
-      "type": "object",
-      "properties": {
-        "cleanPolicy": {
-          "description": "CleanPolicy decides when to clean Vineyard Fuse pods. Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted OnDemand cleans fuse pod once th fuse pod on some node is not needed OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted Defaults to OnRuntimeDeleted",
-          "type": "string"
-        },
-        "env": {
-          "description": "Environment variables that will be used by Vineyard Fuse. Default is not set.",
-          "type": "object",
-          "additionalProperties": {
-            "type": "string",
-            "default": ""
-          }
-        },
-        "image": {
-          "description": "Image for Vineyard Fuse Default is `vineyardcloudnative/vineyard-fluid-fuse`",
-          "type": "string"
-        },
-        "imagePullPolicy": {
-          "description": "Image pull policy for Vineyard Fuse Default is `IfNotPresent` Available values are `Always`, `IfNotPresent`, `Never`",
-          "type": "string"
-        },
-        "imageTag": {
-          "description": "Image Tag for Vineyard Fuse Default is `v0.21.5`",
-          "type": "string"
-        },
-        "networkMode": {
-          "description": "Whether to use hostnetwork or not Default is HostNetwork",
-          "type": "string"
-        },
-        "podMetadata": {
-          "description": "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
-          "default": {},
-          "$ref": "#/definitions/.PodMetadata"
-        },
-        "resources": {
-          "description": "Resources contains the resource requirements and limits for the Vineyard Fuse. Default is not set.",
-          "default": {},
-          "$ref": "#/definitions/v1.ResourceRequirements"
-        }
-      }
-    },
     ".VolumeSource": {
       "description": "VolumeSource defines volume source and volume claim template.",
       "type": "object",
diff --git a/api/v1alpha1/vineyardruntime_types.go b/api/v1alpha1/vineyardruntime_types.go
index cb2ad0ca..c63cf955 100644
--- a/api/v1alpha1/vineyardruntime_types.go
+++ b/api/v1alpha1/vineyardruntime_types.go
@@ -151,8 +151,8 @@ type MasterSpec struct {
 	ExternalEndpoint ExternalEndpointSpec `json:"endpoint,omitempty"`
 }
 
-// VineyardSockSpec holds the configurations for vineyard client socket
-type VineyardSockSpec struct {
+// VineyardClientSocketSpec holds the configurations for vineyard client socket
+type VineyardClientSocketSpec struct {
 	// Image for Vineyard Fuse
 	// Default is `vineyardcloudnative/vineyard-fluid-fuse`
 	// +optional
@@ -196,6 +196,42 @@ type VineyardSockSpec struct {
 	// PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.
 	// +optional
 	PodMetadata PodMetadata `json:"podMetadata,omitempty"`
+
+	// Options for configuring vineyardd parameters.
+	// Supported options are as follows.
+	//   reserve_memory: (Bool) Whether to reserving enough physical memory pages for vineyardd.
+	//                   Default is true.
+	//   allocator: (String) The allocator used by vineyardd, could be "dlmalloc" or "mimalloc".
+	//              Default is "dlmalloc".
+	//   compression: (Bool) Compress before migration or spilling.
+	//                Default is true.
+	//   coredump: (Bool) Enable coredump core dump when been aborted.
+	//             Default is false.
+	//   meta_timeout: (Int) Timeout period before waiting the metadata service to be ready, in seconds
+	//				   Default is 60.
+	//   etcd_endpoint: (String) The endpoint of etcd.
+	//                  Default is same as the etcd endpoint of vineyard worker.
+	//   etcd_prefix: (String) Metadata path prefix in etcd.
+	//                Default is "/vineyard".
+	//   size: (String) shared memory size for vineyardd.
+	//                  1024M, 1024000, 1G, or 1Gi.
+	//                  Default is "0", which means no cache.
+	//                  When the size is not set to "0", it should be greater than the 2048 bytes(2K).
+	//   spill_path: (String) Path to spill temporary files, if not set, spilling will be disabled.
+	//               Default is "".
+	//   spill_lower_rate: (Double) The lower rate of memory usage to trigger spilling.
+	//					   Default is 0.3.
+	//   spill_upper_rate: (Double) The upper rate of memory usage to stop spilling.
+	//					   Default is 0.8.
+	// Default is as follows.
+	// fuse:
+	//   options:
+	//     size: "0"
+	//     etcd_endpoint: "http://{{Name}}-master-0.{{Name}}-master.{{Namespace}}:{{EtcdClientPort}}"
+	//	   etcd_prefix: "/vineyard"
+	//
+	// +optional
+	Options map[string]string `json:"options,omitempty"`
 }
 
 // VineyardRuntimeSpec defines the desired state of VineyardRuntime
@@ -220,7 +256,7 @@ type VineyardRuntimeSpec struct {
 	// IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC.
 	// If the socket file is not mounted, the connection will fall back to RPC.
 	// +optional
-	Fuse VineyardSockSpec `json:"fuse,omitempty"`
+	Fuse VineyardClientSocketSpec `json:"fuse,omitempty"`
 
 	// Tiered storage used by vineyardd
 	// The MediumType can only be `MEM` and `SSD`
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index 52e1a9c9..e1aae252 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -2831,6 +2831,37 @@ func (in *VersionSpec) DeepCopy() *VersionSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VineyardClientSocketSpec) DeepCopyInto(out *VineyardClientSocketSpec) {
+	*out = *in
+	if in.Env != nil {
+		in, out := &in.Env, &out.Env
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	in.Resources.DeepCopyInto(&out.Resources)
+	in.PodMetadata.DeepCopyInto(&out.PodMetadata)
+	if in.Options != nil {
+		in, out := &in.Options, &out.Options
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VineyardClientSocketSpec.
+func (in *VineyardClientSocketSpec) DeepCopy() *VineyardClientSocketSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(VineyardClientSocketSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *VineyardCompTemplateSpec) DeepCopyInto(out *VineyardCompTemplateSpec) {
 	*out = *in
@@ -2969,30 +3000,6 @@ func (in *VineyardRuntimeSpec) DeepCopy() *VineyardRuntimeSpec {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *VineyardSockSpec) DeepCopyInto(out *VineyardSockSpec) {
-	*out = *in
-	if in.Env != nil {
-		in, out := &in.Env, &out.Env
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	in.Resources.DeepCopyInto(&out.Resources)
-	in.PodMetadata.DeepCopyInto(&out.PodMetadata)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VineyardSockSpec.
-func (in *VineyardSockSpec) DeepCopy() *VineyardSockSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(VineyardSockSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *VolumeSource) DeepCopyInto(out *VolumeSource) {
 	*out = *in
diff --git a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
index 07dc3055..c724b36f 100644
--- a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
+++ b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
@@ -122,6 +122,32 @@ spec:
                     - ""
                     - ContainerNetwork
                     type: string
+                  options:
+                    additionalProperties:
+                      type: string
+                    description: 'Options for configuring vineyardd parameters. Supported
+                      options are as follows. reserve_memory: (Bool) Whether to reserving
+                      enough physical memory pages for vineyardd. Default is true.
+                      allocator: (String) The allocator used by vineyardd, could be
+                      "dlmalloc" or "mimalloc". Default is "dlmalloc". compression:
+                      (Bool) Compress before migration or spilling. Default is true.
+                      coredump: (Bool) Enable coredump core dump when been aborted.
+                      Default is false. meta_timeout: (Int) Timeout period before
+                      waiting the metadata service to be ready, in seconds Default
+                      is 60. etcd_endpoint: (String) The endpoint of etcd. Default
+                      is same as the etcd endpoint of vineyard worker. etcd_prefix:
+                      (String) Metadata path prefix in etcd. Default is "/vineyard".
+                      size: (String) shared memory size for vineyardd. 1024M, 1024000,
+                      1G, or 1Gi. Default is "0", which means no cache. When the size
+                      is not set to "0", it should be greater than the 2048 bytes(2K).
+                      spill_path: (String) Path to spill temporary files, if not set,
+                      spilling will be disabled. Default is "". spill_lower_rate:
+                      (Double) The lower rate of memory usage to trigger spilling.
+                      Default is 0.3. spill_upper_rate: (Double) The upper rate of
+                      memory usage to stop spilling. Default is 0.8. Default is as
+                      follows. fuse: options: size: "0" etcd_endpoint: "http://{{Name}}-master-0.{{Name}}-master.{{Namespace}}:{{EtcdClientPort}}"
+                      etcd_prefix: "/vineyard"'
+                    type: object
                   podMetadata:
                     description: PodMetadata defines labels and annotations that will
                       be propagated to Vineyard's pods.
diff --git a/charts/fluid/fluid/templates/_helpers.tpl b/charts/fluid/fluid/templates/_helpers.tpl
index fe5531c5..7ac641e1 100644
--- a/charts/fluid/fluid/templates/_helpers.tpl
+++ b/charts/fluid/fluid/templates/_helpers.tpl
@@ -93,3 +93,21 @@ Create the name of the service account to use
     - delete
 {{- end -}}
 {{- end -}}
+
+
+{{/*
+Check if feature gate DataflowAffinity is enabled in the featureGates.
+*/}}
+{{- define "fluid.dataflowAffinity.enabled" -}}
+{{- $featureGates := splitList "," .Values.dataset.featureGates }}
+{{- $found := false -}}
+{{- range $idx, $featureGate := $featureGates }}
+    {{- $featureGateKV := splitList "=" $featureGate }}
+    {{- $key :=  trim (index $featureGateKV 0) }}
+    {{- $value := trim (index $featureGateKV 1) }}
+    {{- if and (eq $key "DataflowAffinity") (eq $value "true") -}}
+        {{- $found = true -}}
+    {{- end -}}
+{{- end -}}
+{{- $found -}}
+{{- end -}}
diff --git a/charts/fluid/fluid/templates/controller/dataset_controller.yaml b/charts/fluid/fluid/templates/controller/dataset_controller.yaml
index 4071fb25..ceacd8bd 100644
--- a/charts/fluid/fluid/templates/controller/dataset_controller.yaml
+++ b/charts/fluid/fluid/templates/controller/dataset_controller.yaml
@@ -50,6 +50,7 @@ spec:
           - --pprof-addr=:6060
           - --enable-leader-election
           - --leader-election-namespace={{ include "fluid.namespace" . }}
+          - --feature-gates={{ .Values.dataset.featureGates }}
         env:
           {{- if .Values.workdir }}
           - name: FLUID_WORKDIR
diff --git a/charts/fluid/fluid/templates/role/dataset/rbac.yaml b/charts/fluid/fluid/templates/role/dataset/rbac.yaml
index 38374e2a..df1f70fe 100644
--- a/charts/fluid/fluid/templates/role/dataset/rbac.yaml
+++ b/charts/fluid/fluid/templates/role/dataset/rbac.yaml
@@ -13,6 +13,7 @@ rules:
     - get
     - list
     - watch
+  {{- if eq (include "fluid.dataflowAffinity.enabled" . ) "true" }}
   - apiGroups:
       - ""
     resources:
@@ -21,6 +22,7 @@ rules:
       - get
       - list
       - watch
+  {{- end }}
   - apiGroups:
     - ""
     resources:
diff --git a/charts/fluid/fluid/values.yaml b/charts/fluid/fluid/values.yaml
index 62fe1174..7641e225 100644
--- a/charts/fluid/fluid/values.yaml
+++ b/charts/fluid/fluid/values.yaml
@@ -26,6 +26,7 @@ dataset:
     - operator: Exists
   controller:
     image: fluidcloudnative/dataset-controller:v1.0.1-1be5869
+  featureGates: "DataflowAffinity=false"
 
 csi:
   tolerations:
diff --git a/charts/vineyard/templates/fuse/daemonset.yaml b/charts/vineyard/templates/fuse/daemonset.yaml
index e6c9b5a0..f2b533b7 100644
--- a/charts/vineyard/templates/fuse/daemonset.yaml
+++ b/charts/vineyard/templates/fuse/daemonset.yaml
@@ -90,6 +90,10 @@ spec:
             value: {{ .Values.fuse.targetPath }}/rpc-conf
           - name: PRESTOP_MARKER
             value: /tmp/prestop-marker
+          {{- range $key, $value := .Values.fuse.options }}
+          - name: "{{ upper $key }}"
+            value: "{{ $value }}"
+          {{- end }}
           {{- range $key, $value := .Values.fuse.env }}
           - name: "{{ $key }}"
             value: "{{ $value }}"
diff --git a/charts/vineyard/templates/worker/statefulset.yaml b/charts/vineyard/templates/worker/statefulset.yaml
index ff85855d..6189503d 100644
--- a/charts/vineyard/templates/worker/statefulset.yaml
+++ b/charts/vineyard/templates/worker/statefulset.yaml
@@ -86,7 +86,7 @@ spec:
           command:
             - /usr/local/bin/vineyardd
             - --socket
-            - /var/run/vineyard/vineyard.sock
+            - /var/run/vineyard/vineyard-worker.sock
             - --size
             - "{{ include "vineyard.worker.size" . }}"
             {{- if eq (toString (index .Values.worker.options "vineyardd.reserve.memory")) "true" }}
@@ -111,6 +111,10 @@ spec:
             - --log_dir
             - /var/log/vineyard
             {{- end }}
+          lifecycle:
+            preStop:
+              exec:
+                command: ["sh", "-c", "rm -f /var/run/vineyard/vineyard-worker.sock"]
           env:
           - name: VINEYARDD_NAME
             value: {{ template "vineyard.fullname" . }}-vineyardd
@@ -163,7 +167,7 @@ spec:
             exec:
               command:
               - ls
-              - /var/run/vineyard/vineyard.sock
+              - /var/run/vineyard/vineyard-worker.sock
             initialDelaySeconds: 15
             periodSeconds: 10
             failureThreshold: 10
diff --git a/charts/vineyard/values.yaml b/charts/vineyard/values.yaml
index 4ff5a773..f395ff73 100644
--- a/charts/vineyard/values.yaml
+++ b/charts/vineyard/values.yaml
@@ -133,6 +133,8 @@ fuse:
   targetPath: ""
   nodeSelector: {}
   hostPID: false
+  options:
+    size: "0"
 
 owner:
   enabled: false
diff --git a/cmd/dataset/app/dataset.go b/cmd/dataset/app/dataset.go
index 064a06ab..169abce3 100644
--- a/cmd/dataset/app/dataset.go
+++ b/cmd/dataset/app/dataset.go
@@ -17,6 +17,7 @@ limitations under the License.
 package app
 
 import (
+	utilfeature "github.com/fluid-cloudnative/fluid/pkg/utils/feature"
 	"os"
 	"time"
 
@@ -100,6 +101,8 @@ func init() {
 	datasetCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconciliation in controller's workqueue")
 	datasetCmd.Flags().IntVar(&controllerWorkqueueQPS, "workqueue-qps", 10, "qps limit value for controller's workqueue")
 	datasetCmd.Flags().IntVar(&controllerWorkqueueBurst, "workqueue-burst", 100, "burst limit value for controller's workqueue")
+
+	utilfeature.DefaultMutableFeatureGate.AddFlag(datasetCmd.Flags())
 }
 
 func handle() {
diff --git a/cmd/jindo/app/jindo.go b/cmd/jindo/app/jindo.go
index 2dea91e9..786db05e 100644
--- a/cmd/jindo/app/jindo.go
+++ b/cmd/jindo/app/jindo.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2021 The Fluid Authors.
+Copyright 2022 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
index 07dc3055..c724b36f 100644
--- a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
+++ b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
@@ -122,6 +122,32 @@ spec:
                     - ""
                     - ContainerNetwork
                     type: string
+                  options:
+                    additionalProperties:
+                      type: string
+                    description: 'Options for configuring vineyardd parameters. Supported
+                      options are as follows. reserve_memory: (Bool) Whether to reserving
+                      enough physical memory pages for vineyardd. Default is true.
+                      allocator: (String) The allocator used by vineyardd, could be
+                      "dlmalloc" or "mimalloc". Default is "dlmalloc". compression:
+                      (Bool) Compress before migration or spilling. Default is true.
+                      coredump: (Bool) Enable coredump core dump when been aborted.
+                      Default is false. meta_timeout: (Int) Timeout period before
+                      waiting the metadata service to be ready, in seconds Default
+                      is 60. etcd_endpoint: (String) The endpoint of etcd. Default
+                      is same as the etcd endpoint of vineyard worker. etcd_prefix:
+                      (String) Metadata path prefix in etcd. Default is "/vineyard".
+                      size: (String) shared memory size for vineyardd. 1024M, 1024000,
+                      1G, or 1Gi. Default is "0", which means no cache. When the size
+                      is not set to "0", it should be greater than the 2048 bytes(2K).
+                      spill_path: (String) Path to spill temporary files, if not set,
+                      spilling will be disabled. Default is "". spill_lower_rate:
+                      (Double) The lower rate of memory usage to trigger spilling.
+                      Default is 0.3. spill_upper_rate: (Double) The upper rate of
+                      memory usage to stop spilling. Default is 0.8. Default is as
+                      follows. fuse: options: size: "0" etcd_endpoint: "http://{{Name}}-master-0.{{Name}}-master.{{Namespace}}:{{EtcdClientPort}}"
+                      etcd_prefix: "/vineyard"'
+                    type: object
                   podMetadata:
                     description: PodMetadata defines labels and annotations that will
                       be propagated to Vineyard's pods.
diff --git a/docs/en/dev/api_doc.md b/docs/en/dev/api_doc.md
index a8a98c29..fa854f51 100644
--- a/docs/en/dev/api_doc.md
+++ b/docs/en/dev/api_doc.md
@@ -2392,8 +2392,8 @@ If worker.replicas and the field are both specified, the field will be respected
 <td>
 <code>fuse</code></br>
 <em>
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
-VineyardSockSpec
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">
+VineyardClientSocketSpec
 </a>
 </em>
 </td>
@@ -5293,7 +5293,7 @@ string
 <a href="#data.fluid.io/v1alpha1.JindoFuseSpec">JindoFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec</a>)
 </p>
 <p>
 </p>
@@ -7516,8 +7516,8 @@ bool
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinCompTemplateSpec">ThinCompTemplateSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>)
 </p>
 <p>
 </p>
@@ -7806,9 +7806,9 @@ Kubernetes core/v1.NodeAffinity
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntimeSpec">JuiceFSRuntimeSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.Metadata">Metadata</a>, 
 <a href="#data.fluid.io/v1alpha1.Processor">Processor</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>)
 </p>
 <p>
 <p>PodMetadata defines subgroup properties of metav1.ObjectMeta</p>
@@ -9977,6 +9977,183 @@ string
 </tr>
 </tbody>
 </table>
+<h3 id="data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>)
+</p>
+<p>
+<p>VineyardClientSocketSpec holds the configurations for vineyard client socket</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>image</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Image for Vineyard Fuse
+Default is <code>vineyardcloudnative/vineyard-fluid-fuse</code></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageTag</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Image Tag for Vineyard Fuse
+Default is <code>v0.21.5</code></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imagePullPolicy</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Image pull policy for Vineyard Fuse
+Default is <code>IfNotPresent</code>
+Available values are <code>Always</code>, <code>IfNotPresent</code>, <code>Never</code></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>env</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Environment variables that will be used by Vineyard Fuse.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cleanPolicy</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.FuseCleanPolicy">
+FuseCleanPolicy
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>CleanPolicy decides when to clean Vineyard Fuse pods.
+Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted
+OnDemand cleans fuse pod once th fuse pod on some node is not needed
+OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted
+Defaults to OnRuntimeDeleted</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>resources</code></br>
+<em>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#resourcerequirements-v1-core">
+Kubernetes core/v1.ResourceRequirements
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Resources contains the resource requirements and limits for the Vineyard Fuse.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMode</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.NetworkMode">
+NetworkMode
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Whether to use hostnetwork or not
+Default is HostNetwork</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>options</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Options for configuring vineyardd parameters.
+Supported options are as follows.
+reserve_memory: (Bool) Whether to reserving enough physical memory pages for vineyardd.
+Default is true.
+allocator: (String) The allocator used by vineyardd, could be &ldquo;dlmalloc&rdquo; or &ldquo;mimalloc&rdquo;.
+Default is &ldquo;dlmalloc&rdquo;.
+compression: (Bool) Compress before migration or spilling.
+Default is true.
+coredump: (Bool) Enable coredump core dump when been aborted.
+Default is false.
+meta_timeout: (Int) Timeout period before waiting the metadata service to be ready, in seconds
+Default is 60.
+etcd_endpoint: (String) The endpoint of etcd.
+Default is same as the etcd endpoint of vineyard worker.
+etcd_prefix: (String) Metadata path prefix in etcd.
+Default is &ldquo;/vineyard&rdquo;.
+size: (String) shared memory size for vineyardd.
+1024M, 1024000, 1G, or 1Gi.
+Default is &ldquo;0&rdquo;, which means no cache.
+When the size is not set to &ldquo;0&rdquo;, it should be greater than the 2048 bytes(2K).
+spill_path: (String) Path to spill temporary files, if not set, spilling will be disabled.
+Default is &ldquo;&rdquo;.
+spill_lower_rate: (Double) The lower rate of memory usage to trigger spilling.
+Default is 0.3.
+spill_upper_rate: (Double) The upper rate of memory usage to stop spilling.
+Default is 0.8.
+Default is as follows.
+fuse:
+options:
+size: &ldquo;0&rdquo;
+etcd_endpoint: &ldquo;http://{{Name}}-master-0.{{Name}}-master.{{Namespace}}:{{EtcdClientPort}}&rdquo;
+etcd_prefix: &ldquo;/vineyard&rdquo;</p>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec
 </h3>
 <p>
@@ -10243,8 +10420,8 @@ If worker.replicas and the field are both specified, the field will be respected
 <td>
 <code>fuse</code></br>
 <em>
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
-VineyardSockSpec
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">
+VineyardClientSocketSpec
 </a>
 </em>
 </td>
@@ -10337,140 +10514,6 @@ Default is null.</p>
 </tr>
 </tbody>
 </table>
-<h3 id="data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec
-</h3>
-<p>
-(<em>Appears on:</em>
-<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>)
-</p>
-<p>
-<p>VineyardSockSpec holds the configurations for vineyard client socket</p>
-</p>
-<table>
-<thead>
-<tr>
-<th>Field</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>
-<code>image</code></br>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Image for Vineyard Fuse
-Default is <code>vineyardcloudnative/vineyard-fluid-fuse</code></p>
-</td>
-</tr>
-<tr>
-<td>
-<code>imageTag</code></br>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Image Tag for Vineyard Fuse
-Default is <code>v0.21.5</code></p>
-</td>
-</tr>
-<tr>
-<td>
-<code>imagePullPolicy</code></br>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Image pull policy for Vineyard Fuse
-Default is <code>IfNotPresent</code>
-Available values are <code>Always</code>, <code>IfNotPresent</code>, <code>Never</code></p>
-</td>
-</tr>
-<tr>
-<td>
-<code>env</code></br>
-<em>
-map[string]string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Environment variables that will be used by Vineyard Fuse.
-Default is not set.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>cleanPolicy</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.FuseCleanPolicy">
-FuseCleanPolicy
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>CleanPolicy decides when to clean Vineyard Fuse pods.
-Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted
-OnDemand cleans fuse pod once th fuse pod on some node is not needed
-OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted
-Defaults to OnRuntimeDeleted</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>resources</code></br>
-<em>
-<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#resourcerequirements-v1-core">
-Kubernetes core/v1.ResourceRequirements
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Resources contains the resource requirements and limits for the Vineyard Fuse.
-Default is not set.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>networkMode</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.NetworkMode">
-NetworkMode
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Whether to use hostnetwork or not
-Default is HostNetwork</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>podMetadata</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.PodMetadata">
-PodMetadata
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
-</td>
-</tr>
-</tbody>
-</table>
 <h3 id="data.fluid.io/v1alpha1.VolumeSource">VolumeSource
 </h3>
 <p>
diff --git a/docs/en/samples/vineyard/configure_cache_size_of_vineyard_fuse.md b/docs/en/samples/vineyard/configure_cache_size_of_vineyard_fuse.md
new file mode 100644
index 00000000..3a377d49
--- /dev/null
+++ b/docs/en/samples/vineyard/configure_cache_size_of_vineyard_fuse.md
@@ -0,0 +1,218 @@
+## How to configure the cache size of Vineyard Fuse
+
+Before you begin, we'd better have a basic understanding of the [Vineyard Fuse](https://github.com/v6d-io/v6d/tree/main/docker/vineyard-fluid-fuse). It mainly creates the vineyard client configurations in the application pod and defines the priority of different vineyard sockets.
+
+For example, suppose we have enabled the cache of vineyard fuse, a local vineyardd will be started in the fuse container, and it will connect to the vineyard master. The new vineyardd will create a vineyard socket named `vineyard-local.sock` in the pod, and the vineyard fuse will also create the symbolic link `vineyard-worker.sock` to pod if the fuse pod runs on the same node as the vineyard worker. In this case, we will put the vineyard socket `vineyard-local.sock` in the first place in the vineyard client configurations YAML. When the application connects to the vineyard, it will first try to put and get data from the local vineyardd. If it's out of memory, it will fall back to the vineyard worker. Thus, we can regard the vineyard fuse as a local cache of the external vineyard workers.
+
+## Install fluid
+
+Refer to the [Installation Documentation](../../userguide/install.md) to complete the installation.
+
+## Create Vineyard Runtime and set the fuse cache size to 0
+
+If you don't set the cache size of vineyard fuse, the default value is 0. To make it
+clear, we set the cache size to 0 explicitly.
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: data.fluid.io/v1alpha1
+kind: VineyardRuntime
+metadata:
+  name: vineyard
+spec:
+  replicas: 2
+  tieredstore:
+    levels:
+    - mediumtype: MEM
+      quota: 20Gi
+  fuse:
+    options:
+      # Not to start the local vineyardd in the vineyard fuse container
+      size: "0"
+---
+apiVersion: data.fluid.io/v1alpha1
+kind: Dataset
+metadata:
+  name: vineyard
+EOF
+```
+
+Check if the `Vineyard Runtime` is created successfully:
+
+```shell
+$ kubectl get vineyardRuntime vineyard 
+NAME       MASTER PHASE   WORKER PHASE   FUSE PHASE   AGE
+vineyard   Ready          PartialReady   Ready        59s
+```
+
+Then look at the status of the `Vineyard Dataset` and notice that it has been bound to the `Vineyard Runtime`:
+
+```shell
+$ kubectl get dataset vineyard
+NAME       UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
+vineyard                                                                  Bound   73s
+```
+
+### [Serverful Mode] Create an Application Pod and Mount the Vineyard Dataset
+
+Add the label `fuse.serverful.fluid.io/inject: "true"` to make the pod scheduled to the node where the vineyard worker is running.
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: Pod
+metadata:
+  name: demo-app
+  labels:
+    fuse.serverful.fluid.io/inject: "true"
+spec:
+  containers:
+    - name: demo
+      image: python:3.10
+      command:
+        - /bin/bash
+        - -c
+        - |
+          pip3 install vineyard;
+          sleep infinity
+      volumeMounts:
+        - mountPath: /var/run/vineyard
+          name: client-configuration
+  volumes:
+    - name: client-configuration
+      persistentVolumeClaim:
+        claimName: vineyard
+EOF
+```
+
+Then we can check the client configurations in the pod, and notice there is only one vineyard socket named `vineyard-worker.sock`.
+
+```shell
+$ kubectl exec -it demo-app -- ls /var/run/vineyard
+rpc-conf  vineyard-config.yaml  vineyard-worker.sock
+
+$ kubectl exec -it demo-app -- cat /var/run/vineyard/vineyard-config.yaml                    
+Vineyard:
+  IPCSocket: vineyard-worker.sock
+  RPCEndpoint: vineyard-worker-0.vineyard-worker.default:9600,vineyard-worker-1.vineyard-worker.default:9600
+```
+
+Connect to the vineyard worker in the pod.
+
+```shell
+$  kubectl exec -it demo-app -- python
+Python 3.10.14 (main, Mar 25 2024, 21:45:25) [GCC 12.2.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import vineyard
+>>> client = vineyard.connect()
+>>> client.status
+{
+    instance_id: 0,
+    deployment: local,
+    memory_usage: 0,
+    memory_limit: 21474836480,
+    deferred_requests: 0,
+    ipc_connections: 0,
+    rpc_connections: 1
+}
+```
+
+## Create Vineyard Runtime and set the fuse cache size to 1Gi
+
+Add the option `size: "1Gi"` to enable the cache of vineyard fuse and set the cache size to 1Gi.
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: data.fluid.io/v1alpha1
+kind: VineyardRuntime
+metadata:
+  name: vineyard-with-fuse-cache
+spec:
+  replicas: 2
+  tieredstore:
+    levels:
+    - mediumtype: MEM
+      quota: 20Gi
+  fuse:
+    options:
+      # Start the local vineyardd with 1Gi memory in the vineyard fuse container
+      size: "1Gi"
+---
+apiVersion: data.fluid.io/v1alpha1
+kind: Dataset
+metadata:
+  name: vineyard-with-fuse-cache
+EOF
+```
+
+### [Serverful Mode] Create an Application Pod and Mount the Vineyard Dataset
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: Pod
+metadata:
+  name: demo-app
+  labels:
+    fuse.serverful.fluid.io/inject: "true"
+spec:
+  containers:
+    - name: demo
+      image: python:3.10
+      command:
+        - /bin/bash
+        - -c
+        - |
+          pip3 install vineyard;
+          sleep infinity
+      volumeMounts:
+        - mountPath: /var/run/vineyard
+          name: client-configuration
+  volumes:
+    - name: client-configuration
+      persistentVolumeClaim:
+        claimName: vineyard-with-fuse-cache
+EOF
+```
+
+Check the status of Vineyard FUSE:
+
+```shell
+$ kubectl get po | grep vineyard-with-fuse-cache-fuse
+vineyard-with-fuse-cache-fuse-chd9w   1/1     Running   0          110s
+```
+
+Then we can check the client configurations in the pod, and notice there are two vineyard sockets named `vineyard-local.sock` and `vineyard-worker.sock`. In the client
+configurations YAML, the `vineyard-local.sock` is in the first place, which means the application will first try to put and get data from the local vineyardd.
+
+```shell
+$ kubectl exec -it demo-app -- ls /var/run/vineyard
+rpc-conf  vineyard-config.yaml  vineyard-local.sock  vineyard-worker.sock
+
+# Check the vineyard client configurations
+$ kubectl exec -it demo-app -- cat /var/run/vineyard/vineyard-config.yaml                    
+Vineyard:
+  IPCSocket: vineyard-local.sock
+  RPCEndpoint: vineyard-with-fuse-cache-worker-0.vineyard-with-fuse-cache-worker.default:9600,vineyard-with-fuse-cache-worker-1.vineyard-with-fuse-cache-worker.default:9600
+```
+
+We can find if we connect to the vineyard with the default configurations, the local
+vineyardd will be used first.
+
+```shell
+$  kubectl exec -it demo-app -- python
+Python 3.10.14 (main, Mar 25 2024, 21:45:25) [GCC 12.2.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import vineyard
+>>> client = vineyard.connect()
+>>> client.status
+{
+    instance_id: 2,
+    deployment: local,
+    memory_usage: 0,
+    memory_limit: 1073741824, # 1Gi, not 20Gi in vineyard worker
+    deferred_requests: 0,
+    ipc_connections: 1,
+    rpc_connections: 0
+}
+```
diff --git a/docs/zh/dev/api_doc.md b/docs/zh/dev/api_doc.md
index a8a98c29..fa854f51 100644
--- a/docs/zh/dev/api_doc.md
+++ b/docs/zh/dev/api_doc.md
@@ -2392,8 +2392,8 @@ If worker.replicas and the field are both specified, the field will be respected
 <td>
 <code>fuse</code></br>
 <em>
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
-VineyardSockSpec
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">
+VineyardClientSocketSpec
 </a>
 </em>
 </td>
@@ -5293,7 +5293,7 @@ string
 <a href="#data.fluid.io/v1alpha1.JindoFuseSpec">JindoFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec</a>)
 </p>
 <p>
 </p>
@@ -7516,8 +7516,8 @@ bool
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinCompTemplateSpec">ThinCompTemplateSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>)
 </p>
 <p>
 </p>
@@ -7806,9 +7806,9 @@ Kubernetes core/v1.NodeAffinity
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntimeSpec">JuiceFSRuntimeSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.Metadata">Metadata</a>, 
 <a href="#data.fluid.io/v1alpha1.Processor">Processor</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>)
 </p>
 <p>
 <p>PodMetadata defines subgroup properties of metav1.ObjectMeta</p>
@@ -9977,6 +9977,183 @@ string
 </tr>
 </tbody>
 </table>
+<h3 id="data.fluid.io/v1alpha1.VineyardClientSocketSpec">VineyardClientSocketSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>)
+</p>
+<p>
+<p>VineyardClientSocketSpec holds the configurations for vineyard client socket</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>image</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Image for Vineyard Fuse
+Default is <code>vineyardcloudnative/vineyard-fluid-fuse</code></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageTag</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Image Tag for Vineyard Fuse
+Default is <code>v0.21.5</code></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imagePullPolicy</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Image pull policy for Vineyard Fuse
+Default is <code>IfNotPresent</code>
+Available values are <code>Always</code>, <code>IfNotPresent</code>, <code>Never</code></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>env</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Environment variables that will be used by Vineyard Fuse.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cleanPolicy</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.FuseCleanPolicy">
+FuseCleanPolicy
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>CleanPolicy decides when to clean Vineyard Fuse pods.
+Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted
+OnDemand cleans fuse pod once th fuse pod on some node is not needed
+OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted
+Defaults to OnRuntimeDeleted</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>resources</code></br>
+<em>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#resourcerequirements-v1-core">
+Kubernetes core/v1.ResourceRequirements
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Resources contains the resource requirements and limits for the Vineyard Fuse.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMode</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.NetworkMode">
+NetworkMode
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Whether to use hostnetwork or not
+Default is HostNetwork</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>options</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Options for configuring vineyardd parameters.
+Supported options are as follows.
+reserve_memory: (Bool) Whether to reserving enough physical memory pages for vineyardd.
+Default is true.
+allocator: (String) The allocator used by vineyardd, could be &ldquo;dlmalloc&rdquo; or &ldquo;mimalloc&rdquo;.
+Default is &ldquo;dlmalloc&rdquo;.
+compression: (Bool) Compress before migration or spilling.
+Default is true.
+coredump: (Bool) Enable coredump core dump when been aborted.
+Default is false.
+meta_timeout: (Int) Timeout period before waiting the metadata service to be ready, in seconds
+Default is 60.
+etcd_endpoint: (String) The endpoint of etcd.
+Default is same as the etcd endpoint of vineyard worker.
+etcd_prefix: (String) Metadata path prefix in etcd.
+Default is &ldquo;/vineyard&rdquo;.
+size: (String) shared memory size for vineyardd.
+1024M, 1024000, 1G, or 1Gi.
+Default is &ldquo;0&rdquo;, which means no cache.
+When the size is not set to &ldquo;0&rdquo;, it should be greater than the 2048 bytes(2K).
+spill_path: (String) Path to spill temporary files, if not set, spilling will be disabled.
+Default is &ldquo;&rdquo;.
+spill_lower_rate: (Double) The lower rate of memory usage to trigger spilling.
+Default is 0.3.
+spill_upper_rate: (Double) The upper rate of memory usage to stop spilling.
+Default is 0.8.
+Default is as follows.
+fuse:
+options:
+size: &ldquo;0&rdquo;
+etcd_endpoint: &ldquo;http://{{Name}}-master-0.{{Name}}-master.{{Namespace}}:{{EtcdClientPort}}&rdquo;
+etcd_prefix: &ldquo;/vineyard&rdquo;</p>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec
 </h3>
 <p>
@@ -10243,8 +10420,8 @@ If worker.replicas and the field are both specified, the field will be respected
 <td>
 <code>fuse</code></br>
 <em>
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
-VineyardSockSpec
+<a href="#data.fluid.io/v1alpha1.VineyardClientSocketSpec">
+VineyardClientSocketSpec
 </a>
 </em>
 </td>
@@ -10337,140 +10514,6 @@ Default is null.</p>
 </tr>
 </tbody>
 </table>
-<h3 id="data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec
-</h3>
-<p>
-(<em>Appears on:</em>
-<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>)
-</p>
-<p>
-<p>VineyardSockSpec holds the configurations for vineyard client socket</p>
-</p>
-<table>
-<thead>
-<tr>
-<th>Field</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>
-<code>image</code></br>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Image for Vineyard Fuse
-Default is <code>vineyardcloudnative/vineyard-fluid-fuse</code></p>
-</td>
-</tr>
-<tr>
-<td>
-<code>imageTag</code></br>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Image Tag for Vineyard Fuse
-Default is <code>v0.21.5</code></p>
-</td>
-</tr>
-<tr>
-<td>
-<code>imagePullPolicy</code></br>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Image pull policy for Vineyard Fuse
-Default is <code>IfNotPresent</code>
-Available values are <code>Always</code>, <code>IfNotPresent</code>, <code>Never</code></p>
-</td>
-</tr>
-<tr>
-<td>
-<code>env</code></br>
-<em>
-map[string]string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Environment variables that will be used by Vineyard Fuse.
-Default is not set.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>cleanPolicy</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.FuseCleanPolicy">
-FuseCleanPolicy
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>CleanPolicy decides when to clean Vineyard Fuse pods.
-Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted
-OnDemand cleans fuse pod once th fuse pod on some node is not needed
-OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted
-Defaults to OnRuntimeDeleted</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>resources</code></br>
-<em>
-<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#resourcerequirements-v1-core">
-Kubernetes core/v1.ResourceRequirements
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Resources contains the resource requirements and limits for the Vineyard Fuse.
-Default is not set.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>networkMode</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.NetworkMode">
-NetworkMode
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Whether to use hostnetwork or not
-Default is HostNetwork</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>podMetadata</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.PodMetadata">
-PodMetadata
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
-</td>
-</tr>
-</tbody>
-</table>
 <h3 id="data.fluid.io/v1alpha1.VolumeSource">VolumeSource
 </h3>
 <p>
diff --git a/pkg/controllers/v1alpha1/databackup/status_handler.go b/pkg/controllers/v1alpha1/databackup/status_handler.go
index 5a720015..9befa5e1 100644
--- a/pkg/controllers/v1alpha1/databackup/status_handler.go
+++ b/pkg/controllers/v1alpha1/databackup/status_handler.go
@@ -53,8 +53,9 @@ func (o *OnceHandler) GetOperationStatus(ctx runtime.ReconcileRequestContext, op
 	if !kubeclient.IsFinishedPod(backupPod) {
 		return
 	}
+
 	// set the node labels in status when job finished
-	if result.NodeAffinity == nil {
+	if dataflow.Enabled(dataflow.DataflowAffinity) && result.NodeAffinity == nil {
 		// generate the node labels
 		result.NodeAffinity, err = dataflow.GenerateNodeAffinity(ctx.Client, backupPod)
 		if err != nil {
diff --git a/pkg/controllers/v1alpha1/dataload/status_handler.go b/pkg/controllers/v1alpha1/dataload/status_handler.go
index cbd0f8cd..ca408d61 100644
--- a/pkg/controllers/v1alpha1/dataload/status_handler.go
+++ b/pkg/controllers/v1alpha1/dataload/status_handler.go
@@ -81,7 +81,7 @@ func (r *OnceStatusHandler) GetOperationStatus(ctx cruntime.ReconcileRequestCont
 	}
 
 	// set the node labels in status when job finished
-	if result.NodeAffinity == nil {
+	if dataflow.Enabled(dataflow.DataflowAffinity) && result.NodeAffinity == nil {
 		jobPod, err := kubeclient.GetSucceedPodForJob(r.Client, job)
 		if err != nil {
 			ctx.Log.Error(err, "can't get pod for job", "namespace", ctx.Namespace, "jobName", jobName)
diff --git a/pkg/controllers/v1alpha1/datamigrate/status_handler.go b/pkg/controllers/v1alpha1/datamigrate/status_handler.go
index c501d609..f0d83f7b 100644
--- a/pkg/controllers/v1alpha1/datamigrate/status_handler.go
+++ b/pkg/controllers/v1alpha1/datamigrate/status_handler.go
@@ -91,7 +91,7 @@ func (m *OnceStatusHandler) GetOperationStatus(ctx cruntime.ReconcileRequestCont
 	// for parallel migrate, there are multiple pods, so can not set the node labels.
 	if m.dataMigrate.Spec.Parallelism == 1 {
 		// set the node labels in status
-		if result.NodeAffinity == nil {
+		if dataflow.Enabled(dataflow.DataflowAffinity) && result.NodeAffinity == nil {
 			jobPod, err := kubeclient.GetSucceedPodForJob(m.Client, job)
 			if err != nil {
 				ctx.Log.Error(err, "can't get pod for job", "namespace", ctx.Namespace, "jobName", jobName)
diff --git a/pkg/controllers/v1alpha1/dataprocess/status_handler.go b/pkg/controllers/v1alpha1/dataprocess/status_handler.go
index d2d00ce5..4659270d 100644
--- a/pkg/controllers/v1alpha1/dataprocess/status_handler.go
+++ b/pkg/controllers/v1alpha1/dataprocess/status_handler.go
@@ -70,7 +70,7 @@ func (handler *OnceStatusHandler) GetOperationStatus(ctx runtime.ReconcileReques
 	}
 
 	// set the node labels in status when job finished
-	if result.NodeAffinity == nil {
+	if dataflow.Enabled(dataflow.DataflowAffinity) && result.NodeAffinity == nil {
 		jobPod, err := kubeclient.GetSucceedPodForJob(handler.Client, job)
 		if err != nil {
 			ctx.Log.Error(err, "can't get pod for job", "namespace", ctx.Namespace, "jobName", jobName)
diff --git a/pkg/dataflow/affinity.go b/pkg/dataflow/affinity.go
index a8e080b7..4d4d91c4 100644
--- a/pkg/dataflow/affinity.go
+++ b/pkg/dataflow/affinity.go
@@ -28,6 +28,10 @@ import (
 
 // InjectAffinityByRunAfterOp inject the affinity based on preceding operation
 func InjectAffinityByRunAfterOp(c client.Client, runAfter *datav1alpha1.OperationRef, opNamespace string, currentAffinity *v1.Affinity) (*v1.Affinity, error) {
+	if !Enabled(DataflowAffinity) {
+		return currentAffinity, nil
+	}
+
 	// no previous operation or use default affinity strategy, no need to generate node affinity
 	if runAfter == nil || runAfter.AffinityStrategy.Policy == datav1alpha1.DefaultAffinityStrategy {
 		return currentAffinity, nil
diff --git a/pkg/dataflow/features.go b/pkg/dataflow/features.go
new file mode 100644
index 00000000..4c65ca4c
--- /dev/null
+++ b/pkg/dataflow/features.go
@@ -0,0 +1,44 @@
+/*
+Copyright 2024 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dataflow
+
+import (
+	utilfeature "github.com/fluid-cloudnative/fluid/pkg/utils/feature"
+	"k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/component-base/featuregate"
+)
+
+const (
+	// DataflowAffinity Enable affinity inheritance for dataflow operations.
+	DataflowAffinity featuregate.Feature = "DataflowAffinity"
+)
+
+// defaultFeatureGates consists of all known fluid-specific feature keys.
+// To add a new feature, define a key for it above and add it here.
+var defaultFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
+	DataflowAffinity: {Default: false, PreRelease: featuregate.Alpha},
+}
+
+func init() {
+	// register the feature gates and its default value.
+	runtime.Must(utilfeature.DefaultMutableFeatureGate.Add(defaultFeatureGates))
+}
+
+// Enabled is helper for `utilfeature.DefaultFeatureGate.Enabled()`
+func Enabled(f featuregate.Feature) bool {
+	return utilfeature.DefaultFeatureGate.Enabled(f)
+}
diff --git a/pkg/ddc/base/volume.go b/pkg/ddc/base/volume.go
index 2480450a..621a3a41 100644
--- a/pkg/ddc/base/volume.go
+++ b/pkg/ddc/base/volume.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/vineyard/const.go b/pkg/ddc/vineyard/const.go
index 962a40c3..18b0550b 100644
--- a/pkg/ddc/vineyard/const.go
+++ b/pkg/ddc/vineyard/const.go
@@ -41,4 +41,17 @@ const (
 	WorkerEtcdPrefix = "etcd.prefix"
 
 	DefaultWorkerEtcdPrefixValue = "/vineyard"
+
+	// the size of vineyardd in vineyard-fuse
+	VineyarddSize = "size"
+
+	// the etcd endpoint of vineyardd in vineyard-fuse
+	EtcdEndpoint = "etcd_endpoint"
+
+	// the etcd prefix of vineyardd in vineyard-fuse
+	EtcdPrefix = "etcd_prefix"
+
+	DefaultSize = "0"
+
+	DefaultEtcdPrefix = "/vineyard"
 )
diff --git a/pkg/ddc/vineyard/transform.go b/pkg/ddc/vineyard/transform.go
index 8c715873..77df3b15 100644
--- a/pkg/ddc/vineyard/transform.go
+++ b/pkg/ddc/vineyard/transform.go
@@ -191,6 +191,10 @@ func (e *VineyardEngine) transformFuse(runtime *datav1alpha1.VineyardRuntime, va
 	// parse fuse pod network mode
 	value.Fuse.HostNetwork = datav1alpha1.IsHostNetwork(runtime.Spec.Fuse.NetworkMode)
 
+	options := e.transformFuseOptions(runtime, value)
+	if len(options) != 0 {
+		value.Fuse.Options = options
+	}
 	e.transformResourcesForFuse(runtime, value)
 }
 
@@ -237,6 +241,21 @@ func (e *VineyardEngine) transformWorkerOptions(runtime *datav1alpha1.VineyardRu
 	return options
 }
 
+func (e *VineyardEngine) transformFuseOptions(runtime *datav1alpha1.VineyardRuntime, value *Vineyard) map[string]string {
+	options := map[string]string{
+		VineyarddSize: DefaultSize,
+		EtcdEndpoint:  fmt.Sprintf("http://%s-master-0.%s-master.%s:%d", value.FullnameOverride, value.FullnameOverride, e.namespace, value.Master.Ports[MasterClientName]),
+		EtcdPrefix:    DefaultEtcdPrefix,
+	}
+
+	if len(runtime.Spec.Fuse.Options) > 0 {
+		for key, value := range runtime.Spec.Fuse.Options {
+			options[key] = value
+		}
+	}
+	return options
+}
+
 func (e *VineyardEngine) transformWorkerPorts(runtime *datav1alpha1.VineyardRuntime) map[string]int {
 	ports := map[string]int{
 		WorkerRPCName:      WorkerRPCPort,
diff --git a/pkg/ddc/vineyard/type.go b/pkg/ddc/vineyard/type.go
index 2f422862..f5f9ee18 100644
--- a/pkg/ddc/vineyard/type.go
+++ b/pkg/ddc/vineyard/type.go
@@ -93,6 +93,7 @@ type Fuse struct {
 	NodeSelector    map[string]string            `json:"nodeSelector,omitempty"`
 	Resources       common.Resources             `json:"resources,omitempty"`
 	HostPID         bool                         `json:"hostPID,omitempty"`
+	Options         map[string]string            `json:"options,omitempty"`
 }
 
 type TieredStore struct {


Test patch:
diff --git a/pkg/dataflow/affinity_test.go b/pkg/dataflow/affinity_test.go
index e30c7646..bc4ca70b 100644
--- a/pkg/dataflow/affinity_test.go
+++ b/pkg/dataflow/affinity_test.go
@@ -20,6 +20,7 @@ import (
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/common"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/fake"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/feature"
 	appsv1 "k8s.io/api/apps/v1"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -31,10 +32,11 @@ import (
 func TestInjectAffinityByRunAfterOp(t *testing.T) {
 
 	type args struct {
-		runAfter        *datav1alpha1.OperationRef
-		opNamespace     string
-		objects         []runtime.Object
-		currentAffinity *v1.Affinity
+		runAfter                *datav1alpha1.OperationRef
+		opNamespace             string
+		objects                 []runtime.Object
+		currentAffinity         *v1.Affinity
+		dataflowAffinityEnabled bool
 	}
 	tests := []struct {
 		name    string
@@ -58,8 +60,9 @@ func TestInjectAffinityByRunAfterOp(t *testing.T) {
 						Status: datav1alpha1.OperationStatus{},
 					},
 				},
-				opNamespace:     "default",
-				currentAffinity: nil,
+				opNamespace:             "default",
+				currentAffinity:         nil,
+				dataflowAffinityEnabled: true,
 			},
 			want:    nil,
 			wantErr: false,
@@ -83,8 +86,9 @@ func TestInjectAffinityByRunAfterOp(t *testing.T) {
 						Status: datav1alpha1.OperationStatus{},
 					},
 				},
-				opNamespace:     "default",
-				currentAffinity: nil,
+				opNamespace:             "default",
+				currentAffinity:         nil,
+				dataflowAffinityEnabled: true,
 			},
 			want:    nil,
 			wantErr: true,
@@ -124,8 +128,9 @@ func TestInjectAffinityByRunAfterOp(t *testing.T) {
 						},
 					},
 				},
-				opNamespace:     "default",
-				currentAffinity: nil,
+				opNamespace:             "default",
+				currentAffinity:         nil,
+				dataflowAffinityEnabled: true,
 			},
 			want: &v1.Affinity{
 				NodeAffinity: &v1.NodeAffinity{
@@ -186,8 +191,9 @@ func TestInjectAffinityByRunAfterOp(t *testing.T) {
 						},
 					},
 				},
-				opNamespace:     "default",
-				currentAffinity: nil,
+				opNamespace:             "default",
+				currentAffinity:         nil,
+				dataflowAffinityEnabled: true,
 			},
 			want: &v1.Affinity{
 				NodeAffinity: &v1.NodeAffinity{
@@ -260,8 +266,9 @@ func TestInjectAffinityByRunAfterOp(t *testing.T) {
 						},
 					},
 				},
-				opNamespace:     "default",
-				currentAffinity: nil,
+				opNamespace:             "default",
+				currentAffinity:         nil,
+				dataflowAffinityEnabled: true,
 			},
 			want: &v1.Affinity{
 				NodeAffinity: &v1.NodeAffinity{
@@ -283,6 +290,65 @@ func TestInjectAffinityByRunAfterOp(t *testing.T) {
 			},
 			wantErr: false,
 		},
+		{
+			name: "not enabled, prefer policy, use zone",
+			args: args{
+				runAfter: &datav1alpha1.OperationRef{
+					Kind:      "DataLoad",
+					Name:      "test-op",
+					Namespace: "test",
+					AffinityStrategy: datav1alpha1.AffinityStrategy{
+						Policy: datav1alpha1.PreferAffinityStrategy,
+						Prefers: []datav1alpha1.Prefer{
+							{
+								Weight: 10,
+								Name:   common.K8sZoneLabelKey,
+							},
+						},
+					},
+				},
+				objects: []runtime.Object{
+					&datav1alpha1.DataLoad{
+						ObjectMeta: metav1.ObjectMeta{
+							Name:      "test-op",
+							Namespace: "test",
+						},
+						Status: datav1alpha1.OperationStatus{
+							NodeAffinity: &v1.NodeAffinity{
+								RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
+									NodeSelectorTerms: []v1.NodeSelectorTerm{
+										{
+											MatchExpressions: []v1.NodeSelectorRequirement{
+												{
+													Key:      common.K8sNodeNameLabelKey,
+													Operator: v1.NodeSelectorOpIn,
+													Values:   []string{"node01"},
+												},
+												{
+													Key:      common.K8sZoneLabelKey,
+													Operator: v1.NodeSelectorOpIn,
+													Values:   []string{"zone01"},
+												},
+												{
+													Key:      common.K8sRegionLabelKey,
+													Operator: v1.NodeSelectorOpIn,
+													Values:   []string{"region01"},
+												},
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				},
+				opNamespace:             "default",
+				currentAffinity:         nil,
+				dataflowAffinityEnabled: false,
+			},
+			want:    nil,
+			wantErr: false,
+		},
 	}
 	testScheme := runtime.NewScheme()
 	_ = v1.AddToScheme(testScheme)
@@ -292,6 +358,15 @@ func TestInjectAffinityByRunAfterOp(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			c := fake.NewFakeClientWithScheme(testScheme, tt.args.objects...)
+
+			err := feature.DefaultMutableFeatureGate.SetFromMap(map[string]bool{
+				string(DataflowAffinity): tt.args.dataflowAffinityEnabled,
+			})
+			if err != nil {
+				t.Errorf("failed to set feature gate: %v", err)
+				return
+			}
+
 			got, err := InjectAffinityByRunAfterOp(c, tt.args.runAfter, tt.args.opNamespace, tt.args.currentAffinity)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("InjectAffinityByRunAfterOp() error = %v, wantErr %v", err, tt.wantErr)
diff --git a/pkg/ddc/vineyard/transform_resources_test.go b/pkg/ddc/vineyard/transform_resources_test.go
index 78ab46d6..9006b0ca 100644
--- a/pkg/ddc/vineyard/transform_resources_test.go
+++ b/pkg/ddc/vineyard/transform_resources_test.go
@@ -523,7 +523,7 @@ func TestTransformResourcesForFuseWithValue(t *testing.T) {
 	}{
 		{&datav1alpha1.VineyardRuntime{
 			Spec: datav1alpha1.VineyardRuntimeSpec{
-				Fuse: datav1alpha1.VineyardSockSpec{
+				Fuse: datav1alpha1.VineyardClientSocketSpec{
 					Resources: resources,
 				},
 				TieredStore: datav1alpha1.TieredStore{
diff --git a/pkg/ddc/vineyard/transform_test.go b/pkg/ddc/vineyard/transform_test.go
index f29adfe7..fa1aeac4 100755
--- a/pkg/ddc/vineyard/transform_test.go
+++ b/pkg/ddc/vineyard/transform_test.go
@@ -51,7 +51,7 @@ func TestTransformFuse(t *testing.T) {
 		"test image, imageTag and pullPolicy": {
 			runtime: &datav1alpha1.VineyardRuntime{
 				Spec: datav1alpha1.VineyardRuntimeSpec{
-					Fuse: datav1alpha1.VineyardSockSpec{
+					Fuse: datav1alpha1.VineyardClientSocketSpec{
 						Image:           "dummy-fuse-image",
 						ImageTag:        "dummy-tag",
 						ImagePullPolicy: "IfNotPresent",
@@ -67,7 +67,7 @@ func TestTransformFuse(t *testing.T) {
 		"test image, imageTag and pullPolicy from env": {
 			runtime: &datav1alpha1.VineyardRuntime{
 				Spec: datav1alpha1.VineyardRuntimeSpec{
-					Fuse: datav1alpha1.VineyardSockSpec{
+					Fuse: datav1alpha1.VineyardClientSocketSpec{
 						ImagePullPolicy: "IfNotPresent",
 						Env:             map[string]string{"TEST_ENV": "true"},
 						CleanPolicy:     "OnRuntimeDeleted",
@@ -473,6 +473,78 @@ func TestTransformWorkerOptions(t *testing.T) {
 	}
 }
 
+func TestTransformFuseOptions(t *testing.T) {
+	tests := []struct {
+		name     string
+		runtime  *datav1alpha1.VineyardRuntime
+		value    *Vineyard
+		expected map[string]string
+	}{
+		{
+			name: "NoFuseOptions",
+			runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					Fuse: datav1alpha1.VineyardClientSocketSpec{
+						Options: map[string]string{},
+					},
+				},
+			},
+			value: &Vineyard{
+				FullnameOverride: "vineyard",
+				Master: Master{
+					Ports: map[string]int{
+						"client": 2379,
+					},
+				},
+			},
+			expected: map[string]string{
+				"size":          "0",
+				"etcd_endpoint": "http://vineyard-master-0.vineyard-master.default:2379",
+				"etcd_prefix":   "/vineyard",
+			},
+		},
+		{
+			name: "WithFuseOptions",
+			runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					Fuse: datav1alpha1.VineyardClientSocketSpec{
+						Options: map[string]string{
+							"size":           "10Gi",
+							"etcd_endpoint":  "http://vineyard-master-0.vineyard-master.default:12379",
+							"reserve_memory": "true",
+						},
+					},
+				},
+			},
+			value: &Vineyard{
+				Master: Master{
+					Ports: map[string]int{
+						"client": 12379,
+					},
+				},
+			},
+			expected: map[string]string{
+				"size":           "10Gi",
+				"etcd_endpoint":  "http://vineyard-master-0.vineyard-master.default:12379",
+				"etcd_prefix":    "/vineyard",
+				"reserve_memory": "true",
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			engine := &VineyardEngine{
+				namespace: "default",
+			}
+			actual := engine.transformFuseOptions(tt.runtime, tt.value)
+			if !reflect.DeepEqual(actual, tt.expected) {
+				t.Errorf("%s: expected %v, got %v", tt.name, tt.expected, actual)
+			}
+		})
+	}
+}
+
 func TestTransformWorkerPorts(t *testing.T) {
 	tests := []struct {
 		name     string