Skip to content
gun

Web Part Event Firings and Why You Shouldn’t Have Code in the Constructor

So I’m working on an end user focused blog post about the difference between closing (Close) and deleting (Delete) a web part. In the middle of that I realized that although we’ve been told that the web part still runs when you close a web part on a page, we’ve not been told what still runs in the web part. So I fire up Visual Studio and I create the world’s dumbest web part. (There should be a competition.) All this web part does is log each time any one of the methods that can be overridden is called. Essentially any time the web part receives any sort of action. I run the web part in WSS v3 and I get the following results:

Adding Regular Load Minimized Closing Closed
Constructor Constructor Constructor Constructor Constructor
Constructor ResolveAdapter ResolveAdapter ResolveAdapter Missing: Dispose
ResolveAdapter OnInit OnInit OnInit  
OnInit TrackViewState TrackViewState TrackViewState  
TrackViewState HasControls OnLoad HasControls  
OnLoad OnLoad EnsureChildControls OnUnload  
EnsureChildControls EnsureChildControls ResolveAdapter Missing: Dispose  
ResolveAdapter ResolveAdapter CreateChildControls    
CreateChildControls CreateChildControls OnPreRender    
OnPreRender OnPreRender SaveViewState    
SaveViewState SaveViewState HasControls    
HasControls HasControls RenderControl    
RenderControl RenderControl Render    
Render Render RenderBeginTag    
RenderBeginTag RenderBeginTag AddAttributesToRender    
AddAttributesToRender AddAttributesToRender RenderContents    
RenderContents RenderContents RenderChildren    
RenderChildren RenderChildren RenderEndTag    
RenderEndTag RenderEndTag OnUnload    
OnUnload OnUnload Dispose    
Dispose Dispose      

There are a couple of things to note here. First, in the Adding scenario – when the web part is being added to the page, two instances of the web part are created but only one of them has events fired against it. You’ll have to trust me that it’s only one instance that’s being used. This means we’ve got one Dispose method call that’s missing. i.e. Web Parts must implement IDisposable which is the Dispose method and the dispose method should be called every time the web part is created. When I get to the closed scenario is where it gets bad. When you’re closing the web part and when the web part is closed you only get one constructor – but never a dispose.

By the way, please don’t get too hung up on the order of events here. You’ll see that HasControls fired twice in the Regular Load scenario – that’s pretty normal to have some slight variations in timing that cause a few extra or fewer calls. This might serve as a rough framework but it’s not the final word on event firing. (You’ve been warned.)

Back to our story… what does all of this mean? Well, let me first say that I’ve had several folks who’ve asked me questions via email over the years and when it comes to be parts I always encourage them to move code out of the constructor and into OnInit or one of the other functions. In Web Part land there’s just not enough spun up at constructor time for things to work all the time. I’ve had more than a few folks say that their web parts magically started working once they moved code back into OnInit. So again, what does this mean?

Essentially, unless you’ve got a good reason, don’t use the Web Part’s constructor. I’ve seen problems with web parts that use it and this latest data seems to show that the dispose method doesn’t always get called – in some cases you’ll get a constructor call but no Dispose. However, in every case if OnInit is called there seems to be an Dispose call.

This blog is online with CKS:EBE

This is my first post from CKS:EBE v2.  It’s been a long journey.  For most of the last three years you’ve not been able to comment or track back to my blog posts.  That’s been because the tool I was using before didn’t have any sort of blog spam filtering and when blog spam started to become popular it became a problem to manage.
If you find anything that’s not working on the site please let me know.

Progress on “The SharePoint Shepherd’s Guide for End Users”

I wanted to provide a quick update on The SharePoint Shepherd’s Guide for End Users.  First, I have the blog’s branding (i.e. SharePoint Theme) deployed to the site.  Instead of looking like an out of the box SharePoint site it looks like a real branded site.  I’ve love to hear feedback on the branding — or on problems you’re having with it.

Second, I’ve been maintaining a list of links, reviews, and refrences on the site.  If you’re interested in what people have been saying about the book, please check it out.

Third, It looks like the book will be available in standard book distribution VERY soon.  Amazon.com already has a page for the book up.  It doens’t yet let you order it, it has no image, no description, etc., however, you can be alerted when it’s available from them.  I’ve signed up for an alert so hopefully I’ll be able to communicate availability here.

Finally, thank you to everyone who has been supporting the project.  I’ve been overwhelmed by the interest in the project.

SharePoint Site Collection Governance

While working with a client recently we came upon a seemingly simple question. How big, in terms of business scope, should a SharePoint site collection be? The question is a good one because it gets at the heart of how to architect your SharePoint Solution. You can decide on a model with only a few site collections — or one where there are a large number of site collections. In this article, I’ll take you through a process of evaluating the needs of your business units and how to design a strategy and make individual decisions.

