CIFS in Alfresco 4.0 Mark Rogers Senior Software Engineer, Alfresco
Feb 22, 2016
CIFS in Alfresco 4.0
Mark Rogers
Senior Software Engineer, Alfresco
Introduction
CIFS and Alfresco in 4.0
Overview• Explain some of the issues in previous versions • Present the options for changes
• How you configure shuffle scenarios
• Q & A
• Lunch!
CIFS and JLAN and Alfresco
JLAN
AlfrescoDB Driver
FTPNFSCIFS
CIFS and JLANFile State Cache
• Packet level metadata• Last modified• File size
• Locks
• Session Information
Protocol Handler
Alfresco
CIFS
File State Cache
CIFS v Alfresco
CIFS• File/Folder• Hard coded metadata• No Versioning• Packet Level Protocol• Create, Read, Write, • Delete, Rename• Many levels of locking• Multiple separate
operations.
• Body Level Two• Body Level Three
• Body Level Four
Alfresco• Content and metadata• Versioning• Stream Based• Optimistic locking• Many associations• Coarse transactions
CIFS Create ShuffleCIFS Operations
• File Exists
File A
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File File A Temp
File
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Renamed
File A Temp File
Old File
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Renamed
• Temp File
moved into place
File A Temp File
Old File
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Renamed
• Temp File
moved into place
• Existing file
deleted
File A Temp File
Old File
Issues
CIFS and Alfresco
Issues• Automated Testing
• Transaction boundary
• Scenario Handling
• Alfresco Clustering
• Error Handling
• Logging
Issues
Automated testing• Starting with Alfresco
3.4 there are an increasing set of tests for the Alfresco Content Disk Driver.
Issues• Automated Testing• Clustering• Transaction boundary• Error Handling• Logging• Shuffle Scenarios
Issues
Clustering• Alfresco dependency
upon file state cache reduced/removed.
• JLAN clustered file state cache.
• Fixed Node Monitor
Issues• Automated Testing• Clustering• Transaction boundary• Error Handling• Logging• Shuffle Scenarios
Issues
Transaction boundary• Moved transaction
boundary down to alfresco
• Removed all dependency on transactional data from the file state cache
Issues• Automated Testing• Clustering• Transaction boundary• Error Handling• Logging• Shuffle Scenarios
Issues
Error Handling• Rework
Issues• Automated Testing• Clustering• Transaction boundary• Error Handling• Logging• Shuffle Scenarios
Issues
Logging• “Alfresco style” log4j
logging for Disk Driver and other alfresco code.
Issues• Automated Testing• Clustering• Transaction boundary• Error Handling• Logging• Shuffle Scenarios
Issues
Shuffle • A new
framework/engine for dealing with “shuffle scenarios”
• Remove all hard coded “shuffle logic
• Move all shuffle state out of the transactional layers.
Issues• Automated Testing• Clustering• Transaction boundary• Error Handling• Logging• Shuffle Scenarios
CIFS Shuffles
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Renamed
• Temp File
moved into place
• Existing file
deleted
File A Temp File
Old File
CIFS Rename ShuffleCIFS Operations
• File Exists
• Rename File
• Create New File
• Delete Temp File
• Scenario Fires
File A File A ~
CIFS Shuffles
Approaches• The sausage machine • The “watchers”
CIFS Shuffles
Shuffle • Simple operations
such as “does file A exist” need to read the cached instructions in the pipeline in addition to getting the state from the repo…
• Data loss on crashing!
The sausage machine• CIFS Commands go
into a pipeline and once we have a complete scenario we update the repo with a complete coarse grained transaction.
CIFS Shuffles
Shuffle • Scenarios compete
• At the end of each command alfresco is in a known persistent state.
• As and when scenarios fire they can “counter transact” previous behaviour.
The watchers• CIFS Commands go
through a set of scenarios which say what to do. The highest priority scenario wins.
• The scenarios contain their own state.
• Many scenarios run at once
CIFS Create ShuffleCIFS Operations
• File Exists
File A
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File File A Temp
File
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Rename
• Scenario Fires
File A Temp File
Old File
1.Copy Content
2.Rename temp file to Old File
3.Rename File A to Temp File
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Rename
• Scenario Fires
• Temp File
moved into place
• Existing file
deleted
File A Temp File
Old File
1.Copy Content
2.Rename temp file 3.Rename File A
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Rename
• Scenario Fires
• Temp File
moved into place
File A Temp File
Old File
CIFS Create ShuffleCIFS Operations
• File Exists
• Create Temp File
• Rename
• Scenario Fires
• Temp File
moved into place
• Old file deleted
File A
Old File
Architecture JLAN
Buffered Content Disk Driver
Non Transactional Disk Driver
Content Disk Driver 2
Filesystem Command Executor
Rule Evaluator
Scenario
CIFS Shuffles
Scenarios• Scenario Create• Scenario Rename• Scenario Create Delete Rename• Scenario Double Rename• Scenario Open File• Scenario Simple Non Buffered
• And others …
Configuration
Network-protocol-context.xml <property name="scenarios"> <list> <!-- TextEdit Mac Lion --> <bean id="tempDeleteShuffle" class="org.alfresco.filesys.repo.rules.ScenarioTempDeleteShuffle"> <property name="pattern"><value>^.*\.txt$</value></property> <property name="tempDirPattern"><value>.*(\\\..*\\)+.*</value></property> <property name="timeout"><value>60000</value></property> <property name="ranking"><value>HIGH</value></property> </bean> <!-- Excel 2003 --> <bean id="createShuffleExcel2003" class="org.alfresco.filesys.repo.rules.ScenarioCreateShuffle"> <property name="pattern"><value>[0-9A-F]{8}+$</value></property> <property name="timeout"><value>60000</value></property> <property name="ranking"><value>HIGH</value></property> </bean> <!-- Word 2003 --> <bean id="createShuffle2003" class="org.alfresco.filesys.repo.rules.ScenarioCreateShuffle"> <property name="pattern"><value>~WRD.*.TMP</value></property> <property name="timeout"><value>60000</value></property> <property name="ranking"><value>HIGH</value></property> </bean>
Scenario Instance/** * A scenario is a factory for scenario instances. * */public interface Scenario{ /** * Create a new ScenarioInstance * <p> * If the scenario is interested in the specified operation then * return a new scenario instance. * @param currentInstances the current instances of all scenarios. * @param operation the operation to be performed * @return the scenario instance or null if a new instance is not required. */ ScenarioInstance createInstance(EvaluatorContext ctx, Operation operation); }
Scenario/** * A scenario instance is an active scenario. It has a ranking, an * evaluate method and knows whether it is complete. * <p> * The evaluate method is called repeatedly as operations are processed. */public interface ScenarioInstance{ /** * Get the Ranking * @return */ public Ranking getRanking(); /** * evaluate the scenario against the current operation * * @param operation */ public Command evaluate(Operation operation); /** * Is the scenario complete? * * @return */ public boolean isComplete(); }
Lunch !