Welcome to MSDN Blogs Sign in | Join | Help

Deploying TFS in the Developer Division at Microsoft

You haven't heard from me for a while because I've been taking a bit of a break for the past month to help out at home with our new daughter.  I returned to work on Monday.  As I'm getting back into the swing of things, I thought it would be a great time to write a new blog post.  I apologize for the length – there’s a lot to say and I didn’t really have the time to break it into chunks and dribble it out.

 

 

Expanding our Dogfooding

 

As you know the VSTS team has been using TFS internally for well over a year.  John Lawrence (http://blogs.msdn.com/johnlawr) has been blogging various statistics from our dogfood server for quite some time.  I think I've also mentioned that after we released V1, our plan was to roll out TFS to the rest of the Developer Division.  Well, we've been working on that for the past couple of months - getting internal tools to work with TFS, updating scripts, porting data, migrating teams, etc.  While we're not nearly done, we've made some great progress and I thought I'd share it with you.

 

Getting all of DevDiv to use TFS is a significant challenge.  A single branch of our source code is over 600,000 files today.  We are in the process of adding all of our test source to our branches (historically they have been in a separate repository).  This will add more than 1,000,000 more files to each branch.  By the time all is said and done, considering all of the branches we use, the TFS server will contain 100,000,000 files or more (no, that’s not a typo J).  This will make it one of the (if not the) largest source code databases on the planet.  There are other systems in the world with more source (for example the Windows NT source base is bigger, however it is broken up across approximately 9 different version control databases).

 

This is an ambitious goal to take on within a month of shipping TFS.  Today we have about 1,000 users and over 13,000,000 files in our TFS installation.  We've learned a great deal from the exercise and have plans to continue growing both the number of users and number of branches over the next 6 months or so.  Over that time, I’m sure we’ll learn even more.  We simulated very large databases in our labs before we shipped V1 but there’s nothing quite like seeing what happens in a production environment where the unbridled masses are unleashedJ.

 

 

Current stats

 

Here’s a snapshot of the overall server stats that John has been publishing for a while so that you can see how it has grown in all of the dimensions.

 

Users

Recent users: 806

Users with assigned work items: 1,023

Version control users: 1,229

 

Work items

Work items: 94,695

Areas & Iterations: 5,897

Work item versions: 721,531

Attached files: 24,569

Stored Queries: 9,160

 

Version control

Files/Folders: 13,137,178/1,677,668

LocalVersion: 82,217,411

Total compressed file sizes: 171.8GB

Workspaces: 2,376

Shelvesets: 3,711

Total checkins: 72,223

Pending changes: 106,113

 

Commands (last 7 days)

Work Item queries: 22,085

Work Item updates: 5,909

Work Item opens: 35,072

Gets: 21,088

Downloads: 10,705,779

Checkins: 7,216

Uploads: 192,832

Shelves: 749

 

 

Our experience

 

As I said, we’ve learned a lot from the exercise so far and have made several product fixes as a result.  We are rolling all of the fixes we've made into a service pack that we will make available publicly later this year (please don't ask me to me more concrete than that as we are still in the midst of planning the release J).

 

The good news is that with relatively minor changes the system is performing well under impressive load and scale.  Most of the growth pains we've had have been around version control data.  As you can see above the number of files under version control has grown by almost a factor of 10 since John last reported it in February.  I’d also like to point out that although I’m going to describe some issues we’ve dealt with in the roll out to DevDiv, no where in the process have we experienced a single data corruption of any type.

 

As we started growing the amount of data in the server we ran into some service issues.  These service issues were caused by operations taking way longer than they should and blocking other people from using the server for periods of time.  With the patches and operational changes we've made over the past month, we've restored the server’s level of performance and availability.

 

This is what dogfooding at Microsoft is all about.  It allows us to really push the system under real production conditions with massive amounts of data and significant load.  We can examine carefully how the server is behaving.  We can experiment (albeit carefully) with alternative approaches to really push the scale of the system.  In the spirit of transparency (and hopefully to share some interesting challenges we’ve faced), I'm going to describe many of the issues we've hit, what we've done and what further we are planning on doing.  I hope your take away from this is not simply that the server has had problems - every system has problems at some level of scale or load.  What I hope you take away is that we are in this with our customers and are pushing the system as hard as we can and addressing the issues.  All of our customers (including those internally at Microsoft) will benefit from the effort we put in as we continually use and improve the system.

 

 

