Category: .NET

  • How Not To Retire Open-Source Projects

    A couple of days ago I had a chat with a friend, an ex-Telerik employee, who was the driving force behind JustDecompile product. We discussed briefly the recent Telerik announcement that open-sourced JustDecompile has been retired.

    This the moment when you say “Wait a moment! JustDecompile is not open-source project”. This is correct. However JustDecompileEngine, the decompilation engine behind JustDecompile is open-source project since 2015. And if try to access it on GitHub you are greeted with a 404 error

    Can you see the problem? Let’s look at another retired Telerik product – JustAssembly.

    Fortunately, there are a lot of forks that contain this particular JustDecompileEngine commit

    I worked at Telerik for many years and I know in details how the decisions for open-sourcing or discontinuing a project are taken. Without revealing any details, let me assure you that a lot of people are involved in these processes and the decisions aren’t taken lightly. Considering sales and marketing people, product owners, team leads, support leads and VPs it is easy to involve 10-12 persons.

    It is easy to conclude that the people involved in this process don’t know what open-source software development is. This is somewhat typical for many corporations. It is funny. It would be funnier if Telerik restores JustDecompileEngine repo (wink-wink).

    In case you decide to retire an open-source project I would suggest the following steps:

    1. Edit main README.md file
      • briefly explain the reason to retire the project
      • provide a list of alternative, preferable open-source projects
    2. Disable, if any, CI builds
    3. Consider changing the project license to even more permissive if possible
    4. Archive the repo (make it read-only)

    Anyway, JustDecompile is now CodemerxDecompile and JustDecompileEngine has a new home and is even better.

  • JustMock Lite is now open source

    A few weeks ago something important happened. I am very happy to say that JustMock Lite is now open source. You can find it on GitHub.

    In this post I would like to share some bits of history. JustMock was my first project at Telerik. It was created by a team of two. The managed API was designed and implemented by my friend and colleague Mehfuz and I implemented the unmanaged CLR profiler. The project was done in a very short time. I spent 6 weeks to implement all the functionality for so called elevated mocking. This includes mocking static, non-virtual methods and sealed types. After a few iterations JustMock was released early in April 2010.

    I remember my very first day at Telerik. I had a meeting with Hristo Kosev and together we set the project goals. It turned out JustMock was just an appetizer for JustTrace. Back then we did not have much experience with the CLR unmanaged profiling API and Hristo wanted to extend Telerik product family with a performance and memory profiling tool. So, the plans were to start with JustMock and gain know-how before we build JustTrace. Step by step, we extended the team and JustMock/JustTrace team was created. Here is the door sign that the team used to have.

    jmjt

    Later the team changed its name to MATTeam (mocking and tracing team).

    Looking back, I think we built two really good products. As far as I know, at the time of writing this post JustMock is still the only tool that can mock of the most types from mscorlib.dll assembly. JustTrace also has its merits. It was the first .NET profiler with support for profiling managed Windows Store apps. I left MATTeam an year ago and I hope soon I can tell you about what I work on. Stay tuned.

  • Native code profiling with JustTrace

    The latest JustTrace version (Q1 2014) has some neat features. It is now possible to profile unmanaged applications with JustTrace. In this post I am going to show you how easy it is to profile native applications with JustTrace.

    For the sake of simplicity I am going to profile notepad.exe editor as it is available on every Windows machine. First, we need to setup the symbol path folder so that JustTrace can decode correctly the native call stacks. This folder is the place where all required *.pdb files should be.

    jtsettings

    In most scenarios, we want to profile the code we wrote from within Visual Studio. If your build generates *.pdb files then it is not required to setup the symbols folder. However, in order to analyze the call stacks collected from notepad.exe we must download the debug symbols from Microsoft Symbol Server. The easiest way to obtain the debug symbol files is to use symchk.exe which comes with Microsoft Debugging Tools for Windows. Here is how we can download notepad.pdb file.

    symchk.exe c:\Windows\System32\notepad.exe /s SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

    [Note that in order to decode full call stacks you may need to download *.pdb files for other dynamic libraries such as user32.dll and kernelbase.dll for example. With symchk.exe you can download debug symbol files for more than one module at once. For more details you can check Using SymChk page.]

    Now we are ready to profile notepad.exe editor. Navigate to New Profiling Session->Native Executable menu, enter the path to notepad.exe and click Run button. Once notepad.exe is started, open some large file and use the timeline UI control to select the time interval of interest.

    jtnative

    In closing, I would say that JustTrace has become a versatile profiling tool which is not constrained to the .NET world anymore. There are plenty of unmanaged applications written in C or C++ and JustTrace can help to improve their performance. You should give it a try.

  • Notes on Asynchronous I/O in .NET

    Yesterday I worked on a pet project and I needed to read some large files in an asynchronous manner. The last time I had to solve similar problem was in the times of .NET v2.0 so I was familiar with FileStream constructors that have bool isAsync parameter and BeginRead/EndRead methods. This time, however, I decided to use the newer Task based API.

    After some time working I noticed that there was a lot of repetition and my code was quite verbose. I googled for an asynchronous I/O library and I picked some popular one. Indeed the library hid the unwanted verbosity and the code became nice and tidy. After I finished the feature I was working on, I decided to run some performance tests. Oops, the performance was not good. It seemed like the bottleneck was in the file I/O. I started JustDecompile and quickly found out that the library was using FileStream.ReadAsync method. So far, so good.

    Without much thinking I ran my app under WinDbg and set breakpoint at kernel32!ReadFile function. Once the breakpoint was hit I examined the stack:

    0:007> ddp esp
    0577f074  720fcf8b c6d04d8b
    0577f078  000001fc
    0577f07c  03e85328 05040302
    0577f080  00100000
    0577f084  0577f0f8 00000000
    0577f088  00000000

    Hmm, a few wrong things here. The breakpoint is hit on thread #7 and the OVERLAPPED argument is NULL. It seems like ReadAsync is executed in a new thread and the read operation is synchronous. After some poking with JustDecompile I found the reason. The FileStream object was created via FileStream(string path, FileMode mode) constructor which sets useAsync to false.

    I created a small isolated project to test further ReadAsync behavior. I used a constructor that explicitly sets useAsync to true. I set the breakpoint and examined the stack:

    0:000> ddp esp
    00ffed54  726c0e24 c6d44d8b
    00ffed58  000001f4
    00ffed5c  03da5328 84838281
    00ffed60  00100000
    00ffed64  00000000
    00ffed68  02e01e34 00000000
    00ffed6c  e1648b9e

    This time the read operation is started on the main thread and an OVERLAPPED argument is passed to the ReadFile function.

    0:000> dd 02e01e34 
    02e01e34  00000000 00000000 04c912f4 00000000
    02e01e44  00000000 00000000 72158e40 02da30fc
    02e01e54  02da318c 00000000 00000000 00000000
    0:000> ? 04c912f4 
    Evaluate expression: 80286452 = 04c912f4

    A double check with SysInternals’ Process Monitor confirms it.

    readmonitor

    I emailed the author of the library and he was kind enough to response immediately. At first, he pointed me to the following MSDN page that demonstrates “correct” FileStream usage but after a short discussion he realized the unexpected behavior.

    badasync

    I don’t think this is a correct pattern and I quickly found at least two other MSDN resources that use explicit useAsync argument for the FileStream constructor:

    In closing, I would say that simply using ReadAsync API doesn’t guarantee that the actual read operation would be executed in an asynchronous manner. You should be careful which FileStream constructor you use. Otherwise you could end up with a new thread that executes the I/O operation synchronously.

  • How to solve SOS/DAC mismatch

    Have you ever experienced the following SOS/DAC mismatch error in WinDbg?

    Failed to load data access DLL, 0x80004005
    Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
    2) the file mscordacwks.dll that matches your version of mscorwks.dll is
    in the version directory
    3) or, if you are debugging a dump file, verify that the file
    mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
    4) you are debugging on the same architecture as the dump file.
    For example, an IA64 dump file must be debugged on an IA64
    machine.

    There are a lot of blog posts and articles that explain the cause for this error. The solution is simple: find the correct mscordacwks.dll version. And this is the moment when your pain starts. Well, not any more. I wrote a simple static C# class that downloads the correct mscordacwks.dll file for you. You can use it as easy as follows:

    DacHelper.DownloadDac(@"C:\mydump.dmp", @"C:\symbols");

    You can extend the class to download sos.dll file as well or to support ARM or IA64 processors. Keep in mind that you have to compile the source code with /unsafe option enabled. Also don’t forget to include the following two files (with the correct bitness) from WinDbg folder in your path:

    • dbghelp.dll
    • symsrv.dll

    Enjoy 🙂

    zipicon1Source Code

  • Declarative mocking

    Mocking complements the test-driven development (TDD) allowing developers to write small and concise unit tests for components with external dependencies that would otherwise be hard or impossible to test. As the software becomes more and more distributed and loosely coupled, mocking becomes an intrinsic part of TDD process. While there are good tools and established best practices for mocking in .NET, most of the currently widely used approaches are imperative. Imperative code tends to be verbose, less expressive and describes how a mocking behavior is achieved rather what behavior is desired. On the other hand, nowadays new technologies make it possible to build declarative mocking tools and frameworks.

    Let’s start with a few examples (I try to avoid artificially examples, e.g. ICalculator-like, because they don’t explain the properties of real projects). Suppose you work on a mobile social app that consumes external weather service. The app sends the current coordinates (latitude and longitude) and gets back JSON data as a string. You define the service interface as:

    public interface IWeatherService
    {
        string GetCurrent(float latitude, float longitude);
    }

    The service implementation does a REST call to get the data. For my current location, the REST call looks like the following:

    http://api.openweathermap.org/data/2.5/weather?lat=42.7&lon=23.3

    Once the app gets the data it should suggest places where the user can meet with friends. Depending on the current weather, the app should suggest an indoor or outdoor place. A possible implementation of this feature may look like the following:

    public enum Sky
    {
        Cloudy,
        PartiallyCloudy,
        Clear
    }
    
    public enum PlaceType
    {
        Indoor,
        Outdoor
    }
    
    public class WeatherModel : Model
    {
        private readonly IWeatherService weatherService;
    
        public WeatherModel(IWeatherService weatherService)
        {
            if (weatherService == null)
            {
                throw new ArgumentNullException("weatherService");
            }
            this.weatherService = weatherService;
        }
    
        public PlaceType SuggestPlaceType(float latitude, float longitude)
        {
            var sky = this.GetCurrentSky(latitude, longitude);
    
            return sky.Equals(Sky.Clear)
                    ? PlaceType.Outdoor
                    : PlaceType.Indoor;
        }
    
        private Sky GetCurrentSky(float latitude, float longitude)
        {
            var data = this.weatherService.GetCurrent(latitude, longitude);
    
            dynamic json = JsonConvert.DeserializeObject(data);
    
            var value = json.weather[0].main.Value as string;
    
            var sky = (Sky)Enum.Parse(typeof(Sky), value);
    
            return sky;
        }
    
        // the rest is omitted for brevity
    }

    The implementation is quite straightforward. It provides a simple design for dependency injection via WeatherModel constructor and SuggestPlaceType method keeps the logic simple by delegating most of the work to a private method.

    As we said before, the implementation of IWeatherService does a REST call. This requires that the test server(s) should have internet connection available. This is a serious restriction because most test environments are not internet-connected.

    To solve this issue we can use any modern mocking framework (e.g. Moq, JustMock, NSubstitute, FakeItEasy and so on). In this case I am going to use JustMock.

    [TestMethod]
    public void TestSuggestedPlaceType()
    {
        // Arrange
        var weatherSvc = Mock.Create<IWeatherService>();
    
        var latitude = 42.7f;
        var longitude = 23.3f;
        var expected = "{'coord':{'lon':23.3,'lat':42.7},'sys':{'country':'BG','sunrise':1380428547,'sunset':1380471081},'weather':[{'id':800,'main':'Clear','description':'Sky is Clear','icon':'01d'}],'base':'gdps stations','main':{'temp':291.15,'pressure':1015,'humidity':72,'temp_min':291.15,'temp_max':291.15},'wind':{'speed':1,'deg':0},'rain':{'3h':0},'clouds':{'all':0},'dt':1380439800,'id':6458974,'name':'Stolichna Obshtina','cod':200}";
        Mock.Arrange(() => weatherSvc.GetCurrent(latitude, longitude)).Returns(expected);
    
        // Act
        var model = new WeatherModel(weatherSvc);
        var suggestedPlaceType = model.SuggestPlaceType(latitude, longitude);
    
        // Assert
        Assert.AreEqual(PlaceType.Outdoor, suggestedPlaceType);
    }

    I prefer Arrange-Act-Assert (AAA) pattern for writing unit tests because it makes it simple and easy to read. As we can see, in this scenario the unit test is quite concise: 2 lines for the arrangement, 2 lines for the action,1 line for the assertion and a few lines for local variable definitions and comments. In fact, any modern mocking library can do it in a few lines. It doesn’t matter if I use JustMock or Moq or something else.

    The point is, in such simple scenarios any mocking framework usage will result in simple and nice to read unit tests. Before we continue, I would like to remind you that both JustMock and Moq are imperative mocking frameworks. So are NSubstitute and FakeItEasy and many others. This means that we have explicitly to command the mocking framework how the desired behavior is achieved.

    So far, we saw that imperative mocking frameworks do very well in simple scenarios. Let’s see an example where they don’t do well and see how declarative mocking can help. Suppose you work on invoice module for a CRM system. There is a requirement that the invoice module should send an email when there are more than 3 delayed invoices for a customer. A possible implementation may look as it follows:

    public interface ISpecializedList<T>
    {
        void Add(T item);
    
        void Reset();
    
        uint Count { get; }
    
        // the rest is omitted for brevity
    }
    
    public interface ICustomerHistory
    {
        ISpecializedList<Invoice> DelayedInvoices { get; }
    
        // the rest is omitted for brevity
    }
    
    public class InvoiceManager
    {
        private readonly ICustomerHistory customerHistory;
    
        public static readonly uint DelayedInvoiceCountThreshold = 3;
    
        public InvoiceManager(ICustomerHistory customerHistory)
        {
            if (customerHistory == null)
            {
                throw new ArgumentNullException("customerHistory");
            }
            this.customerHistory = customerHistory;
        }
    
        public void MarkInvoiceAsDelayed(Invoice invoice)
        {
            var delayedInvoices = this.customerHistory.DelayedInvoices;
    
            delayedInvoices.Add(invoice);
    
            if (delayedInvoices.Count > DelayedInvoiceCountThreshold)
            {
                this.SendReport(invoice.Customer);
            }
        }
    
        private void SendReport(Customer customer)
        {
            // send report via email
    
            this.ReportSent = true;
        }
    
        public bool ReportSent
        {
            get; private set;
        }
    
        // the rest is omitted for brevity
    }

    Let’s write the unit test. I am going to use JustMock.

    [TestMethod]
    public void TestSendReportWhenDelayOrderThresholdIsExceeded()
    {
        // Arrange
        var history = Mock.Create<ICustomerHistory>();
    
        uint count = 0;
    
        Mock.Arrange(() => history.DelayedInvoices.Add(Arg.IsAny<Invoice>())).DoInstead(new Action(() =>
        {
            Mock.Arrange(() => history.DelayedInvoices.Count).Returns(++count);
        }));
    
        // Act
        var invoiceMananger = new InvoiceManager(history);
        invoiceMananger.MarkInvoiceAsDelayed(new Invoice());
        invoiceMananger.MarkInvoiceAsDelayed(new Invoice());
        invoiceMananger.MarkInvoiceAsDelayed(new Invoice());
        invoiceMananger.MarkInvoiceAsDelayed(new Invoice());
    
        // Assert
        Assert.IsTrue(invoiceMananger.ReportSent);
    }

    This time the unit test looks quite complicated. We have to use DoInstead method to simulate the internal workings of ISpecializedList<T> implementation. Said in another words we have code duplication. First, there is a code that increments the Count property of ISpecializedList<T> implementation we use in production. Second, there is a code that increment the Count property in our test for the sole purpose of the test. Also, note that now we have count local variable in our test.

    Let’s compare the two scenarios and see why the last test is so complicated. In the first scenario we don’t have a mutable object state while in the second one we have to take care for the Count property. This is an important difference. Usually a good program design says that a method with a return value doesn’t change the object state, while a method without a return value does change the object state. After all, it is common sense.

    Suppose we have to write a unit test for the following method:

    public void CreateUser(string username, string password) { ... }

    This method doesn’t return a value. However, it changes the system state. Usually, when we write a unit test for void method we assert that the system is changed. For example, we can assert that we can login with the provided username and password.

    Another option is to change the method signature so the method returns a value:

    public bool /* success */ CreateUser(string username, string password) { ... }
    // or
    public int /* user id */ CreateUser(string username, string password) { ... }

    However this is not always possible or meaningful.

    So, we see that mocking even a simple interface like ISpecializedList<T> complicates the unit tests. This is a consequence of imperative mocking approach. Let’s see a hypothetical solution based on FakeItEasy syntax.

    [TestMethod]
    public void TestAddItem()
    {
        // Arrange
        var list = A.Fake<ISpecializedList<Invoice>>();
    
        A.CallTo(() => list.Add(A<Invoice>.Ignored).Ensures(() => list.Count == list.Count + 1);
    
        // Act
        list.Add(new Invoice());
        list.Add(new Invoice());
        list.Add(new Invoice());
    
        // Assert 
        Assert.AreEqual(3, list.Count);
    }

    In this case we removed the need of count local variable and made the test shorter and a more expressive. The Ensures method accepts a lambda expression that describes the next object state. For example, we can arrange Reset method as follows:

    A.CallTo(() => list.Reset()).Ensures(() => list.Count == 0);

    Let’s see two more examples. We can arrange a mock for IDbConnection as follows:

    IDbConnection cnn = ...;
    
    A.CallTo(() => cnn.CreateCommand()).Returns(new SqlCommand());
    A.CallTo(() => cnn.Open()).Ensures(() => cnn.State == ConnectionState.Open);
    A.CallTo(() => cnn.Close()).Ensures(() => cnn.State == ConnectionState.Closed
    						&& A.FailureWhen<InvalidOperationException>(() => cnn.BeginTransaction()));
    A.CallTo(() => cnn.Database).FailsWith<NotImplementedException>();
    A.CallTo(() => cnn.BeginTransaction()).FailsWhen<InvalidOperationException>(() => cnn.State != ConnectionState.Open);

    This code fragment shows how we can describe the state machine behind IDbConnection instance. Similarly, we can arrange a mock for TextReader as follows:

    TextReader reader = ...;
    
    A.CallTo(() => reader.Read()).Requires(() => reader.CanRead);
    A.CallTo(() => reader.Read()).Returns(0);
    A.CallTo(() => reader.Close()).Ensures(() => A.FailureWhen<InvalidOperationException>(() => reader.Read()));
    A.FailureWhen<Exception>(() => reader.ReadBlockAsync(null, 0, 0));

    While a fluent API can help with declarative mocking it surely has limits. Both Requires and Ensures methods describe invariants but the lambda expressions become harder to read when they grow in size. So I started looking for improvements.

    First, I decided to try Roslyn. It turns out that Roslyn is quite good framework for my purposes. My current approach is to define mock types as regular classes (I find some limitations of this approach and more research is needed). Instead of using fluent API I can define a mock type in the source code.

    public mock class MockList<T> : ISpecializedList<T>
    {
        public void Add(T item)
            ensures Count == Count + 1;
    
        public void Reset()
            ensures Count == 0;
    
        public uint Count
        {
            get;
        }
    }

    I borrowed ensures clause from Spec# and added mock modifier to the class definition. Then I used Roslyn API to hook and emit a simple throw new NotImplementedException(); for every method.
    screenshot

    I also emitted DescriptionAttribute for every ensures clause. I guess, it will be better to emit a reference to a custom attribute defined in another assembly but for now I decided to keep it simple. Now we can rewrite the previous TestAddItem test as follows:

    [TestMethod]
    public void TestAddItem()
    {
        // Arrange
        var list = new MockList<Invoice>();
    
        // Act
        list.Add(new Invoice());
        list.Add(new Invoice());
        list.Add(new Invoice());
    
        // Assert 
        Assert.AreEqual(3, list.Count);
    }

    With the current implementation this test will fail with NotImplementedException but the test itself is short and easy to read. For further development I see two options. The first one is to make Roslyn to emit the correct ILASM corresponding to the expressions defined via requires and ensures clauses. The second option is to emit an interface rather a class and to keep requires and ensures clauses encoded as attributes. Then, at runtime the mocking API can create types that enforce the defined invariants. I think the second option is more flexible than the first one.

    Besides Roslyn, there is another approach that can make mocking easier. Recently I came upon the concept of prorogued programming. Using this technique the developer can train the mocks used in the unit tests so that the desired behavior is achieved during the test runs. While this approach may seem semi-automated I find it very attractive. I think it has a lot of advantages and if there is a good tooling support it may turn out this is a better way to go.

    What’s next? I will research the Roslyn approach further. There are two options:

    • (static) using Roslyn API to emit ILASM at compile time
    • (dynamic) using Roslyn to emit interfaces and metadata and then using mocking API at runtime to provide the actual implementation

    Both options have tradeoffs and a careful analysis is needed. Prorogued programming seems very suitable technique to make mocking easier so I need to investigate it further. Stay tuned.

    Further reading:

     

  • Profiing Data Visualization

    Every .NET performance profiling tool offers some form of data visualization. Usually, the profiling data is shown in a hierarchical representation such as calling context tree (CCT) or calling context ring chart (CCRC). In this post I would like to provide a short description of the most commonly used profiling data visualizations.

    In general, CCT is well understood. Software developers find CCT easy to work with as it represents the program workflow. For example, if method A() calls method B() which in turn calls method C() then the CCT will represent this program workflow as follows:

    A() -> B() -> C()

    CCT data contains the time that is spent inside each method (not shown here for the sake of simplicity). Here is a short list of some .NET profilers that use CCT/CCRC to visualize data:

    While CCT is useful and easy to understand data visualization it has limitations. Often we create big applications with complex program workflows. For such big applications the CCT navigation becomes harder. Often the CCT size becomes overwhelming and the developers cannot grasp the data. To understand big CCT the profiling tools offer some form of aggregation. The most common aggregation is so called Hot Spot tree (HST). Sometimes it is called caller context tree but for the purpose of this post we will use former name. Here is the HST for our previous example:

    C() <- B() <- A()

    We said that HST is a form of aggregation but we didn’t explain what and how we aggregate. HST aggregates CCT nodes by summing the time spent inside a method for each unique call path. Let’s make it more concrete with a simple example. Suppose we have an application with the following program workflow (CCT):

    A() -> B() -> C(/* 4s */)
               |
               |--> D() -> C(/* 6s */)

    The time spent in method C() is 4 seconds when it is called from B() and the time spent in method C() is 6 seconds when it is called from D(). So, the total time spent in method C() is 10 seconds. We can build HST for method C() by aggregating the time for each unique call path.

    C(/* 10s */) <- B(/* 4s */) <- A(/* 4s */)
                  |
                  |-- D(/* 6s */) <- B(/* 6s */) <- A(/* 6s */)

    HST shows how the time spent in method C() is distributed for each unique call path. If we build HST for every method it becomes obvious why HST is so useful data visualization. Instead of focusing on the whole CCT which may contain millions of nodes we can focus on the top, say, 10 most expensive HSTs as they show us the top 10 most time expensive methods. In fact, I find HST so useful that I can argue that showing CCT is not needed at all when solving difficult performance issues.

    I would like to address the last sentence as it is related to the DIKW pyramid. While CCT is useful profiling data visualization, it is mostly about data. Data is just numbers/symbols. It cannot answer “who”, “what”, “where” and “when” questions. Processing CCT into HSTs transforms data into information. HSTs can answer where time is spent inside an application. I am not going to address all the theoretical details here but I would like to dig some details about performance profiling further.

    We saw why HSTs are useful but sometimes we want to know more. For example, is our application CPU or I/O bound? Or maybe we are interested in the application dynamics (e.g. when it is CPU bound and when it is I/O bound). Component interaction is also an important question for many of us. The software vendors of profiling tools recognize these needs and try to build better products. For example Microsoft provides Tier Interaction Profiling, Telerik JustTrace provides Namespace grouping, JetBrains dotTrace provides Subsystems, SpeedTrace offers Layer Breakdown and so on. While all these visualizations are useful, sometimes a simple diagram works even better.
    Layers
    The point is that there is no silver bullet. A single profiling data visualization cannot answer every question. I think ideas like Profiling Query Language (PQL) have a lot of potential. It doesn’t matter if there will be PQL or LINQ to some well established domain model (e.g. LINQ to Profiling Data). The language is only a detail. The important thing is that the collected data should be queryable. Once the data is queryable the developer can do the proper queries. Of course, each profiling tool can be shipped with a set of predefined common queries. I hope we will see PQL in action very soon 😉

     

  • CLR Limitations

    Yesterday I ran one of my apps onto VirtualBox VM and it suddenly crashed with OutOfMemoryException. There is nothing special about my app, it allocates one large array of System.UInt64 and does some calculations. So, it seems that my problem was related to the array size.

    Array size limitations

    Here are a few facts about my app:

    • it allocates a single ~6GB array and it does memory intensive calculation
    • it uses the new .NET 4.5 configuration gcAllowVeryLargeObjects setting
    • it is compiled with “Any CPU” platform target (“Prefer 32-bit” option is not set)

    My first thought was that the guest OS does not support 64-bit programs and I should compile my app with “x64” platform target support to make this requirement explicit. It turned out that this is not the case and the guest OS is Windows 7 Ultimate x64 edition. This is where I got confused. I decided to run my app onto the host OS and it ran as expected.

    Let’s recap it. My host OS is Windows 7 Ultimate x64 Edition (same as the guest OS) and my app works. On the guest OS my app crashes The .NET version is 4.0.30319.18051 for both host OS and guest OS. The only difference is that the host OS has 16GB physical memory while the guest OS has 4GB. However, my understanding is that the amount of physical memory should not cause OutOfMemoryException.

    The first thing I did was reading MSDN documentation one more time. There isn’t much related to my issue. The only relevant part is the following:

    Using this element in your application configuration file enables arrays that are larger than 2 GB in size, but does not change other limits on object size or array size:

    • The maximum number of elements in an array is UInt32.MaxValue.
    • The maximum index in any single dimension is 2,147,483,591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2,146,435,071 (0X7FEFFFFF) for other types.
    • The maximum size for strings and other non-array objects is unchanged.

    I decided to create a small repro app that isolates the problem:

    static void Main(string[] args)
    {
        var arr = new object[0X7FEFFFFF];
        Console.WriteLine(arr.LongLength);
        Console.ReadLine();
    }

    (I also modified app.config file accordingly)

    <configuration>
      <runtime>
        <gcAllowVeryLargeObjects enabled="true" />
      </runtime>
    </configuration>

    When I run this program on the host OS it works as expected. When I run the same binary onto the VM I get OutOfMemoryException. I googled and found the following comment on stackoverflow since Sep 7 2010. This pretty much confirms my understanding stated above. Still, the reality is that this simple app crashes on the guest OS. Clearly, there is an undocumented (please correct me if I am wrong) CLR limitation.

    As I said before, the only difference between the host OS and the guest OS is the amount of the physical memory. So, I decided to increase the guest OS memory. I had no clear idea what I am doing and I set the memory to 5000MB (just some number larger then 4GB). This time, my app worked as expected.

    memory
    memory2

    So, it seems that the physical memory is an important factor. I still don’t understand it and if you know why this happens please drop a comment. I guess the CLR team has good reason for that 4GB threshold but it would be nice if this is properly documented.

    Object size limitations

    Once I figured out that the physical memory can also limit the array size, I became curious what are the CLR limitations for regular objects. I quickly managed to find out that the maximum object size in my version of .NET is 128MB.

    class ClassA
    {
        public StructA a;
    }
    
    unsafe struct StructA
    {
        public fixed byte data[128 * 1024 * 1024 - 8];
    }

    I can instantiate objects from ClassA without problems. However when I try add one more field (e.g. byte or bool) to ClassA or StructA definition I get the following error:

    System.TypeLoadException was unhandled
    Message: Size of field of type 'ClassA' from assembly
    'Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
    is too large.

    So, it seems that for my particular .NET version the maximum object size is 128MB. What about if we try to instantiate the following array:

    var arr = new StructA[1];

    In this case I get the following error:

    System.TypeLoadException was unhandled
    Message: Array of type 'StructA' from assembly
    'Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 
    cannot be created because base value type is too large.

    It turns out arrays have yet another limitation. In order to instantiate an array of StructA I have to modify StructA definition to the following:

    unsafe struct StructA
    {
        public fixed byte data[64 * 1024 - 4];
    }

    It seems that the maximum array base element size is limited to 64KB.

    Conclusion

    In closing, I would say it is always useful to know the CLR limitations. Sometimes they are manifested in an unexpected way but in the most common scenarios it is unlikely that you hit some of them.

  • OWIN and NGINX

    Since a few months I work with non-Microsoft technologies and operating systems. I work with Linux, Puppet, Docker (lightweight Linux containers), Apache, Nginx, Node.js and other. So far, it is fun and I’ve learned a lot. This week I saw a lot of news and buzz around OWIN and Katana project. It seems that OWIN is a hot topic and I decided to give it a try. In this post I will show you how to build OWIN implementation and use Nginx server.

    Note: this is proof of concept rather than a production-ready code.

    OWIN is a specification that defines a standard interface between .NET web servers and web applications. Its goal is to provide a simple and decoupled way how web frameworks and web servers interact. As the specification states, there is no assembly called OWIN.dll or similar. It is just a way how you can build web applications without dependency on particular web server. Concrete implementations can provide OWIN.dll assembly though.

    This is in a contrast with the traditional ASP.NET applications that have a dependency on System.Web.dll assembly. If implemented correctly OWIN eliminates such dependencies. The benefits are that your web application becomes more portable, flexible and lightweight.

    Let’s start with the implementation. I modeled my OWIN implementation after the one provided by Microsoft.

    public interface IAppBuilder
    {
        IDictionary<string, object> Properties { get; }
        object Build(Type returnType);
        IAppBuilder New();
        IAppBuilder Use(object middleware, params object[] args);
    }

    For the purpose of this post we will implement the Properties property and the Use method. Let’s define our AppFunc application delegate as follows:

    delegate Task AppFunc(IDictionary<string, object> environment);

    The examples from Katana project provide the following code template for the main function:

    static void Main(string[] args)
    {
        using (WebApplication.Start<Startup>("http://localhost:5000/"))
        {
            Console.WriteLine("Started");
            Console.ReadKey();
            Console.WriteLine("Stopping");
        }
    }

    I like it very much so I decided to provide WebApplication class with a single Start method:

    public static class WebApplication
    {
        public static IDisposable Start(string url)
        {
            return new WebServer(typeof(TStartup));
        }
    }

    We will provide WebServer implementation later. Let’s see what the implementation of Startup class is:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var myModule = new LightweightModule();
            app.Use(myModule);
        }
    }

    Let’s summarize it. We have a console application and in the main method it calls Start method and passes two parameters: Startup type and a URL. Start method will start a web server that listens for requests on the specified URL and the server will use Startup class to configure the web application. We don’t have any dependency on System.Web.dll assembly. We have a nice and simple decoupling of the web server and the web application.

    So far, so good. Let’s see how the web server configures the web application. In our OWIN implementation we will use reflection to reflect TStartup type and try find Configuration method using naming convention and predefined method signature. The Configuration method instantiates LightweightModule object and passes it to the web server. The web server will inspect the object for its type and will try to find Invoke method compatible with the AppFunc signature. Once Invoke method is found it will be called for every web request. Here is the actual Use method implementation:

    public IAppBuilder Use(object middleware, params object[] args)
    {
        var type = middleware.GetType();
        var flags = BindingFlags.Instance | BindingFlags.Public;
        var methods = type.GetMethods(flags);
    
        // TODO: call method "void Initialize(AppFunc next, ...)" with "args"
    
        var q = from m in methods
                where m.Name == "Invoke"
                let p = m.GetParameters()
                where (p.Length == 1)
                       && (p[0].ParameterType == typeof(IDictionary<string, object>))
                       && (m.ReturnType == typeof(Task))
                select m;
    
        var candidate = q.FirstOrDefault();
    
        if (candidate != null)
        {
            var appFunc = Delegate.CreateDelegate(typeof(AppFunc), middleware, candidate) as AppFunc;
            this.registeredMiddlewareObjects.Add(appFunc);
        }
    
        return this;
    }

    Finally we come to WebServer implementation. This is where Nginx comes. For the purpose of this post we will assume that Nginx server is started and configured. You can easily extend this code to start Nginx via System.Diagnostics.Process class. I built and tested this example with Nginx version 1.4.2. Let’s see how we have to configure Nginx server. Open nginx.conf file and find the following settings:

        server {
            listen       80;
            server_name  localhost;

    and change the port to 5000 (this is the port we use in the example). A few lines below you should see the following settings:

            location / {
                root   html;
                index  index.html index.htm;
            }

    You should modify it as follows:

            location / {
                root   html;
                index  index.html index.htm;
                fastcgi_index Default.aspx;
                fastcgi_pass 127.0.0.1:9000;
                include fastcgi_params;
            }

    That’s all. In short, we configured Nginx to listen on port 5000 and configured fastcgi settings. With these settings Nginx will pass every request to a FastCGI server at 127.0.0.1:9000 using FastCGI protocol. FastCGI is a protocol for interfacing programs with a web server.

    So, now we need a FastCGI server. Implementing FastCGI server is not hard but for the sake of this post we will use SharpCGI implementation. We are going to use SharpCGI library in WebServer implementation. First, we have to start listening on port 9000:

    private void Start()
    {
        var config = new Options();
        config.Bind = BindMode.CreateSocket;
        var addr = IPAddress.Parse("127.0.0.1");
        config.EndPoint = new IPEndPoint(addr, 9000);
        config.OnError = Console.WriteLine;
        Server.Start(this.HandleRequest, config);
    }

    The code is straightforward and the only piece we haven’t look at is HandleRequest method. This is where web requests are processed:

    private void HandleRequest(Request req, Response res)
    {
        var outputBuff = new byte[1000];
    
        // TODO: use middleware chaining instead a loop
    
        foreach (var appFunc in this.appBuilder.RegisteredMiddlewareObjects)
        {
            using (var ms = new MemoryStream(outputBuff))
            {
                this.appBuilder.Properties["owin.RequestPath"] = req.ScriptName.Value;
                this.appBuilder.Properties["owin.RequestQueryString"] = req.QueryString.Value;
    
                this.appBuilder.Properties["owin.ResponseBody"] = ms;
                this.appBuilder.Properties["owin.ResponseStatusCode"] = 0;
    
                var task = appFunc(this.appBuilder.Properties);
    
                // TODO: don't task.Wait() and use res.AsyncPut(outputBuff);
    
                task.Wait();
                res.Put(outputBuff);
            }
        }
    }

    This was the last piece from our OWIN implementaion. This is where we call the web application specific method via AppFunc delegate.

    In closing I think OWIN helps the developers to build better web applications. Please note that my implementation is neither complete neither production-ready. There is a lot of room for improvement. You can find the source code here:

    OWINDemo.zip

     

     

  • Dispose Pattern

    There are a lot of blog posts and articles about the proper IDisposable implementation, so why writing another one? I guess I am writing it because the topic is quite subjective as there are many different scenarios for IDisposable usage.

    I am not going to explore all the details about IDisposable implementation. I would recommend the following readings though I would advise you to be a selective reader so don’t take everything for granted truth:

    These are valuable articles because they contain a lot of different opinions. I would also recommend the following two MSDN links which you may find contradicting:

    While the most people talk about Dispose and Finalize patterns as different things I would recommend to be careful and to think about them as a single pattern. It is always hard, even impossible, to predict how your code will be used from other software developers. So, having a safe strategy and implementing Dispose and Finalize patterns together might be the right choice.

    Let’s see the following class definition:

    public class ProcessInfo : IDisposable
    {
        [DllImport("kernel32")]
        static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
    
        [DllImport("kernel32")]
        static extern int GetCurrentProcessId();
    
        [DllImport("kernel32")]
        static extern bool CloseHandle(IntPtr hHandle);
    
        private readonly IntPtr hProcess;
    
        public ProcessInfo()
        {
            const int PROCESS_VM_READ = 0x10;
    
            this.hProcess = OpenProcess(PROCESS_VM_READ, false, GetCurrentProcessId());
        }
    
        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }
    
        protected virtual void Dispose(bool disposing)
        {
            if (this.hProcess != IntPtr.Zero)
            {
                CloseHandle(hProcess);
            }
        }
    }

    It is not the best example but let’s pretend this class has some useful methods and properties for the current process. Because the class implements IDisposable interface it is reasonable to expect something like the following code:

    using (var procInfo = new ProcessInfo())
    {
        // call some methods and properties
    }

    The code fragment above seems all good and fine. The tricky part is that the C# compiler will actually emit the following equivalent code:

    ProcessInfo procInfo = null;
    try
    {
        procInfo = new ProcessInfo();
        // call some methods and properties
    }
    finally
    {
        if (procInfo != null)
        {
            procInfo.Dispose();
        }
    }

    Let’s focus on the constructor. The main purpose of the constructor is to construct an object. This means that the constructed object should be in a usable state. This concept is deeply embraced in .NET base class library. Let’s see the following code fragment:

    var fs = new FileStream("", FileMode.Open);

    As you can guess, it will throw ArgumentException. Let’s see another canonical example:

    public class Person
    {
        public Person(string name, uint age)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("invalid name", "name");
            }
    
            if (age < MIN_AGE)
            {
                throw new ArgumentException("invalid age", "age");
            }
    
            // store "name" and "age"
        }
        // Some useful methods and properties
    }

    Most of us have written such code. Often it is perfectly legal to throw an exception when we cannot construct a usable object. Back to our example:

    using (var procInfo = new ProcessInfo())
    {
        // call some methods and properties
    }

    If an exception is thrown in the constructor then procInfo variable won’t be assigned and therefore Dispose() method won’t be called. Let’s modify ProcInfo constructor a bit:

    public ProcessInfo()
    {
        const int PROCESS_VM_READ = 0x10;
    
        this.hProcess = OpenProcess(PROCESS_VM_READ, false, GetCurrentProcessId());
    
        // something wrong
        throw new Exception();
    }

    Oops, we have Win32 handle leak. One option is to use try-catch clause inside the constructor and call CloseHandle(…) method. Sometimes this is the best option.

    Another option is to implement the Finalize pattern. It is easy and I find it more clear:

    ~ProcessInfo()
    {
        this.Dispose(false);
    }

    Now, there are clear roles for the constructor and Dispose/Finalize methods and the Win32 handle leak is fixed.