CP-32985: XenCenter control to turn read caching on / off per SR

Signed-off-by: Mihaela Stoica <mihaela.stoica@citrix.com>
This commit is contained in:
Mihaela Stoica 2020-04-14 18:40:17 +01:00 committed by Konstantina Chremmou
parent bb560db1dc
commit 71a09385c3
11 changed files with 1027 additions and 0 deletions

View File

@ -82,6 +82,7 @@ namespace XenAdmin.Dialogs
private USBEditPage usbEditPage;
private NetworkOptionsEditPage NetworkOptionsEditPage;
private ClusteringEditPage ClusteringEditPage;
private SrReadCachingEditPage SrReadCachingEditPage;
#endregion
private IXenObject xenObject, xenObjectBefore, xenObjectCopy;
@ -270,6 +271,9 @@ namespace XenAdmin.Dialogs
ShowTab(newVmApplianceVmOrderAndDelaysPage1 = new NewVMApplianceVMOrderAndDelaysPage { Pool = pool });
}
if (is_sr && ((SR)xenObjectCopy).SupportsReadCaching() && !Helpers.FeatureForbidden(xenObjectCopy, Host.RestrictReadCaching))
ShowTab(SrReadCachingEditPage = new SrReadCachingEditPage());
//
// Now add one tab per VBD (for VDIs only)
//

View File

@ -1143,4 +1143,7 @@
<data name="XenServerUpdateAlert" xml:space="preserve">
<value>updates-applying</value>
</data>
<data name="StorageReadCaching" xml:space="preserve">
<value>storage-readcaching</value>
</data>
</root>

View File