What we’ve learned

 

Most of the issues can ultimately be traced back to the size of data in some form.  There are two dimensions of size that affect the server – how much data is in the server (making tables and indexes larger, etc) and how big individual operations are (consuming memory, CPU, locks, etc).  As I mentioned above - a single branch in the VS database is over 600,000 files.  As we started to manipulate single branches this large - checkin all 600,000 files, merge 100,000's of changes, etc we ran into some issues.  We found that having 600,000 pending changes in a single workspace didn't work well.  As the warehouse data grew to millions and millions of files, it had some issues.  Etc.  Our initial approach to work around some of these problems was to break up these really large operations and do them in smaller chunks (for example - checkin 50,000 files at a time rather than 600,000).  In many cases (but not all) this is a fine solution and only a minor annoyance.

 

We’ve completed our analysis of the underlying constraints that we were hitting and have fixed, or are working on fixes to address all of them.  Here’s a summary of some of the things we have learned.

 

Sprocs & Query plans

We've made a variety of tweaks to our stored procedures to induce better query plans when we find ones that aren't working very well.  As the amount of data grows, any query plan that is not optimal can quickly go from a few milliseconds to minutes.  Changes we've made include:

 

Checkin, Undo, Rename - Changed the sprocs because the performance degraded when there were 100,000's of pending changes in a single workspace

SetPermission, SetPermissionInheritance - Fixed a performance problem that appeared when the number of files in the system got really large and the depth of the tree grew.

Get - We discovered that many of the get operations were for individual files or for very small groups (often done by automated tools).  Our V1 implementation took approximately the same amount of time whether you were doing a get of a single file or an entire workspace of 10,000's of files (ignoring any file download time).  We have enhanced the get sproc now to optimize for what is actually asked for.  The result is that single file gets have dropped from about 5 seconds to a few hundred milliseconds.

Merge - We found that a big part of the time spent in merge was computing what changes needed to be made to update the client.  This was causing blocking of other operations on the server.  We moved the client calculation outside the merge transaction and reduced concurrency problems.

 

Locking