http://www.intranetjournal.com/articles/200804/ij_04_07_08a.html

SharePoint is not Lotus Notes

I’m not the world’s biggest fans of so called “think tanks” and their reports.  While I have the deepest respect for some of the analysts I’ve met, I also know more than a few that truly miss the point.  They don’t get it.  They don’t understand the market they work in.

Recently one of the folks that I don’t think really understands the market – CMS Watch – started hocking their latest dribble about SharePoint in the CMS market.  One of the things in the report is a comparison of SharePoint to Lotus Notes. I don’t know for sure but this is apparently the case since several reporters – to whom I can only imagine a copy of the report was sent to – have posted articles making this comparison.  I can further only assume that this is a desperate attempt on CMS Watch’s part to sell a few copies of the report since the comparison doesn’t make sense.  I feel sorry for the reporters (who are overworked and underpaid) who fell into the trap of repeating this senseless comparison.

I think there are a ton of reasons why this comparison is silly.  Let me summarize the top few:

  1. One successful product is being compared to another from a different era  –  It’s sort of like comparing Lotus 1-2-3 against the current offering of MS Excel.  1-2-3 was, for its time, the best spreadsheet.  Similarly, Word Perfect 5.1 really hit the market the right way.  It was a really good word processor until the Windows GUI and WYSIWYG overtook character based word processing.  Both of these products (Lotus 1-2-3 and WordPerfect) were successful products.  The basic comparison is that SharePoint may become like Notes.  Notes was, for its time, the right product.  It is a good, money making product even today.
  2. Offline and the web – Notes is an offline database tool.  Call it groupware, a collaboration tool, or whatever you want.  It’s good at managing sparsely changing databases.  I know of several applications that Microsoft has failed to displace because they’re based on the rich replication that the tool has for offline access.  SharePoint, at least what we have today, is an online only tool.  Sure it’s got options for taking stuff offline – both from Microsoft and third parties – but we’re not there yet.  So we have a tool that from the start was designed to deal with the offline scenario – and one that was designed to deal with the online scenario.  They’re totally opposite design approaches.
  3. User Driven vs. Management Driven – It is a fallacy that Notes was driven by end users.  Notes utilization was driven by departmental IT.  Folks may believe I’m splitting hairs, but I don’t think so.  Notes was adopted because departmental IT (what some folks call Business Unit IT) needed solutions and central IT wouldn’t do them.  They could develop Notes applications and corporate IT would host them.  SharePoint is being driven in some cases literally by end users who need to share a spreadsheet or keep versions of a document.  It’s not the departmental IT manager.  It’s the administrative assistant or the business analyst or the chemist.  The adoption model isn’t the same.  Honestly, the adoption is much more akin to the MS Access adoption model.
  4. Users Hate Notes – As some have correctly pointed out, most folks who hate Lotus Notes hate it as a mail client – and well they should.  I’m a strong Outlook advocate.  Its issues pale in comparison to those of Notes.  I don’t have any particular malice towards Lotus Notes as a sparsely connected DB – it’s great at that.  The issue is trying to force it to be a mail client too.  SharePoint doesn’t do email.  Exchange and Outlook do Email.  SharePoint integrates with Exchange and Outlook.

So let’s follow the supposition that SharePoint will follow the lifecycle of Lotus Notes.  Where does that leave us?  With a product that has one of the longest lives of any product in PC history?  To a product that has 120M users?  I guess I don’t see that as a bad thing.

The implication is that SharePoint will someday become a legacy product for organizations as they seek to divest themselves from it.  Uh, duh.  That’s going to happen.  The trick is when and why?  I don’t know the when, but as for the why – it will be because MS doesn’t make the right investments in the product.  I think MS has a much better track record at making the right investments than IBM has.

I’m really waiting on someone to catch on that the MS Access comparison (which I made above) is a better comparison. MS Access adoption was driven by end users.  It was very easy to let MS Access databases get out of hand — just as it’s easy to let SharePoint sites to get out of hand.  However, what SharePoint has going for it is it’s still recoverable – where Access wasn’t.  Oh, yea, and you *CAN* throw hardware at a SharePoint performance problem (due to bad design) where with Access you really couldn’t.

Can you do bad designs with SharePoint?  Absolutely.  Is this any different than any other CMS (or collaboration) product?  No.  Well, why then, you might ask, are there so many screwed up SharePoint implementations and so few of the other products?  Let the other products do 1 Billion in sales – and 100 Million licensed users.  Take a look at the numbers again – you’ll probably find that the numbers aren’t that different as a percentage.  Everyone’s seeing more screwed up SharePoint implementations because there are more of them to be screwed up.

