This sounds like a circular reference in the Tabs table which is the first major problem I've encountered with some 2.x to 3.x upgrades. This has been a major contributing factor of several 2.x to 3.x upgrade problems I have encountered lately.
Below is an SQL script which you can run in Query Analyzer which will validate the tab structure of your install. I havent added an actual break... so you'll just have to watch to see if it spins out of control... but it will either finish each section quickly or keep repeating that it is checking menus (which indicates an endless loop). Sorry that it is crude *grin*.
e.g... this is an endless loop...
11404 >> 11465...
11465 >> 11404...
11404 >> 11465...
11465 >> 11404...
DECLARE @TabId INT
DECLARE @PortalId INT
DECLARE @ParentId INT
DECLARE @Level INT
DECLARE @PortalName NVARCHAR(128)
DECLARE @NewTabId INT
DECLARE @NewParentId INT
DECLARE @MSG NVARCHAR(1000)
DECLARE @PreviousPortalId INT
SET @PreviousPortalId = -999
DECLARE cur CURSOR LOCAL SCROLL STATIC READ_ONLY FOR
SELECT TabId, PortalId, ParentId, [Level] FROM Tabs ORDER BY PortalId, TabId
OPEN cur
FETCH NEXT FROM cur INTO @TabId, @PortalId, @ParentId, @Level
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (ISNULL(@PortalId, -1) <> @PreviousPortalId)
BEGIN
PRINT '================================================='
SELECT @PortalName = PortalName FROM Portals WHERE PortalId = @PortalId
PRINT 'Processing Portal: ' + ISNULL(@PortalName,'No Portal, Host Menu')
PRINT '================================================='
END
SET @NewParentId = @ParentId
SET @NewTabId = @TabId
PRINT 'Validating Tab [' + LTRIM(CAST(@TabId AS VARCHAR(10))) + '] :'
WHILE (1 = 1)
BEGIN
SET @MSG = CHAR(9) + LTRIM(CAST(@NewTabId AS VARCHAR(10))) + ' >> '
IF @NewParentId IS NULL
BEGIN
SET @MSG = @MSG + '[NULL]... OK'
PRINT @MSG
BREAK
END
ELSE
BEGIN
SET @MSG = @MSG + LTRIM(CAST(@NewParentId AS VARCHAR(10))) + '... '
END
SELECT @NewTabId = TabId, @NewParentId = ParentId FROM Tabs WHERE TabId = @NewParentId
PRINT @MSG
END
SET @PreviousPortalId = @PortalId
FETCH NEXT FROM cur INTO @TabId, @PortalId, @ParentId, @Level
END
CLOSE cur
DEALLOCATE cur