Not enough space on the disk – Windows Azure

No, it’s not because Local Storage quota is low. That’s easy to fix by just increasing the quota in the SerivceDef. I hit this nasty issue while working with WebDeploy, but since you might get this in a different context as well I wanted to share it and get hours back of your life, dear reader Smile

Problem

WebDeploy throws an out of disk exception when creating a package

There is not enough space on the disk. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at System.IO.BinaryWriter.Write(Byte[] buffer, Int32 index, Int32 count) at Microsoft.Web.Deployment.ZipEntry.ReadFromFile(String path, Boolean shouldCompress, BinaryWriter tempWriter, Stream stream, FileAttributes attr, DateTime lastModifiedTime, String descriptor, Int64 size) at Microsoft.Web.Deployment.ZipEntry..ctor(String path, DeploymentObject source, ZipFile zipFile)

Analysis

WebDeploy uses a temp path to create temporary files during the package creation. This folder seems to have a 100MB quota according to MSDN, so if the package is more than that, the process will throw an IO exception because the “disk is full” even though there is plenty of space. Below a trace of Process Monitor running from the Azure Web Role showing the CreateFile returning DISK FULL.

image

By looking with Reflector, we can validate that WebDeploy is using Path.GetTempPath.

image

Solution

Since we can’t change WebDeploy code nor parameterize it to use a different path, the solution is to change the TEMP/TMP environment variables, as suggested here http://msdn.microsoft.com/en-us/library/gg465400.aspx#Y976. An excerpt…

Ensure That the TEMP/TMP Target Directory Has Sufficient Space

The standard Windows environment variables TEMP and TMP are available to code running in your application. Both TEMP and TMP point to a single directory that has a maximum size of 100 MB. Any data stored in this directory is not persisted across the lifecycle of the hosted service; if the role instances in a hosted service are recycled, the directory is cleaned.

If the temporary directory for the hosted service runs out of space, or if you need data to persist in the temporary directory across the lifecycle of the hosted service, you can implement one of the following alternatives:

  • You can configure a local storage resource, and access it directly instead of using TEMP or TMP. To access a local storage resource from code running within your application, call the RoleEnvironment.GetLocalResource method. For more information about setting up local storage resources, see How to Configure Local Storage Resources
  • You can configure a local storage resource, and point the TEMP and TMP directories to point to the path of the local storage resource. This modification should be performed within the RoleEntryPoint.OnStart method.
  • The following code example shows how to modify the target directories for TEMP and TMP from within the OnStart method:

    using System;
    using Microsoft.WindowsAzure.ServiceRuntime;
    
    namespace WorkerRole1
    {
       public class WorkerRole : RoleEntryPoint
       {
          public override bool OnStart()
          {
             string customTempLocalResourcePath = 
                RoleEnvironment.GetLocalResource("tempdir").RootPath;
             Environment.SetEnvironmentVariable("TMP", customTempLocalResourcePath);
             Environment.SetEnvironmentVariable("TEMP", customTempLocalResourcePath);
                
             // The rest of your startup code goes here…
             
             return base.OnStart();
          }
       }
    }



    No Comments

    • […] ホーム紹介 RSS feed Xian Guo Zhua Xia Yodao Google netvibes newsgator Bloglines iNezha Twitter © 2009-2011 蒼の王座 Web Deployで発生するWindows Azureディスク容量不足への対応 8月 7th, 2011 コメントする | トラックバック「Not enough space on the disk – Windows Azure | Matias Woloski」をざっくり意訳した投稿です。ローカルストレージ容量が容量が少なくて、Windows Azureで容量不足が発生します。ServiceDefで容量増加をすることで簡単に解決することができます。WebDeployを使用すると度々この問題に直面します。解決方法について情報共有したいと思います。問題パッケージを作成する時、WebDeployがディスク容量不足の例外が発生します。There is not enough space on the disk. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at System.IO.BinaryWriter.Write(Byte[] buffer, Int32 index, Int32 count) at Microsoft.Web.Deployment.ZipEntry.ReadFromFile(String path, Boolean shouldCompress, BinaryWriter tempWriter, Stream stream, FileAttributes attr, DateTime lastModifiedTime, String descriptor, Int64 size) at Microsoft.Web.Deployment.ZipEntry..ctor(String path, DeploymentObject source, ZipFile zipFile)分析パッケージを作成している間、WebDeployは一時ファイルを作成するためにtempパスを使用します。このフォルダーは、MSDNによると100MBです。パッケージが100MB以上必要な場合、”disk is full”が原因で、IO例外が発生します。Azure Web Role上で、Process Monitorのトレースを見ると、CreateFileからDISK FULLを返します。Reflectorで見ると、WebDeployはPath.GetTempPathを使用します。解決策異なるパスを使用するのに、WebDeployコードを変更する必要はありません。TEMP/TMP環境設定を変更します。詳細は、General Troubleshooting in Windows Azureを参照して下さい。TEMP/TMPのディレクトリを十分な容量を持っているディレクトリに変更することができます。TEMPとTMPは、最大サイズ100MBのディレクトリに設定さています。このディレクトリに保存されたデータは、ホストサービスのライフサイクルの中で永続化されません。ロールインスタンスがリサイクルすると、ディレクトリはクリアされます。もしホストサービス用の一時ディレクトリが容量不足になるか、一時ディレクトリのデータを永続化させる必要があるなら、それらを解決することができます。ローカルストレージのリソースを設定することで、TEMP又はTMPを使用する代わりに直接アクセスできるようになります。ローカルストレージリソースにアクセスする為に、アプリケーションからRoleEnvironment.GetLocalResource Method (Microsoft.WindowsAzure.ServiceRuntime)メソッドを呼び出します。詳細については、How to Configure Local Storage Resourcesを参照してください。ローカルストレージリソースを設定し、TEMPとTMPディレクトリをローカルストレージリソースに指定します。この変更は、RoleEntryPoint.OnStart Method (Microsoft.WindowsAzure.ServiceRuntime)メソッド内で処理すべきです。次のコードは、OnStartメソッドからTEMPとTMPの対象ディレクトリを変更する方法です。using System; using Microsoft.WindowsAzure.ServiceRuntime;namespace WorkerRole1 { public class WorkerRole : RoleEntryPoint { public override bool OnStart() { string customTempLocalResourcePath = RoleEnvironment.GetLocalResource("tempdir").RootPath; Environment.SetEnvironmentVariable("TMP", customTempLocalResourcePath); Environment.SetEnvironmentVariable("TEMP", customTempLocalResourcePath);// The rest of your startup code goes here…return base.OnStart(); } } }閲覧数TOP5マイクロソフト組織改革:赤服のScott GuthrieがAzureアプリケーションプラットフォームチームを担当Windows Azure AppFabricキャッシュサービスをリリース!Windows Azureニュースfrom MIX 11(Azure Team Blogの意訳)SQL Azure DBに接続しようとすると18456エラーがでる場合の対処Windows Azure Roleアーキテクチャ関連エントリー SQL AzureでCo-Adminを設定する方法 TechED NA2011:SQL Azure概要のまとめ Windows Azure VMのOSパフォーマンスログが格納されている場所 Enzo Backup for SQL Azure 体験記その1 Windows Azure Migration Scannerを公開Tweet タグ: Tips, Web Deploy, Windows Azure ASP.NET Universal ProviderをSQL的側面から見てみた まだコメントはありません。 Cancel reply […]

    • matthieu says:

      Thanks, you saved my life !

    Leave a Reply