Customer Service is a Thankless Job – Sorry

I have the greatest respect and admiration for folks who do customer support.  I couldn’t do it.  My personality just wouldn’t allow me to walk folks through plugging in the proverbial power cord every day of the world.  I am sure that I’d become the first ever documented case of spontaneous human combustion.  Because of this I’ve contemplated whether I should write this blog post for quite a while.  However, I ultimately realized that although I had my issues with individual customer service folks who had helped me, I am substantially more frustrated with the systems that allow this to continue – and in fact encourage it.

So I need to provide a little bit of background.  Around the first of this year I tried getting to http://technet.microsoft.com for whatever reason it didn’t respond.  I didn’t think much about it, I was just going to register for something so it wasn’t a big deal.  A week or two later I tried again and it still didn’t work.  At this point I got a little more curious.  So I logged into a server at Bluelock.  I could get to TechNet from Bluelock.  That meant it was a local problem.  So I put on my debugging hat and dug in.

A quick check of nslookup reviled that the IP address resolved for both locations were the same.  OK, it’s not a DNS problem.  Good to know.  I then started digging in and ran a packet trace from my firewalls (a SonicWall Pro2040 @ Bluelock and a SonicWall TZ170 here).  I saw something very odd.  At Bluelock I got the SYN and SYN ACK packets I’d expect to form up the TCP connection.  Here I got SYN, SYN ACK, SYN, SYN ACK.  Hmmm, that means the TCP stack locally didn’t like the ACK designed to form up the TCP connection.  I try a few other machines on the network including Windows Server, XP, Vista, etc.  They’re all having the same issue.  I tried with the local PC firewall on and without it on.  Still the same result.  I decided to eliminate more variables.  I instructed Telnet to make a connection to TechNet on port 80.  Although Telnet is a lousy web browsing client <grin>, it is one of the most basic ways to test whether a TCP connection can form.  When it didn’t work I had eliminated a ton of stuff.

So, in preparation for my call to support, I went in with a laptop and bypassed my TZ170.  I MAC cloned its external address so Brighthouse/Road Runner, my cable provider, wouldn’t lock out either the TZ170 or the laptop – so far as they were concerned it should have looked like the same computer.  When I did the test I observed the same thing.  No connections to technet.microsoft.com but arguably every other web site seemed to work.  (I’d later find out that there were a handful of other sites that were affected by this problem, but that wasn’t until later.)

So I hook everything back up and pick up the phone to call the Road Runner national help desk.  A pleasant sounding lady named Brandy answered the phone.  I briefly described that there was one web site, technet.microsoft.com, that I couldn’t get to.  She asked me “Did you put www in front of that?”  I politely explained that this web site didn’t have a www in front of its address.  I further explained that I had done a substantial amount of troubleshooting and had isolated the problem to the fact that TCP connections weren’t being formed up to the web site – although it was transmitting packets.  I offered to send her the packet capture and described the telnet procedure I had used to eliminate a ton of the variables that can happen in a typical system.  After a brief pause she asked “Did you try clearing your browser cache and cookies?”  I politely responded that it was clear that I wasn’t communicating effectively with her and that I’d appreciate the opportunity to speak with her manager.  To be clear, I expected this sort of an interaction, as I said before, most folks that customer support speaks with aren’t able to find the on/off switch.  I don’t expect them to be reading packet traces with me (as a point of fact I couldn’t tell you what IN the packets was wrong.)  I look at this interaction as an important and unfortunate necessity.  However, what happened next would start me down the process of changing my TV and Internet service.

A supervisor answered the phone that would only identify himself as Mike.  I explained the situation to Mike.  After a brief interaction Mike told me that this was a problem caused by the equipment or configuration on my end and wasn’t their responsibility.  When I asked him how he reached this conclusion he told me that I could get to every other web site and he could get to technet.microsoft.com therefore it must be my problem.  I presume Mike was in Reston, VA and I’m in Indianapolis, IN – there are a few different pieces of equipment between him and I.  I’ve seen all sorts of weird issues for clients caused by routers that are overloaded, overheated, or damp (don’t ask).  I certainly didn’t agree that because he didn’t see the problem that it didn’t exist.  I’ve never met God personally but that doesn’t shake my belief that he does exist.  I’ve never seen an electrical fire but that doesn’t mean I don’t believe they don’t exist.