@ -0,0 +1,159 @@
namespace XenAdmin.SettingsPanels
{
partial class SrReadCachingEditPage
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SrReadCachingEditPage));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.labelTitle = new XenAdmin.Controls.Common.AutoHeightLabel();
this.checkBoxEnableReadCaching = new System.Windows.Forms.CheckBox();
this.tableLayoutInfo = new System.Windows.Forms.TableLayoutPanel();
this.linkLabelTellMeMore = new System.Windows.Forms.LinkLabel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.labelChangeInfo = new System.Windows.Forms.Label();
this.pictureBoxInfo2 = new System.Windows.Forms.PictureBox();
this.pictureBoxInfo1 = new System.Windows.Forms.PictureBox();
this.labelVdiInfo = new System.Windows.Forms.Label();
this.labelMemoryInfo = new System.Windows.Forms.Label();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutInfo.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxInfo2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxInfo1)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
this.tableLayoutPanel1.Controls.Add(this.labelTitle, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.checkBoxEnableReadCaching, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutInfo, 0, 4);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
//
// labelTitle
//
resources.ApplyResources(this.labelTitle, "labelTitle");
this.tableLayoutPanel1.SetColumnSpan(this.labelTitle, 2);
this.labelTitle.Name = "labelTitle";
//
// checkBoxEnableReadCaching
//
resources.ApplyResources(this.checkBoxEnableReadCaching, "checkBoxEnableReadCaching");
this.tableLayoutPanel1.SetColumnSpan(this.checkBoxEnableReadCaching, 2);
this.checkBoxEnableReadCaching.Name = "checkBoxEnableReadCaching";
this.checkBoxEnableReadCaching.UseVisualStyleBackColor = true;
//
// tableLayoutInfo
//
resources.ApplyResources(this.tableLayoutInfo, "tableLayoutInfo");
this.tableLayoutPanel1.SetColumnSpan(this.tableLayoutInfo, 2);
this.tableLayoutInfo.Controls.Add(this.linkLabelTellMeMore, 0, 3);
this.tableLayoutInfo.Controls.Add(this.pictureBox1, 0, 2);
this.tableLayoutInfo.Controls.Add(this.labelChangeInfo, 0, 2);
this.tableLayoutInfo.Controls.Add(this.pictureBoxInfo2, 0, 1);
this.tableLayoutInfo.Controls.Add(this.pictureBoxInfo1, 0, 0);
this.tableLayoutInfo.Controls.Add(this.labelVdiInfo, 1, 0);
this.tableLayoutInfo.Controls.Add(this.labelMemoryInfo, 1, 1);
this.tableLayoutInfo.Name = "tableLayoutInfo";
//
// linkLabelTellMeMore
//
resources.ApplyResources(this.linkLabelTellMeMore, "linkLabelTellMeMore");
this.tableLayoutInfo.SetColumnSpan(this.linkLabelTellMeMore, 2);
this.linkLabelTellMeMore.Name = "linkLabelTellMeMore";
this.linkLabelTellMeMore.TabStop = true;
this.linkLabelTellMeMore.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelTellMeMore_LinkClicked);
//
// pictureBox1
//
resources.ApplyResources(this.pictureBox1, "pictureBox1");
this.pictureBox1.Image = global::XenAdmin.Properties.Resources._000_Info3_h32bit_16;
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.TabStop = false;
//
// labelChangeInfo
//
resources.ApplyResources(this.labelChangeInfo, "labelChangeInfo");
this.labelChangeInfo.Name = "labelChangeInfo";
//
// pictureBoxInfo2
//
resources.ApplyResources(this.pictureBoxInfo2, "pictureBoxInfo2");
this.pictureBoxInfo2.Image = global::XenAdmin.Properties.Resources._000_Info3_h32bit_16;
this.pictureBoxInfo2.Name = "pictureBoxInfo2";
this.pictureBoxInfo2.TabStop = false;
//
// pictureBoxInfo1
//
resources.ApplyResources(this.pictureBoxInfo1, "pictureBoxInfo1");
this.pictureBoxInfo1.Image = global::XenAdmin.Properties.Resources._000_Info3_h32bit_16;
this.pictureBoxInfo1.Name = "pictureBoxInfo1";
this.pictureBoxInfo1.TabStop = false;
//
// labelVdiInfo
//
resources.ApplyResources(this.labelVdiInfo, "labelVdiInfo");
this.labelVdiInfo.Name = "labelVdiInfo";
//
// labelMemoryInfo
//
resources.ApplyResources(this.labelMemoryInfo, "labelMemoryInfo");
this.labelMemoryInfo.Name = "labelMemoryInfo";
//
// SrReadCachingEditPage
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.tableLayoutPanel1);
this.Name = "SrReadCachingEditPage";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutInfo.ResumeLayout(false);
this.tableLayoutInfo.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxInfo2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxInfo1)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private Controls.Common.AutoHeightLabel labelTitle;
private System.Windows.Forms.CheckBox checkBoxEnableReadCaching;
private System.Windows.Forms.TableLayoutPanel tableLayoutInfo;
private System.Windows.Forms.PictureBox pictureBoxInfo2;
private System.Windows.Forms.PictureBox pictureBoxInfo1;
private System.Windows.Forms.Label labelVdiInfo;
private System.Windows.Forms.Label labelMemoryInfo;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label labelChangeInfo;
private System.Windows.Forms.LinkLabel linkLabelTellMeMore;
}
}

View File

