Posts tagged Microsoft Office SharePoint Server
SharePoint Memory Leak
Feb 16th
Ottimo post di Todd sopratutto se utilizzate regolarmente DisposeCheck.
As most readers will already know static objects live for the life of the AppDomain so an AppDomain’s lifetime is equal to that of static objects within the .Net Framework. As such when an object registers for event notification from an object which is either static (or in this case the AppDomain) the registering object roots itself for the lifetime of the AppDomain. The GC cannot collect this object until either the AppDomain restarts or the object unregisters itself from the event handler. Unfortunately SPHttpApplication does not unregister itself from the AppDomain’s UnhandledExceptionEventHandler handler so each instance will live as long as the AppDomain. So even after the HttpApplicationFactory releases the SPHttpApplication the object will continue to remain in memory until the AppDomain restarts.
I’m MVP
Jan 1st
Il nuovo anno non poteva iniziare meglio: poco fa ho ricevuto la *famosa* email di conferma dell’award MVP (Most Valuable Professional) su SharePoint.
Non ho parole e neanche provo a ringraziarvi tutti, voglio comunque citare chi, in questi anni, mi ha aiutato a *fare il salto* sia dal punto di vista umano e professionale, quindi un doveroso grazie a Rob e Gab e di conseguenza a tutti gli appassionati di Knowledge Management che mi hanno spinto ogni giorno ad approfondire questo dominio applicativo per supportarli durante il loro lavoro di *pratica quotidiana*.
Utenti, comunità, partner di lavoro, colleghi, tutte persone con le quali ho avuto la fortuna di parlare, convincere e dimostrare oltre le potenzialità di uno specifico prodotto la metodologia, l’approccio che c’è dietro al fantastico mondo della collaborazione e produttività secondo Microsoft.
Questo è uno dei risultati, forse uno di quelli *professionalmente* più appetibili ma non certo l’unico: le strette di mano, gli endorsement e le email notturne sono il lato affascinante del nostro lavoro e spesso, anche se passano inosservate, rappresentano pillole di buonumore che aiutano ad affrontare con maggiore coscenza le sfide quotidiane a cui siamo messi continuamente di fronte.
Un caro saluto quindi ad Alessandro Teglia e agli altri MVP della mia categoria: Igor, Claudio e Gabriele … ci vediamo prestissimo :-)
Retrieve SiteCollection usage information and disk space
Dec 22nd
Quando si ha la necessità di misurare il size su disco ed il contenuto del ContentDB di un determinato SPSite i metodi che possiamo utilizzare sono parecchi, alcuni più efficienti degli altri e/o eventualmente bypassare l’utilizzo del OM messo a disposizione da MOSS.
In questo caso specifico abbiamo la necessità di monitorare il size del ContentDB di un determinato SPSite onde evitare il raggiungimento dei famigerati 100GB raccomandati dal capacity planning di riferimento.
Possiamo scegliere tra tre diversi metodi, oguno con una propria particolarità in base a diversi scenari di utilizzo.
Stored Procedure
Possiamo ad esempio misurare lo spazio fisico che il ContentDB occupa nel filesystem utilizzando la sp di sistema sp_spaceused. Questa misurazione è puntuale e può comprendere sia il LogDB che l’mdf vero e proprio e consiste nell’esecuzione della sp di sistema tramite il passaggio del nome DB che vogliamo monitorare. Non si fa uso dell’OM di MOSS, maggiormente performante ma occorre eseguire la sp nella stessa istanza SQL in cui è gestito il ContentDB di riferimento. Vi giro un esempio che prende in input il nome del database (@SourceDB) ed il sorting delle righe della tabella di output (@SortBy).
1: CREATE PROCEDURE [dba_SpaceUsed]
2:
3: @SourceDB varchar ( 128 ) = null,
4: @SortBy char(1) = 'S'
5:
6: AS
7:
8: SET NOCOUNT ON
9: DECLARE @sql nvarchar (4000)
10: IF @SourceDB IS NULL BEGIN
11: SET @SourceDB = DB_NAME ()
12: END
13:
14: CREATE TABLE #Tables ( [schema] sysname
15: , TabName sysname
16: )
17: SELECT @sql = 'INSERT #tables ([schema], [TabName])
18: SELECT TABLE_SCHEMA, TABLE_NAME
19: FROM ['+ @SourceDB +'].INFORMATION_SCHEMA.TABLES
20: WHERE TABLE_TYPE = ''BASE TABLE'''
21: EXEC (@sql)
22: CREATE TABLE #TabSpaceTxt (
23: TabName sysname
24: , [Rows] varchar (11)
25: , Reserved varchar (18)
26: , Data varchar (18)
27: , Index_Size varchar ( 18 )
28: , Unused varchar ( 18 )
29: )
30: CREATE TABLE #TabSpace ( [Schema] sysname
31: , TabName sysname
32: , [Rows] bigint
33: , ReservedMB numeric(18,3)
34: , DataMB numeric(18,3)
35: , Index_SizeMB numeric(18,3)
36: , UnusedMB numeric(18,3)
37: )
38: DECLARE @Tab sysname, @Sch sysname
39: DECLARE TableCursor CURSOR FOR
40: SELECT [SCHEMA], TabNAME
41: FROM #tables
42: OPEN TableCursor;
43: FETCH TableCursor into @Sch, @Tab;
44: WHILE @@FETCH_STATUS = 0 BEGIN
45: SELECT @sql = 'exec [' + @SourceDB
46: + ']..sp_executesql N''insert #TabSpaceTxt exec sp_spaceused '
47: + '''''[' + @Sch + '].[' + @Tab + ']' + '''''''';
48: Delete from #TabSpaceTxt;
49: EXEC (@sql);
50: INSERT INTO #TabSpace
51: SELECT @Sch
52: , [TabName]
53: , convert(bigint, rows)
54: , convert(numeric(18,3), convert(numeric(18,3),
55: left(reserved, len(reserved)-3)) / 1024.0)
56: ReservedMB
57: , convert(numeric(18,3), convert(numeric(18,3),
58: left(data, len(data)-3)) / 1024.0) DataMB
59: , convert(numeric(18,3), convert(numeric(18,3),
60: left(index_size, len(index_size)-3)) / 1024.0)
61: Index_SizeMB
62: , convert(numeric(18,3), convert(numeric(18,3),
63: left(unused, len([Unused])-3)) / 1024.0)
64: [UnusedMB]
65: FROM #TabSpaceTxt;
66: FETCH TableCursor into @Sch, @Tab;
67: END;
68: CLOSE TableCursor;
69: DEALLOCATE TableCursor;
70: IF @SortBy = 'N'
71: SELECT * FROM #TabSpace
72: ORDER BY [Schema] asc, [TabName] asc
73: ELSE IF @SortBy = 'T'
74: SELECT * FROM #TabSpace
75: ORDER BY [TabName] asc, [Schema] asc
76: ELSE
77: SELECT * FROM #TabSpace
78: ORDER BY ReservedMB desc
79: ;
80: DROP TABLE #Tables
81: DROP TABLE #TabSpaceTxt
82: DROP TABLE #TabSpace
Il risultato dell’esecuzione di questa sp è la visualizzazione di dati di occupazione su disco in base all’elenco completo di tabelle che sono contenute nel DB. I valori sono espressi in MB e basta fare la somma delle righe per avere il size totale di occupazione su disco del ContentDB di riferimento.
SPSite (ContentDatabase)
Se invece abbiamo bisogno di un’astrazione più ad alto livello possiamo interfacciarci direttamente con l’OM di MOSS e recuperare la proprietà DiskSizeRequired dell’oggetto ContentDataBase afferente alla classe SPSite.
1: private ulong CheckSiteDiskSpaceOccupied(string url)
2: {
3:
4: using (SPSite site = new SPSite(url))
5: {
6: return site.ContentDatabase.DiskSizeRequired;
7: }
8:
9: }
Il valore ritornato è un ULong (unsigned) e riporta il valore in bytes necessario ad effettuare un restore (full backup) del ContentDB di riferimento. Questo valore comprende anche la quantità di spazio necessaria alla ricostruzione dei log e di eventuali indici: può essere quindi maggiore del primo esempio.
SPSite (UsageInfo)
In quest’ultimo esempio invece ritorniamo il valore totale in bytes che viene consumato da tutti gli oggetti (metadata, SPList, ecc …) di un determinato SPSite.
1: private long CheckSiteContentUsage(string url)
2: {
3:
4: using (SPSite site = new SPSite(url))
5: {
6:
7: SPSite.UsageInfo info = site.Usage;
8: return info.Storage;
9:
10: }
11:
12: }
In questo caso l’oggetto UsageInfo ritorna un indicatore non aggiornato in tempo reale, in quanto appunto non basa la sua persistenza su informazioni che vengono recuperate da filesystem ma sul lavoro di timerjob che controllano periodicamente l’utilizzo degli oggetti del SPSite di riferimento.
In base alle vostre necessità selezionate il modo migliore, se siete nella stessa instanza potete utilizzare il primo metodo, altrimenti se occorrono dati puntuali utilizzate l’OM e magari ponderate bene l’utilizzo della struttura UsageInfo per elaborare le informazioni di utilizzo sui singoli oggetti del SPSite di riferimento.
The SharePoint Flying Pig’s Blog
Dec 22nd
Faccio mia la segnalazione di Igor circa l’apertura del nuovo blog di Riccardo Celesti su tutto ciò che riguarda SharePoint ed il suo lavoro. Sottoscrivetevi asap … io intanto immagino quando arriverà il momento di Elisabetta e Barbara! Anche loro li potete trovare a Marzo (9-10-11) alla Microsoft SharePoint & Office Conference.
How to programmatically monitoring SharePoint 2010 environment
Oct 5th
Beh mi sono messo al dentro di un mondo cosi vasto che pare impossibile dare una soluzione di tipo P. All’interno di applicazioni verticali all’infrastruttura di MOSS (tra un pò Microsoft SharePoint 2010) occorre di norma monitorare i processi e le attività di interfacciamento tra l’Application Platform di riferimento e la propria applicazione. Ora, a prescindere dalla nostra applicazione è utile permettere agli amministratori di sistema di rimanere informati sulle attività che riguardano il rapporto tra le funzionalità offerte a livello di applicazione e la disponibilità in termini di servizi, tempo di risposta, risolrse locali e quant’altro dell’architettura di riferimento.
Ad esempio quando si parla di SharePoint di devono affrontare temi che riguardano la disponibilità dei servizi di ricerca, spazio su disco dei ContentDB delle varie Site Collection fino ad arrivare slle singole instanze di workflow che possono anch’esse scaturire eccezioni dei rispettivi job di lavoro che le instanziano. Organizzare questo lavoro non è cosa semplice, occorre capire innanzitutto cosa si cerca di monitorare ed in che modo implementare un metodo ad hoc. Per fare un sempio chiarificatore: avete mai cercato di monitorare il size su disco dei vari db che formano una farm di MOSS? Qui un utile esempio ma occorre una buona dose di pazienza per capirne il funzionamento.
Se invece conosciamo *bene* l’infrastruttura su cui poggia la nostra soluzione possiamo adottare un metodo di monitoraggio molto più facile ed immediato che faccia utilizzo dell’EventViewer della macchina server su cui è installato il prodotto. L’Health model di riferimento ci può essere di aiuto illustrandoci gli event id delle eccezioni più comuni o degli alert che possono aiutarci a capire lo stato di salute di determinati sotto-sistemi dell’infrastruttura. Questo approccio ci da la possibilità di implementare il nostro sistema *custom* dove gestire soltanto gli eventi caratterizzanti la nostra applicazione, magari con del codice simile all’esempio seguente:
1: /// <summary>
2: /// Check if a determinate event id was occurred
3: /// </summary>
4: /// <param name="logType">Application/Security/Setup/System</param>
5: /// <param name="source">Office Server/Windows SharePoint Services 4</param>
6: /// <param name="eventId">6481, 6398, ...</param>
7: /// <returns>True/False</returns>
8: private Boolean CheckEventID(string logType, string source, int eventId)
9: {
10: Boolean result = false;
11: using (System.Diagnostics.EventLog eLog = new System.Diagnostics.EventLog())
12: {
13: eLog.Log = logType;
14: foreach (System.Diagnostics.EventLogEntry ele in eLog.Entries)
15: {
16: if (ele.TimeWritten.Day == DateTime.Now.Day)
17: {
18: if (ele.Source == source && ele.InstanceId == eventId) result = true;
19: }
20: }
21: }
22: return result;
23: }
Dato la tipologia di evento che vogliamo monitorare, data la source e l’event id possiamo notificare (a seconda del grado di errore) diversi eventi che riguardano MOSS e più in generale l’intera famiglia di servizi che sono eseguiti all’interno della FARM.
Ovviamente con l’arrivo di SharePoint 2010 alcune cose cambieranno, ad esempio saranno aggiunti nuovi event id che riguardano il namespace …SearchDataAccessServiceinstance (6481) e tanti altri. Una cosa che credo si possa già *annunciare* (forse Gabriele si incavolerà …) è la lista di naming convention adottate per la categoria source e che sono i seguenti:
- Office SharePoint Server 14 Error Reporting
- Office Web Applications
- Windows SharePoint Services 4
- Windows SharePoint Services 4 Error Reporting
- Windows SharePoint Services 4 Search
Ovviamente sta a voi implementarvi un enum ;-)
is SharePoint installed? maybe!
Sep 15th
Fino a ieri a questa domanda si poteva rispondere in maniera netta e distinta (“si” o “no”), infatti le versioni di Office Server presenti sulla macchina erano facilmente distinguibili attraverso la lettura delle chiavi di registro, qui un utile esempio. Oggi a questa domanda si dovrebbe rispondere in maniera un pochino più incerta (“dipende”) in quanto attualmente fa capolino una nuova key del registro di sistema dal nome *14*.
E’ buffo come la naming dei prodotti non segua mai e poi mai l’internal convention del registro di sistema, ultima ripicca credo degli sviluppatori. L’acronimo MOSS (Microsoft Office SharePoint Server) non esiste più, sta lasciando lo spazio al giovane, molto giovane… Microsoft SharePoint Server il cui cronimo ancora non è facile ricavare a meno che non si voglia creare un bel pò di confusione con MSS che vuol dire Microsoft Search Server!
Dal punto di vista del registro di sistema quest’ultimo compare comunque nella key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server, anche se questa scelta è di per se discutibile. Se avete un ambiente in cui avete fatto un aggiornamento alla nuova versione (MOSS-SharePoitn Server) avrete la situazione seguente:
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server
- 12.0
- 14.0
A parte la remota possibilità di avere le due versioni sulla stessa macchina c’è da considerare l’ottimizzazione del codice per una o l’altra versione o almeno per determinati accessi su altrettanto ben definite operazioni. Occorre quindi rimettere mano al codice di identificazione della versione di SharePoint arricchendolo con un ulteriore controllo e magari specializzare i comportamenti di accesso ai dati secondo le differenti versioni presenti o *presunte*.
Citizen Service Platform + josh Protocol! = FORUMPA
May 5th
Il CSP (Citizen Service Platform) è al centro della politica di innovazione e di infrastruttura proposta da Microsoft per gli Enti governativi. Costruire un prodotto CSP *centrico* e per di più compliant con le più ristrette normative attualmente vigenti in materia di dematerializzazione dell’azione amministrativa, fa si che josh Protocol! possa esprimere in pieno ciò che di *buono* una software house possa proporre sul mercato senza scendere in compromessi infrastrutturali o prestazionali determinanti.
La modellazione della soluzione offerta dal CSP, l’infrastruttura di riferimento e l’architettura dei prodotti che ruotano intorno a questo paradigma ci hanno messo nella condizione di avere a disposizione un vasto range di materiale *vivo* su cui basare gran parte delle specifiche del prodotto che, anche quest’anno, presidierà assieme a josh la tematica della dematerializzazione presso lo stand Microsoft al ForumPA.
Magari, faccio in tempo a fare un salto per farvi qualche proof of concept di persona!
Knowledge Box Spring 2009 – Roma 28 maggio
May 5th
Il 28 maggio si tiene a Roma la consueta edizione estiva del convegno organizzato da IT Consult sulle metodologie, tecnologie ed esperienze di Knowledge Management.
Di seguito un’estratto dell’agenda (in anteprima) cosi da darvi la possibilità di valutare la vostra presenza:
- Enterprise 2.0: quando la tecnologia batte la crisi – Mariano Corso
- Il Return Of Investment (ROI) del Knowledge Management – Romeo Pruno
- Microsoft Office SharePoint Server tra presente e futuro – Gabriele Del Giovine
- Un esempio di modellazione di processo con josh – Pierpaolo Manzini
- Marina Militare Italiana: la centralità dei processi come motore di innovazione – Massimo Finelli
Quest’anno, prima della conclusione dei lavori, sarà organizzata una interessante tavola rotonda tra i maggiori testimonial di progetti di KM italiani che si confronteranno sulle tematiche di BPM con josh e Microsoft Office SharePoint Server.
L’evento è gratuito, per informazioni ed iscrizioni, qui.
7 Maggio Roma – SharePoint Master
Mar 21st
Framework 3.5 Sp1 e Sharepoint, update error
Mar 19th
Gabriele segnala all’interno del newsgroup microsoft.public.it.sharepoint un importante warning relativo alla procedura di aggiornamento KB951847. Se avete una installazione su Win2003/Win2008 host-header based comunque vale la pena leggere queste importanti indicazioni. Io stesso nel mio ambiente di sviluppo ne sono stato affetto.