So I asked Mike to escalate the case and he refused.  When I asked to speak with his manager is when the story got sad and entertaining at the same time.  Mike responded that he didn’t have a manager.  I said, well, supervisor, director, boss — whomever did his reviews…  He responded he didn’t have any of those.  I had to pause.  I knew that the manager of the call center who’s working at 11PM on a Monday night isn’t the CEO of the organization, so I was being lied to.  I strongly dislike being lied to.  I dislike it even more when it’s so obvious.

So I asked, Mike if he signed his own paychecks.  He said no but wondered why I cared about an accounting function.  I responded that I didn’t – but that if he didn’t sign his own paychecks he had a boss.  So I continued the only person in an organization that doesn’t have a direct boss, that I know of, is the CEO.  I asked him if he was the CEO and when he responded no I asked him if he worked for the CEO.  He said yes, and I asked if he worked for the CEO directly.  He responded that he did.

So at this point, I’ve demonstrated that Mike’s a liar.  He clearly communicated he didn’t have a boss, manager, etc., but then later indicated that he worked for the CEO.  However, I’ve still got a problem.  I don’t believe that Mike actually works for the CEO.  I decided to give up for the evening and talk to someone during the day shift.

At this point I think I need to make a personal statement, if I ever have an employee so boldly lie to a client they will be fired – on the spot.  I don’t see how any organization can stand to have its employees boldly lying to customers like this.  It’s this clarity of conviction that makes the rest of the story so troubling.

I called back during the day and got Mona.  I politely told Mona I needed to speak with a supervisor and when asked what for, I said that I needed to register a complaint about a supervisor from last evening and I didn’t feel comfortable sharing that complaint with her.  She transferred me to Martha.

I explained the customer service situation to Martha and asked that she do whatever was appropriate to deal with the concern.  I considered the issue disheartening but had written it off.

Dealing with the customer service issue meant I didn’t have time to deal with the actual problem so I had to wait to call back – in the evening.  (Taking care of my customers is a priority.)  When I called back in I got Kelly.  Kelly transferred me to Mike.  My conversation with Mike was only slightly better in that he said that he would look into the issue.  He didn’t offer to allow me to talk to the next level of support, provide me with a NOC ticket number, etc.  He simply said he’d look into it.

When I asked when I could expect to hear something from him, he said he couldn’t make a commitment on when the problem would be resolved.  When I clarified that I was just looking to know when I’d hear from him on this issue again he indicated that he couldn’t make a commitment – not even for a status call.  I shared with him that I felt this was bad customer service.  He told me I was wrong that you never make a commitment you can’t keep.  To me, follow up calls should be something you have control of.

So without any timeframe guidelines since Mike wouldn’t provide them – I called back in 4 hours later to request a status update.  To be clear, I didn’t expect that the problem would be resolved, I just thought I might be able to get the NOC ticket number.  The technician answering the phone told me that Mike had tried to call me and that I didn’t answer.  I logged into Vonage and verified that I hadn’t missed any calls.  I asked the technician for the status update and he indicated that the notes didn’t indicate what the update was.  So after informing him that there was no call I asked to be transferred to Mike again.

Mike was noticeably frustrated.  When I asked what the status update was he indicated that he didn’t call.  (Apparently the technician was mistaken)  When I asked for a status update I was told that he couldn’t work on the issue because I had called in.  For this to be truth this would presume that he was personally troubleshooting the issue, something I wasn’t ready to accept.  I asked him when I should call in again he told me that he’d call me when he had something to report – and more disturbingly he said “You need to stop calling in.”  I was shocked.  I called in a few minutes after four hours of delay from originally reporting the problem after he wouldn’t communicate an expectation to me – it wasn’t like I was calling in every 10 minutes.  However, the whole point of customer service is to talk to customers who are having problems.  It would seem that if no one calls in then there wouldn’t be any jobs.

Mike also threatened to close the case that he ultimately admitted he had opened with the NOC.  My response was something along the lines of “If you think I’m upset now…”  I apparently convinced him to leave the case open as I hung up because at 2AM I got a call from a technician (that I let go to voice mail).  The technician indicated that he had a few questions but he thought he knew what the problem was.

By the time I woke up TechNet worked.  I called in to close the case and asked to speak with a manager again about the customer service issues.  I again got Martha.  Martha indicated that their boss (Mike’s and hers) wouldn’t be in until 10AM (it was like 8:30).  I asked for a call back and she assured me she’d give him the message.

By this time some of the corporate sales and support guys had returned my calls that I made.  I know a few people in the area who use Brighthouse for their corporate Internet connectivity.  So I managed to get a call.  The corporate service manager acknowledged some issues on the network due to some IP addresses they acquired from Japan and indicated they were are of the issue.  Since my problem was resolved I thanked him and moved on.