@ -0,0 +1,82 @@
/* Copyright (c) Citrix Systems, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System.Drawing;
using System.Windows.Forms;
using XenAdmin.Actions;
using XenAdmin.Help;
using XenAPI;
namespace XenAdmin.SettingsPanels
{
public partial class SrReadCachingEditPage : UserControl, IEditPage
{
private SR sr;
public SrReadCachingEditPage()
{
InitializeComponent();
Text = Messages.READ_CACHING;
}
public string SubText => checkBoxEnableReadCaching.Checked ? Messages.ENABLED : Messages.DISABLED;
public Image Image => Properties.Resources._000_Storage_h32bit_16;
public AsyncAction SaveSettings()
{
sr.SetReadCachingEnabled(checkBoxEnableReadCaching.Checked);
return null;
}
public void SetXenObjects(IXenObject orig, IXenObject clone)
{
sr = clone as SR;
if (sr == null)
return;
checkBoxEnableReadCaching.Checked = sr.GetReadCachingEnabled();
}
public bool ValidToSave => true;
public void ShowLocalValidationMessages()
{ }
public void Cleanup()
{ }
public bool HasChanged => checkBoxEnableReadCaching.Checked != sr.GetReadCachingEnabled();
private void linkLabelTellMeMore_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
HelpManager.Launch("StorageReadCaching");
}
}
}

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,519 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="labelTitle.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="labelTitle.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelTitle.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="labelTitle.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 0</value>
</data>
<data name="labelTitle.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 25</value>
</data>
<data name="labelTitle.Size" type="System.Drawing.Size, System.Drawing">
<value>609, 51</value>
</data>
<data name="labelTitle.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelTitle.Text" xml:space="preserve">
<value>Read caching improves a VMs disk performance as, after the initial read from external disk, data is cached within the hosts free memory. Select whether you want to enable read caching on this Storage Repository.</value>
</data>
<data name="&gt;&gt;labelTitle.Name" xml:space="preserve">
<value>labelTitle</value>
</data>
<data name="&gt;&gt;labelTitle.Type" xml:space="preserve">
<value>XenAdmin.Controls.Common.AutoHeightLabel, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;labelTitle.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;labelTitle.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="checkBoxEnableReadCaching.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="checkBoxEnableReadCaching.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="checkBoxEnableReadCaching.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 80</value>
</data>
<data name="checkBoxEnableReadCaching.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="checkBoxEnableReadCaching.Size" type="System.Drawing.Size, System.Drawing">
<value>160, 21</value>
</data>
<data name="checkBoxEnableReadCaching.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="checkBoxEnableReadCaching.Text" xml:space="preserve">
<value>&amp;Enable read caching</value>
</data>
<data name="&gt;&gt;checkBoxEnableReadCaching.Name" xml:space="preserve">
<value>checkBoxEnableReadCaching</value>
</data>
<data name="&gt;&gt;checkBoxEnableReadCaching.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBoxEnableReadCaching.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;checkBoxEnableReadCaching.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="tableLayoutInfo.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="tableLayoutInfo.ColumnCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="linkLabelTellMeMore.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="linkLabelTellMeMore.Font" type="System.Drawing.Font, System.Drawing">
<value>Segoe UI, 9pt</value>
</data>
<data name="linkLabelTellMeMore.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="linkLabelTellMeMore.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 210</value>
</data>
<data name="linkLabelTellMeMore.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="linkLabelTellMeMore.Size" type="System.Drawing.Size, System.Drawing">
<value>282, 20</value>
</data>
<data name="linkLabelTellMeMore.TabIndex" type="System.Int32, mscorlib">
<value>13</value>
</data>
<data name="linkLabelTellMeMore.Text" xml:space="preserve">
<value>Tell me more about storage read caching</value>
</data>
<data name="linkLabelTellMeMore.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;linkLabelTellMeMore.Name" xml:space="preserve">
<value>linkLabelTellMeMore</value>
</data>
<data name="&gt;&gt;linkLabelTellMeMore.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;linkLabelTellMeMore.Parent" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;linkLabelTellMeMore.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="pictureBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="pictureBox1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 147</value>
</data>
<data name="pictureBox1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>20, 20</value>
</data>
<data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
<value>pictureBox1</value>
</data>
<data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="labelChangeInfo.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelChangeInfo.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelChangeInfo.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelChangeInfo.Location" type="System.Drawing.Point, System.Drawing">
<value>32, 147</value>
</data>
<data name="labelChangeInfo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 25</value>
</data>
<data name="labelChangeInfo.Size" type="System.Drawing.Size, System.Drawing">
<value>573, 34</value>
</data>
<data name="labelChangeInfo.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="labelChangeInfo.Text" xml:space="preserve">
<value>When read caching enablement is changed, the running VMs will only benefit from the change after they are rebooted. </value>
</data>
<data name="&gt;&gt;labelChangeInfo.Name" xml:space="preserve">
<value>labelChangeInfo</value>
</data>
<data name="&gt;&gt;labelChangeInfo.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelChangeInfo.Parent" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;labelChangeInfo.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="pictureBoxInfo2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="pictureBoxInfo2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="pictureBoxInfo2.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 84</value>
</data>
<data name="pictureBoxInfo2.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="pictureBoxInfo2.Size" type="System.Drawing.Size, System.Drawing">
<value>20, 20</value>
</data>
<data name="pictureBoxInfo2.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="&gt;&gt;pictureBoxInfo2.Name" xml:space="preserve">
<value>pictureBoxInfo2</value>
</data>
<data name="&gt;&gt;pictureBoxInfo2.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBoxInfo2.Parent" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;pictureBoxInfo2.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="pictureBoxInfo1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="pictureBoxInfo1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="pictureBoxInfo1.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 4</value>
</data>
<data name="pictureBoxInfo1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 25</value>
</data>
<data name="pictureBoxInfo1.Size" type="System.Drawing.Size, System.Drawing">
<value>20, 20</value>
</data>
<data name="pictureBoxInfo1.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;pictureBoxInfo1.Name" xml:space="preserve">
<value>pictureBoxInfo1</value>
</data>
<data name="&gt;&gt;pictureBoxInfo1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBoxInfo1.Parent" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;pictureBoxInfo1.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="labelVdiInfo.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelVdiInfo.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelVdiInfo.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelVdiInfo.Location" type="System.Drawing.Point, System.Drawing">
<value>32, 4</value>
</data>
<data name="labelVdiInfo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 25</value>
</data>
<data name="labelVdiInfo.Size" type="System.Drawing.Size, System.Drawing">
<value>573, 51</value>
</data>
<data name="labelVdiInfo.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="labelVdiInfo.Text" xml:space="preserve">
<value>Read caching only applies to read-only VDIs and VDI parents. These VDIs exist where VMs are created from Fast Clone or disk snapshots. The greatest performance improvements can be seen when many VMs are cloned from a single golden image.</value>
</data>
<data name="&gt;&gt;labelVdiInfo.Name" xml:space="preserve">
<value>labelVdiInfo</value>
</data>
<data name="&gt;&gt;labelVdiInfo.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelVdiInfo.Parent" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;labelVdiInfo.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="labelMemoryInfo.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelMemoryInfo.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelMemoryInfo.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelMemoryInfo.Location" type="System.Drawing.Point, System.Drawing">
<value>32, 84</value>
</data>
<data name="labelMemoryInfo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 25</value>
</data>
<data name="labelMemoryInfo.Size" type="System.Drawing.Size, System.Drawing">
<value>573, 34</value>
</data>
<data name="labelMemoryInfo.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="labelMemoryInfo.Text" xml:space="preserve">
<value>Performance improvements depend on the amount of free memory available in the hosts Control Domain. </value>
</data>
<data name="&gt;&gt;labelMemoryInfo.Name" xml:space="preserve">
<value>labelMemoryInfo</value>
</data>
<data name="&gt;&gt;labelMemoryInfo.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelMemoryInfo.Parent" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;labelMemoryInfo.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="tableLayoutInfo.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tableLayoutInfo.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 133</value>
</data>
<data name="tableLayoutInfo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="tableLayoutInfo.RowCount" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="tableLayoutInfo.Size" type="System.Drawing.Size, System.Drawing">
<value>609, 314</value>
</data>
<data name="tableLayoutInfo.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="&gt;&gt;tableLayoutInfo.Name" xml:space="preserve">
<value>tableLayoutInfo</value>
</data>
<data name="&gt;&gt;tableLayoutInfo.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutInfo.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;tableLayoutInfo.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="tableLayoutInfo.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="linkLabelTellMeMore" Row="3" RowSpan="1" Column="0" ColumnSpan="2" /&gt;&lt;Control Name="pictureBox1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="labelChangeInfo" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="pictureBoxInfo2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="pictureBoxInfo1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="labelVdiInfo" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="labelMemoryInfo" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,Percent,100" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20,Absolute,25,Absolute,25,Absolute,25,Absolute,25,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tableLayoutPanel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="tableLayoutPanel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="tableLayoutPanel1.RowCount" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>617, 451</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="labelTitle" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /&gt;&lt;Control Name="checkBoxEnableReadCaching" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /&gt;&lt;Control Name="tableLayoutInfo" Row="4" RowSpan="1" Column="0" ColumnSpan="2" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,Percent,100" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,Absolute,24,Percent,100,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>120, 120</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>617, 451</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>SrReadCachingEditPage</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -435,6 +435,12 @@
<Compile Include="SettingsPanels\SecurityEditPage.Designer.cs">
<DependentUpon>SecurityEditPage.cs</DependentUpon>
</Compile>
<Compile Include="SettingsPanels\SrReadCachingEditPage.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="SettingsPanels\SrReadCachingEditPage.Designer.cs">
<DependentUpon>SrReadCachingEditPage.cs</DependentUpon>
</Compile>
<Compile Include="SettingsPanels\USBEditPage.cs">
<SubType>UserControl</SubType>
</Compile>
@ -2134,6 +2140,15 @@
<EmbeddedResource Include="SettingsPanels\SecurityEditPage.zh-CN.resx">
<DependentUpon>SecurityEditPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\SrReadCachingEditPage.resx">
<DependentUpon>SrReadCachingEditPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\SrReadCachingEditPage.ja.resx">
<DependentUpon>SrReadCachingEditPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\SrReadCachingEditPage.zh-CN.resx">
<DependentUpon>SrReadCachingEditPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\USBEditPage.ja.resx">
<DependentUpon>USBEditPage.cs</DependentUpon>
</EmbeddedResource>

View File

@ -31266,6 +31266,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Read caching.
/// </summary>
public static string READ_CACHING {
get {
return ResourceManager.GetString("READ_CACHING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Read Only.
/// </summary>

View File

@ -10859,6 +10859,9 @@ You must reconnect to {1} using an account with Pool Administrator permissions b
<data name="RBAC_WARNING_VM_WIZARD_MEM" xml:space="preserve">
<value>A {0} user cannot alter memory values and will be restricted to the settings on the template.</value>
</data>
<data name="READ_CACHING" xml:space="preserve">
<value>Read caching</value>
</data>
<data name="READ_ONLY" xml:space="preserve">
<value>Read Only</value>
</data>

View File

@ -952,6 +952,37 @@ namespace XenAPI
return sm != null && sm.features != null && sm.features.ContainsKey("SR_TRIM");
}
/// <summary>
/// Whether the underlying SR backend supports read caching.
/// </summary>
/// <returns></returns>
public bool SupportsReadCaching()
{
// for Stockholm or greater versions, check if the SM has the VDI_READ_CACHING capability
if (Helpers.StockholmOrGreater(Connection))
{
var sm = SM.GetByType(Connection, type);
return sm != null && Array.IndexOf(sm.capabilities, "VDI_READ_CACHING") != -1;
}
// for older versions, use the SR type; read caching is available for NFS, EXT3 and SMB/CIFS SR types
var srType = GetSRType(false);
return srType == SRTypes.nfs || srType == SRTypes.ext || srType == SRTypes.smb;
}
public bool GetReadCachingEnabled()
{
// read caching is enabled when the o_direct key is not defined (or set to false) in other_config
// and is disabled if o_direct=true
return SupportsReadCaching() && !BoolKey(other_config, "o_direct");
}
public void SetReadCachingEnabled(bool value)
{
// to enable read caching, remove the o_direct key; to disable it, set o_direct=true
other_config = SetDictionaryKey(other_config, "o_direct", value ? null : bool.TrueString.ToLower());
}
#region IEquatable<SR> Members
/// <summary>