<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Mahjayar's WebLog.</title><subtitle type="html" /><id>http://blogs.msdn.com/mahjayar/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/mahjayar/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2008-10-12T10:11:17Z</updated><entry><title>MSF V2 CTP2 Deep Dive – Memory Based Batching</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/09/16/msf-v2-ctp2-deep-dive-memory-based-batching.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/09/16/msf-v2-ctp2-deep-dive-memory-based-batching.aspx</id><published>2009-09-17T02:24:00Z</published><updated>2009-09-17T02:24:00Z</updated><content type="html">&lt;P align=justify&gt;Its been quite a while since I posted about MSF v2 CTP2. As promised in my earlier posts I will be doing a series of deep-dive of the new SyncServices features added in MSF V2 CTP2. Today I am starting off with the Batching feature.&lt;/P&gt;
&lt;P align=justify&gt;One of the most common feedback we received with the peer providers shipped for MSF V1 was the inability to sync changes in batches. Customer using DbSyncProvider always complained of OutOfMemory exceptions when synchronizing large data across databases. The MSF workflow did support the notion of batching but the relational peer providers did not take advantage of the feature. &lt;/P&gt;
&lt;H1&gt;Background:&lt;/H1&gt;
&lt;P align=justify&gt;When we decided to support batching we looked back at how the hub-spoke providers supported batching. For the hub-spoke we supported batched download of data from server by modifying the enumeration query to return rows in batches. Even though this solved the issue of OOM with large data it had some inherent limitations. Some of the problems were&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Code has to be hand coded by the user for each sync schema which meant a higher probability of user error.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Batching was not supported for uploads from the clients.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;There was no easy way to estimate the number of batches you would need. The solution computed batch size by dividing the current tickcount with the last sent tick count for any table. This meant that the batch size was fixed even if the table had 0 changes between the last sent and the current time instance. This meant that the SyncAgent would return empty batches.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Batching was based on number of rows which made it harder to predict when data will be too big. &lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;In general usability was hindered as the batching SP was complex and highly involved. The SP became more complex if the anchors were non timestamp based.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=justify&gt;One other problem unique to the peer providers was the use of SyncKnowledge to compute the changes that needs to be synchronized. In hub-spoke these were simple timestamp anchors that users used to compute what has changed in a table and each table had its own anchor which did not collide with other tables. In peer providers the SyncKnowledge represents the “knowledge” of all tables for a given Sync scope. Any disparity in what the knowledge represents about a replica and the actual data would mean data will not synchronize and result in data non-convergence in your sync topology. &lt;/P&gt;
&lt;H1&gt;Motivation for Batching:&lt;/H1&gt;
&lt;P align=justify&gt;When we designed batching we wanted to address all the above shortcomings. We also wanted to reduce the probability of user errors when computing batches. The primary notion of batching would be to avoid running out of memory when synchronizing large amounts of data. The most straight forward way to support batching would be to batch by rows. This works for most cases but does the solve the problem mentioned earlier – how does the user compute how many rows can the client handle. A desktop machine might have enough processing power to consume 10,000 rows at a time but a hand held device might only be able to handle 100 rows. Moreover on a desktop the sync session has to share the available memory which meant that on high loads the number of rows that a sync session can handle without going out of memory rapidly declines. &lt;/P&gt;
&lt;P align=justify&gt;The primary goal of the sync developer is to successfully sync data over from one replica to another without running out of memory. Basically the one and only goal of batching is to ensure that incremental progress can be made with the available memory resource on the machine. Since one of the most deterministic resource a developer has control over is the available memory, we decided to design batching around memory usage. The developer would put a limit on the max amount on the size of data being synchronized. This works wonderfully well as it makes batching an on demand operation. If row based batching was used then the system would have to send ‘N’ batches no matter how small the individual rows were of. In the memory based batching if all changes required to send to the destination fits within the max size specified then batching is bypassed.&lt;/P&gt;
&lt;P align=justify&gt;We also wanted to make it support batching for all kinds of relational stores (Sql, Sql CE and any ADO.NET capable database). We wanted to achieve all of this with as little input from the user as possible. We did not want customers to reinvent the wheel around batching logic for every sync application they wrote.&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Batching Workflow:&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P align=justify&gt;With the motivations for batching being clear we decided to enable batching via a simple switch on the &lt;STRONG&gt;RelationalSyncProvider&lt;/STRONG&gt;. We added a new property, &lt;STRONG&gt;MemoryDataCacheSize&lt;/STRONG&gt;", which users can set to limit the amount of memory used (in KB) by the synchronizing rows. Data cache limit can be set on both providers and the runtime will use the lower size to ensure that one peer does not send data that cannot be handled by the destination. Sync runtime will revert to batched mode even if one peer has not specified a cache size.&lt;/P&gt;
&lt;H2&gt;Batched Enumeration:&lt;/H2&gt;
&lt;P align=justify&gt;The workflow of batching is quite simple. Destination providers communicate its cache size by returning it to the &lt;STRONG&gt;SyncOrchestrator&lt;/STRONG&gt; in its &lt;STRONG&gt;GetSyncBatchParameters&lt;/STRONG&gt;() call. This in-turn is passed to the enumerating peer in the &lt;STRONG&gt;GetChangeBatch&lt;/STRONG&gt;() call. Here is the simple workflow of the batched enumeration process.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;If batching is enabled then start a background thread that will compute the enumeration.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Runtime starts by querying the list of tables mentioned in the &lt;STRONG&gt;DbSyncAdapters&lt;/STRONG&gt; list.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;For each table it retrieves the ADO.NET &lt;STRONG&gt;DataReader&lt;/STRONG&gt; for its corresponding enum query.&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;For each row, before reading the column values, it computes the size of the row.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;If current_Data_Cache_Size + Next_Row_Size &amp;lt;= (110% * &lt;STRONG&gt;MemoryDataCacheSize&lt;/STRONG&gt;) specified then it reads the row in to memory.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;If pulling in the new row exceeds the specified &lt;STRONG&gt;MemoryDataCacheSize&lt;/STRONG&gt; it spools the current in memory rows to a file. It then cleans up its data cache and continues reading changes.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Batches are spooled in the user specified directory configured on &lt;STRONG&gt;RelationalSyncProvider.BatchingDirectory&lt;/STRONG&gt; property.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;The above steps are repeated till all the tables have been enumerated.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=justify&gt;As you can see batch files are spooled to disk only when the data exceeds the memory size specified. If all changes fit in memory then the system reverts back to non batching mode where all changes are sent to destination in memory.&lt;/P&gt;
&lt;P align=justify&gt;The runtime will try to stuff a batch with data as long as the in-memory size of those data does not exceed the specified batch size by 10%. This is to guard against sending many number of under populated batches.&lt;/P&gt;
&lt;P align=justify&gt;There are times when a single row would be greater than 110% of the specified data cache size. In such cases the runtime errors out with an exception message that lists the offending table and the primary key of the row that is too big. Users would need to increase the data cache size to accommodate that row.&lt;/P&gt;
&lt;P align=justify&gt;Since enumeration happens in the background, we employ a prodcuer/consumer model between the main threads &lt;STRONG&gt;GetChangeBatch&lt;/STRONG&gt;() call and the background enumeration thread. The main consumer thread will block till the producer spools a batch (or reverts to non batched mode if all changes fit in memory) and report this batch information to the destination provider.&lt;/P&gt;
&lt;H2&gt;Batched Apply:&lt;/H2&gt;
&lt;P align=justify&gt;Relational providers uses the type &lt;STRONG&gt;DbSyncContext&lt;/STRONG&gt; to communicate changes between the source and the destination providers. With batching we have added three new properties to this type to facilitate working with batches. The three properties added are&lt;/P&gt;
&lt;P&gt;public string BatchFileName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { get; set; } ==&amp;gt; Points to the actual spooled batch file.&lt;/P&gt;
&lt;P&gt;public string IsLastBatch&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { get; set; }&lt;/P&gt;
&lt;P&gt;public string IsDataBatched&amp;nbsp;&amp;nbsp;&amp;nbsp; { get; set; }&lt;/P&gt;
&lt;P align=justify&gt;When the destination receives a batched &lt;STRONG&gt;DbSyncContext&lt;/STRONG&gt; it will queue the context. It will queue all batches till it receives the last batch at which point it will open a transaction, deserialize each batch, apply its contents and then finally commit the transaction. Destination provider will apply the batches in the same FIFO order it received them from the source provider.&lt;/P&gt;
&lt;H2&gt;Tombstone Application:&lt;/H2&gt;
&lt;P align=justify&gt;Relational providers usually applies changes in the following order. DELETES followed by INSERTS and UPDATES. Order in which these changes are applied is usually dictated by the order in which the users specify their table adapters. The adapter order assumes that related tables (PK/FK) and ordered correctly.&amp;nbsp; For DELETES, the runtime will apply changes in the reverse adapter order to ensure that child table DELETES are applied first before parent table DELETES to avoid RI violations. Since batches are applied in FIFO order its plausible that the current batch may not contain the child table DELETES. Within a given batch the runtime continues to apply DELETES in reverse order. In the case where the child table is not in current batch the runtime will recognize the SQL errors for those tombstones and queue them up for retry. When all batches have been applied, the runtime will revisit this queued up DELETES and retry applying them. At this point all of the parent deletes should succeed as the dependent child entries should have already been applied.&lt;/P&gt;
&lt;P align=justify&gt;Note that batching does not change any runtime logic related to conflicts handing. Batching only governs the number of rows in memory at any given point of time and nothing else. The only thing you have to guard in your &lt;STRONG&gt;ApplyChangeFailed&lt;/STRONG&gt; event handler is the above mentioned case where a PK delete fails.&lt;/P&gt;
&lt;H1&gt;Batching Assumptions:&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;Sync runtime has full Read/Write access to the directory specified in the &lt;STRONG&gt;BatchingDirectory&lt;/STRONG&gt; property. &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;MemoryDataCacheSize&lt;/STRONG&gt; only applies to the memory used for reading sync rows. It does not guard against overall process memory usage. &lt;/LI&gt;
&lt;LI&gt;Batches are applied in the order they are received by the destination provider. &lt;/LI&gt;&lt;/UL&gt;
&lt;H1&gt;So, Does It Work?&lt;/H1&gt;
&lt;P align=justify&gt;Moment of truth is whether all this batching thingy works and does it prevent process from running out of memory. I coded up a simple scenario which syncs two tables, Orders and OrderDetails, from a Sql server down to a CE client. The schema for the two tables is quite simple.&lt;/P&gt;
&lt;P&gt;//Orders &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; orderid - int, PK &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; orderdate – datetime&lt;/P&gt;
&lt;P align=justify&gt;&lt;BR&gt;//OrderDetails &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; orderdetailsid - id, PK &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; orderid - int &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; product - varchar(max) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; quantity –int&lt;/P&gt;
&lt;P align=justify&gt;I populated the tables with about 25,000 rows each. Each row in OrderDetails is about 8K in size and each row in orders is about 50 bytes in size. The demo computes the max working set of the process for reporting purposes. I did two runs one without batching and one with batching. Here is the comparison between the two runs.&lt;/P&gt;
&lt;TABLE border=0 cellSpacing=0 cellPadding=2 width=375&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=131&gt;&lt;STRONG&gt;Sync Type&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=131&gt;&lt;STRONG&gt;Peak Working Set (MB)&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=111&gt;&lt;STRONG&gt;Memory Use percent&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=140&gt;Non Batched&lt;/TD&gt;
&lt;TD vAlign=top width=137&gt;446&lt;/TD&gt;
&lt;TD vAlign=top width=115&gt;NA&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=142&gt;Batched (1 MB batch Size)&lt;/TD&gt;
&lt;TD vAlign=top width=139&gt;47&lt;/TD&gt;
&lt;TD vAlign=top width=117&gt;10.53&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=142&gt;Batched (5 MB batch Size)&lt;/TD&gt;
&lt;TD vAlign=top width=139&gt;59&lt;/TD&gt;
&lt;TD vAlign=top width=119&gt;13.2&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;Batched (10 MB batch Size)&lt;/TD&gt;
&lt;TD vAlign=top width=139&gt;78&lt;/TD&gt;
&lt;TD vAlign=top width=120&gt;17.45&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P align=justify&gt;As you can see that batching uses approximately 10-20% of the non batched memory for the above sample. This is not to be an indication of memory savings for all kinds of schemas. Feel free to try it with your real world schemas and I am sure you will see considerable improvements.&lt;/P&gt;
&lt;P align=justify&gt;Here is the procmon output for the non-batched case. As you can see the memory utilization keeps climbing till all changes are read in memory.&lt;/P&gt;
&lt;P align=justify&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_thumb.png" width=494 height=666 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Here is the procmon for the same demo when batching is enabled. You can see that the runtime goes to 31 MB initially and then settles in to a nice pattern as files are spooled and then consumed by the destination.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_4.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_thumb_1.png" width=465 height=626 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/MSFV2CTP2DeepDiveBatching_C4EE/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Here is the MSDN doc link for the batching feature. &lt;A href="http://msdn.microsoft.com/en-us/library/dd918908(SQL.105).aspx"&gt;http://msdn.microsoft.com/en-us/library/dd918908(SQL.105).aspx&lt;/A&gt;. &amp;nbsp;Feel free to comment here is you have any specific questions.&lt;/P&gt;
&lt;P&gt;Next- Detailed look at the batch file.&lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9896105" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /><category term="DbSyncProvider" scheme="http://blogs.msdn.com/mahjayar/archive/tags/DbSyncProvider/default.aspx" /></entry><entry><title>Announcing Sync Framework 2.0 CTP2</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/06/05/announcing-sync-framework-2-0-ctp2.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/06/05/announcing-sync-framework-2-0-ctp2.aspx</id><published>2009-06-05T23:31:00Z</published><updated>2009-06-05T23:31:00Z</updated><content type="html">&lt;P&gt;We just released CTP2 of Microsoft Sync Framework V2. Check out the blog entry at &lt;A href="http://blogs.msdn.com/sync/archive/2009/06/04/announcing-sync-framework-2-0-ctp2.aspx"&gt;http://blogs.msdn.com/sync/archive/2009/06/04/announcing-sync-framework-2-0-ctp2.aspx&lt;/A&gt;&amp;nbsp;for details on major new features.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;We have so much to talk about Sync Services for ADO.NET in this release that I cannot fit all of these in one blog. For starters here are the big features we have crammed in to this CTP.&lt;/P&gt;
&lt;P&gt;1. New Sql CE and Sql based peer sync provider - SqlCeSyncProvider and SqlSyncProvider.&lt;/P&gt;
&lt;P&gt;2. New management API's to automatically provision Sql and Sql Server express to sync enable tables.&lt;/P&gt;
&lt;P&gt;3. API's to backup and restore a Sync enabled database with no loss of Sync metadata.&lt;/P&gt;
&lt;P&gt;4. Support for 0 code support for enabling batching in all databases providers (Sql and Sql CE providers) - This one majorly cool feature.&lt;/P&gt;
&lt;P&gt;5. Snapshot initialization for bootstrapping a new Sql CE peer from an existing peer.&lt;/P&gt;
&lt;P&gt;6. Support for shared server sync scopes on Sql server.&lt;/P&gt;
&lt;P&gt;7. Improved sync performance on Sql CE.&lt;/P&gt;
&lt;P&gt;Thats an summary of the major changes that we are making available in this CTP. Each of these features will require a separate blog post and I will do over the course of this weekend.&lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9701953" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /><category term="DbSyncProvider" scheme="http://blogs.msdn.com/mahjayar/archive/tags/DbSyncProvider/default.aspx" /></entry><entry><title>Looking for volunteers for Project Huron Early Adopter Program</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/04/30/looking-for-volunteers-for-project-huron-early-adopter-program.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/04/30/looking-for-volunteers-for-project-huron-early-adopter-program.aspx</id><published>2009-05-01T00:55:00Z</published><updated>2009-05-01T00:55:00Z</updated><content type="html">&lt;P&gt;Ever since we announced Project Huron at PDC last year we have been hard at work trying to scope out the scenarios for our V1 release. Due to resource contstraints we decided to scope out the Access to Cloud publish use case for V1. We instead decided to concentrate more on sharing Sql Server and Sql Server Compact databases via the Data Hub hosted in the sky. Liam, our Project Manager has a &lt;A href="http://blogs.msdn.com/sync/archive/2009/04/29/project-huron-early-adopter-program.aspx" mce_href="http://blogs.msdn.com/sync/archive/2009/04/29/project-huron-early-adopter-program.aspx"&gt;post over &lt;/A&gt;at our official sync blog asking for some early adopter partners. Please reply back using the contact form at &lt;A href="http://blogs.msdn.com/sync/contact.aspx"&gt;http://blogs.msdn.com/sync/contact.aspx&lt;/A&gt;&amp;nbsp;if you would like to be an early adpoter. Head over to the blog post for see some screen mockups of our early Huron Management studio UI.&lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9581378" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /><category term="Project Huron" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Project+Huron/default.aspx" /><category term="Windows Azure" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Windows+Azure/default.aspx" /></entry><entry><title>SyncServicesADO.NET Survery</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/04/07/syncservicesado-net-survery.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/04/07/syncservicesado-net-survery.aspx</id><published>2009-04-08T02:11:00Z</published><updated>2009-04-08T02:11:00Z</updated><content type="html">&lt;P&gt;We are looking for some SyncServices for ADO.NET users (both Hub spoke and peer to peer toplogy) to take a survey and answer questions on how they handle custom conflict resolution and business logic processing. Please head over to &lt;A href="http://blogs.msdn.com/sync/archive/2009/04/07/custom-conflict-resolution-survey.aspx"&gt;http://blogs.msdn.com/sync/archive/2009/04/07/custom-conflict-resolution-survey.aspx&lt;/A&gt;&amp;nbsp;and leave your responses as comments to that post. &lt;/P&gt;
&lt;P&gt;This will go a long way in helping us figure out how best to streamline our event API's.&lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9536976" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /><category term="DbSyncProvider" scheme="http://blogs.msdn.com/mahjayar/archive/tags/DbSyncProvider/default.aspx" /></entry><entry><title>DbSyncProvider WCF Based Synchronization– Memory Performance Analysis Of DataSet Binary SerializationFormat Vs DataSet Surrogates</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/03/10/dbsyncprovider-wcf-based-synchronizing-memory-performance-analysis-of-dataset-binary-serializationformat-vs-dataset-surrogates.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/03/10/dbsyncprovider-wcf-based-synchronizing-memory-performance-analysis-of-dataset-binary-serializationformat-vs-dataset-surrogates.aspx</id><published>2009-03-10T11:02:00Z</published><updated>2009-03-10T11:02:00Z</updated><content type="html">&lt;P align=justify&gt;I had posted &lt;A href="http://blogs.msdn.com/mahjayar/archive/2008/10/01/dbsyncprovider-improving-memory-performance-in-wcf-based-synchronization.aspx" mce_href="http://blogs.msdn.com/mahjayar/archive/2008/10/01/dbsyncprovider-improving-memory-performance-in-wcf-based-synchronization.aspx"&gt;earlier&lt;/A&gt; about the memory performance when using default DataSet serialization behavior vs. using a Surrogate. Users had some questions on how the DataSet surrogate compared with the DataSet’s Remoting SerializationFormat. With .Net Fx 2.0 DataSet shipped support for serializing DataSet in Binary in addition to the default XML format. I decided to do a quick test comparing the serialization memory usage&amp;nbsp; between the two optimizations. Here is a simple table detailing the memory usage.&lt;/P&gt;
&lt;P align=justify&gt;I used a Toshiba Tecra laptop running Windows 7 Beta build with 2GB RAM. The DataSet contains one DataTable which contains one string column. Each column is a 5Mb string. Size is Peak working set. The BinaryFormatter serializes the DataSet in to a MemoryStream.&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=499&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=84&gt;&lt;STRONG&gt;No of Rows&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=203&gt;&lt;STRONG&gt;BinaryFormat Serialization (MB)&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=207&gt;&lt;STRONG&gt;Surrogate Serialization (MB)&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=87&gt;1&lt;/TD&gt;
&lt;TD vAlign=top width=203&gt;34.1&lt;/TD&gt;
&lt;TD vAlign=top width=207&gt;34.5&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=89&gt;5&lt;/TD&gt;
&lt;TD vAlign=top width=203&gt;131.6&lt;/TD&gt;
&lt;TD vAlign=top width=207&gt;131.39&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=90&gt;10&lt;/TD&gt;
&lt;TD vAlign=top width=203&gt;271.1&lt;/TD&gt;
&lt;TD vAlign=top width=207&gt;271.39&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=91&gt;48&lt;/TD&gt;
&lt;TD vAlign=top width=203&gt;1116.1&lt;/TD&gt;
&lt;TD vAlign=top width=207&gt;1118.1&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=92&gt;50&lt;/TD&gt;
&lt;TD vAlign=top width=203&gt;Out of Memory&lt;/TD&gt;
&lt;TD vAlign=top width=207&gt;1024&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=93&gt;51&lt;/TD&gt;
&lt;TD vAlign=top width=203&gt;Out Of Memory&lt;/TD&gt;
&lt;TD vAlign=top width=207&gt;Out Of Memory&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P align=justify&gt;As you can see the memory performance is pretty similar to both the options but the Surrogate approach is able to handle slightly more data than the Binary format. The Binary format peaked at 48 rows while the Surrogate approach peaked at 50 rows. I like the Surrogate approach as it gives the users complete control on the way data is serialized and has option for further user defined optimizations. Further the option to pick DataSet Binary serialization format is not available in the Compact framework which means Surrogates might be the only viable option (as opposed to writing a new serializer) for devices. Next I will compare the wire size of the actual serialized data.&lt;/P&gt;
&lt;P align=justify&gt;Here is the link for original Microsoft KB article on the Surrogate approach. &lt;A href="http://support.microsoft.com/kb/829740" mce_href="http://support.microsoft.com/kb/829740"&gt;http://support.microsoft.com/kb/829740&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9468800" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="WCF (Indigo)" scheme="http://blogs.msdn.com/mahjayar/archive/tags/WCF+_2800_Indigo_2900_/default.aspx" /><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /><category term="DbSyncProvider" scheme="http://blogs.msdn.com/mahjayar/archive/tags/DbSyncProvider/default.aspx" /></entry><entry><title>New Microsoft Sync Framework case study data available.</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/02/25/new-microsoft-sync-framework-case-study-data-available.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/02/25/new-microsoft-sync-framework-case-study-data-available.aspx</id><published>2009-02-25T21:01:00Z</published><updated>2009-02-25T21:01:00Z</updated><content type="html">&lt;P&gt;We recently updated our official MSF&amp;nbsp;blog with three new Customer Spotlight case study data detailing how customers are using Microsoft Sync Framework to develop new synchronization scenarios. Here are the links to the posts.&lt;/P&gt;
&lt;P&gt;Flip Client: &lt;A href="http://blogs.msdn.com/sync/archive/2009/02/10/customer-spotlight-interscape-flip-for-the-mobile-sales-workforce.aspx"&gt;http://blogs.msdn.com/sync/archive/2009/02/10/customer-spotlight-interscape-flip-for-the-mobile-sales-workforce.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Sync2DB: &lt;A href="http://blogs.msdn.com/sync/archive/2009/02/06/customer-spotlight-sync2db-outlook-to-database-synchronization.aspx"&gt;http://blogs.msdn.com/sync/archive/2009/02/06/customer-spotlight-sync2db-outlook-to-database-synchronization.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Windows Live toolbar: &lt;A href="http://blogs.msdn.com/sync/archive/2009/02/11/internal-customer-spotlight-synchronization-scalability-and-live-toolbar.aspx"&gt;http://blogs.msdn.com/sync/archive/2009/02/11/internal-customer-spotlight-synchronization-scalability-and-live-toolbar.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Having Windows Live toolbar build on top of MSF to synchronize favorites is a huge testament&amp;nbsp;to the scability of sync knowledge. Live toolbar is currently synchronizing millions of user favorites. &lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9444383" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /></entry><entry><title>I am a PC and I am 4 1/2 – Cute!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/02/12/i-am-a-pc-and-i-am-4-1-2-cute.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/02/12/i-am-a-pc-and-i-am-4-1-2-cute.aspx</id><published>2009-02-12T21:21:50Z</published><updated>2009-02-12T21:21:50Z</updated><content type="html">&lt;embed src="http://images.video.msn.com/flash/soapbox1_1.swf" width="432" height="364" id="b5rit9p0" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" pluginspage="http://macromedia.com/go/getflashplayer" flashvars="c=v&amp;v=533e05d2-9f12-4a86-bdda-efd0455fcd36&amp;ifs=true&amp;fr=shared"&gt;&lt;/embed&gt;&lt;noembed&gt;&lt;a href="http://video.msn.com/?playlist=videoByUuids:uuids:533e05d2-9f12-4a86-bdda-efd0455fcd36&amp;amp;showPlaylist=true&amp;amp;from=shared" target="_new" title="Kylie uses Windows Live Photo Gallery"&gt;Video: Kylie uses Windows Live Photo Gallery&lt;/a&gt;&lt;/noembed&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Cute..very cute.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9415351" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Random Thoughts" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Random+Thoughts/default.aspx" /></entry><entry><title>DbSyncProvider: Improving memory performance involving execissive conflicts.</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/01/15/dbsyncprovider-improving-memory-performance-involving-execissive-conflicts.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/01/15/dbsyncprovider-improving-memory-performance-involving-execissive-conflicts.aspx</id><published>2009-01-15T23:17:50Z</published><updated>2009-01-15T23:17:50Z</updated><content type="html">&lt;p align="justify"&gt;&lt;font size="2"&gt;This is the second post aimed at providing tips for improving runtime memory footprint when using the P2P &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.dbsyncprovider.aspx"&gt;DbSyncProvier&lt;/a&gt; class in V2 of SyncServices for ADO.NET. &lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;First post link: &lt;/font&gt;&lt;a title="DbSyncProvider- Improving Memory Performance In WCF Based Synchronization" href="http://blogs.msdn.com/mahjayar/archive/2008/10/01/dbsyncprovider-improving-memory-performance-in-wcf-based-synchronization.aspx"&gt;&lt;font size="2"&gt;DbSyncProvider- Improving Memory Performance In WCF Based Synchronization&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;We have had customers report memory usage surging when DbSyncProvider is applying changes from a peer and encounters conflicts. If the number of conflicts increases the memory usage spikes and pretty soon will run out of memory.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;After debugging, we narrowed down the issue down to a property in &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.dbsynctableprogress.aspx"&gt;DbSyncTableProgress&lt;/a&gt; class: Conflicts. This property was being used by the runtime to “log” conflicts that were skipped during that Sync session. DbSyncTableProgress holds the running count of progress made during a sync session for each sync adapter configured. Whenever the system encounters a Conflict while applying a row it will try to invoke the optional conflict event handler. The runtime will then decide what to do with the row based on the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.applyaction.aspx"&gt;ApplyAction&lt;/a&gt; enum returned by that event handler. The default action is ApplyAction.Continue which means the runtime will assume “LocalWins” resolution and just update the local metadata for that row and move on. That is the best case scenario. Now lets see the worst case scenarios: we have two.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;1. No event handler registered but row application failed due to Database error.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;2. User registered event handler returned an ApplyAction of RetryNextSync.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;The first case can happen for a variety of reasons such as errors in user configured TSQL command, typos in user configured Stored proc names or params, error in executing stored proc or database timeouts or other database related errors. The second is just a normal way of saying “dont worry about this row for this sync and we will try this again in the next sync”. Since the P2P provider is based off of Microsoft Sync Framework choosing RetryNextSync adds an exception for that particular row in the sync knowledge and moves on. This exception will tell the source to resend the row during the next sync.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;Whenever the above two scenarios happen the runtime will “log” the conflict in the corresponding DbSyncTableProgress for that table. Logging includes cloning the source DataRow and the local DataRow and storing it in DbSyncTableProgress.Conflicts property. So for each conflict the runtime caches the source and destination row. If the number of conflicts increases or the size of each DataRow is large the system will gobble up available memory eventually leading to OutOfMemory exceptions. &lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;This property was carried over from &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.synctableprogress_members.aspx"&gt;SyncTableProgress&lt;/a&gt; type in SyncServices V1. SyncServices V1 was an anchor based hub-spoke synchronization. V1 too had conflict resolution handling and one such option was to skip applying rows. Since the runtime had no way of storing anchors for those skipped rows, those rows would never ever be synchronized again (until a future changed to the same row happens). So, we had to aggregate and log all such conflicts so users can view it at the end of a sync session and take appropriate action. As you can see with the advent of SyncFramework this property is no longer needed as this bookkeeping is automatically done by the SyncFramework API’s.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;strong&gt;Workaround&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;So there is a simple workaround to avoid this issue. Workaround is to implement the SyncProgress event handler on DbSyncProvider and clear the Conflicts collection on the TableProgress property.&lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="left"&gt;&lt;font size="2"&gt;this.peerProvider.SyncProgress += &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#008000"&gt;EventHandler&lt;/font&gt;&amp;lt;&lt;font color="#008000"&gt;DbSyncProgressEventArgs&lt;/font&gt;&amp;gt;(peerProvider_SyncProgress);&lt;/font&gt;&lt;/p&gt;    &lt;p align="left"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p align="left"&gt;&lt;font size="2"&gt;void peerProvider_SyncProgress(object sender, &lt;font color="#008000"&gt;DbSyncProgressEventArgs&lt;/font&gt; e)         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; e.TableProgress.Conflicts.Clear();         &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="2"&gt;This will ensure that the collection is always cleared and no extra memory will be used. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Ps: This bug is on track to be fixed for the next release.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Maheshwar Jayaraman&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9321485" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Debugging" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Debugging/default.aspx" /><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /><category term="DbSyncProvider" scheme="http://blogs.msdn.com/mahjayar/archive/tags/DbSyncProvider/default.aspx" /></entry><entry><title>Updated GUI Tool to configure SSL on a given port using Httpcfg.exe</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2009/01/02/updated-gui-tool-to-configure-ssl-on-a-given-port-using-httpcfg-exe.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2009/01/02/updated-gui-tool-to-configure-ssl-on-a-given-port-using-httpcfg-exe.aspx</id><published>2009-01-03T00:05:00Z</published><updated>2009-01-03T00:05:00Z</updated><content type="html">&lt;P&gt;One of my first &lt;A class="" href="http://blogs.msdn.com/mahjayar/archive/2004/11/30/272638.aspx" mce_href="http://blogs.msdn.com/mahjayar/archive/2004/11/30/272638.aspx"&gt;posts &lt;/A&gt;was a link to my managed UI wrapper that let users view/configure/edit SSL certificates on local machines. I had developed it when I worked on the System.Net team as I found it really hard to use the command line version of Httpcfg.exe to configure SSL certs. The tool was developed with the Beta version of .Net 2.0 and I really didnt have time to update it after Whidbey was released. What I didnt realize was that the tool was the most popular search hit on my blog and that the original download link is dead on codeplex. So, I took some time this weekend and resurrected the tool up to latest release versions of .NET. &lt;/P&gt;
&lt;P&gt;The latest bits are available at &lt;A href="http://maheshwar.net/projects/httpcfgui/httpcfgui.zip"&gt;http://maheshwar.net/projects/httpcfgui/httpcfgui.zip&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;From my old blog:&lt;/P&gt;
&lt;P&gt;"Some Requirements/Information before you download the tool.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;1. Tested on Win2k3, WinXP and Vista(needs to run as admin).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;2. Requires .NET 2.0 framework.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;3. To open the machine store, you need to be the admin on that machine.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;4. You need to have httpcfg.exe in your system path. It can be downloaded &lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=49ae8576-9bb9-4126-9761-ba8011fabf38&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=49ae8576-9bb9-4126-9761-ba8011fabf38&amp;amp;displaylang=en"&gt;here&lt;/A&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;. It comes as a part of support tools for win2k3 and XP.&amp;nbsp; I could have attached the exe but dont think I can redistribute it. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The readme.txt tells you how to use it."&lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9269713" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Utility" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Utility/default.aspx" /></entry><entry><title>Getting Windows Live Toolbar Favorities sync to work</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2008/12/23/getting-windows-live-toolbar-favorities-sync-to-work.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2008/12/23/getting-windows-live-toolbar-favorities-sync-to-work.aspx</id><published>2008-12-23T22:29:00Z</published><updated>2008-12-23T22:29:00Z</updated><content type="html">&lt;P&gt;Recently a &lt;A class="" href="http://blogs.msdn.com/mahjayar/archive/2008/12/15/microsoft-sync-framework-and-windows-live-favorites-sync.aspx#9250699" mce_href="http://blogs.msdn.com/mahjayar/archive/2008/12/15/microsoft-sync-framework-and-windows-live-favorites-sync.aspx#9250699"&gt;commenter&lt;/A&gt; posted that they were unable to get Favorities sync to work (or show as an valid option on the toolbar). Found a recent post by a Microsoft dev who debugged the issue. Read more at &lt;A href="http://blogs.msdn.com/john_pollard/archive/2008/12/22/fixing-an-issue-with-windows-live-toolbar-and-favorites-sync.aspx"&gt;http://blogs.msdn.com/john_pollard/archive/2008/12/22/fixing-an-issue-with-windows-live-toolbar-and-favorites-sync.aspx&lt;/A&gt;. Hopefully this solves your installation issues.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9250705" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /></entry><entry><title>Microsoft Sync Framework and Windows Live Favorites Sync</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2008/12/15/microsoft-sync-framework-and-windows-live-favorites-sync.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2008/12/15/microsoft-sync-framework-and-windows-live-favorites-sync.aspx</id><published>2008-12-16T00:44:00Z</published><updated>2008-12-16T00:44:00Z</updated><content type="html">&lt;P align=justify&gt;Windows Live team just released the beta for &lt;A href="http://download.live.com/" mce_href="http://download.live.com/"&gt;Windows Live Essentials&lt;/A&gt;. I wanted to quickly point out the new Windows Live Favorites Sync feature that is part of the Live Toolbar. It now uses Microsoft Sync Framework (File Sync providers to be specific) to synchronize your favorites folder. This is the first Microsoft product release that uses our framework and naturally we are very excited about this. Download the suite and try out the new favorites sync.&lt;/P&gt;
&lt;P align=justify&gt;&lt;STRONG&gt;Update&lt;/STRONG&gt;: Adding links to download&lt;/P&gt;
&lt;P align=justify&gt;&amp;nbsp;Direct Links:&lt;/P&gt;
&lt;P align=justify&gt;Suite: &lt;A href="http://download.live.com/"&gt;http://download.live.com&lt;/A&gt;&lt;/P&gt;
&lt;P align=justify&gt;Toolbar: &lt;A href="http://download.live.com/toolbar"&gt;http://download.live.com/toolbar&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9222579" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /></entry><entry><title>Windows Azure 101 – My first Windows Azure app</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2008/12/12/windows-azure-101-my-first-windows-azure-app.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2008/12/12/windows-azure-101-my-first-windows-azure-app.aspx</id><published>2008-12-13T03:41:00Z</published><updated>2008-12-13T03:41:00Z</updated><content type="html">&lt;P align=justify&gt;I recently got a beta invite for the Windows Azure hosting and storage services and immediately set about writing a simple hello world hosted app. I wanted to test both the Web role and the Worker role so I was looking for a simple scenario for that. I liked the new Windows Live feature of displaying a new background image on &lt;A href="http://live.com/" mce_href="http://live.com"&gt;http://live.com&lt;/A&gt; site. They started doing this for the recently concluded Olympics but have since continued to display different images from around the world. I had written a simple windows service that checks the page every day to download any new images. I decided to port this app over to Windows Azure. I could use the Worker role to host my live image “poller” and store any new images in Windows Azure Blob storage. Then I can write a simple web app that will display all images stored in my blog storage.&lt;/P&gt;
&lt;H1 align=justify&gt;Step 1: Download Windows Azure SDK and Visual Studio tools&lt;/H1&gt;
&lt;P align=justify&gt;Downloaded and installed &lt;A href="http://go.microsoft.com/fwlink/?LinkID=130232" mce_href="http://go.microsoft.com/fwlink/?LinkID=130232"&gt;Windows Azure SDK&lt;/A&gt; and &lt;A href="http://go.microsoft.com/fwlink/?LinkId=128752" mce_href="http://go.microsoft.com/fwlink/?LinkId=128752"&gt;Windows Azure tools for Visual studio&lt;/A&gt;.&lt;/P&gt;
&lt;P align=justify&gt;Even if you don't have a Windows Azure invite, you can download the SDK and try it out by developing against the development fabric. The SDK contains all needed runtime components to host a local development fabric and storage services. &lt;/P&gt;
&lt;H1 align=justify&gt;Step 2: Create a new Windows Azure Cloud Service&lt;/H1&gt;
&lt;P align=justify&gt;Launch VS 2008 and started a new Cloud Service project. From the predefined templates, I chose the Web and Worker Cloud Service template. This gave me a cloud service project with 2 roles in it (Web and Worker roles).&lt;/P&gt;
&lt;P align=justify&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Click for larger image" border=0 alt="Click for larger image" src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb.png" width=342 height=163 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;H1 align=justify&gt;Step 3: Code the live search image poller worker role.&lt;/H1&gt;
&lt;P align=justify&gt;The worker role is intended for background processing jobs. Worker roles cannot accept incoming requests but can make unlimited outgoing requests. The roles are run in a sandbox domain which means it doesn’t have any access to local file systems. All storage requirements are to be solved by using one of the three Windows Azure storage services (Blob, Queue and Table). For this sample all I needed to do was store the images in the blob service and add some metadata such that blobs can be rendered by a browser.&lt;/P&gt;
&lt;P align=justify&gt;Before downloading all images, I needed to create a unique container where I would be storing these image blobs. The Windows Azure SDK ships a very useful REST based API to programmatically access the storage service. Here is the code to do that.&lt;/P&gt;
&lt;P align=justify&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_4.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_1.png" width=446 height=114 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=justify&gt;BlobStorage and BlobContainer types are part of the REST storage access API and RoleManager is Windows Azure logging utility. I set the container visibility to public for ease of access. (Don't bother trying to delete content as only GET requests are&amp;nbsp; anonymous, all other operations require my unique access key)&lt;/P&gt;
&lt;P align=justify&gt;Primary job of the poller would be to download &lt;A href="http://live.com/" mce_href="http://live.com"&gt;http://live.com&lt;/A&gt; resource and look for the background image. It will then inspect the blob storage to see if the image already exists and if not add it to the container. We also set the blob’s content type to image/jpeg so browsers can render the blob link as an image.&lt;/P&gt;
&lt;P align=justify&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_6.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_2.png" width=493 height=115 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=justify&gt;Done. Its that simple. Now details about blobs in the live search container can be accessed via a simple get request to &lt;A title=http://maheshwar.blob.core.windows.net/livesearchimages/?comp=list href="http://maheshwar.blob.core.windows.net/livesearchimages/?comp=list" mce_href="http://maheshwar.blob.core.windows.net/livesearchimages/?comp=list"&gt;http://maheshwar.blob.core.windows.net/livesearchimages/?comp=list&lt;/A&gt; .Here is the list as of writing this post.&lt;/P&gt;
&lt;P align=justify&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_8.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_3.png" width=470 height=216 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_3.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;H1&gt;Step 4: Code the Web app to display the images.&lt;/H1&gt;
&lt;P align=justify&gt;I just wanted to have a simple ASPX page that just lists all images and their download timestamp. I once again used the REST API’s to download all blobs from my livesearchimages container and data bound the columns to a simple DataGrid.&lt;/P&gt;
&lt;P align=justify&gt;Here is the code to retrieve all Blobs. To make data binding easier, I just wrapped the contents of my blob in to a LiveImageMetadata class.&lt;/P&gt;
&lt;P align=justify&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_12.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_5.png" width=432 height=267 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_5.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;LiveImageMetadata type.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_14.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_6.png" width=433 height=227 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;And finally the DataGrid definition.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_10.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_4.png" width=448 height=163 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_4.png"&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=justify&gt;After testing locally, I updated all references to my cloud services url and published the service. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_16.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_7.png" width=244 height=195 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_7.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;You can view all images downloaded by visiting link &lt;A href="http://maheshwar.cloudapp.net/LiveSearchImages.aspx" mce_href="http://maheshwar.cloudapp.net"&gt;http://maheshwar.cloudapp.net/LiveSearchImages.aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_18.png" mce_href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_18.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_8.png" width=244 height=113 mce_src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/WindowsAzure101MyfirstWindowsAzureapp_CDE8/image_thumb_8.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=justify&gt;That looks simple but it was not so straight forward experience moving it from my development fabric to the cloud fabric. I have some feedback to the Windows Azure team on how to make the developer experience simpler.&lt;/P&gt;
&lt;P align=justify&gt;Some feedback:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Whats up with the dependency on SQL Server Express edition? I had Sql Server on my dev box and had to go through manual steps (not straight forward and not documented) to get it to work with Sql Server.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;The app settings are in two different places when developing for the dev fabric and the cloud fabric. In dev mode, app settings go in web.config and app.config while for the production mode it has to entered in the service configuration file. It would be nice if the “Publish” button did that on behalf of the users.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;The ConfigurationSettings has to be defined in two parts. All keys needs to be defined in the ServiceDefinition.csdef file and the actual name value pairs defined in the serviceconfiguration.cscfg file. Seems redundant. &lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Once deployed there is no UI indication of the initialization process. It would be good to have a UI (like the one they demonstrated in PDC that showed what state the VM machines are in)&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;No online mechanism to view logs. you have to click “Copy logs” in the configure button then wait till logs are dumped to the blob container. Then you have to use the CloudDrive sample (the sample rocks btw) to copy the logs locally and then inspect them.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;No log filter. By default it logs all and hence the log XML files gets very large. Especially when every other second you have the “&amp;lt;EventProperty Name="Message"&amp;gt;Entered GetHealthStatus()&amp;lt;/EventProperty&amp;gt;” message spamming the logs.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;A TDS proxy to connect to the storage services so we can inspect our data via Sql management studio.&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P align=justify&gt;Having said that I see the huge potential Windows Azure has. Since the hosting services has .NET 3.5 installed it means you can host any (WCF/Silverlight/ASPX/ASMX) services on the cloud. I am going to move my Silverlight projects from &lt;A href="http://maheshwar.net/bog/projects" mce_href="http://maheshwar.net/bog/projects"&gt;http://maheshwar.net/bog/projects&lt;/A&gt; over to Azure.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=justify&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9204314" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Windows Azure" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Windows+Azure/default.aspx" /></entry><entry><title>PDC 08 Summary - Project "Huron" and MSF V2 CTP</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2008/11/06/pdc-08-summary-project-huron-and-msf-v2-ctp.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2008/11/06/pdc-08-summary-project-huron-and-msf-v2-ctp.aspx</id><published>2008-11-06T21:46:02Z</published><updated>2008-11-06T21:46:02Z</updated><content type="html">&lt;p align="justify"&gt;PDC 08 was last week and I wanted to summarize the PDC sync specific announcements. Hope every one had a chance to catch up on the all the impressive videos. First, Windows 7 looks impressive and I cant wait to dogfood the Beta build. &lt;/p&gt;  &lt;p&gt;As I posted &lt;a href="http://blogs.msdn.com/mahjayar/archive/2008/10/12/pd-2008-sync-framework-sessions.aspx"&gt;earlier&lt;/a&gt;, we had 3 Microsoft Sync Framework related presentations and here are the direct links to the recorded sessions.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/pdc2008/TL30/"&gt;Microsoft Sync Framework Advances &lt;/a&gt;– Presenter Lev Novik&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/pdc2008/PC44/"&gt;Windows 7: Programming Sync Providers That Work Great with Windows&lt;/a&gt; – Presenter Jason Roberts&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/pdc2008/BB40/"&gt;Sync Framework: Enterprise Data in the Cloud and on Devices &lt;/a&gt;(Presenter: Liam Cavanagh)&lt;/p&gt;  &lt;p align="justify"&gt;I am involved in &lt;a href="http://sqlserviceslabs.net/huron.html" target="_blank"&gt;Project Huron&lt;/a&gt; and wanted to talk briefly about what we discussed at PDC and what’s coming next. Project Huron intends to be a data hub in the cloud enabling data sharing and replication using the Sql Data Services and Microsoft Sync Framework. Here is the full snippet of Project Huron from our &lt;a href="http://blogs.msdn.com/sync"&gt;Sync blog&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;b&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/PDC08SummaryProjectHuronandMSFV2CTP_924E/img56_7.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 1px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="img56" border="0" alt="img56" align="left" src="http://blogs.msdn.com/blogfiles/mahjayar/WindowsLiveWriter/PDC08SummaryProjectHuronandMSFV2CTP_924E/img56_thumb.jpg" width="244" height="238" /&gt;&lt;/a&gt; Project Codename “Huron”&lt;/b&gt; – Leverage the power of SQL Data Services and Microsoft Sync Framework to build business data hubs in the cloud. Using this cloud based data hub, “Huron” provides a simpler, more convenient and less expensive way to:&lt;/p&gt;    &lt;p&gt;· Publish databases to the cloud along with reports, forms and objects&lt;/p&gt;    &lt;p&gt;· Subscribe to published data and automatically configure the local database for sync&lt;/p&gt;    &lt;p&gt;· Make online changes through SQL Data Services and propagate those changes to subscribed users once they connect&lt;/p&gt;    &lt;p&gt;· Enable scheduled and background synchronization of data changes through SQL Data Services and then on to other subscribed users&lt;/p&gt;    &lt;p&gt;· Backup and restore of database applications to the cloud&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;We showed one such scenario of Project Huron at PDC. The PDC demo shows how customers using Access database can scale out and enable collaboration scenarios on the Access database by publishing it to the cloud. Customers interested in sharing or contributing to the data can subscribe to the hosted Access database. All changes are routed and synchronized in a peer to peer fashion through the cloud hub. We also demonstrated the “data hub” nature of the data in the cloud by downloading the same Access data to a Microsoft Compact database with full bi directional sync support. All components showed in the demo were running on live code. We used Microsoft Synchronization Framework V1 to build our AccessProvider, SDSProvider and SqlCESyncProvider. Acess and CE providers run locally on the box while the SDSProvider is running in our sync service running the cloud handling the SDS store. Feedback from PDC is very promising and the Access scale out/collaboration scenario seems to be a very common problem that customers run in to. Infact, we had a couple of guest posts over at the &lt;a href="http://blogs.msdn.com/access" target="_blank"&gt;Access team blog&lt;/a&gt; and feedback from that blog has also been very promising. You can read the entire post at &lt;a title="Announcement- Storing Access apps and data in the cloud" href="http://blogs.msdn.com/access/archive/2008/10/28/storing-access-apps-and-data-in-the-cloud.aspx"&gt;&lt;em&gt;Announcement- Storing Access apps and data in the cloud&lt;/em&gt;&lt;/a&gt; and &lt;a title="Video demos of Huron - Access and the SQL Server Data Services" href="http://blogs.msdn.com/access/archive/2008/10/31/video-demos-of-huron-access-and-the-sql-server-data-services.aspx"&gt;&lt;em&gt;Video demos of Huron - Access and the SQL Server Data Services&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What’s next for Huron&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;We are looking for early adopters to participate in project Huron which will start very soon. If you are interested in participating then please send an email to &lt;a href="mailto:DataLabs@Microsoft.com"&gt;DataLabs@Microsoft.com&lt;/a&gt; with “Huron beta” in the subject line. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;We also announced public availability of the MSF v2 CTP which has some interesting new features built in. More info on MSF V2 CTP1 can be found &lt;a href="http://blogs.msdn.com/sync/archive/2008/10/28/annoucing-sync-framework-v2-ctp1.aspx" target="_blank"&gt;here&lt;/a&gt;. We are very excited about Huron and cant wait to share it with early adopters.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9050181" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /><category term="Project Huron" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Project+Huron/default.aspx" /></entry><entry><title>No Re-release of Microsoft Sync Framework V1</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2008/10/22/no-re-release-of-microsoft-sync-framework-v1.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2008/10/22/no-re-release-of-microsoft-sync-framework-v1.aspx</id><published>2008-10-22T21:55:00Z</published><updated>2008-10-22T21:55:00Z</updated><content type="html">&lt;P&gt;Last week, &lt;A href="http://blogs.zdnet.com/microsoft/?p=1646" mce_href="http://blogs.zdnet.com/microsoft/?p=1646"&gt;Mary Jo Foley&lt;/A&gt; reported that we re-released Microsoft Sync Framework V1 with updated bits. Since I hadn't seen any internal emails on this I pinged my PM to get more details. Yesterday Liam posted an entry&amp;nbsp;in our &lt;A href="http://blogs.msdn.com/sync/archive/2008/10/21/not-an-updated-version-of-microsoft-sync-framework.aspx" mce_href="http://blogs.msdn.com/sync/archive/2008/10/21/not-an-updated-version-of-microsoft-sync-framework.aspx"&gt;Sync blog&lt;/A&gt; explaining&amp;nbsp;the "bump" in the published date. &lt;STRONG&gt;Summary&lt;/STRONG&gt;: We did not update the bits with any features/bug fixes. Apologize for the confusion.&lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9011526" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /></entry><entry><title>PD 2008 – Sync Framework Sessions</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mahjayar/archive/2008/10/12/pd-2008-sync-framework-sessions.aspx" /><id>http://blogs.msdn.com/mahjayar/archive/2008/10/12/pd-2008-sync-framework-sessions.aspx</id><published>2008-10-12T20:11:17Z</published><updated>2008-10-12T20:11:17Z</updated><content type="html">&lt;p&gt;We have 3 sessions planned for PDC. Details of the &lt;a href="https://sessions.microsoftpdc.com/public/sessions.aspx"&gt;sessions&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Microsoft Sync Framework Advances&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Presenter: Lev Novik&lt;/p&gt;  &lt;p&gt;This session shows you how the next version of the Microsoft Sync Framework makes it easier to synchronize distributed copies of data across desktops, devices, services, or anywhere else they may be stored.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sync Framework: Enterprise Data in the Cloud and on Devices&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Presenter: Liam Cavanagh&lt;/p&gt;  &lt;p&gt;See how synchronization plays a pivotal role in transitioning to a managed cloud environment by creating a central hub of information in the cloud. Using synchronization, organizations can enable more efficient mobile and enterprise-to-enterprise scenarios.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Windows 7: Programming Sync Providers That Work Great with Windows&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Moe Khosravy, Jason Roberts&lt;/p&gt;  &lt;p&gt;Learn how you can enable your application to synchronize with other applications that use the Microsoft Sync Framework. This session covers how to implement sync for contacts and other PIM data, how to package sync providers for distribution and installation, and how to register sync provider for use on Windows.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;All 3 sessions have excellent content and are shaping very well. I have been involved in the second one being presented by Liam Cavanagh. I will discuss more about the work we did after PDC. PDC is mere 2 weeks away. Excited!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8996705" width="1" height="1"&gt;</content><author><name>Mahjayar</name><uri>http://blogs.msdn.com/members/Mahjayar.aspx</uri></author><category term="Sync Framework" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx" /><category term="Sync Services for ADO.NET" scheme="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Services+for+ADO.NET/default.aspx" /></entry></feed>