Two weeks later I was clearing off my desk found my note and called back in.  This time when I spoke with Martha she indicated that Mike’s boss wouldn’t be calling me back.  No reason was given.  I was nearly ready to change services, but I needed one more push.

That push came a week later when TechNet stopped working again.  I called back in and after initially having a technician walk through it with me and get assigned a NOC ticket… I was told I’d get a follow upcall.  The next day, I tried to follow up and being told that I had never done any troubleshooting steps and that I had been told repeatedly this was my issue and not an issue on the Road Runner network.

The end.  I’m done.  I decided that I there were too many customer service issues.

I switched to AT&T’s U-Verse service.  I’ve called in a few times with some questions – and I can’t tell you the customer service difference.  The folks I’m talking to are polite, respectful, willing to help… all things that I never got out of the Roadrunner National Helpdesk.

So back to the starting point, why does this bug me so much?  Well, I have a set of unanswerable questions:

  1. How can you have such poor customer service skills in a manager and not realize it?
  2. How can anyone in a customer service position refuse to call a customer back?
  3. Organizationally, how do you fail to recognize such a systemic problem?

I wonder if I’ll get a call back now that it is too late.

The Monster Server Project – VMWare, iSCSI, and learning

So I’ve been working on a project for quite some time, and I’m finally seeing the light at the end of the tunnel.  Doing work with SharePoint means getting to know virtual machines and, relatively speaking, throwing a lot of hardware at the problem.  I like many other SharePoint consultants have ended up with a high end laptop.  However, that’s scored me the reputation as the guy with the heaviest bag.  Not only do I have to carry a big laptop but I’m also carrying two or three external hard drives at any one time.  That may make my chiropractor happy but it’s not something that I’m real fond of.

So my idea is that I’d get a big virtual server up and running and I’d just connect to the images running on that server – instead of trying to run them locally.  The idea sounds good, particularly when I’m in my office with reliable high speed connectivity.  However, there’s some question to how this will work at clients and on the road.  I’ll let everyone know how that goes when I get there.  It is, however, the impetus for this project.

I had purchased a server to do a conversion project.  The short story is I needed a server with fast disks and a fast processor to handle some conversion work.  Yes, the project was big enough to just bundle in the cost of the hardware.  I ended up with a Dell 1950 1U server with a Quad Core 2.66 Ghz and 4GB of RAM.  I also configured it with 4x 146GB SAS 10K drives.  I didn’t need that much space and I was concerned about speed of the drive arms.  While I was at it I added a Dell Remote Access card so I could get to the server even if something bad happened.  The server is better than my core network infrastructure by a wide margin – it’s the first truly server class machine I have.

The conversion project came to an end and I was left with a server that by all accounts could make a good virtual host.  However, there wasn’t enough RAM to run multiple machines (to do things like test farm configurations for SharePoint).  So I went to buy RAM for the machine.  I thought it would hold 16GB of RAM and was prepared to make that purchase.  However, I realized upon further review that it would take 32GB of RAM.  So I maxed it out.  My wife will tell you this is a standard response from me.  I rarely go halfway.(I think if she understood she’d be confused by the fact that it only has one quad core processor in it.)

I had configured the disks on the machine in a RAID 1+0 for performance … I wanted to keep that because in addition to my development machines I wanted to be able to run my web site off of the machine.  When I started to look at the RAM to disk ratio I could tell it’s out of whack.  By this time I had decided to use VMWare Infrastructure (ESX) to host my virtual machines.  My friends at Bluelock had already convinced me that the performance was in some cases better than on physical hardware.  (Watch Windows boot and you still won’t believe how fast it is.)  So that meant I had to figure out storage options that would work with VMWare.

Well, VMWare doesn’t support USB drives, and their support for storage controllers is VERY limited.  Basically, I couldn’t find a direct attach solution for SATA drives that was supported.  Why SATA drives?  Well, because they’re cheap for large capacities.  Since I had fast storage, I needed some Tier 2 slow storage.  Honestly, there’s not much you can do to beat $250 for a 1TB drive.

What is supported in VMWare is iSCSI.  iSCSI is the poor man’s SAN technology.  I call it the poor man’s SAN because it’s much less expensive than a Fiber Channel solution.  The performance can be relatively close to fiber channel performance if correctly configured.  For what I needed iSCSI was going to be more than adequate.

Well, that’s fine except that iSCSI cabinets are on the somewhat expensive side – even those that take SATA drives.  After a relatively exhaustive search I found a 2U unit sold by Enhance Technologies called RS8IP.  It can hold a total of 8 SATA drives.  For my initial bite at the apple I settled on 4x 1TB Seagate drives.  The MSRP for the RS8IP is slightly over $3K and the 4 drives cost about another $1K.  Yes, I am talking about spending $4K on storage – but it’s 4TB of unprotected storage.  I opted for RAID5 which left me with a 3TB usable space. (actually 2.793 TB since 1TB drives are really slightly smaller than that when you do your division by 1024 instead of 1000).