We've run into an issue with database locking.  The biggest effect has been on the pending change table when doing things like really large checkins.  In these scenarios we need to take write locks for every pending change being affected.  SQL's row level locking does a great job.  However, to limit the amount of memory a transaction can use for locks, at a point (about 5,000 row locks) SQL stops locking each individual row and "escalates" to a table lock.  This means that the transaction has every row in the table locked.  While, for the vast majority of applications, this is not a consideration (either tables aren't that big, not that many rows need to be locked or concurrency is low) - it is an issue for our application.  It means that for the duration of the checkin transaction of over 5,000 items no one else can pend any changes (checkout) because the table is locked.  For checkins of small numbers of 1,000's of items (5,000, 10,000, 20,000) it's not too noticable because the checkin is fast enough.  However checkins of 100,000's of files can take many minutes and everyone screams when they can't checkout for minutes at a time.

 

The pending change table is not the only place we can hit this.  We can also hit it on the LocalVersion table, the Version table, etc but it tends to be the one we've hit the most.  The problem, however, is general and we are looking for a general solution.

 

We have worked with the SQL team to understand all of our options.  The first option we are trying is to disable row locks on the tables/indexes where this affects us.  This will cause SQL to use page locks instead.  Based on the way our tables and indexes are clustered, we don’t believe this lower granularity of locking is going to be a problem for us.  Another approach we will try, either together with the first or separately, is to disable lock escalation causing SQL to continue to take finer grained locks of how many are needed (never escalating to table locks).  Of course, this means that the server can use more memory for locks but we are planning for that.  We're in the process of upgrading to our final production hardware which is a 64 bit server with 32GB of RAM.  We won’t know for sure that this fully addresses the problem until we’ve finished testing it.

 

In the mean time we've chunked most of  the really large operations up (as I described above) and moved them more to off hours and this is not creating a problem for us at the moment.

 

Read Committed Snapshot Isolation (RCSI)

RCSI is a really cool new feature in SQL server that allows readers to maintain read committed isolation semantics without taking read locks.  It does this by proactively making copies of data that is changed and allowing readers to access these "old versions" of the rows when needed.  RCSI is a database level setting so when enabled, it applies to all tables in the database.  There are some tables (most notably the LocalVersion table) that benefit substantially from RCSI.  RCSI gives us substantially better concurrency and performance.

 

However, we have discovered a side effect.  It’s not huge but it aggravates the locking issues a bit.  RCSI is pretty smart about how it works and it actually only copies the changed portions of a row to minimize the amount of data copied.  However, some of our really large operations delete large numbers of rows from some tables.  For example, in the 600,000 file checkin case, we need to delete 600,000 pending change rows when the checkin is complete.  RCSI has to make a copy of the "changed" data but because the operation is a delete, all of the data in the row "changes".  This means that RCSI has to copy all 600,000 rows.  We have found that under load this alone can take several minutes and is sometimes the single most expensive part of an operation.  When we disable RCSI, the same deletes complete less than half the time.

 

We are investigating a variety of options.  The first is to change the pattern so that rather than deleting the rows in the transaction, we instead change the value of a non-indexed column to indicate that the row is "deleted".  We could then delete those rows in a separate transaction with an isolation level below read committed (read uncommitted) and there by avoid the row copying that happens with RCSI.  If we’re not happy with that, our alternative is to change RCSI from “on” for the entire database to “enabled” and then go through all of the sprocs and specifically state which transactions need that semantic and which don’t.  This would be a much more impactful change requiring much more testing.

 

AT memory

When we started trying the huge operations (like checkins of 600,000 files), we saw a variety of out of memory problems on the application tier server.  After investigation, we discovered that some of these operations were requiring up to 1.5GB of memory on the AT to hold the results before sending them back to the client.  Because our AT is a 32 bit application we started running out of virtual memory and the web service would recycle.  Recall, normal 32-bit process have only 2GB of virtual address space.  Although there is a configuration to increase this to 3GB, it is generally not recommended for IIS worker processes

 

The biggest occurrence of this was operations that return what we call "GetOperations".  This is data that tells the client what needs to be updated.  For example, if I call the "Get" web service, it returns an array of "GetOperations" to tell the client what to do to bring itself up to date.  This also happens with delete, rename, merge and others.  When doing these operations on 100,000's of files the AT would run out of memory.  We also saw the Warehouse hit this problem when it tried to process code churn information for a single checkin of 100,000's of files for the same reason.

 

We've taken a variety of approaches to help with this problem.  First, the single biggest portion of a GetOperation is the "download ticket" that allows you to download the file.  Some of the operations getting these large numbers of GetOperations had no intention of downloading the files, so we modified them to request that the tickets not be generated.  Some operations were changed to request the download tickets in chunks after the initial list of GetOperations is returned.  We also made some memory consumption optimizations to reduce how much memory is used during processing.

 

Ultimately, there will always be some level at which the AT will run out of memory.  We can trim down and optimize so maybe it will take a single operation of 10,000,000 files instead of 500,000 but there will always be a limit.  Our future approach will be to make the AT work as a 64-bit process so that virtual memory will no longer be a meaningful limitation.

 

Warehouse

The warehouse too has had issues as a result of the flood of data.  I mentioned the problem with AT memory above.  In addition we have had an issue with the warehouse consuming too many resources (CPU and RAM) on the live server.  With all of that data, it got to the point that the hourly cube processing could consume high CPU load for as much as 20 minutes.  We are investigating the causes for this high load with the Analysis Services team.  As a short term fix we made a change to our server topology to move the warehouse off of the live server and only a separate warehouse server.  In general, the large scale data warehouse best practice is to put your warehouse be on different hardware than your operational server.  Unfortunately, this is not a supported production configuration in TFS V1 so I can not recommend it.  Doing this WILL create problems with the serviceability of a TFS installation.  We are investigating making this topology supported in the future.

 

When looking hard at the warehouse performance in the light of all of the data we were pumping we noticed that there was quite a lot of network traffic between AS and the SQL server (I don't remember the details).  As a result we updated all of the server to server network connections to be Gigabit ethernet.

 

We hit another problem (that required a sproc change) when we rapidly (with a tool) added 2,000 to 3,000 Areas.  The work item tracking system was unable to consume this much change so rapidly and stopped working until we could fix it.  We now have a patch available that can remedy the issue.  If anyone reading this hits the issue, Customer Support should be able to help you.

 

 

Summary

 

As you can see we've hit a wide range of issues.  I expect that as we continue the rollout and increase the data size substantially we'll uncover new problems.  However, the system is already holding up under a stunningly large amount of data.  We'll continue to fix issues as we find them and will make sure to deliver those fixes in the commercially available product.  Many of the fixes we’ve done so far actually help performance even when the data sizes are not nearly so big.  It’s just that the fixes go from being “nice to have” with smaller data set sizes to “necessary” at REALLY large data set sizes.

 

We set out to build TFS as a product that could scale from small teams to the largest enterprises.  I’m immensely proud of what we have accomplished with the product so far.  I really do hope this information doesn’t scare people.  As I’ve said, every system has limits and will run into problems at some level of scale or load – we’re just being up front about what ours are.  Those of you with hundreds of thousands for even small numbers of millions of files can use TFS V1 just fine with no additional fixes or patches and it will serve you well.  As you grow, we’ll be ready for you.  We won’t stop until TFS has more headroom than any team development system in existence.

 

Thanks for listening - if you've actually read this far I'm impressed :)

 

Brian

Published Wednesday, May 17, 2006 7:38 AM by bharry

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# re: Deploying TFS in the Developer Division at Microsoft

Wednesday, May 17, 2006 11:47 AM by Maximilian Haru Raditya
Cool!

I really like what's been explained in your post. It shows me a real case study, especially when you said that MS is currently using it internally for the developer division. Is it almost all parts of the division?

I absolutely agree with you that the next version of TFS should provide an option to move data warehouse server (the analysis service server, furthermore the reporting service sever as well) to servers other than the transactional database server for maximum scalability.

Also, I think TFS should support installation on 64-bit machine to scale well for the next version, not just the SQL Server part, which is currently the only supported scenario.

I think it's really a good work for a V1 product.

Thanks and keep up the good work!

# re: Deploying TFS in the Developer Division at Microsoft

Wednesday, May 17, 2006 12:50 PM by KeithH
It's great to see you guys following through on pushing TFS into DevDiv.  It's this kind of "extreme" dogfooding that reassures me that our paltry sized (in comparison) development teams won't hit these issues because you will have found & fixed them first.  I'm looking forward to SP1.  BTW is there any chance that we will get a "move team project" utility to move a project from one TF server to another in SP1?

# re: Deploying TFS in the Developer Division at Microsoft

Wednesday, May 17, 2006 1:09 PM by Bryan Hinton
Brian,

Thanks for sharing - I have been part of a TFS pilot program here at Intel and am trying to evangelize its use and having this information is very valuable to back up my efforts.  Could you also share the queries that you are running to get the statistics you listed?  I would like to do similar things for my system.

# re: Deploying TFS in the Developer Division at Microsoft

Thursday, May 18, 2006 7:48 AM by bharry
Thanks for the comments so far.  I'm going to roll up some responses to the first 3 comments in one.

No, we're not nearly to all parts of the division yet.  I'd guess we're in the ballpark of a 3rd of the way - maybe a little less on file count.

No, I'm afraid "move team project" is much more work than we can do in a service pack.  However, we are already working hard on it for our next release.

I'll post some of the queries I use in my next blog post.  Yesterday I spent a couple of hour tuning them because it was starting to take quite a few minutes to gather all of the statistics.  I'll try to get that out by the end of next week.

Thanks again and keep the comments and questions coming...

Brian

# VSTS Links - 05/18/2006

Thursday, May 18, 2006 3:48 PM by Team System News
Brian Harry gives an excellent post on Deploying TFS in the Developer Division at Microsoft.

James...

# DevDiv내의 TFS 사용에 관한 글

Sunday, May 21, 2006 11:45 AM by bkchung's WebLog
http://blogs.msdn.com/bharry/archive/2006/05/17/599817.aspx
DevDiv는 Developer Division의 약자로 제가 속한 디비젼으로...

# shoemoney

Thursday, June 01, 2006 5:17 PM by shoemoney
nice shoemoney site at <a href="http://www.imyourhuckleberry.info/">shoemoney</a>">http://www.imyourhuckleberry.info/">shoemoney</a> http://www.imyourhuckleberry.info/ 16

# re: Deploying TFS in the Developer Division at Microsoft

Monday, June 12, 2006 12:31 PM by Carl Daniel
Great article, Brian!  How's that next blog post coming - you know, the one with the queries you use to get TFS statistics?

# re: Deploying TFS in the Developer Division at Microsoft

Monday, June 12, 2006 4:21 PM by bharry
Sorry about that, I just posted them

# re: Deploying TFS in the Developer Division at Microsoft

Wednesday, June 14, 2006 11:35 PM by Minas Casiou
TFS Server Error on Branching (about 5GB of data in main branch)...
SQL Error..>See below...

------------
String or binary data would be truncated.
MRPTEST2.TfsVersionControl..prc_PendBranch: Database Update Failure - Error 8152 executing INSERT statement for tbl_Lock
The statement has been terminated. (type SqlException)
------------

An error report has been generated & sent off etc.
Is there anywhere I can get patches for this bug by any chance?
The Branch operation worked on the main branch in the past, and still works for small parts, but the whole of the trunk can no longer be branched! :( Spewing! Just at the last part of our eveluation process!!!



TF53010: An unexpected condition has occurred in a Team Foundation component. The information contained here should be made available to your site administrative staff.
Technical Information (for the administrative staff):
Date (UTC): 15/06/2006 3:07:13 AM
Machine: MRPTEST2
Application Domain: /LM/W3SVC/3/Root/VersionControl-3-127948074529668170
Assembly: Microsoft.TeamFoundation.Common, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a; v2.0.50727
Process Details:
 Process Name: w3wp
 Process Id: 2672
 Thread Id: 3992
 Account name: NSWPS\n1115635

Detailed Message: TF14105: An exception occurred in the Team Foundation Source Control System.
Web Request Details
   Url: http://mrptest2:8080/VersionControl/v1.0/repository.asmx [method: POST]
   User Agent: Team Foundation (devenv.exe, 8.0.50727.147)
   Headers: Content-Length=585&Content-Type=application%2fsoap%2bxml%3b+charset%3dutf-8&Accept-Encoding=gzip&Accept-Language=en-AU&Expect=100-continue&Host=mrptest2%3a8080&User-Agent=Team+Foundation+(devenv.exe%2c+8.0.50727.147)&X-TFS-Version=1.0.0.0&X-VersionControl-Instance=f755ccec-a571-4ddd-92bc-b5cbdb71e9b8
   Path: /VersionControl/v1.0/repository.asmx
   Local Request: True
   Host Address: 10.12.112.60
   User: NSWPS\n1115635 [authentication type: NTLM]

Exception Message: String or binary data would be truncated.
MRPTEST2.TfsVersionControl..prc_PendBranch: Database Update Failure - Error 8152 executing INSERT statement for tbl_Lock
The statement has been terminated. (type SqlException)
SQL Exception Class: 16
SQL Exception Number: 8152
SQL Exception Procedure: prc_PendBranch
SQL Exception Line Number: 570
SQL Exception Server: MRPTEST2
SQL Exception State: 13
SQL Error(s):
SQL Error[1]: System.Data.SqlClient.SqlError: MRPTEST2.TfsVersionControl..prc_PendBranch: Database Update Failure - Error 8152 executing INSERT statement for tbl_Lock
   Class: 16
   Number: 500004
   Server: MRPTEST2
   Source: .Net SqlClient Data Provider
   State: 1
   Procedure: prc_PendBranch
   Line Number: 597
SQL Error[2]: System.Data.SqlClient.SqlError: The statement has been terminated.
   Class: 0
   Number: 3621
   Server: MRPTEST2
   Source: .Net SqlClient Data Provider
   State: 0
   Procedure: prc_PendBranch
   Line Number: 570

Exception Data Dictionary:
HelpLink.ProdName = Microsoft SQL Server
HelpLink.ProdVer = 09.00.2047
HelpLink.EvtSrc = MSSQLServer
HelpLink.EvtID = 8152
HelpLink.BaseHelpUrl = http://go.microsoft.com/fwlink
HelpLink.LinkId = 20476


Exception Stack Trace:    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
  at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
  at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
  at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
  at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
  at System.Data.SqlClient.SqlDataReader.get_MetaData()
  at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
  at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
  at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
  at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
  at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
  at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
  at Microsoft.TeamFoundation.Server.SqlResourceComponent.execute(ExecuteType executeType, CommandBehavior behavior)
  at Microsoft.TeamFoundation.VersionControl.Server.VersionControlSqlResourceComponent.execute(ExecuteType executeType, CommandBehavior behavior)
  at Microsoft.TeamFoundation.Server.SqlResourceComponent.ExecuteReader()
  at Microsoft.TeamFoundation.VersionControl.Server.VersionedItemComponent.PendBranch(Workspace workspace, String sourceServerItem, String targetServerItem, List`1 dontBranch, IList gets, IList failures)
  at Microsoft.TeamFoundation.VersionControl.Server.ChangeRequest.PendChange(ExpandedChange expandedChange, VersionedItemComponent db, Workspace workspace, IPrincipal userPrincipal, Set`1 attempts, IList successes, IList warnings, IList failures)
  at Microsoft.TeamFoundation.VersionControl.Server.ChangeRequest.PendChanges(IPrincipal userPrincipal, Workspace workspace, ChangeRequest[] requests, ArrayList& failures)
  at Microsoft.TeamFoundation.VersionControl.Server.Repository.PendChanges(String workspaceName, String ownerName, ChangeRequest[] changes, ArrayList& failures)



For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

# re: Deploying TFS in the Developer Division at Microsoft

Thursday, June 15, 2006 8:35 AM by bharry
I just sent it to the dev team and I'll let you know what I hear.

# re: Deploying TFS in the Developer Division at Microsoft

Friday, June 16, 2006 2:39 PM by bharry
Here's what I got back:

It looks like the most likely cause of this is one of the items in the target of the branch exceeds 260 characters. There is an error check which checks for it – but due to a faulty join, it requires the target of the branch to be mapped in the working folders. Our assumption is that the target is not mapped – skipping the error check and failing when it actually inserts into tbl_Lock. If the customer maps the target of the branch – it will give them the item which is too long. This has been fixed in SP1.

So it sounds like fundementally the problem is that you are trying to branch a tree that is resulting in a path that is greater than 260 characters.  You need to branch it higher in the tree and/or use a shorter foldername.  TFS can only store paths up to 260 characters long.

Let me know if this doesn't seem like the problem.

Brian

# re: Deploying TFS in the Developer Division at Microsoft

Friday, June 23, 2006 11:34 AM by Messaoud
Interresting.
Can you tell us more about the size/physical configuration of the server you used ?
Some info about :
- nb of Servers
- CPUs
- RAMs
- HD

Thanx,
Messaoud

# Visual Studio Team System Resources (VSTS)

Tuesday, December 05, 2006 10:26 PM by Sean McBreen's WebLog

I'm very proud of Visual Studio Team System and what Microsoft have done here - I've blogged about it

# Bored? Want to find out what it was like for MS to deploy TFS?

Monday, December 18, 2006 10:40 PM by Darryl Burling @ Work

In case you have become bored due to us not releasing anything since Saturday ( Visual Studio 2005 SP1

# ALM using VSTS / TFS - More links than you shake a stick at !

Thursday, February 01, 2007 1:00 AM by The Liquidator

Configuration and Management of Team Foundation Server http://msdn.microsoft.com/vstudio/teamsystem/team/quickstarts/configure/default.aspx

# Brian Harry: Microsoft DevDiv Dogfood Statistics — Version Control Blog — Microsoft Team Foundation, Use cases,

# re: Deploying TFS in the Developer Division at Microsoft

Saturday, February 10, 2007 4:38 AM by Stern

Replying to an old post, but "TFS can only store paths up to 260 characters long" - that's kind of rubbish, isn't it?

# re: Deploying TFS in the Developer Division at Microsoft

Saturday, February 10, 2007 6:52 AM by bharry

I don't particularly think so.  There's no doubt it's a limitation and it will affect some people but not very many.  The reason for this limit is that the Win32 API only supports 259 character paths using the normal syntax.  To support paths with longer than 259 character, they have to be prefixed with \\?\.  It's not that it's amazingly hard to do but there is some work in it and it is relatively poorly understood.  The result is that very few apps support more than 260 character paths.

Let's think a bit about what a 260 character path means.  With an 80 character wide console window, it wraps around the screen more than 3 times.  Not particularly legible.

That said, it's on our radar to get to removing the limitation because there are sometimes legitimate reasons for such long paths.

Brian

# Employment Wages » bharry’s WebLog : Deploying TFS in the Developer Division at Microsoft

Leave a Comment

(required) 
required 
(required) 
 
Page view tracker