getPagePath and get_rev

Our Page class got more confusing and messy in the latest code. Also, profiles show that Page.get_rev and Page.getPagePath methods are very expensive, as they are called many times.

For profiles see MoinProfiling.

Multiple creation of pages

Most page are created to use single fuction like exists() or link_to(), which are very useful and save ugly calls to multiple other wikiutil functions.

Notice how some page are created 14 times, like the virtual root page of the wiki .

Logging page creation show this - for visit of FrontPage:

[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: 'HelpContents'
[Sat Dec 18 16:22:54 2004] Creating page: 'TitleIndex'
[Sat Dec 18 16:22:54 2004] Creating page: 'WordIndex'
[Sat Dec 18 16:22:54 2004] Creating page: 'UserPreferences'
[Sat Dec 18 16:22:54 2004] Creating page: 'HelpOnFormatting'
[Sat Dec 18 16:22:54 2004] Creating page: 'FindPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'NirSoffer'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: 'UserPreferences'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'RecentChanges'
[Sat Dec 18 16:22:54 2004] Creating page: u'FindPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'HelpContents'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:54 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:55 2004] Creating page: u'EnglishDict'
[Sat Dec 18 16:22:55 2004] Creating page: u'EnglishDict'
[Sat Dec 18 16:22:55 2004] Creating page: u'EnglishDict'
[Sat Dec 18 16:22:55 2004] Creating page: u'RecentChanges'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'WikiSandBox'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'FindPage'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'SyntaxReference'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'SiteNavigation'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'WikiSandBox'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'HelpForBeginners'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'HelpContents'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'WikiWikiWeb'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'MoinMoin'
[Sat Dec 18 16:22:55 2004] Creating page: ''
[Sat Dec 18 16:22:55 2004] Creating page: u'FrontPage'
[Sat Dec 18 16:22:55 2004] Creating page: u'NirSoffer'
[Sat Dec 18 16:22:55 2004] Creating page: u'FrontPage'

Experimental Patch

I made an experimental rewrite of Page.py, to see if what is the effect of solving these two problems. To do this, I broke some functionality here and there.

The patch include these changes:

  • Caching pages in request, Page.init returns a cached instance when posible

  • Replacing getPagePath and get_rev with getInfo and getInfoForDomain.
    • getInfo - returns page _pageinfo dict, filling the dict with data in the first call. data include: path, domain (standard or underlay), textfile and revision number.
    • getInfoForDomain - get page data from specific domain, standard or underlay.
  • Adding new methods: getPageEditLog, getPageAttachmentPath etc. Page client should not know the internal structure of a page, so we can change it without breaking other code.
  • Update client to use new calls
  • Make self repair of page sub directories, only.

Still missing:

  • Also page creation must have the code that create the paths needed when we have to create new page. It should not be the same code that check for existing paths as it was done in getPagePath.

The patch works for reading pages, there are problems with creating new pages.

For profiles, see MoinProfiling.

Multiple Page creation

Page creation log for FrontPage:

[Sat Dec 18 17:09:10 2004] Created page 'HelpContents'
[Sat Dec 18 17:09:10 2004] Created page 'TitleIndex'
[Sat Dec 18 17:09:10 2004] Created page 'WordIndex'
[Sat Dec 18 17:09:10 2004] Created page 'UserPreferences'
[Sat Dec 18 17:09:10 2004] Created page 'HelpOnFormatting'
[Sat Dec 18 17:09:10 2004] Created page 'FindPage'
[Sat Dec 18 17:09:10 2004] Created page u'NirSoffer'
[Sat Dec 18 17:09:10 2004] Created page u'RecentChanges'
[Sat Dec 18 17:09:10 2004] Created page u'EnglishDict'
[Sat Dec 18 17:09:10 2004] Created page u'WikiSandBox'
[Sat Dec 18 17:09:10 2004] Created page u'SyntaxReference'
[Sat Dec 18 17:09:10 2004] Created page u'SiteNavigation'
[Sat Dec 18 17:09:11 2004] Created page u'HelpForBeginners'
[Sat Dec 18 17:09:11 2004] Created page u'WikiWikiWeb'
[Sat Dec 18 17:09:11 2004] Created page u'MoinMoin'

For some reason the empty page is not logged

Patch

Here is the patch, play with it.

page-refactor.patch

MoinMoin: PageClassRefactoring (last edited 2007-10-29 19:12:42 by localhost)