I’ve had VMWare up and running for a while on the system, but honestly I’ve not had the time to really get to know it too well.  I do know that it’s really quick with the virtual machines I’ve been running on it.  I hadn’t fully converted to using it for my development systems for space reasons – and it hadn’t been moved to its permanent home, it’s been sitting here at the house so I couldn’t really run multiple instances and get to them from the outside.  Anyway, I was impressed by windows boot times and general performance.

Configuring the RS8IP was pretty easy, except for some mistakes I made.  There’s a quick install that can be accessed from the front of the unit.  I did that and when I got asked about LBA64 – I said Yes.  That, I would learn later would be a problem.

I started out trying to figure out how to get VMWare to talk to the unit.  I got an error message about VMotion and iSCSI having not been licensed… Interesting since the licensing screen said I was licensed for it.

A quick call to a buddy and I was told that I had to create a VMKernel port for iSCSI on my virtual switch in VMWare.  Once I created that I could create the iSCSI storage adapter.  Once I had the adapter I scanned for the iSCSI targets (luns) I exposed on the RS8IP.  No dice.

It was about this time I was really not feeling good.  It’s not too often that I wonder off into areas that I don’t have a way to test and troubleshoot but I was concerned this might be one of those times.  However, I saw instructions for the MS iSCSI initiator.  I downloaded it and installed it into a virtual machine with Windows XP on it.  The MS iSCSI initiator loaded up, it saw the RS8IP, but it didn’t show any volumes.  As a verification, I went over to a Vista machine I have and set it up on the Vista machine.  Presto… I had a 2793 GB drive showing up.

It was about this time that I started thinking about what might be different between Vista and XP… and I realized that LBA64 support was a likely candidate.  I thought that perhaps VMWare would have the same limitations so … I rebuilt the drive array without LBA support.

And … Presto after a few short hours I could see the drive in XP.  (By the way, had I paid better attention I could have started the test while the array was rebuilding but I forgot to setup the LUN and well, I didn’t remember until after the array was rebuilt.)

So it’s visible in XP and in Vista… but still not visible in VMWare.  A few emails and a little while later I had a buddy at Bluelock respond to ask me if I had enabled iSCSI through the VMWare firewall… Doh!  Once I enabled it through the VMWare firewall and rescanned.  I had a LUN show up.  Success … or so I thought.

I went to add the storage to VMWare and I was told that there wasn’t a partition table, it was corrupt, the world was coming to an end… well, you get the point.  I briefly played around with the fdisk utility from the command prompt and decided that there were enough problems VMWare was having that I should probably turn LBA 64 back on and see what happened.

And I didn’t see the drive.  So I thought, well, maybe it has to fully rebuild.  A few hours later … after the rebuild was completed, I tried again.  No dice.  By this time I’m getting pretty frustrated.  I’m feeling like I’m trying to guess the combination to a lock.

After some more research it became apparent that the LBA64 bit question comes up right at 2TB.  So once again I deleted the array and this time created two volumes and two LUNs.  One volume was 1396 GB and the other was 1397.  Neither had LBA64 turned on.  So I rescanned from VMWare and found both luns.  I went in and got VMWare to add them to the storage and even copied files to them almost immediately.  Sure the array was still building in the background, but I copied a non-trivial amount of data over pretty quickly.

Sunday morning while my family was sleeping I decided to have some fun.  So I simultaneously installed: Windows XP, Windows Vista, Windows Server 2003 R2, Windows Server 2003 R2 x64, Windows Server 2008, and Windows Server 2008 x64 on the environment.  In less than 2 hours I had six operating systems installed.  OK, that’s what I’m talking about!  I figure most of the reason it took 2 hours was I was having to remember to check on the installations and press keys.  Oh, yea, I patched all of those operating systems in the same 2 hours.  If you’ve ever patched a new installation of XP you know that can take 2 hours on its own.

I know I’ve still got a few gremlins in the system but they’re minor at this point.  First, I don’t think VMWare has the adapters teamed correctly.  I was looking at the switch diagnostics and it was showing 50% utilization on one port and almost none on the other port that the NICs were attached to.  Second, the drives are being recognized by the RS8IP as SATA 1.5Gb/s instead of SATA 3.0 Gb/s.  (It’s got a cool screen that shows me that information though.)  Third and Finally, I don’t know enough about VMWare yet to figure out how to convert my new operating systems into templates that I can use to create new systems.

So what did I learn from this exercise?

  1. It’s good to have friends.  OK, I already knew that but it’s worth repeating.  Seriously – thanks Ben and Andy for your help.
  2. Don’t create volumes that are larger than 2TB no matter how tempted you are.  It’s just going to be painful.
  3. VMWare is a powerful tool but one that requires a lot of learning.  (Oh, and finding information on it or the problems your facing is pretty difficult.)
  4. iSCSI is cool.  It performs pretty well and can be setup by mortals (notwithstanding the 2TB volume size issue.)
  5. To setup iSCSI on VMWare: a) Make sure you have a VMKernal port, b) Make sure you let VMWare make outbound iSCSI connections, c) Setup the iSCSI cabinet in the dynamic discovery tab of the iSCSI adapter, d) Rescan the iSCSI adapter (takes 60+ seconds), e) Don’t create LUNs that are greater than 2TB.

Article: SharePoint’s Delegate Control Power

Learn about a handy feature that lets you isolate the functionality of one control from another on one or more Web sites.

One complaint about Microsoft Windows SharePoint Services (WSS) 2.0 and Microsoft SharePoint Portal Server 2003 was the difficulty in making changes to the environment after it was deployed. Officially, changing a site definition isn’t supported after it has been used to create other sites. Of course, that was then.

Now, Windows SharePoint Services 3.0 and Microsoft Office SharePoint Server (MOSS) 2007 offer many ways to make changes to sites after they have been provisioned. The introduction of SharePoint Features (note the capital “F”) has opened up an entire world to changing master pages, page layouts, and pages themselves. Further, SharePoint now includes a new technique—delegate controls—that allows for more fine-grained control over parts of the page.

http://www.devx.com/enterprise/Article/36628

What is not a Huge MOSS Workflow Issue (Take 2)

Several months ago I responded (in what has to be the worst titled blog post “SPWorkflowAssociation.AutoCleanupDays”) to an inflammatory post by Dave Wollerman titled “Huge MOSS Workflow Issue… What is Microsoft Thinking!!!” I was recently pointed to Dave’s response to my response.

So I’m with Dave in that I think everyone should know about the situation.  Perhaps where I differ from Dave’s thinking is I believe people should have solutions to the problem so that’s what I’m going to offer here.

First, a recap.  By default, Workflows will clean themselves up 60 days after they “end”.  This process doesn’t delete the actual workflow history table entries but does disconnect them from the user interface, so they’re harder to get to.

So there are two key things to note about this:

  1. It’s settable.  You can change it in your element manifest as my original post on this topic pointed out.  You can also change it in the API for every existing workflow association if you want.  (SPWorkflowAssociation.AutoCleanupDays).  If you never want SharePoint to delete workflow history, the workaround is simple.  Write a tool that runs every 59 days that goes through every site, web, list, and workflow association and sets the AutoCleanUpDays property to 9999.  The end.  No issue.  It won’t clean anything up for you.  It’s probably 4 hours worth of coding including testing.  I don’t understand how something that can be fixed so easily is a “Huge MOSS Workflow Issue”
  2. Workflow History != Audit (for you VB programmers, Workflow History <> Audit).  Workflow history isn’t an audit.  It’s not secured by default.  It’s not tamper proof.  If you’re using Workflow history for audit – and the auditors are letting you – then there’s something wrong.  If you need an audited record then have the workflow bundle everything up and record it in a record center (or insert your solution here) so that it is a final record.  I can put an entry into the list saying that the Easter Bunny approved something if I’ve got contributor access to the web site (and no one has changed the default permissions of the history list.)  I can delete the records indicating that I did approve something.  It’s just not secure so using it as an audit record when it isn’t not only doesn’t work, it doesn’t make sense.

So in Dave’s defense, I’ve definitely had those “What were they thinking?!?” moments.  The support engineers, product managers, and program managers will all be happy to pipe in and confirm that I’ve had them.  However, I have them over things that are more pervasive and don’t have good workarounds.  (Like say checking for the existence of a list without throwing an exception, or not allowing for the creation of a content type with a specific ID from the API, etc.)  I know it can be frustrating to expect that SharePoint operates one way only to be shown that it operates another.

However, ultimately, this is a non-issue.  It’s easy to work around and it’s a bad approach to start.

InfoPath Forms Services – The form template is not browser-compatible

Every once in a great while Murphy meets me at my doorstep and decides to do a “Ridealong” all day.  Occasionally I keep one step ahead of him.  Due to some much appreciated help from the InfoPath product team – today is one of those days.

A quick rewind, just more than a week ago I ran out of time before going to the SharePoint Conference.  I was trying to publish an InfoPath form for a client.  I opened in design mode with Infopath that day and I got a complaint about a duplicate key violation.  I quickly change the XSN file extension to CAB, extracted the files, fixed the manifest.xsf (I think it was that file) and used MakeCab to create a new cab file.  I renamed the file to XSN and I thought everything was fine.  InfoPath opened in design mode.  However, as I said I ran out of time before publishing the form.

I arrived at the client this morning to publish the form and started by getting some drop down list data on to their environment.  During this process I noticed something was wrong.  Knowing that I hadn’t rebooted in several days I decided to reboot my laptop.  For good measure once my laptop was rebooted I decided to take the virtual machine I developed the form in and restart it.  I figured I’d start clean to eliminate problems.

It’s at this point in the story that Murphy decided that he needed to get involved.  So what happened was I got a Check disk happen when I restarted the VPC.  Normally I don’t pay much attention.  When I started seeing it scrolling the screen with sequential sector numbers I sat up and paid attention.  Somehow a substantial amount of the master file table and directory structure was unreadable.  I’m still not sure what caused this melt down.  So after quite some time I got the system to boot up and I got logged in.  There was, however, a serious problem.  Explorer couldn’t start because SHELL32.DLL was missing.  It turns out that Task Manager (Ctrl-Alt-Esc) also needs SHELL32.DLL.  So I have an unbootable system.

I attached the drive as a secondary drive to a working VPC and turned on undo disks… of course the files that I needed were gone.  I tried a file recovery tool that I bought and it didn’t work.  That’s surprising because I’ve seen it bring back entire directory structures in the past.  I’m becoming impressed at the amount of damage that Murphy did in really short time.

I come back to my office … I look to my backups and find that I have a backup of the image from a week ago – after I had done all my work.  After some restore time … I had nearly (if not everything) that I had lost.

So I start working on my publishing in my test environment – so I can verify that I have everything.  Here’s where Murphy thought he had me.  I publish the form and get a message on the Upload Form Template page:

 

The form template is not browser-compatible.  It might be possible to correct the problem by opening the form template in Microsoft Office InfoPath, and then republishing it.

 

So I go back to InfoPath and rerun the Design Checker.  I got 8 messages about some post backs that needed to happen – and no errors.

So I open the ULS Logs (C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\LOGS) and find an interesting error:

 

GetSolutionInformation failure: The following file is either missing or is not part of included in the form template: OSD220.OSD To add a file to the form template in design mode, use the Resource Files dialog box on the Tools menu, and then add the file you want.

 

So I crack my XSN by renaming it .CAB and see that the file it’s complaining about actually exists. it looks like this:

 

<?XML version=”1.0″ ENCODING=’UTF-8′?>

<!DOCTYPE SOFTPKG SYSTEM “http://www.microsoft.com/standards/osd/osd.dtd”>

<?XML::namespace href=”http://www.microsoft.com/standards/osd/msicd.dtd” as=”MSICD”?>

<SOFTPKG NAME=”Cab1″ VERSION=”1,0,0,0″>

<TITLE> Cab1 </TITLE>

<MSICD::NATIVECODE>

<CODE NAME=”AddMoveChangeRequests”>

<IMPLEMENTATION>

<CODEBASE FILENAME=”AddMoveChangeRequests.dll”>

</CODEBASE>

</IMPLEMENTATION>

</CODE>

</MSICD::NATIVECODE>

</SOFTPKG>

Well, at this point I’m stumped.  So I drop an email to some very nice folks (Thanks Nick & Brian).  The inform me that InfoPath will show the same error if I try to fill the form out (and not use Preview as I’m in the habit of doing.)

It seems that when I put the file back together from fixing the duplicate ID problem I somehow accidentally sucked up the OSD file and it’s not supposed to be there.  (Because it’s not listed in the manifest.xsf)

They are kind enough to tell me how to fix it too.  Take the form in design mode and do a File-Save as Source Files.  Then open up the Manifest.xsf in design mode and finally doing a Save As to turn it back into a packaged XSN file.

Apparently the OSD file is an Open Software Description file … I still don’t know exactly what it’s supposed to be.

So here’s what I learned today:

  1. If you get a message that a form isn’t browser enabled… Check it.
  2. If you check it and see that it is browser enabled and there are no errors check the ULS logs
  3. If you get a message about a missing file in the ULS logs it could be the file is present and shouldn’t be.
  4. You should always try to fill out the form.  Just testing with Preview isn’t enough.
  5. It helps to have good people willing to bail you out when Murphy tries to do a “Ridealong”

 

Recent Posts

Public Speaking